aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Eshel <eshel@almaden.ibm.com>2006-11-28 16:26:41 -0500
committerJ. Bruce Fields <bfields@citi.umich.edu>2007-05-06 20:38:49 -0400
commitfd85b8170dabbf021987875ef7f903791f4f181e (patch)
tree9899d2e3e3cd3ac60ed5638add79e39045817e41
parent9b9d2ab4154a42ea4a119f7d3e4e0288bfe0bb79 (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.c20
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 /*