]> git.baikalelectronics.ru Git - kernel.git/commitdiff
NFS/pNFS: Don't call pnfs_free_bucket_lseg() before removing the request
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 6 Jan 2021 16:28:30 +0000 (11:28 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 10 Jan 2021 18:32:52 +0000 (13:32 -0500)
In pnfs_generic_clear_request_commit(), we try calling
pnfs_free_bucket_lseg() before we remove the request from the DS bucket.
That will always fail, since the point is to test for whether or not
that bucket is empty.

Fixes: c84bea59449a ("NFS/pNFS: Simplify bucket layout segment reference counting")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/pnfs_nfs.c

index 2efcfdd348a111a86c9647250a9d51b6d21f2dc0..df20bbe8d15e368f3c15f1bed9db312540b4cb15 100644 (file)
@@ -78,22 +78,18 @@ void
 pnfs_generic_clear_request_commit(struct nfs_page *req,
                                  struct nfs_commit_info *cinfo)
 {
-       struct pnfs_layout_segment *freeme = NULL;
+       struct pnfs_commit_bucket *bucket = NULL;
 
        if (!test_and_clear_bit(PG_COMMIT_TO_DS, &req->wb_flags))
                goto out;
        cinfo->ds->nwritten--;
-       if (list_is_singular(&req->wb_list)) {
-               struct pnfs_commit_bucket *bucket;
-
+       if (list_is_singular(&req->wb_list))
                bucket = list_first_entry(&req->wb_list,
-                                         struct pnfs_commit_bucket,
-                                         written);
-               freeme = pnfs_free_bucket_lseg(bucket);
-       }
+                                         struct pnfs_commit_bucket, written);
 out:
        nfs_request_remove_commit_list(req, cinfo);
-       pnfs_put_lseg(freeme);
+       if (bucket)
+               pnfs_put_lseg(pnfs_free_bucket_lseg(bucket));
 }
 EXPORT_SYMBOL_GPL(pnfs_generic_clear_request_commit);