Message ID | 5527548df9be8ce76ed31ad0ea6520908533b4fe.1731103952.git.trond.myklebust@hammerspace.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [1/2] NFSv4.0: Fix the wake up of the next waiter in nfs_release_seqid() | expand |
LGTM Reviewed-by: Yang Erkun <yangerkun@huawei.com> 在 2024/11/9 6:13, trondmy@kernel.org 写道: > From: Trond Myklebust <trond.myklebust@hammerspace.com> > > There is no need to wake up another waiter on the seqid list unless the > seqid being removed is at the head of the list, and so is relinquishing > control of the sequence counter to the next entry. > > Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> > --- > fs/nfs/nfs4state.c | 10 ++++------ > 1 file changed, 4 insertions(+), 6 deletions(-) > > diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c > index dafd61186557..9a9f60a2291b 100644 > --- a/fs/nfs/nfs4state.c > +++ b/fs/nfs/nfs4state.c > @@ -1083,14 +1083,12 @@ void nfs_release_seqid(struct nfs_seqid *seqid) > return; > sequence = seqid->sequence; > spin_lock(&sequence->lock); > - list_del_init(&seqid->list); > - if (!list_empty(&sequence->list)) { > - struct nfs_seqid *next; > - > - next = list_first_entry(&sequence->list, > - struct nfs_seqid, list); > + if (list_is_first(&seqid->list, &sequence->list) && > + !list_is_singular(&sequence->list)) { > + struct nfs_seqid *next = list_next_entry(seqid, list); > rpc_wake_up_queued_task(&sequence->wait, next->task); > } > + list_del_init(&seqid->list); > spin_unlock(&sequence->lock); > } >
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index dafd61186557..9a9f60a2291b 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c @@ -1083,14 +1083,12 @@ void nfs_release_seqid(struct nfs_seqid *seqid) return; sequence = seqid->sequence; spin_lock(&sequence->lock); - list_del_init(&seqid->list); - if (!list_empty(&sequence->list)) { - struct nfs_seqid *next; - - next = list_first_entry(&sequence->list, - struct nfs_seqid, list); + if (list_is_first(&seqid->list, &sequence->list) && + !list_is_singular(&sequence->list)) { + struct nfs_seqid *next = list_next_entry(seqid, list); rpc_wake_up_queued_task(&sequence->wait, next->task); } + list_del_init(&seqid->list); spin_unlock(&sequence->lock); }