]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
NFSv4.0: Fix the wake up of the next waiter in nfs_release_seqid()
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Fri, 8 Nov 2024 16:41:21 +0000 (11:41 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sat, 9 Nov 2024 16:01:29 +0000 (11:01 -0500)
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.

Reviewed-by: Yang Erkun <yangerkun@huawei.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/nfs4state.c

index dafd61186557f8f4577235af852ab96f3da4c10b..9a9f60a2291b44a6c728dd42093acb7e9130eb80 100644 (file)
@@ -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);
 }