[pnfs] [PATCH 9/9] pnfs client prevent race in sequence slot

Benny Halevy bhalevy at panasas.com
Wed Sep 26 18:26:29 EDT 2007


William A. (Andy) Adamson wrote:
> Here is what is happening on the failure of the Connectathon lock test #12.
> 
> The client produces a SEQUENCE:PUTFH:GETATTR (nfs4_proc_getattr) compond
> followed by a SEQUENCE:PUTFH:LOCKU (nfs4_proc_unlck).
> 
> Wireshark shows the nfs4_proc_getattr as succeeding, and the
> nfs4_proc_unlck as failing with BAD_SESSION.
> 
> The nfs4_proc_getattr rpc task catches a signal (from the test) and
> returns -ERESTARTSYS, having not called decode, which results in the
> nfs4_proc_getattr local variable nfs41_sequence_res.status being left
> unset - so whatever garbage is in the un-initalized
> nfs41_sequence_res.status is what is passed to nfs41_sequence_done. This
> happens to be non-zero, and is interpreted by nfs41_proc_sequence_done()
> as an error, which means that the sequence number for the slot is
> decremented, and the next rpc (nfs4_proc_unlk) will send the same
> sequence number and get an error (BAD_SESSION on our server).
> 
> The client does not know if the rpc succeeded, because it never decoded
> the reply. But, in order to process the SEQUENCE operation on the
> nfs4_proc_getattr and not get out of sync with the server, the client
> needs to know the status of the SEQUENCE operation sent by the server.
> 
> Suggestions?

I'm not sure how hard it is to implement but I think you want the application
thread to get the signal and return but have an internal thread take over the
rpc book-keeping to completion.

> 
> -->Andy
> 
> 
> On 9/26/07, *Trond Myklebust* <trond.myklebust at fys.uio.no
> <mailto:trond.myklebust at fys.uio.no>> wrote:
> 
>     On Wed, 2007-09-26 at 08:45 -0400, andros at umich.edu
>     <mailto:andros at umich.edu> wrote:
>     > From: Andy Adamson <andros at umich.edu <mailto:andros at umich.edu>>
>     >
>     > Move the lock to cover reading the sequence list in rpc_sequence
>     > which allowed multiple rpc's to be in flight with the same slot
>     > sequence id.
> 
>     Sorry. This patch is just wrong. There is no reason to take the spinlock
>     when just testing for equality here.
> 
>     Trond
> 
>     > Signed-off by: Andy Adamson< andros at umich.edu
>     <mailto:andros at umich.edu>>
>     > ---
>     >  fs/nfs/nfs4state.c |    4 ++--
>     >  1 files changed, 2 insertions(+), 2 deletions(-)
>     >
>     > diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
>     > index 4963454..cbc08af 100644
>     > --- a/fs/nfs/nfs4state.c
>     > +++ b/fs/nfs/nfs4state.c
>     > @@ -773,15 +773,15 @@ int nfs_wait_on_sequence(struct nfs_seqid
>     *seqid, struct rpc_task *task)
>     >       struct rpc_sequence *sequence = seqid->sequence->sequence;
>     >       int status = 0;
>     >
>     > +     spin_lock(&sequence->lock);
>     >       if (sequence->list.next == &seqid->list)
>     >               goto out;
>     > -     spin_lock(&sequence->lock);
>     >       if (sequence->list.next != &seqid->list) {
>     >               rpc_sleep_on(&sequence->wait, task, NULL, NULL);
>     >               status = -EAGAIN;
>     >       }
>     > -     spin_unlock(&sequence->lock);
>     >  out:
>     > +     spin_unlock(&sequence->lock);
>     >       return status;
>     >  }
>     >
> 
>     _______________________________________________
>     pNFS mailing list
>     pNFS at linux-nfs.org <mailto:pNFS at linux-nfs.org>
>     http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> pNFS mailing list
> pNFS at linux-nfs.org
> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs


-- 
Benny Halevy
Software Architect
Tel/Fax: +972-3-647-8340
Mobile: +972-54-802-8340
US:      +1-412-203-3187
bhalevy at panasas.com
 
Panasas, Inc.
Leader in Parallel Storage
www.panasas.com


More information about the pNFS mailing list