[PATCH 16/25] libxfs: use uncached buffers for initial mkfs writes

Darrick J. Wong
2020-02-25T00:15:19Z

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>
---
libxfs/libxfs_io.h | 1 -
libxfs/rdwr.c | 12 ------------
mkfs/xfs_mkfs.c | 33 ++++++++++++++++++++++-----------
3 files changed, 22 insertions(+), 24 deletions(-)

diff --git a/libxfs/libxfs_io.h b/libxfs/libxfs_io.h
index 21afc99c..1d30039a 100644
--- a/libxfs/libxfs_io.h
+++ b/libxfs/libxfs_io.h
@@ -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 */
diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c
index 739f4aed..e19b4c51 100644
--- a/libxfs/rdwr.c
+++ b/libxfs/rdwr.c
@@ -633,18 +633,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)
{
diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
index 3827b410..b80bbd75 100644
--- a/mkfs/xfs_mkfs.c
+++ b/mkfs/xfs_mkfs.c
@@ -3396,6 +3396,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.
@@ -3444,11 +3459,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
@@ -3456,19 +3470,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;
@@ -3483,12 +3495,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);
}

}