]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] too many setattr calls from VFS layer
authorChuck Lever <cel@citi.umich.edu>
Thu, 7 Nov 2002 08:43:31 +0000 (00:43 -0800)
committerLinus Torvalds <torvalds@penguin.transmeta.com>
Thu, 7 Nov 2002 08:43:31 +0000 (00:43 -0800)
New code in 2.5 VFS layer invokes notify_change to clear the suid and
sgid bits for every write request.  notify_change needs to optimize out
calls to ->setattr that don't do anything, because for many network file
systems, an on-the-wire SETATTR request is generated for every ->setattr
call, resulting in unnecessary latency for NFS writes.

fs/attr.c

index 1b44201b410b1ec8b4b00730b5d97f050db2f8cf..b262574207e12ba4ac7edbba362a478b962712b3 100644 (file)
--- a/fs/attr.c
+++ b/fs/attr.c
@@ -134,6 +134,7 @@ int notify_change(struct dentry * dentry, struct iattr * attr)
        if (!(ia_valid & ATTR_MTIME_SET))
                attr->ia_mtime = now;
        if (ia_valid & ATTR_KILL_SUID) {
+               attr->ia_valid &= ~ATTR_KILL_SUID;
                if (mode & S_ISUID) {
                        if (!(ia_valid & ATTR_MODE)) {
                                ia_valid = attr->ia_valid |= ATTR_MODE;
@@ -143,6 +144,7 @@ int notify_change(struct dentry * dentry, struct iattr * attr)
                }
        }
        if (ia_valid & ATTR_KILL_SGID) {
+               attr->ia_valid &= ~ ATTR_KILL_SGID;
                if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
                        if (!(ia_valid & ATTR_MODE)) {
                                ia_valid = attr->ia_valid |= ATTR_MODE;
@@ -151,6 +153,8 @@ int notify_change(struct dentry * dentry, struct iattr * attr)
                        attr->ia_mode &= ~S_ISGID;
                }
        }
+       if (!attr->ia_valid)
+               return 0;
 
        if (inode->i_op && inode->i_op->setattr) {
                error = security_ops->inode_setattr(dentry, attr);