]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: clean up the initial read logic in xfs_readsb
authorChristoph Hellwig <hch@lst.de>
Mon, 7 Jul 2025 12:53:12 +0000 (14:53 +0200)
committerCarlos Maiolino <cem@kernel.org>
Tue, 8 Jul 2025 11:30:26 +0000 (13:30 +0200)
The initial sb read is always for a device logical block size buffer.
The device logical block size is provided in the bt_logical_sectorsize in
struct buftarg, so use that instead of the confusingly named
xfs_getsize_buftarg buffer that reads it from the bdev.

Update the comments surrounding the code to better describe what is going
on.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
fs/xfs/xfs_buf.h
fs/xfs/xfs_mount.c

index 15fc569483465d2e8154fcd680e11416592e52f8..73a9686110e8aefc019c1cb75d93de335997928a 100644 (file)
@@ -375,7 +375,6 @@ extern void xfs_buftarg_wait(struct xfs_buftarg *);
 extern void xfs_buftarg_drain(struct xfs_buftarg *);
 int xfs_configure_buftarg(struct xfs_buftarg *btp, unsigned int sectorsize);
 
-#define xfs_getsize_buftarg(buftarg)   block_size((buftarg)->bt_bdev)
 #define xfs_readonly_buftarg(buftarg)  bdev_read_only((buftarg)->bt_bdev)
 
 int xfs_buf_reverify(struct xfs_buf *bp, const struct xfs_buf_ops *ops);
index 29276fe60df9c6d21e3ad0a3de551c92a46ef239..047100b080aa383b23d16e8cba05cbbbec7ad95a 100644 (file)
@@ -171,19 +171,16 @@ xfs_readsb(
        ASSERT(mp->m_ddev_targp != NULL);
 
        /*
-        * For the initial read, we must guess at the sector
-        * size based on the block device.  It's enough to
-        * get the sb_sectsize out of the superblock and
-        * then reread with the proper length.
-        * We don't verify it yet, because it may not be complete.
+        * In the first pass, use the device sector size to just read enough
+        * of the superblock to extract the XFS sector size.
+        *
+        * The device sector size must be smaller than or equal to the XFS
+        * sector size and thus we can always read the superblock.  Once we know
+        * the XFS sector size, re-read it and run the buffer verifier.
         */
-       sector_size = xfs_getsize_buftarg(mp->m_ddev_targp);
+       sector_size = mp->m_ddev_targp->bt_logical_sectorsize;
        buf_ops = NULL;
 
-       /*
-        * Allocate a (locked) buffer to hold the superblock. This will be kept
-        * around at all times to optimize access to the superblock.
-        */
 reread:
        error = xfs_buf_read_uncached(mp->m_ddev_targp, XFS_SB_DADDR,
                                      BTOBB(sector_size), &bp, buf_ops);
@@ -247,6 +244,10 @@ reread:
        /* no need to be quiet anymore, so reset the buf ops */
        bp->b_ops = &xfs_sb_buf_ops;
 
+       /*
+        * Keep a pointer of the sb buffer around instead of caching it in the
+        * buffer cache because we access it frequently.
+        */
        mp->m_sb_bp = bp;
        xfs_buf_unlock(bp);
        return 0;