aboutsummaryrefslogtreecommitdiffstats
path: root/fs/orangefs
diff options
context:
space:
mode:
authorMartin Brandenburg <martin@omnibond.com>2016-03-15 11:28:20 -0400
committerMike Marshall <hubcap@omnibond.com>2016-03-23 17:36:14 -0400
commit3c9cf98d7b4f27e4303ea6e67db7f0c343a575b6 (patch)
tree88e392fbcce753bc8770b8b70c779ba4be4d2d09 /fs/orangefs
parentd57521a653e7ac2e8edaabfff202caf87c61f08a (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.c2
-rw-r--r--fs/orangefs/file.c7
-rw-r--r--fs/orangefs/inode.c9
-rw-r--r--fs/orangefs/orangefs-kernel.h4
-rw-r--r--fs/orangefs/orangefs-utils.c121
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
547int orangefs_inode_getattr(struct inode *inode, __u32 mask, int check); 547int orangefs_inode_old_getattr(struct inode *inode, __u32 mask, int check);
548
549int orangefs_inode_getattr(struct inode *inode, int new, int size);
548 550
549int orangefs_inode_setattr(struct inode *inode, struct iattr *iattr); 551int 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 */
461int orangefs_inode_getattr(struct inode *inode, __u32 getattr_mask, int check) 461int 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
540static 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
552int 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;
653out:
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