[pnfs] [PATCH 9/9] pnfs client prevent race in sequence slot
William A. (Andy) Adamson
andros at citi.umich.edu
Wed Sep 26 12:21:51 EDT 2007
On 9/26/07, Benny Halevy <bhalevy at panasas.com> wrote:
>
> Hmm Andy,
>
> Actually I'm not quite sure I understand the bug and your solution...
> What prevents sequence->list.next from changing after sequence->lock is
> released?
> Similar to what could have happened before you moved the lock, in the goto
> out path...
yeah, I think I just changed the timing. I'm looking at it futher.
-->Andy
Benny
>
>
> Benny Halevy wrote:
> > andros at umich.edu wrote:
> >> From: Andy Adamson <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.
> >>
> >> Signed-off by: Andy Adamson<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;
> >
> > This statement can be removed now as its else case is
> > handled right below. see patch below.
> >
> >> - 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;
> >> }
> >>
> >
> > diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
> > index cbc08af..5cbdbc0 100644
> > --- a/fs/nfs/nfs4state.c
> > +++ b/fs/nfs/nfs4state.c
> > @@ -774,13 +774,10 @@ int nfs_wait_on_sequence(struct nfs_seqid *seqid,
> struct rpc_task *task)
> > int status = 0;
> >
> > spin_lock(&sequence->lock);
> > - if (sequence->list.next == &seqid->list)
> > - goto out;
> > if (sequence->list.next != &seqid->list) {
> > rpc_sleep_on(&sequence->wait, task, NULL, NULL);
> > status = -EAGAIN;
> > }
> > -out:
> > spin_unlock(&sequence->lock);
> > return status;
> > }
> > --
> >
> > _______________________________________________
> > pNFS mailing list
> > pNFS at linux-nfs.org
> > http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://linux-nfs.org/pipermail/pnfs/attachments/20070926/385dff0d/attachment.htm
More information about the pNFS
mailing list