diff options
author | Martin Brandenburg <martin@omnibond.com> | 2016-03-15 11:28:20 -0400 |
---|---|---|
committer | Mike Marshall <hubcap@omnibond.com> | 2016-03-23 17:36:14 -0400 |
commit | 3c9cf98d7b4f27e4303ea6e67db7f0c343a575b6 (patch) | |
tree | 88e392fbcce753bc8770b8b70c779ba4be4d2d09 /fs/orangefs | |
parent | d57521a653e7ac2e8edaabfff202caf87c61f08a (diff) |
orangefs: rename orangefs_inode_getattr to orangefs_inode_old_getattr
This is motivated by orangefs_inode_old_getattr's habit of writing over
live inodes.
Signed-off-by: Martin Brandenburg <martin@omnibond.com>
Signed-off-by: Mike Marshall <hubcap@omnibond.com>
Diffstat (limited to 'fs/orangefs')
-rw-r--r-- | fs/orangefs/dcache.c | 2 | ||||
-rw-r--r-- | fs/orangefs/file.c | 7 | ||||
-rw-r--r-- | fs/orangefs/inode.c | 9 | ||||
-rw-r--r-- | fs/orangefs/orangefs-kernel.h | 4 | ||||
-rw-r--r-- | fs/orangefs/orangefs-utils.c | 121 |
5 files changed, 133 insertions, 10 deletions
diff --git a/fs/orangefs/dcache.c b/fs/orangefs/dcache.c index 2de92b71d861..cc5487a1d040 100644 --- a/fs/orangefs/dcache.c +++ b/fs/orangefs/dcache.c | |||
@@ -117,7 +117,7 @@ static int orangefs_d_revalidate(struct dentry *dentry, unsigned int flags) | |||
117 | 117 | ||
118 | /* Now we must perform a getattr to validate the inode contents. */ | 118 | /* Now we must perform a getattr to validate the inode contents. */ |
119 | 119 | ||
120 | ret = orangefs_inode_getattr(dentry->d_inode, | 120 | ret = orangefs_inode_old_getattr(dentry->d_inode, |
121 | ORANGEFS_ATTR_SYS_TYPE|ORANGEFS_ATTR_SYS_LNK_TARGET, 1); | 121 | ORANGEFS_ATTR_SYS_TYPE|ORANGEFS_ATTR_SYS_LNK_TARGET, 1); |
122 | if (ret < 0) { | 122 | if (ret < 0) { |
123 | gossip_debug(GOSSIP_DCACHE_DEBUG, "%s:%s:%d getattr failure.\n", | 123 | gossip_debug(GOSSIP_DCACHE_DEBUG, "%s:%s:%d getattr failure.\n", |
diff --git a/fs/orangefs/file.c b/fs/orangefs/file.c index 9b561b7894b3..3aff671534d0 100644 --- a/fs/orangefs/file.c +++ b/fs/orangefs/file.c | |||
@@ -455,10 +455,10 @@ static ssize_t orangefs_file_write_iter(struct kiocb *iocb, struct iov_iter *ite | |||
455 | 455 | ||
456 | /* Make sure generic_write_checks sees an up to date inode size. */ | 456 | /* Make sure generic_write_checks sees an up to date inode size. */ |
457 | if (file->f_flags & O_APPEND) { | 457 | if (file->f_flags & O_APPEND) { |
458 | rc = orangefs_inode_getattr(file->f_mapping->host, | 458 | rc = orangefs_inode_old_getattr(file->f_mapping->host, |
459 | ORANGEFS_ATTR_SYS_SIZE, 0); | 459 | ORANGEFS_ATTR_SYS_SIZE, 0); |
460 | if (rc) { | 460 | if (rc) { |
461 | gossip_err("%s: orangefs_inode_getattr failed, rc:%zd:.\n", | 461 | gossip_err("%s: orangefs_inode_old_getattr failed, rc:%zd:.\n", |
462 | __func__, rc); | 462 | __func__, rc); |
463 | goto out; | 463 | goto out; |
464 | } | 464 | } |
@@ -670,7 +670,8 @@ static loff_t orangefs_file_llseek(struct file *file, loff_t offset, int origin) | |||
670 | * NOTE: We are only interested in file size here, | 670 | * NOTE: We are only interested in file size here, |
671 | * so we set mask accordingly. | 671 | * so we set mask accordingly. |
672 | */ | 672 | */ |
673 | ret = orangefs_inode_getattr(inode, ORANGEFS_ATTR_SYS_SIZE, 0); | 673 | ret = orangefs_inode_old_getattr(inode, |
674 | ORANGEFS_ATTR_SYS_SIZE, 0); | ||
674 | if (ret) { | 675 | if (ret) { |
675 | gossip_debug(GOSSIP_FILE_DEBUG, | 676 | gossip_debug(GOSSIP_FILE_DEBUG, |
676 | "%s:%s:%d calling make bad inode\n", | 677 | "%s:%s:%d calling make bad inode\n", |
diff --git a/fs/orangefs/inode.c b/fs/orangefs/inode.c index a45625240b17..fd591d44a97d 100644 --- a/fs/orangefs/inode.c +++ b/fs/orangefs/inode.c | |||
@@ -268,7 +268,8 @@ int orangefs_getattr(struct vfsmount *mnt, | |||
268 | "orangefs_getattr: called on %s\n", | 268 | "orangefs_getattr: called on %s\n", |
269 | dentry->d_name.name); | 269 | dentry->d_name.name); |
270 | 270 | ||
271 | ret = orangefs_inode_getattr(inode, ORANGEFS_ATTR_SYS_ALL_NOHINT, 0); | 271 | ret = orangefs_inode_old_getattr(inode, ORANGEFS_ATTR_SYS_ALL_NOHINT, |
272 | 0); | ||
272 | if (ret == 0) { | 273 | if (ret == 0) { |
273 | generic_fillattr(inode, kstat); | 274 | generic_fillattr(inode, kstat); |
274 | 275 | ||
@@ -299,7 +300,7 @@ int orangefs_permission(struct inode *inode, int mask) | |||
299 | gossip_debug(GOSSIP_INODE_DEBUG, "%s: refreshing\n", __func__); | 300 | gossip_debug(GOSSIP_INODE_DEBUG, "%s: refreshing\n", __func__); |
300 | 301 | ||
301 | /* Make sure the permission (and other common attrs) are up to date. */ | 302 | /* Make sure the permission (and other common attrs) are up to date. */ |
302 | ret = orangefs_inode_getattr(inode, | 303 | ret = orangefs_inode_old_getattr(inode, |
303 | ORANGEFS_ATTR_SYS_ALL_NOHINT_NOSIZE, 0); | 304 | ORANGEFS_ATTR_SYS_ALL_NOHINT_NOSIZE, 0); |
304 | if (ret < 0) | 305 | if (ret < 0) |
305 | return ret; | 306 | return ret; |
@@ -401,7 +402,7 @@ struct inode *orangefs_iget(struct super_block *sb, struct orangefs_object_kref | |||
401 | if (!inode || !(inode->i_state & I_NEW)) | 402 | if (!inode || !(inode->i_state & I_NEW)) |
402 | return inode; | 403 | return inode; |
403 | 404 | ||
404 | error = orangefs_inode_getattr(inode, | 405 | error = orangefs_inode_old_getattr(inode, |
405 | ORANGEFS_ATTR_SYS_ALL_NOHINT_NOSIZE, 0); | 406 | ORANGEFS_ATTR_SYS_ALL_NOHINT_NOSIZE, 0); |
406 | if (error) { | 407 | if (error) { |
407 | iget_failed(inode); | 408 | iget_failed(inode); |
@@ -447,7 +448,7 @@ struct inode *orangefs_new_inode(struct super_block *sb, struct inode *dir, | |||
447 | orangefs_set_inode(inode, ref); | 448 | orangefs_set_inode(inode, ref); |
448 | inode->i_ino = hash; /* needed for stat etc */ | 449 | inode->i_ino = hash; /* needed for stat etc */ |
449 | 450 | ||
450 | error = orangefs_inode_getattr(inode, | 451 | error = orangefs_inode_old_getattr(inode, |
451 | ORANGEFS_ATTR_SYS_ALL_NOHINT_NOSIZE, 0); | 452 | ORANGEFS_ATTR_SYS_ALL_NOHINT_NOSIZE, 0); |
452 | if (error) | 453 | if (error) |
453 | goto out_iput; | 454 | goto out_iput; |
diff --git a/fs/orangefs/orangefs-kernel.h b/fs/orangefs/orangefs-kernel.h index 784629870717..276685cdf38d 100644 --- a/fs/orangefs/orangefs-kernel.h +++ b/fs/orangefs/orangefs-kernel.h | |||
@@ -544,7 +544,9 @@ int orangefs_inode_setxattr(struct inode *inode, | |||
544 | size_t size, | 544 | size_t size, |
545 | int flags); | 545 | int flags); |
546 | 546 | ||
547 | int orangefs_inode_getattr(struct inode *inode, __u32 mask, int check); | 547 | int orangefs_inode_old_getattr(struct inode *inode, __u32 mask, int check); |
548 | |||
549 | int orangefs_inode_getattr(struct inode *inode, int new, int size); | ||
548 | 550 | ||
549 | int orangefs_inode_setattr(struct inode *inode, struct iattr *iattr); | 551 | int orangefs_inode_setattr(struct inode *inode, struct iattr *iattr); |
550 | 552 | ||
diff --git a/fs/orangefs/orangefs-utils.c b/fs/orangefs/orangefs-utils.c index df4ad04407e2..59c51e2c5a71 100644 --- a/fs/orangefs/orangefs-utils.c +++ b/fs/orangefs/orangefs-utils.c | |||
@@ -458,7 +458,8 @@ static int compare_attributes_to_inode(struct inode *inode, | |||
458 | * otherwise. When check is 1, returns 1 on success where the inode is valid | 458 | * otherwise. When check is 1, returns 1 on success where the inode is valid |
459 | * and 0 on success where the inode is stale and -errno otherwise. | 459 | * and 0 on success where the inode is stale and -errno otherwise. |
460 | */ | 460 | */ |
461 | int orangefs_inode_getattr(struct inode *inode, __u32 getattr_mask, int check) | 461 | int orangefs_inode_old_getattr(struct inode *inode, __u32 getattr_mask, |
462 | int check) | ||
462 | { | 463 | { |
463 | struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode); | 464 | struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode); |
464 | struct orangefs_kernel_op_s *new_op; | 465 | struct orangefs_kernel_op_s *new_op; |
@@ -536,6 +537,124 @@ out: | |||
536 | return ret; | 537 | return ret; |
537 | } | 538 | } |
538 | 539 | ||
540 | static int orangefs_inode_type(enum orangefs_ds_type objtype) | ||
541 | { | ||
542 | if (objtype == ORANGEFS_TYPE_METAFILE) | ||
543 | return S_IFREG; | ||
544 | else if (objtype == ORANGEFS_TYPE_DIRECTORY) | ||
545 | return S_IFDIR; | ||
546 | else if (objtype == ORANGEFS_TYPE_SYMLINK) | ||
547 | return S_IFLNK; | ||
548 | else | ||
549 | return -1; | ||
550 | } | ||
551 | |||
552 | int orangefs_inode_getattr(struct inode *inode, int new, int size) | ||
553 | { | ||
554 | struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode); | ||
555 | struct orangefs_kernel_op_s *new_op; | ||
556 | loff_t inode_size, rounded_up_size; | ||
557 | int ret; | ||
558 | |||
559 | gossip_debug(GOSSIP_UTILS_DEBUG, "%s: called on inode %pU\n", __func__, | ||
560 | get_khandle_from_ino(inode)); | ||
561 | |||
562 | new_op = op_alloc(ORANGEFS_VFS_OP_GETATTR); | ||
563 | if (!new_op) | ||
564 | return -ENOMEM; | ||
565 | new_op->upcall.req.getattr.refn = orangefs_inode->refn; | ||
566 | new_op->upcall.req.getattr.mask = size ? | ||
567 | ORANGEFS_ATTR_SYS_ALL_NOHINT : ORANGEFS_ATTR_SYS_ALL_NOHINT_NOSIZE; | ||
568 | |||
569 | ret = service_operation(new_op, __func__, | ||
570 | get_interruptible_flag(inode)); | ||
571 | if (ret != 0) | ||
572 | goto out; | ||
573 | |||
574 | ret = orangefs_inode_type(new_op-> | ||
575 | downcall.resp.getattr.attributes.objtype); | ||
576 | if (!new) { | ||
577 | /* | ||
578 | * If the inode type or symlink target have changed then this | ||
579 | * inode is stale. | ||
580 | */ | ||
581 | if (ret == -1 || !(inode->i_mode & ret)) { | ||
582 | orangefs_make_bad_inode(inode); | ||
583 | ret = -ESTALE; | ||
584 | goto out; | ||
585 | } | ||
586 | if (ret == S_IFLNK && strncmp(orangefs_inode->link_target, | ||
587 | new_op->downcall.resp.getattr.link_target, | ||
588 | ORANGEFS_NAME_MAX)) { | ||
589 | orangefs_make_bad_inode(inode); | ||
590 | ret = -ESTALE; | ||
591 | goto out; | ||
592 | } | ||
593 | } | ||
594 | |||
595 | switch (ret) { | ||
596 | case S_IFREG: | ||
597 | inode->i_flags = orangefs_inode_flags(&new_op-> | ||
598 | downcall.resp.getattr.attributes); | ||
599 | if (size) { | ||
600 | inode_size = (loff_t)new_op-> | ||
601 | downcall.resp.getattr.attributes.size; | ||
602 | rounded_up_size = | ||
603 | (inode_size + (4096 - (inode_size % 4096))); | ||
604 | inode->i_size = inode_size; | ||
605 | orangefs_inode->blksize = | ||
606 | new_op->downcall.resp.getattr.attributes.blksize; | ||
607 | spin_lock(&inode->i_lock); | ||
608 | inode->i_bytes = inode_size; | ||
609 | inode->i_blocks = | ||
610 | (unsigned long)(rounded_up_size / 512); | ||
611 | spin_unlock(&inode->i_lock); | ||
612 | } | ||
613 | break; | ||
614 | case S_IFDIR: | ||
615 | inode->i_size = PAGE_CACHE_SIZE; | ||
616 | orangefs_inode->blksize = (1 << inode->i_blkbits); | ||
617 | spin_lock(&inode->i_lock); | ||
618 | inode_set_bytes(inode, inode->i_size); | ||
619 | spin_unlock(&inode->i_lock); | ||
620 | set_nlink(inode, 1); | ||
621 | break; | ||
622 | case S_IFLNK: | ||
623 | if (new) { | ||
624 | inode->i_size = (loff_t)strlen(new_op-> | ||
625 | downcall.resp.getattr.link_target); | ||
626 | orangefs_inode->blksize = (1 << inode->i_blkbits); | ||
627 | strlcpy(orangefs_inode->link_target, | ||
628 | new_op->downcall.resp.getattr.link_target, | ||
629 | ORANGEFS_NAME_MAX); | ||
630 | } | ||
631 | break; | ||
632 | } | ||
633 | |||
634 | inode->i_uid = make_kuid(&init_user_ns, new_op-> | ||
635 | downcall.resp.getattr.attributes.owner); | ||
636 | inode->i_gid = make_kgid(&init_user_ns, new_op-> | ||
637 | downcall.resp.getattr.attributes.group); | ||
638 | inode->i_atime.tv_sec = (time64_t)new_op-> | ||
639 | downcall.resp.getattr.attributes.atime; | ||
640 | inode->i_mtime.tv_sec = (time64_t)new_op-> | ||
641 | downcall.resp.getattr.attributes.mtime; | ||
642 | inode->i_ctime.tv_sec = (time64_t)new_op-> | ||
643 | downcall.resp.getattr.attributes.ctime; | ||
644 | inode->i_atime.tv_nsec = 0; | ||
645 | inode->i_mtime.tv_nsec = 0; | ||
646 | inode->i_ctime.tv_nsec = 0; | ||
647 | |||
648 | /* special case: mark the root inode as sticky */ | ||
649 | inode->i_mode = ret | (is_root_handle(inode) ? S_ISVTX : 0) | | ||
650 | orangefs_inode_perms(&new_op->downcall.resp.getattr.attributes); | ||
651 | |||
652 | ret = 0; | ||
653 | out: | ||
654 | op_release(new_op); | ||
655 | return ret; | ||
656 | } | ||
657 | |||
539 | /* | 658 | /* |
540 | * issues a orangefs setattr request to make sure the new attribute values | 659 | * issues a orangefs setattr request to make sure the new attribute values |
541 | * take effect if successful. returns 0 on success; -errno otherwise | 660 | * take effect if successful. returns 0 on success; -errno otherwise |