inode.c | 9 +++++++++ 1 files changed, 9 insertions(+) diff -u --recursive --new-file --show-c-function linux-2.6.1-rc2/fs/nfs/inode.c linux-2.6.1-01-fix_setattr/fs/nfs/inode.c --- linux-2.6.1-rc2/fs/nfs/inode.c 2004-01-07 22:57:48.000000000 -0500 +++ linux-2.6.1-01-fix_setattr/fs/nfs/inode.c 2004-01-08 00:22:49.000000000 -0500 @@ -791,6 +791,8 @@ out_no_inode: goto out; } +#define NFS_VALID_ATTRS (ATTR_MODE|ATTR_UID|ATTR_GID|ATTR_SIZE|ATTR_ATIME|ATTR_ATIME_SET|ATTR_MTIME|ATTR_MTIME_SET) + int nfs_setattr(struct dentry *dentry, struct iattr *attr) { @@ -798,6 +800,11 @@ nfs_setattr(struct dentry *dentry, struc struct nfs_fattr fattr; int error; + /* Optimization: if the end result is no change, don't RPC */ + attr->ia_valid &= NFS_VALID_ATTRS; + if (attr->ia_valid == 0) + return 0; + lock_kernel(); /* @@ -813,6 +820,8 @@ printk("nfs_setattr: revalidate failed, if (!S_ISREG(inode->i_mode)) { attr->ia_valid &= ~ATTR_SIZE; + if (attr->ia_valid == 0) + goto out; } else { filemap_fdatawrite(inode->i_mapping); error = nfs_wb_all(inode);