Commit 5e1abf8c authored by Trond Myklebust's avatar Trond Myklebust

lockd: Clean up of the server-side GRANTED code

Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 6849c0ca
...@@ -147,49 +147,6 @@ static void nlmclnt_release_lockargs(struct nlm_rqst *req) ...@@ -147,49 +147,6 @@ static void nlmclnt_release_lockargs(struct nlm_rqst *req)
fl->fl_ops->fl_release_private(fl); fl->fl_ops->fl_release_private(fl);
} }
/*
* 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. * This is the main entry point for the NLM client.
*/ */
......
...@@ -43,6 +43,8 @@ static void nlmsvc_release_block(struct nlm_block *block); ...@@ -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 void nlmsvc_insert_block(struct nlm_block *block, unsigned long);
static int nlmsvc_remove_block(struct nlm_block *block); 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; static const struct rpc_call_ops nlmsvc_grant_ops;
/* /*
...@@ -196,7 +198,7 @@ nlmsvc_create_block(struct svc_rqst *rqstp, struct nlm_file *file, ...@@ -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); locks_init_lock(&block->b_call.a_res.lock.fl);
kref_init(&block->b_count); kref_init(&block->b_count);
if (!nlmclnt_setgrantargs(&block->b_call, lock)) if (!nlmsvc_setgrantargs(&block->b_call, lock))
goto failed_free; goto failed_free;
/* Set notifier function for VFS, and init args */ /* Set notifier function for VFS, and init args */
...@@ -264,7 +266,7 @@ static void nlmsvc_free_block(struct kref *kref) ...@@ -264,7 +266,7 @@ static void nlmsvc_free_block(struct kref *kref)
if (block->b_host) if (block->b_host)
nlm_release_host(block->b_host); nlm_release_host(block->b_host);
nlmclnt_freegrantargs(&block->b_call); nlmsvc_freegrantargs(&block->b_call);
kfree(block); kfree(block);
} }
...@@ -298,6 +300,49 @@ nlmsvc_traverse_blocks(struct nlm_host *host, struct nlm_file *file, int action) ...@@ -298,6 +300,49 @@ nlmsvc_traverse_blocks(struct nlm_host *host, struct nlm_file *file, int action)
return 0; return 0;
} }
/*
* 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 * Attempt to establish a lock, and if it can't be granted, block it
* if required. * if required.
...@@ -600,11 +645,16 @@ static void nlmsvc_grant_callback(struct rpc_task *task, void *data) ...@@ -600,11 +645,16 @@ static void nlmsvc_grant_callback(struct rpc_task *task, void *data)
} }
nlmsvc_insert_block(block, timeout); nlmsvc_insert_block(block, timeout);
svc_wake_up(block->b_daemon); 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 = { static const struct rpc_call_ops nlmsvc_grant_ops = {
.rpc_call_done = nlmsvc_grant_callback, .rpc_call_done = nlmsvc_grant_callback,
.rpc_release = nlmsvc_grant_release,
}; };
/* /*
......
...@@ -153,8 +153,6 @@ long nlmclnt_block(struct nlm_rqst *req, long timeout); ...@@ -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 *); u32 nlmclnt_grant(const struct sockaddr_in *addr, const struct nlm_lock *);
void nlmclnt_recovery(struct nlm_host *, u32); void nlmclnt_recovery(struct nlm_host *, u32);
int nlmclnt_reclaim(struct nlm_host *, struct file_lock *); 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 * Host cache
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment