ornagefs: ensure that truncate has an up to date inode size
authorMartin Brandenburg <martin@omnibond.com>
Wed, 23 Mar 2016 21:06:25 +0000 (17:06 -0400)
committerMike Marshall <hubcap@omnibond.com>
Wed, 23 Mar 2016 21:36:16 +0000 (17:36 -0400)
Signed-off-by: Martin Brandenburg <martin@omnibond.com>
Signed-off-by: Mike Marshall <hubcap@omnibond.com>
fs/orangefs/inode.c

index 2e521ec..2382e26 100644 (file)
@@ -157,7 +157,7 @@ static int orangefs_setattr_size(struct inode *inode, struct iattr *iattr)
 {
        struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode);
        struct orangefs_kernel_op_s *new_op;
-       loff_t orig_size = i_size_read(inode);
+       loff_t orig_size;
        int ret = -EINVAL;
 
        gossip_debug(GOSSIP_INODE_DEBUG,
@@ -168,6 +168,17 @@ static int orangefs_setattr_size(struct inode *inode, struct iattr *iattr)
                     orangefs_inode->refn.fs_id,
                     iattr->ia_size);
 
+       /* Ensure that we have a up to date size, so we know if it changed. */
+       ret = orangefs_inode_getattr(inode, 0, 1);
+       if (ret == -ESTALE)
+               ret = -EIO;
+       if (ret) {
+               gossip_err("%s: orangefs_inode_getattr failed, ret:%d:.\n",
+                   __func__, ret);
+               return ret;
+       }
+       orig_size = i_size_read(inode);
+
        truncate_setsize(inode, iattr->ia_size);
 
        new_op = op_alloc(ORANGEFS_VFS_OP_TRUNCATE);