lockd: Clean up of the server-side GRANTED code
Trond Myklebust [Mon, 20 Mar 2006 18:44:39 +0000 (13:44 -0500)]
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>

fs/lockd/clntproc.c
fs/lockd/svclock.c
include/linux/lockd/lockd.h

index acc3eb1..80ae312 100644 (file)
@@ -148,49 +148,6 @@ static void nlmclnt_release_lockargs(struct nlm_rqst *req)
 }
 
 /*
- * Initialize arguments for GRANTED call. The nlm_rqst structure
- * has been cleared already.
- */
-int
-nlmclnt_setgrantargs(struct nlm_rqst *call, struct nlm_lock *lock)
-{
-       locks_copy_lock(&call->a_args.lock.fl, &lock->fl);
-       memcpy(&call->a_args.lock.fh, &lock->fh, sizeof(call->a_args.lock.fh));
-       call->a_args.lock.caller = system_utsname.nodename;
-       call->a_args.lock.oh.len = lock->oh.len;
-
-       /* set default data area */
-       call->a_args.lock.oh.data = call->a_owner;
-       call->a_args.lock.svid = lock->fl.fl_pid;
-
-       if (lock->oh.len > NLMCLNT_OHSIZE) {
-               void *data = kmalloc(lock->oh.len, GFP_KERNEL);
-               if (!data) {
-                       nlmclnt_freegrantargs(call);
-                       return 0;
-               }
-               call->a_args.lock.oh.data = (u8 *) data;
-       }
-
-       memcpy(call->a_args.lock.oh.data, lock->oh.data, lock->oh.len);
-       return 1;
-}
-
-void
-nlmclnt_freegrantargs(struct nlm_rqst *call)
-{
-       struct file_lock *fl = &call->a_args.lock.fl;
-       /*
-        * Check whether we allocated memory for the owner.
-        */
-       if (call->a_args.lock.oh.data != (u8 *) call->a_owner) {
-               kfree(call->a_args.lock.oh.data);
-       }
-       if (fl->fl_ops && fl->fl_ops->fl_release_private)
-               fl->fl_ops->fl_release_private(fl);
-}
-
-/*
  * This is the main entry point for the NLM client.
  */
 int
index 20caece..3c7dd95 100644 (file)
@@ -43,6 +43,8 @@ static void nlmsvc_release_block(struct nlm_block *block);
 static void    nlmsvc_insert_block(struct nlm_block *block, unsigned long);
 static int     nlmsvc_remove_block(struct nlm_block *block);
 
+static int nlmsvc_setgrantargs(struct nlm_rqst *call, struct nlm_lock *lock);
+static void nlmsvc_freegrantargs(struct nlm_rqst *call);
 static const struct rpc_call_ops nlmsvc_grant_ops;
 
 /*
@@ -196,7 +198,7 @@ nlmsvc_create_block(struct svc_rqst *rqstp, struct nlm_file *file,
        locks_init_lock(&block->b_call.a_res.lock.fl);
        kref_init(&block->b_count);
 
-       if (!nlmclnt_setgrantargs(&block->b_call, lock))
+       if (!nlmsvc_setgrantargs(&block->b_call, lock))
                goto failed_free;
 
        /* Set notifier function for VFS, and init args */
@@ -264,7 +266,7 @@ static void nlmsvc_free_block(struct kref *kref)
 
        if (block->b_host)
                nlm_release_host(block->b_host);
-       nlmclnt_freegrantargs(&block->b_call);
+       nlmsvc_freegrantargs(&block->b_call);
        kfree(block);
 }
 
@@ -299,6 +301,49 @@ nlmsvc_traverse_blocks(struct nlm_host *host, struct nlm_file *file, int action)
 }
 
 /*
+ * Initialize arguments for GRANTED call. The nlm_rqst structure
+ * has been cleared already.
+ */
+static int nlmsvc_setgrantargs(struct nlm_rqst *call, struct nlm_lock *lock)
+{
+       locks_copy_lock(&call->a_args.lock.fl, &lock->fl);
+       memcpy(&call->a_args.lock.fh, &lock->fh, sizeof(call->a_args.lock.fh));
+       call->a_args.lock.caller = system_utsname.nodename;
+       call->a_args.lock.oh.len = lock->oh.len;
+
+       /* set default data area */
+       call->a_args.lock.oh.data = call->a_owner;
+       call->a_args.lock.svid = lock->fl.fl_pid;
+
+       if (lock->oh.len > NLMCLNT_OHSIZE) {
+               void *data = kmalloc(lock->oh.len, GFP_KERNEL);
+               if (!data) {
+                       nlmsvc_freegrantargs(call);
+                       return 0;
+               }
+               call->a_args.lock.oh.data = (u8 *) data;
+       }
+
+       memcpy(call->a_args.lock.oh.data, lock->oh.data, lock->oh.len);
+       return 1;
+}
+
+static void nlmsvc_freegrantargs(struct nlm_rqst *call)
+{
+       struct file_lock *fl = &call->a_args.lock.fl;
+       /*
+        * Check whether we allocated memory for the owner.
+        */
+       if (call->a_args.lock.oh.data != (u8 *) call->a_owner) {
+               kfree(call->a_args.lock.oh.data);
+       }
+       if (fl->fl_ops && fl->fl_ops->fl_release_private)
+               fl->fl_ops->fl_release_private(fl);
+       if (fl->fl_lmops && fl->fl_lmops->fl_release_private)
+               fl->fl_lmops->fl_release_private(fl);
+}
+
+/*
  * Attempt to establish a lock, and if it can't be granted, block it
  * if required.
  */
@@ -600,11 +645,16 @@ static void nlmsvc_grant_callback(struct rpc_task *task, void *data)
        }
        nlmsvc_insert_block(block, timeout);
        svc_wake_up(block->b_daemon);
-       nlmsvc_release_block(block);
+}
+
+void nlmsvc_grant_release(void *data)
+{
+       nlmsvc_release_block(data);
 }
 
 static const struct rpc_call_ops nlmsvc_grant_ops = {
        .rpc_call_done = nlmsvc_grant_callback,
+       .rpc_release = nlmsvc_grant_release,
 };
 
 /*
index 08ab977..860a93f 100644 (file)
@@ -153,8 +153,6 @@ long                  nlmclnt_block(struct nlm_rqst *req, long timeout);
 u32              nlmclnt_grant(const struct sockaddr_in *addr, const struct nlm_lock *);
 void             nlmclnt_recovery(struct nlm_host *, u32);
 int              nlmclnt_reclaim(struct nlm_host *, struct file_lock *);
-int              nlmclnt_setgrantargs(struct nlm_rqst *, struct nlm_lock *);
-void             nlmclnt_freegrantargs(struct nlm_rqst *);
 
 /*
  * Host cache