]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: keep a reference to the pag for busy extents
authorChristoph Hellwig <hch@lst.de>
Sat, 31 Aug 2024 05:29:58 +0000 (08:29 +0300)
committerChristoph Hellwig <hch@lst.de>
Sun, 22 Sep 2024 05:37:27 +0000 (07:37 +0200)
Processing of busy extents requires the perag structure, so keep the
reference while they are in flight.

Signed-off-by: Christoph Hellwig <hch@lst.de>
fs/xfs/xfs_discard.c
fs/xfs/xfs_extent_busy.c
fs/xfs/xfs_extent_busy.h

index 1a91e97d25ffba1e5399576d6fa0b3e2484e82eb..5c00904e439305042dec66b07124610d56b74820 100644 (file)
@@ -117,11 +117,11 @@ xfs_discard_extents(
 
        blk_start_plug(&plug);
        list_for_each_entry(busyp, &extents->extent_list, list) {
-               trace_xfs_discard_extent(mp, busyp->agno, busyp->bno,
+               trace_xfs_discard_extent(mp, busyp->pag->pag_agno, busyp->bno,
                                         busyp->length);
 
                error = __blkdev_issue_discard(mp->m_ddev_targp->bt_bdev,
-                               XFS_AGB_TO_DADDR(mp, busyp->agno, busyp->bno),
+                               xfs_agbno_to_daddr(busyp->pag, busyp->bno),
                                XFS_FSB_TO_BB(mp, busyp->length),
                                GFP_KERNEL, &bio);
                if (error && error != -EOPNOTSUPP) {
index 22c16fa56bcc44471ef7fd7d9eb2d73e7c601da4..7c0595db29857f93037358c89933367a87c0e43a 100644 (file)
@@ -34,7 +34,7 @@ xfs_extent_busy_insert_list(
 
        new = kzalloc(sizeof(struct xfs_extent_busy),
                        GFP_KERNEL | __GFP_NOFAIL);
-       new->agno = pag->pag_agno;
+       new->pag = xfs_perag_hold(pag);
        new->bno = bno;
        new->length = len;
        INIT_LIST_HEAD(&new->list);
@@ -526,12 +526,14 @@ xfs_extent_busy_clear_one(
                        busyp->flags = XFS_EXTENT_BUSY_DISCARDED;
                        return false;
                }
-               trace_xfs_extent_busy_clear(pag->pag_mount, busyp->agno,
-                               busyp->bno, busyp->length);
+               trace_xfs_extent_busy_clear(pag->pag_mount,
+                               busyp->pag->pag_agno, busyp->bno,
+                               busyp->length);
                rb_erase(&busyp->rb_node, &pag->pagb_tree);
        }
 
        list_del_init(&busyp->list);
+       xfs_perag_put(busyp->pag);
        kfree(busyp);
        return true;
 }
@@ -554,10 +556,9 @@ xfs_extent_busy_clear(
                return;
 
        do {
+               struct xfs_perag        *pag = xfs_perag_hold(busyp->pag);
                bool                    wakeup = false;
-               struct xfs_perag        *pag;
 
-               pag = xfs_perag_get(mp, busyp->agno);
                spin_lock(&pag->pagb_lock);
                do {
                        next = list_next_entry(busyp, list);
@@ -565,7 +566,7 @@ xfs_extent_busy_clear(
                                wakeup = true;
                        busyp = next;
                } while (!list_entry_is_head(busyp, list, list) &&
-                        busyp->agno == pag->pag_agno);
+                        busyp->pag == pag);
 
                if (wakeup) {
                        pag->pagb_gen++;
@@ -662,7 +663,7 @@ xfs_extent_busy_ag_cmp(
                container_of(l2, struct xfs_extent_busy, list);
        s32 diff;
 
-       diff = b1->agno - b2->agno;
+       diff = b1->pag->pag_agno - b2->pag->pag_agno;
        if (!diff)
                diff = b1->bno - b2->bno;
        return diff;
index 847c904a19386c6d664b620c5523432ea38a27c9..72be61912c005f3e8b7c4b38d487fd67735c43ed 100644 (file)
@@ -20,7 +20,7 @@ struct xfs_alloc_arg;
 struct xfs_extent_busy {
        struct rb_node  rb_node;        /* ag by-bno indexed search tree */
        struct list_head list;          /* transaction busy extent list */
-       xfs_agnumber_t  agno;
+       struct xfs_perag *pag;
        xfs_agblock_t   bno;
        xfs_extlen_t    length;
        unsigned int    flags;