Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+25 −0
Original line number Original line Diff line number Diff line
@@ -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.
+10 −0
Original line number Original line Diff line number Diff line
@@ -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 */
};
};


/*
/*