Commit 2b36f412 authored by Marc Eshel's avatar Marc Eshel Committed by J. Bruce Fields

lockd: save lock state on deferral

We need to keep some state for a pending asynchronous lock request, so this
patch adds that state to struct nlm_block.

This also adds a function which defers the request, by calling
rqstp->rq_chandle.defer and storing the resulting deferred request in a
nlm_block structure which we insert into lockd's global block list.  That
new function isn't called yet, so it's dead code until a later patch.
Signed-off-by: default avatarMarc Eshel <eshel@almaden.ibm.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
parent 2beb6614
...@@ -330,6 +330,31 @@ static void nlmsvc_freegrantargs(struct nlm_rqst *call) ...@@ -330,6 +330,31 @@ static void nlmsvc_freegrantargs(struct nlm_rqst *call)
kfree(call->a_args.lock.oh.data); kfree(call->a_args.lock.oh.data);
} }
/*
* Deferred lock request handling for non-blocking lock
*/
static u32
nlmsvc_defer_lock_rqst(struct svc_rqst *rqstp, struct nlm_block *block)
{
u32 status = nlm_lck_denied_nolocks;
block->b_flags |= B_QUEUED;
nlmsvc_insert_block(block, NLM_TIMEOUT);
block->b_cache_req = &rqstp->rq_chandle;
if (rqstp->rq_chandle.defer) {
block->b_deferred_req =
rqstp->rq_chandle.defer(block->b_cache_req);
if (block->b_deferred_req != NULL)
status = nlm_drop_reply;
}
dprintk("lockd: nlmsvc_defer_lock_rqst block %p flags %d status %d\n",
block, block->b_flags, status);
return status;
}
/* /*
* 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.
......
...@@ -119,6 +119,9 @@ struct nlm_file { ...@@ -119,6 +119,9 @@ struct nlm_file {
* couldn't be granted because of a conflicting lock). * couldn't be granted because of a conflicting lock).
*/ */
#define NLM_NEVER (~(unsigned long) 0) #define NLM_NEVER (~(unsigned long) 0)
/* timeout on non-blocking call: */
#define NLM_TIMEOUT (7 * HZ)
struct nlm_block { struct nlm_block {
struct kref b_count; /* Reference count */ struct kref b_count; /* Reference count */
struct list_head b_list; /* linked list of all blocks */ struct list_head b_list; /* linked list of all blocks */
...@@ -130,6 +133,13 @@ struct nlm_block { ...@@ -130,6 +133,13 @@ struct nlm_block {
unsigned int b_id; /* block id */ unsigned int b_id; /* block id */
unsigned char b_granted; /* VFS granted lock */ unsigned char b_granted; /* VFS granted lock */
struct nlm_file * b_file; /* file in question */ struct nlm_file * b_file; /* file in question */
struct cache_req * b_cache_req; /* deferred request handling */
struct file_lock * b_fl; /* set for GETLK */
struct cache_deferred_req * b_deferred_req;
unsigned int b_flags; /* block flags */
#define B_QUEUED 1 /* lock queued */
#define B_GOT_CALLBACK 2 /* got lock or conflicting lock */
#define B_TIMED_OUT 4 /* filesystem too slow to respond */
}; };
/* /*
......
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