]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
libxfs: use uncached buffers for initial mkfs writes
authorDarrick J. Wong <darrick.wong@oracle.com>
Sun, 1 Mar 2020 17:34:11 +0000 (12:34 -0500)
committerEric Sandeen <sandeen@sandeen.net>
Sun, 1 Mar 2020 17:34:11 +0000 (12:34 -0500)
Teach mkfs to use uncached buffers to write the start and end of the
data device, the initial superblock, and the end of the realtime device
instead of open-coding uncached buffers.  This means we can get rid of
libxfs_purgebuf since we handle the state from the start now.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/libxfs_io.h
libxfs/rdwr.c
mkfs/xfs_mkfs.c

index 21afc99c1d45f293dd4d976d22de4c1b3d499da9..1d30039ab2dd49ae04260c8f166399a332ea0055 100644 (file)
@@ -211,7 +211,6 @@ struct xfs_buf *libxfs_getsb(struct xfs_mount *mp);
 extern void    libxfs_bcache_purge(void);
 extern void    libxfs_bcache_free(void);
 extern void    libxfs_bcache_flush(void);
-extern void    libxfs_purgebuf(xfs_buf_t *);
 extern int     libxfs_bcache_overflowed(void);
 
 /* Buffer (Raw) Interfaces */
index cc7db73b4500887a26f47edd8a0f10bdaaa3d71b..958f6c2c5d746d3c99a038470c599d612a5451c7 100644 (file)
@@ -640,18 +640,6 @@ libxfs_buf_relse(
                libxfs_putbufr(bp);
 }
 
-void
-libxfs_purgebuf(xfs_buf_t *bp)
-{
-       struct xfs_bufkey key = {NULL};
-
-       key.buftarg = bp->b_target;
-       key.blkno = bp->b_bn;
-       key.bblen = bp->b_length;
-
-       cache_node_purge(libxfs_bcache, &key, (struct cache_node *)bp);
-}
-
 static struct cache_node *
 libxfs_balloc(cache_key_t key)
 {
index 6d1ba933094ad78709434acd4f472a8ed8107e76..d9675bf1e686dc118fc875a3f9c96b475e57dc01 100644 (file)
@@ -3351,6 +3351,21 @@ finish_superblock_setup(
 
 }
 
+/* Prepare an uncached buffer, ready to write something out. */
+static inline struct xfs_buf *
+alloc_write_buf(
+       struct xfs_buftarg      *btp,
+       xfs_daddr_t             daddr,
+       int                     bblen)
+{
+       struct xfs_buf          *bp;
+
+       bp = libxfs_buf_get_uncached(btp, bblen, 0);
+       bp->b_bn = daddr;
+       bp->b_maps[0].bm_bn = daddr;
+       return bp;
+}
+
 /*
  * Sanitise the data and log devices and prepare them so libxfs can mount the
  * device successfully. Also check we can access the rt device if configured.
@@ -3399,11 +3414,10 @@ prepare_devices(
         * the end of the device.  (MD sb is ~64k from the end, take out a wider
         * swath to be sure)
         */
-       buf = libxfs_buf_get(mp->m_ddev_targp, (xi->dsize - whack_blks),
-                           whack_blks);
+       buf = alloc_write_buf(mp->m_ddev_targp, (xi->dsize - whack_blks),
+                       whack_blks);
        memset(buf->b_addr, 0, WHACK_SIZE);
        libxfs_writebuf(buf, 0);
-       libxfs_purgebuf(buf);
 
        /*
         * Now zero out the beginning of the device, to obliterate any old
@@ -3411,19 +3425,17 @@ prepare_devices(
         * swap (somewhere around the page size), jfs (32k),
         * ext[2,3] and reiserfs (64k) - and hopefully all else.
         */
-       buf = libxfs_buf_get(mp->m_ddev_targp, 0, whack_blks);
+       buf = alloc_write_buf(mp->m_ddev_targp, 0, whack_blks);
        memset(buf->b_addr, 0, WHACK_SIZE);
        libxfs_writebuf(buf, 0);
-       libxfs_purgebuf(buf);
 
        /* OK, now write the superblock... */
-       buf = libxfs_buf_get(mp->m_ddev_targp, XFS_SB_DADDR,
+       buf = alloc_write_buf(mp->m_ddev_targp, XFS_SB_DADDR,
                        XFS_FSS_TO_BB(mp, 1));
        buf->b_ops = &xfs_sb_buf_ops;
        memset(buf->b_addr, 0, cfg->sectorsize);
        libxfs_sb_to_disk(buf->b_addr, sbp);
        libxfs_writebuf(buf, 0);
-       libxfs_purgebuf(buf);
 
        /* ...and zero the log.... */
        lsunit = sbp->sb_logsunit;
@@ -3438,12 +3450,11 @@ prepare_devices(
 
        /* finally, check we can write the last block in the realtime area */
        if (mp->m_rtdev_targp->dev && cfg->rtblocks > 0) {
-               buf = libxfs_buf_get(mp->m_rtdev_targp,
-                                   XFS_FSB_TO_BB(mp, cfg->rtblocks - 1LL),
-                                   BTOBB(cfg->blocksize));
+               buf = alloc_write_buf(mp->m_rtdev_targp,
+                               XFS_FSB_TO_BB(mp, cfg->rtblocks - 1LL),
+                               BTOBB(cfg->blocksize));
                memset(buf->b_addr, 0, cfg->blocksize);
                libxfs_writebuf(buf, 0);
-               libxfs_purgebuf(buf);
        }
 
 }