struct xfs_mount *mp = tp->t_mountp;
if (xfs_efi_is_realtime(xefi)) {
+ xfs_rgnumber_t rgno;
+
+ rgno = xfs_rtb_to_rgno(mp, xefi->xefi_startblock);
+ xefi->xefi_rtg = xfs_rtgroup_get(mp, rgno);
+
*dfpp = xfs_defer_add(tp, &xefi->xefi_list,
&xfs_rtextent_free_defer_type);
return;
.cancel_item = xfs_extent_free_cancel_item,
};
+/* Sort bmap items by rtgroup for efficiency. */
+static int
+xfs_rtextent_free_diff_items(
+ void *priv,
+ const struct list_head *a,
+ const struct list_head *b)
+{
+ struct xfs_extent_free_item *ra = xefi_entry(a);
+ struct xfs_extent_free_item *rb = xefi_entry(b);
+
+ return ra->xefi_rtg->rtg_rgno - rb->xefi_rtg->rtg_rgno;
+}
+
static struct xfs_log_item *
xfs_rtextent_free_create_intent(
struct xfs_trans *tp,
unsigned int count,
bool sort)
{
+ struct xfs_mount *mp = tp->t_mountp;
+
+ if (sort)
+ list_sort(mp, items, xfs_rtextent_free_diff_items);
return NULL;
}
{
struct xfs_extent_free_item *xefi = xefi_entry(item);
+ xfs_rtgroup_put(xefi->xefi_rtg);
kmem_cache_free(xfs_extfree_item_cache, xefi);
}