Commit 5b5abbef authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Dan Williams
Browse files

xfs: move dax device handling into xfs_{alloc,free}_buftarg



Hide the DAX device lookup from the xfs_super.c code.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarDan Williams <dan.j.williams@intel.com>
Link: https://lore.kernel.org/r/20211129102203.2243509-22-hch@lst.de


Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 89b93a7b
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -1892,6 +1892,7 @@ xfs_free_buftarg(
	list_lru_destroy(&btp->bt_lru);
	list_lru_destroy(&btp->bt_lru);


	blkdev_issue_flush(btp->bt_bdev);
	blkdev_issue_flush(btp->bt_bdev);
	fs_put_dax(btp->bt_daxdev);


	kmem_free(btp);
	kmem_free(btp);
}
}
@@ -1932,11 +1933,10 @@ xfs_setsize_buftarg_early(
	return xfs_setsize_buftarg(btp, bdev_logical_block_size(bdev));
	return xfs_setsize_buftarg(btp, bdev_logical_block_size(bdev));
}
}


xfs_buftarg_t *
struct xfs_buftarg *
xfs_alloc_buftarg(
xfs_alloc_buftarg(
	struct xfs_mount	*mp,
	struct xfs_mount	*mp,
	struct block_device	*bdev,
	struct block_device	*bdev)
	struct dax_device	*dax_dev)
{
{
	xfs_buftarg_t		*btp;
	xfs_buftarg_t		*btp;


@@ -1945,7 +1945,7 @@ xfs_alloc_buftarg(
	btp->bt_mount = mp;
	btp->bt_mount = mp;
	btp->bt_dev =  bdev->bd_dev;
	btp->bt_dev =  bdev->bd_dev;
	btp->bt_bdev = bdev;
	btp->bt_bdev = bdev;
	btp->bt_daxdev = dax_dev;
	btp->bt_daxdev = fs_dax_get_by_bdev(bdev);


	/*
	/*
	 * Buffer IO error rate limiting. Limit it to no more than 10 messages
	 * Buffer IO error rate limiting. Limit it to no more than 10 messages
+2 −2
Original line number Original line Diff line number Diff line
@@ -338,8 +338,8 @@ xfs_buf_update_cksum(struct xfs_buf *bp, unsigned long cksum_offset)
/*
/*
 *	Handling of buftargs.
 *	Handling of buftargs.
 */
 */
extern struct xfs_buftarg *xfs_alloc_buftarg(struct xfs_mount *,
struct xfs_buftarg *xfs_alloc_buftarg(struct xfs_mount *mp,
		struct block_device *, struct dax_device *);
		struct block_device *bdev);
extern void xfs_free_buftarg(struct xfs_buftarg *);
extern void xfs_free_buftarg(struct xfs_buftarg *);
extern void xfs_buftarg_wait(struct xfs_buftarg *);
extern void xfs_buftarg_wait(struct xfs_buftarg *);
extern void xfs_buftarg_drain(struct xfs_buftarg *);
extern void xfs_buftarg_drain(struct xfs_buftarg *);
+5 −21
Original line number Original line Diff line number Diff line
@@ -391,26 +391,19 @@ STATIC void
xfs_close_devices(
xfs_close_devices(
	struct xfs_mount	*mp)
	struct xfs_mount	*mp)
{
{
	struct dax_device *dax_ddev = mp->m_ddev_targp->bt_daxdev;

	if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) {
	if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) {
		struct block_device *logdev = mp->m_logdev_targp->bt_bdev;
		struct block_device *logdev = mp->m_logdev_targp->bt_bdev;
		struct dax_device *dax_logdev = mp->m_logdev_targp->bt_daxdev;


		xfs_free_buftarg(mp->m_logdev_targp);
		xfs_free_buftarg(mp->m_logdev_targp);
		xfs_blkdev_put(logdev);
		xfs_blkdev_put(logdev);
		fs_put_dax(dax_logdev);
	}
	}
	if (mp->m_rtdev_targp) {
	if (mp->m_rtdev_targp) {
		struct block_device *rtdev = mp->m_rtdev_targp->bt_bdev;
		struct block_device *rtdev = mp->m_rtdev_targp->bt_bdev;
		struct dax_device *dax_rtdev = mp->m_rtdev_targp->bt_daxdev;


		xfs_free_buftarg(mp->m_rtdev_targp);
		xfs_free_buftarg(mp->m_rtdev_targp);
		xfs_blkdev_put(rtdev);
		xfs_blkdev_put(rtdev);
		fs_put_dax(dax_rtdev);
	}
	}
	xfs_free_buftarg(mp->m_ddev_targp);
	xfs_free_buftarg(mp->m_ddev_targp);
	fs_put_dax(dax_ddev);
}
}


/*
/*
@@ -428,8 +421,6 @@ xfs_open_devices(
	struct xfs_mount	*mp)
	struct xfs_mount	*mp)
{
{
	struct block_device	*ddev = mp->m_super->s_bdev;
	struct block_device	*ddev = mp->m_super->s_bdev;
	struct dax_device	*dax_ddev = fs_dax_get_by_bdev(ddev);
	struct dax_device	*dax_logdev = NULL, *dax_rtdev = NULL;
	struct block_device	*logdev = NULL, *rtdev = NULL;
	struct block_device	*logdev = NULL, *rtdev = NULL;
	int			error;
	int			error;


@@ -439,8 +430,7 @@ xfs_open_devices(
	if (mp->m_logname) {
	if (mp->m_logname) {
		error = xfs_blkdev_get(mp, mp->m_logname, &logdev);
		error = xfs_blkdev_get(mp, mp->m_logname, &logdev);
		if (error)
		if (error)
			goto out;
			return error;
		dax_logdev = fs_dax_get_by_bdev(logdev);
	}
	}


	if (mp->m_rtname) {
	if (mp->m_rtname) {
@@ -454,25 +444,24 @@ xfs_open_devices(
			error = -EINVAL;
			error = -EINVAL;
			goto out_close_rtdev;
			goto out_close_rtdev;
		}
		}
		dax_rtdev = fs_dax_get_by_bdev(rtdev);
	}
	}


	/*
	/*
	 * Setup xfs_mount buffer target pointers
	 * Setup xfs_mount buffer target pointers
	 */
	 */
	error = -ENOMEM;
	error = -ENOMEM;
	mp->m_ddev_targp = xfs_alloc_buftarg(mp, ddev, dax_ddev);
	mp->m_ddev_targp = xfs_alloc_buftarg(mp, ddev);
	if (!mp->m_ddev_targp)
	if (!mp->m_ddev_targp)
		goto out_close_rtdev;
		goto out_close_rtdev;


	if (rtdev) {
	if (rtdev) {
		mp->m_rtdev_targp = xfs_alloc_buftarg(mp, rtdev, dax_rtdev);
		mp->m_rtdev_targp = xfs_alloc_buftarg(mp, rtdev);
		if (!mp->m_rtdev_targp)
		if (!mp->m_rtdev_targp)
			goto out_free_ddev_targ;
			goto out_free_ddev_targ;
	}
	}


	if (logdev && logdev != ddev) {
	if (logdev && logdev != ddev) {
		mp->m_logdev_targp = xfs_alloc_buftarg(mp, logdev, dax_logdev);
		mp->m_logdev_targp = xfs_alloc_buftarg(mp, logdev);
		if (!mp->m_logdev_targp)
		if (!mp->m_logdev_targp)
			goto out_free_rtdev_targ;
			goto out_free_rtdev_targ;
	} else {
	} else {
@@ -488,14 +477,9 @@ xfs_open_devices(
	xfs_free_buftarg(mp->m_ddev_targp);
	xfs_free_buftarg(mp->m_ddev_targp);
 out_close_rtdev:
 out_close_rtdev:
	xfs_blkdev_put(rtdev);
	xfs_blkdev_put(rtdev);
	fs_put_dax(dax_rtdev);
 out_close_logdev:
 out_close_logdev:
	if (logdev && logdev != ddev) {
	if (logdev && logdev != ddev)
		xfs_blkdev_put(logdev);
		xfs_blkdev_put(logdev);
		fs_put_dax(dax_logdev);
	}
 out:
	fs_put_dax(dax_ddev);
	return error;
	return error;
}
}