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: Marc Eshel <eshel@almaden.ibm.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
This commit is contained in:
parent
2beb6614f5
commit
2b36f412ab
|
@ -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 {
|
||||||
* 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 {
|
||||||
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 */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue