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

Commit 17393475 authored by NeilBrown's avatar NeilBrown Committed by Trond Myklebust
Browse files

NFSv4: change nfs4_select_rw_stateid to take a lock_context inplace of lock_owner



The only time that a lock_context is not immediately available is in
setattr, and now that it has an open_context, it can easily find one
with nfs_get_lock_context.
This removes the need for the on-stack nfs_lockowner.

This change is preparation for correctly support flock stateids.

Signed-off-by: default avatarNeilBrown <neilb@suse.com>
Reviewed-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent 29b59f94
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -457,7 +457,7 @@ extern void nfs41_handle_server_scope(struct nfs_client *,
extern void nfs4_put_lock_state(struct nfs4_lock_state *lsp);
extern int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl);
extern int nfs4_select_rw_stateid(struct nfs4_state *, fmode_t,
		const struct nfs_lockowner *, nfs4_stateid *,
		const struct nfs_lock_context *, nfs4_stateid *,
		struct rpc_cred **);

extern struct nfs_seqid *nfs_alloc_seqid(struct nfs_seqid_counter *counter, gfp_t gfp_mask);
+6 −9
Original line number Diff line number Diff line
@@ -2945,12 +2945,13 @@ static int _nfs4_do_setattr(struct inode *inode,
	if (nfs4_copy_delegation_stateid(inode, fmode, &arg->stateid, &delegation_cred)) {
		/* Use that stateid */
	} else if (truncate && ctx != NULL) {
		struct nfs_lockowner lockowner = {
			.l_owner = current->files,
		};
		struct nfs_lock_context *l_ctx;
		if (!nfs4_valid_open_stateid(ctx->state))
			return -EBADF;
		if (nfs4_select_rw_stateid(ctx->state, FMODE_WRITE, &lockowner,
		l_ctx = nfs_get_lock_context(ctx);
		if (IS_ERR(l_ctx))
			return PTR_ERR(l_ctx);
		if (nfs4_select_rw_stateid(ctx->state, FMODE_WRITE, l_ctx,
				&arg->stateid, &delegation_cred) == -EIO)
			return -EBADF;
	} else
@@ -4576,11 +4577,7 @@ int nfs4_set_rw_stateid(nfs4_stateid *stateid,
		const struct nfs_lock_context *l_ctx,
		fmode_t fmode)
{
	const struct nfs_lockowner *lockowner = NULL;

	if (l_ctx != NULL)
		lockowner = &l_ctx->lockowner;
	return nfs4_select_rw_stateid(ctx->state, fmode, lockowner, stateid, NULL);
	return nfs4_select_rw_stateid(ctx->state, fmode, l_ctx, stateid, NULL);
}
EXPORT_SYMBOL_GPL(nfs4_set_rw_stateid);

+5 −6
Original line number Diff line number Diff line
@@ -939,20 +939,19 @@ int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl)

static int nfs4_copy_lock_stateid(nfs4_stateid *dst,
		struct nfs4_state *state,
		const struct nfs_lockowner *lockowner)
		const struct nfs_lock_context *l_ctx)
{
	struct nfs4_lock_state *lsp;
	fl_owner_t fl_owner;
	int ret = -ENOENT;


	if (lockowner == NULL)
	if (l_ctx == NULL)
		goto out;

	if (test_bit(LK_STATE_IN_USE, &state->flags) == 0)
		goto out;

	fl_owner = lockowner->l_owner;
	fl_owner = l_ctx->lockowner.l_owner;
	spin_lock(&state->state_lock);
	lsp = __nfs4_find_lock_state(state, fl_owner);
	if (lsp && test_bit(NFS_LOCK_LOST, &lsp->ls_flags))
@@ -986,7 +985,7 @@ static void nfs4_copy_open_stateid(nfs4_stateid *dst, struct nfs4_state *state)
 * requests.
 */
int nfs4_select_rw_stateid(struct nfs4_state *state,
		fmode_t fmode, const struct nfs_lockowner *lockowner,
		fmode_t fmode, const struct nfs_lock_context *l_ctx,
		nfs4_stateid *dst, struct rpc_cred **cred)
{
	int ret;
@@ -995,7 +994,7 @@ int nfs4_select_rw_stateid(struct nfs4_state *state,
		return -EIO;
	if (cred != NULL)
		*cred = NULL;
	ret = nfs4_copy_lock_stateid(dst, state, lockowner);
	ret = nfs4_copy_lock_stateid(dst, state, l_ctx);
	if (ret == -EIO)
		/* A lost lock - don't even consider delegations */
		goto out;