{
int error;
- error = compute_refcounts(wq->wq_ctx, agno);
+ error = compute_refcounts(wq->wq_ctx, false, agno);
if (error)
do_error(
_("%s while computing reference count records.\n"),
strerror(error));
}
+static void
+compute_rt_refcounts(
+ struct workqueue*wq,
+ xfs_agnumber_t rgno,
+ void *arg)
+{
+ int error;
+
+ error = compute_refcounts(wq->wq_ctx, true, rgno);
+ if (error)
+ do_error(
+_("%s while computing realtime reference count records.\n"),
+ strerror(error));
+}
+
static void
process_inode_reflink_flags(
struct workqueue *wq,
create_work_queue(&wq, mp, platform_nproc());
for (i = 0; i < mp->m_sb.sb_agcount; i++)
queue_work(&wq, compute_ag_refcounts, i, NULL);
+ if (xfs_has_rtreflink(mp)) {
+ for (i = 0; i < mp->m_sb.sb_rgcount; i++)
+ queue_work(&wq, compute_rt_refcounts, i, NULL);
+ }
destroy_work_queue(&wq);
create_work_queue(&wq, mp, platform_nproc());
if (error)
goto nomem;
+ error = init_slab(&ag_rmap->ar_refcount_items,
+ sizeof(struct xfs_refcount_irec));
+ if (error)
+ goto nomem;
+
return;
nomem:
do_error(
static void
refcount_emit(
struct xfs_mount *mp,
+ bool isrt,
xfs_agnumber_t agno,
xfs_agblock_t agbno,
xfs_extlen_t len,
int error;
struct xfs_slab *rlslab;
- rlslab = rmaps_for_group(false, agno)->ar_refcount_items;
+ rlslab = rmaps_for_group(isrt, agno)->ar_refcount_items;
ASSERT(nr_rmaps > 0);
dbg_printf("REFL: agno=%u pblk=%u, len=%u -> refcount=%zu\n",
int
compute_refcounts(
struct xfs_mount *mp,
+ bool isrt,
xfs_agnumber_t agno)
{
struct xfs_btree_cur *rmcur;
if (!xfs_has_reflink(mp))
return 0;
- if (!rmaps_has_observations(rmaps_for_group(false, agno)))
+ if (!rmaps_has_observations(rmaps_for_group(isrt, agno)))
return 0;
- nr_rmaps = rmap_record_count(mp, false, agno);
+ nr_rmaps = rmap_record_count(mp, isrt, agno);
- error = rmap_init_mem_cursor(mp, NULL, false, agno, &rmcur);
+ error = rmap_init_mem_cursor(mp, NULL, isrt, agno, &rmcur);
if (error)
return error;
ASSERT(nbno > cbno);
if (rcbag_count(rcstack) != old_stack_height) {
if (old_stack_height > 1) {
- refcount_emit(mp, agno, cbno,
+ refcount_emit(mp, isrt, agno, cbno,
nbno - cbno,
old_stack_height);
}
extern void rmap_high_key_from_rec(struct xfs_rmap_irec *rec,
struct xfs_rmap_irec *key);
-extern int compute_refcounts(struct xfs_mount *, xfs_agnumber_t);
+int compute_refcounts(struct xfs_mount *mp, bool isrt, xfs_agnumber_t agno);
uint64_t refcount_record_count(struct xfs_mount *mp, xfs_agnumber_t agno);
extern int init_refcount_cursor(xfs_agnumber_t, struct xfs_slab_cursor **);
extern void refcount_avoid_check(struct xfs_mount *mp);