]> err.no Git - linux-2.6/blobdiff - fs/nfs/nfs3proc.c
[PATCH] update kfree, vfree, and vunmap kerneldoc
[linux-2.6] / fs / nfs / nfs3proc.c
index d03bac0cc42f23b92f6465776e9a3438074bf725..2681485cf2d00f9f9fdd647a8bf1cd9861299104 100644 (file)
@@ -120,6 +120,8 @@ nfs3_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
        dprintk("NFS call  setattr\n");
        fattr->valid = 0;
        status = rpc_call(NFS_CLIENT(inode), NFS3PROC_SETATTR, &arg, fattr, 0);
+       if (status == 0)
+               nfs_setattr_update_inode(inode, sattr);
        dprintk("NFS reply setattr: %d\n", status);
        return status;
 }
@@ -314,7 +316,8 @@ nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
                .fh             = &fhandle,
                .fattr          = &fattr
        };
-       int                     status;
+       mode_t mode = sattr->ia_mode;
+       int status;
 
        dprintk("NFS call  create %s\n", dentry->d_name.name);
        arg.createmode = NFS3_CREATE_UNCHECKED;
@@ -324,6 +327,8 @@ nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
                arg.verifier[1] = current->pid;
        }
 
+       sattr->ia_mode &= ~current->fs->umask;
+
 again:
        dir_attr.valid = 0;
        fattr.valid = 0;
@@ -367,9 +372,14 @@ again:
                 * not sure this buys us anything (and I'd have
                 * to revamp the NFSv3 XDR code) */
                status = nfs3_proc_setattr(dentry, &fattr, sattr);
+               if (status == 0)
+                       nfs_setattr_update_inode(dentry->d_inode, sattr);
                nfs_refresh_inode(dentry->d_inode, &fattr);
                dprintk("NFS reply setattr (post-create): %d\n", status);
        }
+       if (status != 0)
+               goto out;
+       status = nfs3_proc_set_default_acl(dir, dentry->d_inode, mode);
 out:
        dprintk("NFS reply create: %d\n", status);
        return status;
@@ -539,15 +549,24 @@ nfs3_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr)
                .fh             = &fhandle,
                .fattr          = &fattr
        };
-       int                     status;
+       int mode = sattr->ia_mode;
+       int status;
 
        dprintk("NFS call  mkdir %s\n", dentry->d_name.name);
        dir_attr.valid = 0;
        fattr.valid = 0;
+
+       sattr->ia_mode &= ~current->fs->umask;
+
        status = rpc_call(NFS_CLIENT(dir), NFS3PROC_MKDIR, &arg, &res, 0);
        nfs_refresh_inode(dir, &dir_attr);
-       if (status == 0)
-               status = nfs_instantiate(dentry, &fhandle, &fattr);
+       if (status != 0)
+               goto out;
+       status = nfs_instantiate(dentry, &fhandle, &fattr);
+       if (status != 0)
+               goto out;
+       status = nfs3_proc_set_default_acl(dir, dentry->d_inode, mode);
+out:
        dprintk("NFS reply mkdir: %d\n", status);
        return status;
 }
@@ -642,6 +661,7 @@ nfs3_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
                .fh             = &fh,
                .fattr          = &fattr
        };
+       mode_t mode = sattr->ia_mode;
        int status;
 
        switch (sattr->ia_mode & S_IFMT) {
@@ -654,12 +674,20 @@ nfs3_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
 
        dprintk("NFS call  mknod %s %u:%u\n", dentry->d_name.name,
                        MAJOR(rdev), MINOR(rdev));
+
+       sattr->ia_mode &= ~current->fs->umask;
+
        dir_attr.valid = 0;
        fattr.valid = 0;
        status = rpc_call(NFS_CLIENT(dir), NFS3PROC_MKNOD, &arg, &res, 0);
        nfs_refresh_inode(dir, &dir_attr);
-       if (status == 0)
-               status = nfs_instantiate(dentry, &fh, &fattr);
+       if (status != 0)
+               goto out;
+       status = nfs_instantiate(dentry, &fh, &fattr);
+       if (status != 0)
+               goto out;
+       status = nfs3_proc_set_default_acl(dir, dentry->d_inode, mode);
+out:
        dprintk("NFS reply mknod: %d\n", status);
        return status;
 }
@@ -858,4 +886,5 @@ struct nfs_rpc_ops  nfs_v3_clientops = {
        .file_open      = nfs_open,
        .file_release   = nfs_release,
        .lock           = nfs3_proc_lock,
+       .clear_acl_cache = nfs3_forget_cached_acls,
 };