diff options
Diffstat (limited to 'fs/nfs/nfs3proc.c')
-rw-r--r-- | fs/nfs/nfs3proc.c | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c index 3878494dfc2c..7851569b31c6 100644 --- a/fs/nfs/nfs3proc.c +++ b/fs/nfs/nfs3proc.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/nfs_page.h> | 17 | #include <linux/nfs_page.h> |
18 | #include <linux/lockd/bind.h> | 18 | #include <linux/lockd/bind.h> |
19 | #include <linux/smp_lock.h> | 19 | #include <linux/smp_lock.h> |
20 | #include <linux/nfs_mount.h> | ||
20 | 21 | ||
21 | #define NFSDBG_FACILITY NFSDBG_PROC | 22 | #define NFSDBG_FACILITY NFSDBG_PROC |
22 | 23 | ||
@@ -45,7 +46,7 @@ static inline int | |||
45 | nfs3_rpc_call_wrapper(struct rpc_clnt *clnt, u32 proc, void *argp, void *resp, int flags) | 46 | nfs3_rpc_call_wrapper(struct rpc_clnt *clnt, u32 proc, void *argp, void *resp, int flags) |
46 | { | 47 | { |
47 | struct rpc_message msg = { | 48 | struct rpc_message msg = { |
48 | .rpc_proc = &nfs3_procedures[proc], | 49 | .rpc_proc = &clnt->cl_procinfo[proc], |
49 | .rpc_argp = argp, | 50 | .rpc_argp = argp, |
50 | .rpc_resp = resp, | 51 | .rpc_resp = resp, |
51 | }; | 52 | }; |
@@ -313,7 +314,8 @@ nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, | |||
313 | .fh = &fhandle, | 314 | .fh = &fhandle, |
314 | .fattr = &fattr | 315 | .fattr = &fattr |
315 | }; | 316 | }; |
316 | int status; | 317 | mode_t mode = sattr->ia_mode; |
318 | int status; | ||
317 | 319 | ||
318 | dprintk("NFS call create %s\n", dentry->d_name.name); | 320 | dprintk("NFS call create %s\n", dentry->d_name.name); |
319 | arg.createmode = NFS3_CREATE_UNCHECKED; | 321 | arg.createmode = NFS3_CREATE_UNCHECKED; |
@@ -323,6 +325,8 @@ nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, | |||
323 | arg.verifier[1] = current->pid; | 325 | arg.verifier[1] = current->pid; |
324 | } | 326 | } |
325 | 327 | ||
328 | sattr->ia_mode &= ~current->fs->umask; | ||
329 | |||
326 | again: | 330 | again: |
327 | dir_attr.valid = 0; | 331 | dir_attr.valid = 0; |
328 | fattr.valid = 0; | 332 | fattr.valid = 0; |
@@ -369,6 +373,9 @@ again: | |||
369 | nfs_refresh_inode(dentry->d_inode, &fattr); | 373 | nfs_refresh_inode(dentry->d_inode, &fattr); |
370 | dprintk("NFS reply setattr (post-create): %d\n", status); | 374 | dprintk("NFS reply setattr (post-create): %d\n", status); |
371 | } | 375 | } |
376 | if (status != 0) | ||
377 | goto out; | ||
378 | status = nfs3_proc_set_default_acl(dir, dentry->d_inode, mode); | ||
372 | out: | 379 | out: |
373 | dprintk("NFS reply create: %d\n", status); | 380 | dprintk("NFS reply create: %d\n", status); |
374 | return status; | 381 | return status; |
@@ -538,15 +545,24 @@ nfs3_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr) | |||
538 | .fh = &fhandle, | 545 | .fh = &fhandle, |
539 | .fattr = &fattr | 546 | .fattr = &fattr |
540 | }; | 547 | }; |
541 | int status; | 548 | int mode = sattr->ia_mode; |
549 | int status; | ||
542 | 550 | ||
543 | dprintk("NFS call mkdir %s\n", dentry->d_name.name); | 551 | dprintk("NFS call mkdir %s\n", dentry->d_name.name); |
544 | dir_attr.valid = 0; | 552 | dir_attr.valid = 0; |
545 | fattr.valid = 0; | 553 | fattr.valid = 0; |
554 | |||
555 | sattr->ia_mode &= ~current->fs->umask; | ||
556 | |||
546 | status = rpc_call(NFS_CLIENT(dir), NFS3PROC_MKDIR, &arg, &res, 0); | 557 | status = rpc_call(NFS_CLIENT(dir), NFS3PROC_MKDIR, &arg, &res, 0); |
547 | nfs_refresh_inode(dir, &dir_attr); | 558 | nfs_refresh_inode(dir, &dir_attr); |
548 | if (status == 0) | 559 | if (status != 0) |
549 | status = nfs_instantiate(dentry, &fhandle, &fattr); | 560 | goto out; |
561 | status = nfs_instantiate(dentry, &fhandle, &fattr); | ||
562 | if (status != 0) | ||
563 | goto out; | ||
564 | status = nfs3_proc_set_default_acl(dir, dentry->d_inode, mode); | ||
565 | out: | ||
550 | dprintk("NFS reply mkdir: %d\n", status); | 566 | dprintk("NFS reply mkdir: %d\n", status); |
551 | return status; | 567 | return status; |
552 | } | 568 | } |
@@ -641,6 +657,7 @@ nfs3_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr, | |||
641 | .fh = &fh, | 657 | .fh = &fh, |
642 | .fattr = &fattr | 658 | .fattr = &fattr |
643 | }; | 659 | }; |
660 | mode_t mode = sattr->ia_mode; | ||
644 | int status; | 661 | int status; |
645 | 662 | ||
646 | switch (sattr->ia_mode & S_IFMT) { | 663 | switch (sattr->ia_mode & S_IFMT) { |
@@ -653,12 +670,20 @@ nfs3_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr, | |||
653 | 670 | ||
654 | dprintk("NFS call mknod %s %u:%u\n", dentry->d_name.name, | 671 | dprintk("NFS call mknod %s %u:%u\n", dentry->d_name.name, |
655 | MAJOR(rdev), MINOR(rdev)); | 672 | MAJOR(rdev), MINOR(rdev)); |
673 | |||
674 | sattr->ia_mode &= ~current->fs->umask; | ||
675 | |||
656 | dir_attr.valid = 0; | 676 | dir_attr.valid = 0; |
657 | fattr.valid = 0; | 677 | fattr.valid = 0; |
658 | status = rpc_call(NFS_CLIENT(dir), NFS3PROC_MKNOD, &arg, &res, 0); | 678 | status = rpc_call(NFS_CLIENT(dir), NFS3PROC_MKNOD, &arg, &res, 0); |
659 | nfs_refresh_inode(dir, &dir_attr); | 679 | nfs_refresh_inode(dir, &dir_attr); |
660 | if (status == 0) | 680 | if (status != 0) |
661 | status = nfs_instantiate(dentry, &fh, &fattr); | 681 | goto out; |
682 | status = nfs_instantiate(dentry, &fh, &fattr); | ||
683 | if (status != 0) | ||
684 | goto out; | ||
685 | status = nfs3_proc_set_default_acl(dir, dentry->d_inode, mode); | ||
686 | out: | ||
662 | dprintk("NFS reply mknod: %d\n", status); | 687 | dprintk("NFS reply mknod: %d\n", status); |
663 | return status; | 688 | return status; |
664 | } | 689 | } |
@@ -825,7 +850,8 @@ nfs3_proc_lock(struct file *filp, int cmd, struct file_lock *fl) | |||
825 | struct nfs_rpc_ops nfs_v3_clientops = { | 850 | struct nfs_rpc_ops nfs_v3_clientops = { |
826 | .version = 3, /* protocol version */ | 851 | .version = 3, /* protocol version */ |
827 | .dentry_ops = &nfs_dentry_operations, | 852 | .dentry_ops = &nfs_dentry_operations, |
828 | .dir_inode_ops = &nfs_dir_inode_operations, | 853 | .dir_inode_ops = &nfs3_dir_inode_operations, |
854 | .file_inode_ops = &nfs3_file_inode_operations, | ||
829 | .getroot = nfs3_proc_get_root, | 855 | .getroot = nfs3_proc_get_root, |
830 | .getattr = nfs3_proc_getattr, | 856 | .getattr = nfs3_proc_getattr, |
831 | .setattr = nfs3_proc_setattr, | 857 | .setattr = nfs3_proc_setattr, |
@@ -856,4 +882,5 @@ struct nfs_rpc_ops nfs_v3_clientops = { | |||
856 | .file_open = nfs_open, | 882 | .file_open = nfs_open, |
857 | .file_release = nfs_release, | 883 | .file_release = nfs_release, |
858 | .lock = nfs3_proc_lock, | 884 | .lock = nfs3_proc_lock, |
885 | .clear_acl_cache = nfs3_forget_cached_acls, | ||
859 | }; | 886 | }; |