diff options
| author | Marc Eshel <eshel@almaden.ibm.com> | 2006-11-28 16:26:41 -0500 |
|---|---|---|
| committer | J. Bruce Fields <bfields@citi.umich.edu> | 2007-05-06 20:38:49 -0400 |
| commit | fd85b8170dabbf021987875ef7f903791f4f181e (patch) | |
| tree | 9899d2e3e3cd3ac60ed5638add79e39045817e41 | |
| parent | 9b9d2ab4154a42ea4a119f7d3e4e0288bfe0bb79 (diff) | |
nfsd4: Convert NFSv4 to new lock interface
Convert NFSv4 to the new lock interface. We don't define any callback for now,
so we're not taking advantage of the asynchronous feature--that's less critical
for the multi-threaded nfsd then it is for the single-threaded lockd. But this
does allow a cluster filesystems to export cluster-coherent locking to NFS.
Note that it's cluster filesystems that are the issue--of the filesystems that
define lock methods (nfs, cifs, etc.), most are not exportable by nfsd.
Signed-off-by: Marc Eshel <eshel@almaden.ibm.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
| -rw-r--r-- | fs/nfsd/nfs4state.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 03b0578781cb..678f3be88ac0 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
| @@ -50,6 +50,7 @@ | |||
| 50 | #include <linux/nfsd/xdr4.h> | 50 | #include <linux/nfsd/xdr4.h> |
| 51 | #include <linux/namei.h> | 51 | #include <linux/namei.h> |
| 52 | #include <linux/mutex.h> | 52 | #include <linux/mutex.h> |
| 53 | #include <linux/lockd/bind.h> | ||
| 53 | 54 | ||
| 54 | #define NFSDDBG_FACILITY NFSDDBG_PROC | 55 | #define NFSDDBG_FACILITY NFSDDBG_PROC |
| 55 | 56 | ||
| @@ -2773,7 +2774,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
| 2773 | /* XXX?: Just to divert the locks_release_private at the start of | 2774 | /* XXX?: Just to divert the locks_release_private at the start of |
| 2774 | * locks_copy_lock: */ | 2775 | * locks_copy_lock: */ |
| 2775 | locks_init_lock(&conflock); | 2776 | locks_init_lock(&conflock); |
| 2776 | err = posix_lock_file(filp, &file_lock, &conflock); | 2777 | err = vfs_lock_file(filp, cmd, &file_lock, &conflock); |
| 2777 | switch (-err) { | 2778 | switch (-err) { |
| 2778 | case 0: /* success! */ | 2779 | case 0: /* success! */ |
| 2779 | update_stateid(&lock_stp->st_stateid); | 2780 | update_stateid(&lock_stp->st_stateid); |
| @@ -2790,7 +2791,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
| 2790 | status = nfserr_deadlock; | 2791 | status = nfserr_deadlock; |
| 2791 | break; | 2792 | break; |
| 2792 | default: | 2793 | default: |
| 2793 | dprintk("NFSD: nfsd4_lock: posix_lock_file_conf() failed! status %d\n",err); | 2794 | dprintk("NFSD: nfsd4_lock: vfs_lock_file() failed! status %d\n",err); |
| 2794 | status = nfserr_resource; | 2795 | status = nfserr_resource; |
| 2795 | break; | 2796 | break; |
| 2796 | } | 2797 | } |
| @@ -2815,6 +2816,7 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
| 2815 | struct inode *inode; | 2816 | struct inode *inode; |
| 2816 | struct file file; | 2817 | struct file file; |
| 2817 | struct file_lock file_lock; | 2818 | struct file_lock file_lock; |
| 2819 | int error; | ||
| 2818 | __be32 status; | 2820 | __be32 status; |
| 2819 | 2821 | ||
| 2820 | if (nfs4_in_grace()) | 2822 | if (nfs4_in_grace()) |
| @@ -2870,16 +2872,20 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
| 2870 | 2872 | ||
| 2871 | nfs4_transform_lock_offset(&file_lock); | 2873 | nfs4_transform_lock_offset(&file_lock); |
| 2872 | 2874 | ||
| 2873 | /* posix_test_lock uses the struct file _only_ to resolve the inode. | 2875 | /* vfs_test_lock uses the struct file _only_ to resolve the inode. |
| 2874 | * since LOCKT doesn't require an OPEN, and therefore a struct | 2876 | * since LOCKT doesn't require an OPEN, and therefore a struct |
| 2875 | * file may not exist, pass posix_test_lock a struct file with | 2877 | * file may not exist, pass vfs_test_lock a struct file with |
| 2876 | * only the dentry:inode set. | 2878 | * only the dentry:inode set. |
| 2877 | */ | 2879 | */ |
| 2878 | memset(&file, 0, sizeof (struct file)); | 2880 | memset(&file, 0, sizeof (struct file)); |
| 2879 | file.f_path.dentry = cstate->current_fh.fh_dentry; | 2881 | file.f_path.dentry = cstate->current_fh.fh_dentry; |
| 2880 | 2882 | ||
| 2881 | status = nfs_ok; | 2883 | status = nfs_ok; |
| 2882 | posix_test_lock(&file, &file_lock); | 2884 | error = vfs_test_lock(&file, &file_lock); |
| 2885 | if (error) { | ||
| 2886 | status = nfserrno(error); | ||
| 2887 | goto out; | ||
| 2888 | } | ||
| 2883 | if (file_lock.fl_type != F_UNLCK) { | 2889 | if (file_lock.fl_type != F_UNLCK) { |
| 2884 | status = nfserr_denied; | 2890 | status = nfserr_denied; |
| 2885 | nfs4_set_lock_denied(&file_lock, &lockt->lt_denied); | 2891 | nfs4_set_lock_denied(&file_lock, &lockt->lt_denied); |
| @@ -2935,9 +2941,9 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
| 2935 | /* | 2941 | /* |
| 2936 | * Try to unlock the file in the VFS. | 2942 | * Try to unlock the file in the VFS. |
| 2937 | */ | 2943 | */ |
| 2938 | err = posix_lock_file(filp, &file_lock, NULL); | 2944 | err = vfs_lock_file(filp, F_SETLK, &file_lock, NULL); |
| 2939 | if (err) { | 2945 | if (err) { |
| 2940 | dprintk("NFSD: nfs4_locku: posix_lock_file failed!\n"); | 2946 | dprintk("NFSD: nfs4_locku: vfs_lock_file failed!\n"); |
| 2941 | goto out_nfserr; | 2947 | goto out_nfserr; |
| 2942 | } | 2948 | } |
| 2943 | /* | 2949 | /* |
