All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anna Schumaker <Anna.Schumaker@netapp.com>
To: Trond Myklebust <trond.myklebust@primarydata.com>,
	<linux-nfs@vger.kernel.org>
Cc: James Drews <drews@engr.wisc.edu>, <jrs@world.std.com>
Subject: Re: [PATCH v2 1/2] NFSv4: Fix problems with close in the presence of a delegation
Date: Tue, 26 Aug 2014 16:11:11 -0400	[thread overview]
Message-ID: <53FCE9DF.1050407@Netapp.com> (raw)
In-Reply-To: <1409077853-15680-1-git-send-email-trond.myklebust@primarydata.com>

On 08/26/2014 02:30 PM, Trond Myklebust wrote:
> In the presence of delegations, we can no longer assume that the
> state->n_rdwr, state->n_rdonly, state->n_wronly reflect the open
> stateid share mode, and so we need to need to calculate the initial
Nit:  Remove the duplicate "need to" (above).

> value for calldata->arg.fmode using the state->flags.
>
> Reported-by: James Drews <drews@engr.wisc.edu>
> Fixes: 88069f77e1ac5 (NFSv41: Fix a potential state leakage when...)
> Cc: stable@vger.kernel.org # 2.6.33+
> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
> ---
>  fs/nfs/nfs4proc.c | 19 +++++++++++++------
>  1 file changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> index 75ae8d22f067..7d67d5b332d4 100644
> --- a/fs/nfs/nfs4proc.c
> +++ b/fs/nfs/nfs4proc.c
> @@ -2601,6 +2601,7 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
>  	struct nfs4_closedata *calldata = data;
>  	struct nfs4_state *state = calldata->state;
>  	struct inode *inode = calldata->inode;
> +	bool is_rdonly, is_wronly, is_rdwr;
>  	int call_close = 0;
>  
>  	dprintk("%s: begin!\n", __func__);
> @@ -2608,24 +2609,30 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
>  		goto out_wait;
>  
>  	task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE];
> -	calldata->arg.fmode = FMODE_READ|FMODE_WRITE;
>  	spin_lock(&state->owner->so_lock);
> +	is_rdwr = test_bit(NFS_O_RDWR_STATE, &state->flags);
> +	is_rdonly = test_bit(NFS_O_RDONLY_STATE, &state->flags);
> +	is_wronly = test_bit(NFS_O_WRONLY_STATE, &state->flags);
> +	spin_unlock(&state->owner->so_lock);
> +	/* Calculate the current open share mode */
> +	calldata->arg.fmode = 0;
> +	if (is_rdonly || is_rdwr)
> +		calldata->arg.fmode |= FMODE_READ;
> +	if (is_wronly || is_rdwr)
> +		calldata->arg.fmode |= FMODE_WRITE;
>  	/* Calculate the change in open mode */
>  	if (state->n_rdwr == 0) {
Do we need the owner lock for reading state->n_rdwr, n_rdonly, and n_wronly?

Anna
>  		if (state->n_rdonly == 0) {
> -			call_close |= test_bit(NFS_O_RDONLY_STATE, &state->flags);
> -			call_close |= test_bit(NFS_O_RDWR_STATE, &state->flags);
> +			call_close |= is_rdonly || is_rdwr;
>  			calldata->arg.fmode &= ~FMODE_READ;
>  		}
>  		if (state->n_wronly == 0) {
> -			call_close |= test_bit(NFS_O_WRONLY_STATE, &state->flags);
> -			call_close |= test_bit(NFS_O_RDWR_STATE, &state->flags);
> +			call_close |= is_wronly || is_rdwr;
>  			calldata->arg.fmode &= ~FMODE_WRITE;
>  		}
>  	}
>  	if (!nfs4_valid_open_stateid(state))
>  		call_close = 0;
> -	spin_unlock(&state->owner->so_lock);
>  
>  	if (!call_close) {
>  		/* Note: exit _without_ calling nfs4_close_done */


  parent reply	other threads:[~2014-08-26 20:11 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-26 18:30 [PATCH v2 1/2] NFSv4: Fix problems with close in the presence of a delegation Trond Myklebust
2014-08-26 18:30 ` [PATCH v2 2/2] NFSv4: Don't clear the open state when we just did an OPEN_DOWNGRADE Trond Myklebust
2014-08-26 20:11 ` Anna Schumaker [this message]
2014-08-26 20:15   ` [PATCH v2 1/2] NFSv4: Fix problems with close in the presence of a delegation Trond Myklebust
2014-08-26 20:21     ` Anna Schumaker
     [not found]       ` <OFAD58A859.9600390A-ON88257D40.0070BE69-88257D40.0070FF36@LocalDomain>
2014-08-26 22:43         ` NFSv4.2 Linux client Marc Eshel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53FCE9DF.1050407@Netapp.com \
    --to=anna.schumaker@netapp.com \
    --cc=drews@engr.wisc.edu \
    --cc=jrs@world.std.com \
    --cc=linux-nfs@vger.kernel.org \
    --cc=trond.myklebust@primarydata.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.