diff options
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/dir.c | 3 | ||||
-rw-r--r-- | fs/nfs/file.c | 6 | ||||
-rw-r--r-- | fs/nfs/super.c | 22 |
3 files changed, 16 insertions, 15 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 370b190a09d1..89f98e9a024b 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
@@ -1943,7 +1943,8 @@ int nfs_permission(struct inode *inode, int mask) | |||
1943 | case S_IFREG: | 1943 | case S_IFREG: |
1944 | /* NFSv4 has atomic_open... */ | 1944 | /* NFSv4 has atomic_open... */ |
1945 | if (nfs_server_capable(inode, NFS_CAP_ATOMIC_OPEN) | 1945 | if (nfs_server_capable(inode, NFS_CAP_ATOMIC_OPEN) |
1946 | && (mask & MAY_OPEN)) | 1946 | && (mask & MAY_OPEN) |
1947 | && !(mask & MAY_EXEC)) | ||
1947 | goto out; | 1948 | goto out; |
1948 | break; | 1949 | break; |
1949 | case S_IFDIR: | 1950 | case S_IFDIR: |
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 5a97bcfe03e5..ec7e27d00bc6 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
@@ -517,10 +517,10 @@ static int nfs_vm_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
517 | 517 | ||
518 | ret = nfs_updatepage(filp, page, 0, pagelen); | 518 | ret = nfs_updatepage(filp, page, 0, pagelen); |
519 | out_unlock: | 519 | out_unlock: |
520 | if (!ret) | ||
521 | return VM_FAULT_LOCKED; | ||
520 | unlock_page(page); | 522 | unlock_page(page); |
521 | if (ret) | 523 | return VM_FAULT_SIGBUS; |
522 | ret = VM_FAULT_SIGBUS; | ||
523 | return ret; | ||
524 | } | 524 | } |
525 | 525 | ||
526 | static struct vm_operations_struct nfs_file_vm_ops = { | 526 | static struct vm_operations_struct nfs_file_vm_ops = { |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 6717200923fe..d2d67781c579 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
@@ -683,9 +683,12 @@ static int nfs_show_stats(struct seq_file *m, struct vfsmount *mnt) | |||
683 | */ | 683 | */ |
684 | static void nfs_umount_begin(struct super_block *sb) | 684 | static void nfs_umount_begin(struct super_block *sb) |
685 | { | 685 | { |
686 | struct nfs_server *server = NFS_SB(sb); | 686 | struct nfs_server *server; |
687 | struct rpc_clnt *rpc; | 687 | struct rpc_clnt *rpc; |
688 | 688 | ||
689 | lock_kernel(); | ||
690 | |||
691 | server = NFS_SB(sb); | ||
689 | /* -EIO all pending I/O */ | 692 | /* -EIO all pending I/O */ |
690 | rpc = server->client_acl; | 693 | rpc = server->client_acl; |
691 | if (!IS_ERR(rpc)) | 694 | if (!IS_ERR(rpc)) |
@@ -693,6 +696,8 @@ static void nfs_umount_begin(struct super_block *sb) | |||
693 | rpc = server->client; | 696 | rpc = server->client; |
694 | if (!IS_ERR(rpc)) | 697 | if (!IS_ERR(rpc)) |
695 | rpc_killall_tasks(rpc); | 698 | rpc_killall_tasks(rpc); |
699 | |||
700 | unlock_kernel(); | ||
696 | } | 701 | } |
697 | 702 | ||
698 | /* | 703 | /* |
@@ -2106,8 +2111,7 @@ out_err_nosb: | |||
2106 | error_splat_root: | 2111 | error_splat_root: |
2107 | dput(mntroot); | 2112 | dput(mntroot); |
2108 | error_splat_super: | 2113 | error_splat_super: |
2109 | up_write(&s->s_umount); | 2114 | deactivate_locked_super(s); |
2110 | deactivate_super(s); | ||
2111 | goto out; | 2115 | goto out; |
2112 | } | 2116 | } |
2113 | 2117 | ||
@@ -2203,8 +2207,7 @@ out_err_noserver: | |||
2203 | return error; | 2207 | return error; |
2204 | 2208 | ||
2205 | error_splat_super: | 2209 | error_splat_super: |
2206 | up_write(&s->s_umount); | 2210 | deactivate_locked_super(s); |
2207 | deactivate_super(s); | ||
2208 | dprintk("<-- nfs_xdev_get_sb() = %d [splat]\n", error); | 2211 | dprintk("<-- nfs_xdev_get_sb() = %d [splat]\n", error); |
2209 | return error; | 2212 | return error; |
2210 | } | 2213 | } |
@@ -2464,8 +2467,7 @@ out_free: | |||
2464 | error_splat_root: | 2467 | error_splat_root: |
2465 | dput(mntroot); | 2468 | dput(mntroot); |
2466 | error_splat_super: | 2469 | error_splat_super: |
2467 | up_write(&s->s_umount); | 2470 | deactivate_locked_super(s); |
2468 | deactivate_super(s); | ||
2469 | goto out; | 2471 | goto out; |
2470 | } | 2472 | } |
2471 | 2473 | ||
@@ -2559,8 +2561,7 @@ out_err_noserver: | |||
2559 | return error; | 2561 | return error; |
2560 | 2562 | ||
2561 | error_splat_super: | 2563 | error_splat_super: |
2562 | up_write(&s->s_umount); | 2564 | deactivate_locked_super(s); |
2563 | deactivate_super(s); | ||
2564 | dprintk("<-- nfs4_xdev_get_sb() = %d [splat]\n", error); | 2565 | dprintk("<-- nfs4_xdev_get_sb() = %d [splat]\n", error); |
2565 | return error; | 2566 | return error; |
2566 | } | 2567 | } |
@@ -2644,8 +2645,7 @@ out_err_noserver: | |||
2644 | return error; | 2645 | return error; |
2645 | 2646 | ||
2646 | error_splat_super: | 2647 | error_splat_super: |
2647 | up_write(&s->s_umount); | 2648 | deactivate_locked_super(s); |
2648 | deactivate_super(s); | ||
2649 | dprintk("<-- nfs4_referral_get_sb() = %d [splat]\n", error); | 2649 | dprintk("<-- nfs4_referral_get_sb() = %d [splat]\n", error); |
2650 | return error; | 2650 | return error; |
2651 | } | 2651 | } |