orangefs: update attributes rather than relying on server
authorMartin Brandenburg <martin@omnibond.com>
Mon, 12 Feb 2018 15:49:24 +0000 (15:49 +0000)
committerMike Marshall <hubcap@omnibond.com>
Fri, 3 May 2019 18:32:38 +0000 (14:32 -0400)
This should be a no-op now, but once inode writeback works, it'll be
necessary to have the correct attribute in the dirty inode.

Previously the attribute fetch timeout was marked invalid and the server
provided the updated attribute.  When the inode is dirty, the server
cannot be consulted since it does not yet know the pending setattr.

Signed-off-by: Martin Brandenburg <martin@omnibond.com>
Signed-off-by: Mike Marshall <hubcap@omnibond.com>
fs/orangefs/file.c
fs/orangefs/namei.c

index b0688ea894a493d510c8866bf3fac36fdad480d8..a9e69c56d2fb3fdbba204fc408ad2e1cd28e3912 100644 (file)
@@ -327,14 +327,8 @@ out:
                        file_accessed(file);
                } else {
                        file_update_time(file);
-                       /*
-                        * Must invalidate to ensure write loop doesn't
-                        * prevent kernel from reading updated
-                        * attribute.  Size probably changed because of
-                        * the write, and other clients could update
-                        * any other attribute.
-                        */
-                       orangefs_inode->getattr_time = jiffies - 1;
+                       if (*offset > i_size_read(inode))
+                               i_size_write(inode, *offset);
                }
        }
 
index 87584d79ca7afa95908e25f737bef3c03d877976..140314b76e105f733f3c947e43fc76bfee63d90f 100644 (file)
@@ -383,6 +383,7 @@ static int orangefs_rename(struct inode *old_dir,
                        unsigned int flags)
 {
        struct orangefs_kernel_op_s *new_op;
+       struct iattr iattr;
        int ret;
 
        if (flags)
@@ -392,7 +393,11 @@ static int orangefs_rename(struct inode *old_dir,
                     "orangefs_rename: called (%pd2 => %pd2) ct=%d\n",
                     old_dentry, new_dentry, d_count(new_dentry));
 
-       ORANGEFS_I(new_dentry->d_parent->d_inode)->getattr_time = jiffies - 1;
+       new_dir->i_mtime = new_dir->i_ctime = current_time(new_dir);
+       memset(&iattr, 0, sizeof iattr);
+       iattr.ia_valid |= ATTR_MTIME;
+       orangefs_inode_setattr(new_dir, &iattr);
+       mark_inode_dirty_sync(new_dir);
 
        new_op = op_alloc(ORANGEFS_VFS_OP_RENAME);
        if (!new_op)