]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/nfsd/nfs4state.c
[PATCH] kdump: enable CONFIG_PROC_VMCORE by default
[linux-2.6-omap-h63xx.git] / fs / nfsd / nfs4state.c
index f6ab762bea991f1289063e47aa771bb3a1c69a8e..47ec112b266cf7a7c819babd881eb5176b7b4364 100644 (file)
@@ -49,6 +49,7 @@
 #include <linux/nfsd/state.h>
 #include <linux/nfsd/xdr4.h>
 #include <linux/namei.h>
+#include <linux/mutex.h>
 
 #define NFSDDBG_FACILITY                NFSDDBG_PROC
 
@@ -77,11 +78,11 @@ static void nfs4_set_recdir(char *recdir);
 
 /* Locking:
  *
- * client_sema: 
+ * client_mutex:
  *     protects clientid_hashtbl[], clientstr_hashtbl[],
  *     unconfstr_hashtbl[], uncofid_hashtbl[].
  */
-static DECLARE_MUTEX(client_sema);
+static DEFINE_MUTEX(client_mutex);
 
 static kmem_cache_t *stateowner_slab = NULL;
 static kmem_cache_t *file_slab = NULL;
@@ -91,13 +92,13 @@ static kmem_cache_t *deleg_slab = NULL;
 void
 nfs4_lock_state(void)
 {
-       down(&client_sema);
+       mutex_lock(&client_mutex);
 }
 
 void
 nfs4_unlock_state(void)
 {
-       up(&client_sema);
+       mutex_unlock(&client_mutex);
 }
 
 static inline u32
@@ -2749,37 +2750,31 @@ nfsd4_lock(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_lock
        * Note: locks.c uses the BKL to protect the inode's lock list.
        */
 
-       status = posix_lock_file(filp, &file_lock);
-       dprintk("NFSD: nfsd4_lock: posix_lock_file status %d\n",status);
+       /* XXX?: Just to divert the locks_release_private at the start of
+        * locks_copy_lock: */
+       conflock.fl_ops = NULL;
+       conflock.fl_lmops = NULL;
+       status = posix_lock_file_conf(filp, &file_lock, &conflock);
+       dprintk("NFSD: nfsd4_lock: posix_lock_file_conf status %d\n",status);
        switch (-status) {
        case 0: /* success! */
                update_stateid(&lock_stp->st_stateid);
                memcpy(&lock->lk_resp_stateid, &lock_stp->st_stateid, 
                                sizeof(stateid_t));
-               goto out;
-       case (EAGAIN):
-               goto conflicting_lock;
+               break;
+       case (EAGAIN):          /* conflock holds conflicting lock */
+               status = nfserr_denied;
+               dprintk("NFSD: nfsd4_lock: conflicting lock found!\n");
+               nfs4_set_lock_denied(&conflock, &lock->lk_denied);
+               break;
        case (EDEADLK):
                status = nfserr_deadlock;
-               dprintk("NFSD: nfsd4_lock: posix_lock_file() failed! status %d\n",status);
-               goto out;
+               break;
        default:        
-               status = nfserrno(status);
-               dprintk("NFSD: nfsd4_lock: posix_lock_file() failed! status %d\n",status);
-               goto out;
-       }
-
-conflicting_lock:
-       dprintk("NFSD: nfsd4_lock: conflicting lock found!\n");
-       status = nfserr_denied;
-       /* XXX There is a race here. Future patch needed to provide 
-        * an atomic posix_lock_and_test_file
-        */
-       if (!posix_test_lock(filp, &file_lock, &conflock)) {
-               status = nfserr_serverfault;
-               goto out;
+               dprintk("NFSD: nfsd4_lock: posix_lock_file_conf() failed! status %d\n",status);
+               status = nfserr_resource;
+               break;
        }
-       nfs4_set_lock_denied(&conflock, &lock->lk_denied);
 out:
        if (status && lock->lk_is_new && lock_sop)
                release_stateowner(lock_sop);