]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs: add a xfs_group_next_range helper
authorChristoph Hellwig <hch@lst.de>
Mon, 25 Nov 2024 21:14:14 +0000 (13:14 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 28 Nov 2024 02:33:09 +0000 (18:33 -0800)
Source kernel commit: 819928770bd91960f88f5a4dfa21b35a1bade61b

Add a helper to iterate over iterate over all groups, which can be used
as a simple while loop:

struct xfs_group                *xg = NULL;

while ((xg = xfs_group_next_range(mp, xg, 0, MAX_GROUP))) {
...
}

This will be wrapped by the realtime group code first, and eventually
replace the for_each_rtgroup_from and for_each_rtgroup_range helpers.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
libxfs/xfs_group.c
libxfs/xfs_group.h

index 8a67148362b0d753c106597a4c516010101a3304..04d65033b75eca181dcb12d96d4fc6c7f5a17b0f 100644 (file)
@@ -86,6 +86,32 @@ xfs_group_grab(
        return xg;
 }
 
+/*
+ * Iterate to the next group.  To start the iteration at @start_index, a %NULL
+ * @xg is passed, else the previous group returned from this function.  The
+ * caller should break out of the loop when this returns %NULL.  If the caller
+ * wants to break out of a loop that did not finish it needs to release the
+ * active reference to @xg using xfs_group_rele() itself.
+ */
+struct xfs_group *
+xfs_group_next_range(
+       struct xfs_mount        *mp,
+       struct xfs_group        *xg,
+       uint32_t                start_index,
+       uint32_t                end_index,
+       enum xfs_group_type     type)
+{
+       uint32_t                index = start_index;
+
+       if (xg) {
+               index = xg->xg_gno + 1;
+               xfs_group_rele(xg);
+       }
+       if (index > end_index)
+               return NULL;
+       return xfs_group_grab(mp, index, type);
+}
+
 /*
  * Find the next group after @xg, or the first group if @xg is NULL.
  */
index e3b6be7ff9e802def5ee68435e5b745a87290101..dd7da90443054b4aee971df0abde3b4c65ef83be 100644 (file)
@@ -20,6 +20,9 @@ void xfs_group_put(struct xfs_group *xg);
 
 struct xfs_group *xfs_group_grab(struct xfs_mount *mp, uint32_t index,
                enum xfs_group_type type);
+struct xfs_group *xfs_group_next_range(struct xfs_mount *mp,
+               struct xfs_group *xg, uint32_t start_index, uint32_t end_index,
+               enum xfs_group_type type);
 struct xfs_group *xfs_group_grab_next_mark(struct xfs_mount *mp,
                struct xfs_group *xg, xa_mark_t mark, enum xfs_group_type type);
 void xfs_group_rele(struct xfs_group *xg);