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
2 changed files with 35 additions and 0 deletions
|
@ -330,6 +330,31 @@ static void nlmsvc_freegrantargs(struct nlm_rqst *call)
|
|||
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
|
||||
* if required.
|
||||
|
|
|
@ -119,6 +119,9 @@ struct nlm_file {
|
|||
* couldn't be granted because of a conflicting lock).
|
||||
*/
|
||||
#define NLM_NEVER (~(unsigned long) 0)
|
||||
/* timeout on non-blocking call: */
|
||||
#define NLM_TIMEOUT (7 * HZ)
|
||||
|
||||
struct nlm_block {
|
||||
struct kref b_count; /* Reference count */
|
||||
struct list_head b_list; /* linked list of all blocks */
|
||||
|
@ -130,6 +133,13 @@ struct nlm_block {
|
|||
unsigned int b_id; /* block id */
|
||||
unsigned char b_granted; /* VFS granted lock */
|
||||
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 a new issue