]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
NFSv4/pnfs: Add support for the PNFS_LAYOUT_FILE_BULK_RETURN flag
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 13 Jun 2024 05:00:49 +0000 (01:00 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Mon, 8 Jul 2024 17:47:26 +0000 (13:47 -0400)
Add a flag PNFS_LAYOUT_FILE_BULK_RETURN, that will attempt to return all
the layouts in a pnfs_layout_destroy_byfsid/pnfs_layout_destroy_byclid
call, instead of just invalidating them.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/pnfs.c
fs/nfs/pnfs.h

index 0e188bc303ee3964d9fa40612555b593017bff67..3bfc7484183122dadc35e21b3a4e96672e5d30c2 100644 (file)
@@ -476,6 +476,18 @@ pnfs_mark_layout_stateid_invalid(struct pnfs_layout_hdr *lo,
        return !list_empty(&lo->plh_segs);
 }
 
+static int pnfs_mark_layout_stateid_return(struct pnfs_layout_hdr *lo,
+                                          struct list_head *lseg_list,
+                                          enum pnfs_iomode iomode, u32 seq)
+{
+       struct pnfs_layout_range range = {
+               .iomode = iomode,
+               .length = NFS4_MAX_UINT64,
+       };
+
+       return pnfs_mark_matching_lsegs_return(lo, lseg_list, &range, seq);
+}
+
 static int
 pnfs_iomode_to_fail_bit(u32 iomode)
 {
@@ -886,7 +898,10 @@ pnfs_layout_free_bulk_destroy_list(struct list_head *layout_list,
 
                spin_lock(&inode->i_lock);
                list_del_init(&lo->plh_bulk_destroy);
-               if (pnfs_mark_layout_stateid_invalid(lo, &lseg_list)) {
+               if (mode == PNFS_LAYOUT_FILE_BULK_RETURN) {
+                       pnfs_mark_layout_stateid_return(lo, &lseg_list,
+                                                       IOMODE_ANY, 0);
+               } else if (pnfs_mark_layout_stateid_invalid(lo, &lseg_list)) {
                        if (mode == PNFS_LAYOUT_BULK_RETURN)
                                set_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags);
                        ret = -EAGAIN;
@@ -1265,27 +1280,15 @@ out:
        return status;
 }
 
-static bool
-pnfs_layout_segments_returnable(struct pnfs_layout_hdr *lo,
-                               enum pnfs_iomode iomode,
-                               u32 seq)
-{
-       struct pnfs_layout_range recall_range = {
-               .length = NFS4_MAX_UINT64,
-               .iomode = iomode,
-       };
-       return pnfs_mark_matching_lsegs_return(lo, &lo->plh_return_segs,
-                                              &recall_range, seq) != -EBUSY;
-}
-
 /* Return true if layoutreturn is needed */
 static bool
 pnfs_layout_need_return(struct pnfs_layout_hdr *lo)
 {
        if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags))
                return false;
-       return pnfs_layout_segments_returnable(lo, lo->plh_return_iomode,
-                                              lo->plh_return_seq);
+       return pnfs_mark_layout_stateid_return(lo, &lo->plh_return_segs,
+                                              lo->plh_return_iomode,
+                                              lo->plh_return_seq) != EBUSY;
 }
 
 static void pnfs_layoutreturn_before_put_layout_hdr(struct pnfs_layout_hdr *lo)
index a6f9427782c22f7a6d75095d8c137d6ac5b999b0..8fa0f152ed194e4b0b4c8307f5b4ddefbc09b7bd 100644 (file)
@@ -121,6 +121,7 @@ enum layoutdriver_policy_flags {
 enum pnfs_layout_destroy_mode {
        PNFS_LAYOUT_INVALIDATE = 0,
        PNFS_LAYOUT_BULK_RETURN,
+       PNFS_LAYOUT_FILE_BULK_RETURN,
 };
 
 struct nfs4_deviceid_node;