]> git.baikalelectronics.ru Git - kernel.git/commitdiff
NFS: Avoid duplicate resets of attribute cache timeouts
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Sat, 26 Jun 2021 15:07:59 +0000 (11:07 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sat, 26 Jun 2021 16:13:40 +0000 (12:13 -0400)
We know that the attributes changed on the server if and only if the
change attribute is different. Otherwise, we're just refreshing our
cache with values that were already known to be stale.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/inode.c

index 327f9ae4dd3f64d7c2084f86525c324e6fc8a496..2824acfe4ff948fc6cbb1198303668d1bcbc3615 100644 (file)
@@ -2055,13 +2055,13 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
                                        | NFS_INO_INVALID_OTHER;
                                if (S_ISDIR(inode->i_mode))
                                        nfs_force_lookup_revalidate(inode);
+                               attr_changed = true;
                                dprintk("NFS: change_attr change on server for file %s/%ld\n",
                                                inode->i_sb->s_id,
                                                inode->i_ino);
                        } else if (!have_delegation)
                                nfsi->cache_validity |= NFS_INO_DATA_INVAL_DEFER;
                        inode_set_iversion_raw(inode, fattr->change_attr);
-                       attr_changed = true;
                }
        } else {
                nfsi->cache_validity |=
@@ -2094,7 +2094,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
                                i_size_write(inode, new_isize);
                                if (!have_writers)
                                        invalid |= NFS_INO_INVALID_DATA;
-                               attr_changed = true;
                        }
                        dprintk("NFS: isize change on server for file %s/%ld "
                                        "(%Ld to %Ld)\n",
@@ -2126,7 +2125,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
                        inode->i_mode = newmode;
                        invalid |= NFS_INO_INVALID_ACCESS
                                | NFS_INO_INVALID_ACL;
-                       attr_changed = true;
                }
        } else if (fattr_supported & NFS_ATTR_FATTR_MODE)
                nfsi->cache_validity |=
@@ -2137,7 +2135,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
                        invalid |= NFS_INO_INVALID_ACCESS
                                | NFS_INO_INVALID_ACL;
                        inode->i_uid = fattr->uid;
-                       attr_changed = true;
                }
        } else if (fattr_supported & NFS_ATTR_FATTR_OWNER)
                nfsi->cache_validity |=
@@ -2148,7 +2145,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
                        invalid |= NFS_INO_INVALID_ACCESS
                                | NFS_INO_INVALID_ACL;
                        inode->i_gid = fattr->gid;
-                       attr_changed = true;
                }
        } else if (fattr_supported & NFS_ATTR_FATTR_GROUP)
                nfsi->cache_validity |=
@@ -2159,7 +2155,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
                        if (S_ISDIR(inode->i_mode))
                                invalid |= NFS_INO_INVALID_DATA;
                        set_nlink(inode, fattr->nlink);
-                       attr_changed = true;
                }
        } else if (fattr_supported & NFS_ATTR_FATTR_NLINK)
                nfsi->cache_validity |=