xfs: use xfs_bmap_longest_free_extent() in filestreams
authorDave Chinner <dchinner@redhat.com>
Sun, 12 Feb 2023 22:14:55 +0000 (09:14 +1100)
committerDave Chinner <dchinner@redhat.com>
Sun, 12 Feb 2023 22:14:55 +0000 (09:14 +1100)
The code in xfs_bmap_longest_free_extent() is open coded in
xfs_filestream_pick_ag(). Export xfs_bmap_longest_free_extent and
call it from the filestreams code instead.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/libxfs/xfs_bmap.h
fs/xfs/xfs_filestream.c

index 8939817..16628fd 100644 (file)
@@ -3135,7 +3135,7 @@ xfs_bmap_adjacent(
 #undef ISVALID
 }
 
-static int
+int
 xfs_bmap_longest_free_extent(
        struct xfs_perag        *pag,
        struct xfs_trans        *tp,
index 524912f..b52cfdc 100644 (file)
@@ -168,6 +168,8 @@ static inline bool xfs_bmap_is_written_extent(struct xfs_bmbt_irec *irec)
 #define xfs_valid_startblock(ip, startblock) \
        ((startblock) != 0 || XFS_IS_REALTIME_INODE(ip))
 
+int    xfs_bmap_longest_free_extent(struct xfs_perag *pag,
+               struct xfs_trans *tp, xfs_extlen_t *blen);
 void   xfs_trim_extent(struct xfs_bmbt_irec *irec, xfs_fileoff_t bno,
                xfs_filblks_t len);
 unsigned int xfs_bmap_compute_attr_offset(struct xfs_mount *mp);
index 7e8b25a..2eb7020 100644 (file)
@@ -124,17 +124,14 @@ xfs_filestream_pick_ag(
                trace_xfs_filestream_scan(mp, ip->i_ino, ag);
 
                pag = xfs_perag_get(mp, ag);
-
-               if (!xfs_perag_initialised_agf(pag)) {
-                       err = xfs_alloc_read_agf(pag, NULL, trylock, NULL);
-                       if (err) {
-                               if (err != -EAGAIN) {
-                                       xfs_perag_put(pag);
-                                       return err;
-                               }
-                               /* Couldn't lock the AGF, skip this AG. */
-                               goto next_ag;
-                       }
+               longest = 0;
+               err = xfs_bmap_longest_free_extent(pag, NULL, &longest);
+               if (err) {
+                       xfs_perag_put(pag);
+                       if (err != -EAGAIN)
+                               return err;
+                       /* Couldn't lock the AGF, skip this AG. */
+                       goto next_ag;
                }
 
                /* Keep track of the AG with the most free blocks. */
@@ -154,9 +151,6 @@ xfs_filestream_pick_ag(
                        goto next_ag;
                }
 
-               longest = xfs_alloc_longest_free_extent(pag,
-                               xfs_alloc_min_freelist(mp, pag),
-                               xfs_ag_resv_needed(pag, XFS_AG_RESV_NONE));
                if (((minlen && longest >= minlen) ||
                     (!minlen && pag->pagf_freeblks >= minfree)) &&
                    (!xfs_perag_prefers_metadata(pag) ||