xfs: add a xfs_group_next_range helper
authorChristoph Hellwig <hch@lst.de>
Mon, 4 Nov 2024 04:18:39 +0000 (20:18 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 5 Nov 2024 21:38:27 +0000 (13:38 -0800)
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>
fs/xfs/libxfs/xfs_group.c
fs/xfs/libxfs/xfs_group.h

index edf5907845f0035dd071727e46dbfe05e7f96ff0..59e08cfaf9bffd2b6ae59d6d62f9838dbb6fce7d 100644 (file)
@@ -87,6 +87,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);