]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - fs/nfs/nfs4proc.c
pNFS: Do not free layout segments that are marked for return
[karo-tx-linux.git] / fs / nfs / nfs4proc.c
index 917a6db5c84f4784011f747216f118e2c6357c6e..561b21e4a930a77412536577c78ab358dccdd457 100644 (file)
@@ -8572,21 +8572,12 @@ static void nfs4_layoutreturn_release(void *calldata)
 {
        struct nfs4_layoutreturn *lrp = calldata;
        struct pnfs_layout_hdr *lo = lrp->args.layout;
-       LIST_HEAD(freeme);
 
        dprintk("--> %s\n", __func__);
-       spin_lock(&lo->plh_inode->i_lock);
-       if (lrp->res.lrs_present) {
-               pnfs_mark_matching_lsegs_invalid(lo, &freeme,
-                               &lrp->args.range,
-                               be32_to_cpu(lrp->args.stateid.seqid));
-               pnfs_set_layout_stateid(lo, &lrp->res.stateid, true);
-       } else
-               pnfs_mark_layout_stateid_invalid(lo, &freeme);
-       pnfs_clear_layoutreturn_waitbit(lo);
-       spin_unlock(&lo->plh_inode->i_lock);
+       pnfs_layoutreturn_free_lsegs(lo, &lrp->args.range,
+                       be32_to_cpu(lrp->args.stateid.seqid),
+                       lrp->res.lrs_present ? &lrp->res.stateid : NULL);
        nfs4_sequence_free_slot(&lrp->res.seq_res);
-       pnfs_free_lseg_list(&freeme);
        pnfs_put_layout_hdr(lrp->args.layout);
        nfs_iput_and_deactive(lrp->inode);
        kfree(calldata);