From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Christoph Hellwig <hch@lst.de>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 1/3] xfs: add a xfs_inode_buftarg helper
Date: Thu, 24 Oct 2019 22:31:49 -0700 [thread overview]
Message-ID: <20191025053149.GD913374@magnolia> (raw)
In-Reply-To: <20191025021852.20172-2-hch@lst.de>
On Fri, Oct 25, 2019 at 11:18:50AM +0900, Christoph Hellwig wrote:
> Add a new xfs_inode_buftarg helper that gets the data I/O buftarg for a
> given inode. Replace the existing xfs_find_bdev_for_inode and
> xfs_find_daxdev_for_inode helpers with this new general one and cleanup
> some of the callers.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
Looks ok,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
--D
> ---
> fs/xfs/xfs_aops.c | 34 +++++-----------------------------
> fs/xfs/xfs_aops.h | 3 ---
> fs/xfs/xfs_bmap_util.c | 15 ++++++++-------
> fs/xfs/xfs_file.c | 14 +++++++-------
> fs/xfs/xfs_inode.h | 7 +++++++
> fs/xfs/xfs_ioctl.c | 7 +++----
> fs/xfs/xfs_iomap.c | 11 +++++++----
> fs/xfs/xfs_iops.c | 2 +-
> 8 files changed, 38 insertions(+), 55 deletions(-)
>
> diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
> index 5d3503f6412a..3a688eb5c5ae 100644
> --- a/fs/xfs/xfs_aops.c
> +++ b/fs/xfs/xfs_aops.c
> @@ -30,32 +30,6 @@ XFS_WPC(struct iomap_writepage_ctx *ctx)
> return container_of(ctx, struct xfs_writepage_ctx, ctx);
> }
>
> -struct block_device *
> -xfs_find_bdev_for_inode(
> - struct inode *inode)
> -{
> - struct xfs_inode *ip = XFS_I(inode);
> - struct xfs_mount *mp = ip->i_mount;
> -
> - if (XFS_IS_REALTIME_INODE(ip))
> - return mp->m_rtdev_targp->bt_bdev;
> - else
> - return mp->m_ddev_targp->bt_bdev;
> -}
> -
> -struct dax_device *
> -xfs_find_daxdev_for_inode(
> - struct inode *inode)
> -{
> - struct xfs_inode *ip = XFS_I(inode);
> - struct xfs_mount *mp = ip->i_mount;
> -
> - if (XFS_IS_REALTIME_INODE(ip))
> - return mp->m_rtdev_targp->bt_daxdev;
> - else
> - return mp->m_ddev_targp->bt_daxdev;
> -}
> -
> /*
> * Fast and loose check if this write could update the on-disk inode size.
> */
> @@ -609,9 +583,11 @@ xfs_dax_writepages(
> struct address_space *mapping,
> struct writeback_control *wbc)
> {
> - xfs_iflags_clear(XFS_I(mapping->host), XFS_ITRUNCATED);
> + struct xfs_inode *ip = XFS_I(mapping->host);
> +
> + xfs_iflags_clear(ip, XFS_ITRUNCATED);
> return dax_writeback_mapping_range(mapping,
> - xfs_find_bdev_for_inode(mapping->host), wbc);
> + xfs_inode_buftarg(ip)->bt_bdev, wbc);
> }
>
> STATIC sector_t
> @@ -661,7 +637,7 @@ xfs_iomap_swapfile_activate(
> struct file *swap_file,
> sector_t *span)
> {
> - sis->bdev = xfs_find_bdev_for_inode(file_inode(swap_file));
> + sis->bdev = xfs_inode_buftarg(XFS_I(file_inode(swap_file)))->bt_bdev;
> return iomap_swapfile_activate(sis, swap_file, span,
> &xfs_read_iomap_ops);
> }
> diff --git a/fs/xfs/xfs_aops.h b/fs/xfs/xfs_aops.h
> index 687b11f34fa2..e0bd68419764 100644
> --- a/fs/xfs/xfs_aops.h
> +++ b/fs/xfs/xfs_aops.h
> @@ -11,7 +11,4 @@ extern const struct address_space_operations xfs_dax_aops;
>
> int xfs_setfilesize(struct xfs_inode *ip, xfs_off_t offset, size_t size);
>
> -extern struct block_device *xfs_find_bdev_for_inode(struct inode *);
> -extern struct dax_device *xfs_find_daxdev_for_inode(struct inode *);
> -
> #endif /* __XFS_AOPS_H__ */
> diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c
> index 5d8632b7f549..9b0572a7b03a 100644
> --- a/fs/xfs/xfs_bmap_util.c
> +++ b/fs/xfs/xfs_bmap_util.c
> @@ -53,15 +53,16 @@ xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb)
> */
> int
> xfs_zero_extent(
> - struct xfs_inode *ip,
> - xfs_fsblock_t start_fsb,
> - xfs_off_t count_fsb)
> + struct xfs_inode *ip,
> + xfs_fsblock_t start_fsb,
> + xfs_off_t count_fsb)
> {
> - struct xfs_mount *mp = ip->i_mount;
> - xfs_daddr_t sector = xfs_fsb_to_db(ip, start_fsb);
> - sector_t block = XFS_BB_TO_FSBT(mp, sector);
> + struct xfs_mount *mp = ip->i_mount;
> + struct xfs_buftarg *target = xfs_inode_buftarg(ip);
> + xfs_daddr_t sector = xfs_fsb_to_db(ip, start_fsb);
> + sector_t block = XFS_BB_TO_FSBT(mp, sector);
>
> - return blkdev_issue_zeroout(xfs_find_bdev_for_inode(VFS_I(ip)),
> + return blkdev_issue_zeroout(target->bt_bdev,
> block << (mp->m_super->s_blocksize_bits - 9),
> count_fsb << (mp->m_super->s_blocksize_bits - 9),
> GFP_NOFS, 0);
> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
> index 24659667d5cb..ee4ebb7904f6 100644
> --- a/fs/xfs/xfs_file.c
> +++ b/fs/xfs/xfs_file.c
> @@ -1229,22 +1229,22 @@ static const struct vm_operations_struct xfs_file_vm_ops = {
>
> STATIC int
> xfs_file_mmap(
> - struct file *filp,
> - struct vm_area_struct *vma)
> + struct file *file,
> + struct vm_area_struct *vma)
> {
> - struct dax_device *dax_dev;
> + struct inode *inode = file_inode(file);
> + struct xfs_buftarg *target = xfs_inode_buftarg(XFS_I(inode));
>
> - dax_dev = xfs_find_daxdev_for_inode(file_inode(filp));
> /*
> * We don't support synchronous mappings for non-DAX files and
> * for DAX files if underneath dax_device is not synchronous.
> */
> - if (!daxdev_mapping_supported(vma, dax_dev))
> + if (!daxdev_mapping_supported(vma, target->bt_daxdev))
> return -EOPNOTSUPP;
>
> - file_accessed(filp);
> + file_accessed(file);
> vma->vm_ops = &xfs_file_vm_ops;
> - if (IS_DAX(file_inode(filp)))
> + if (IS_DAX(inode))
> vma->vm_flags |= VM_HUGEPAGE;
> return 0;
> }
> diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h
> index 558173f95a03..bcfb35a9c5ca 100644
> --- a/fs/xfs/xfs_inode.h
> +++ b/fs/xfs/xfs_inode.h
> @@ -219,6 +219,13 @@ static inline bool xfs_inode_has_cow_data(struct xfs_inode *ip)
> return ip->i_cowfp && ip->i_cowfp->if_bytes;
> }
>
> +/*
> + * Return the buftarg used for data allocations on a given inode.
> + */
> +#define xfs_inode_buftarg(ip) \
> + (XFS_IS_REALTIME_INODE(ip) ? \
> + (ip)->i_mount->m_rtdev_targp : (ip)->i_mount->m_ddev_targp)
> +
> /*
> * In-core inode flags.
> */
> diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
> index d58f0d6a699e..b7b5c17131cd 100644
> --- a/fs/xfs/xfs_ioctl.c
> +++ b/fs/xfs/xfs_ioctl.c
> @@ -1311,10 +1311,9 @@ xfs_ioctl_setattr_dax_invalidate(
> * have to check the device for dax support or flush pagecache.
> */
> if (fa->fsx_xflags & FS_XFLAG_DAX) {
> - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
> - return -EINVAL;
Um... why are we're removing this mode check?
--D
> - if (!bdev_dax_supported(xfs_find_bdev_for_inode(VFS_I(ip)),
> - sb->s_blocksize))
> + struct xfs_buftarg *target = xfs_inode_buftarg(ip);
> +
> + if (!bdev_dax_supported(target->bt_bdev, sb->s_blocksize))
> return -EINVAL;
> }
>
> diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
> index bf0c7756ac90..c1063507e5fd 100644
> --- a/fs/xfs/xfs_iomap.c
> +++ b/fs/xfs/xfs_iomap.c
> @@ -57,6 +57,7 @@ xfs_bmbt_to_iomap(
> u16 flags)
> {
> struct xfs_mount *mp = ip->i_mount;
> + struct xfs_buftarg *target = xfs_inode_buftarg(ip);
>
> if (unlikely(!xfs_valid_startblock(ip, imap->br_startblock)))
> return xfs_alert_fsblock_zero(ip, imap);
> @@ -77,8 +78,8 @@ xfs_bmbt_to_iomap(
> }
> iomap->offset = XFS_FSB_TO_B(mp, imap->br_startoff);
> iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount);
> - iomap->bdev = xfs_find_bdev_for_inode(VFS_I(ip));
> - iomap->dax_dev = xfs_find_daxdev_for_inode(VFS_I(ip));
> + iomap->bdev = target->bt_bdev;
> + iomap->dax_dev = target->bt_daxdev;
> iomap->flags = flags;
>
> if (xfs_ipincount(ip) &&
> @@ -94,12 +95,14 @@ xfs_hole_to_iomap(
> xfs_fileoff_t offset_fsb,
> xfs_fileoff_t end_fsb)
> {
> + struct xfs_buftarg *target = xfs_inode_buftarg(ip);
> +
> iomap->addr = IOMAP_NULL_ADDR;
> iomap->type = IOMAP_HOLE;
> iomap->offset = XFS_FSB_TO_B(ip->i_mount, offset_fsb);
> iomap->length = XFS_FSB_TO_B(ip->i_mount, end_fsb - offset_fsb);
> - iomap->bdev = xfs_find_bdev_for_inode(VFS_I(ip));
> - iomap->dax_dev = xfs_find_daxdev_for_inode(VFS_I(ip));
> + iomap->bdev = target->bt_bdev;
> + iomap->dax_dev = target->bt_daxdev;
> }
>
> static inline xfs_fileoff_t
> diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c
> index 329a34af8e79..404f2dd58698 100644
> --- a/fs/xfs/xfs_iops.c
> +++ b/fs/xfs/xfs_iops.c
> @@ -1227,7 +1227,7 @@ xfs_inode_supports_dax(
> return false;
>
> /* Device has to support DAX too. */
> - return xfs_find_daxdev_for_inode(VFS_I(ip)) != NULL;
> + return xfs_inode_buftarg(ip)->bt_daxdev != NULL;
> }
>
> STATIC void
> --
> 2.20.1
>
next prev parent reply other threads:[~2019-10-25 5:33 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-25 2:18 cleanup buftarg lookup Christoph Hellwig
2019-10-25 2:18 ` [PATCH 1/3] xfs: add a xfs_inode_buftarg helper Christoph Hellwig
2019-10-25 5:31 ` Darrick J. Wong [this message]
2019-10-25 2:18 ` [PATCH 2/3] xfs: use xfs_inode_buftarg in xfs_file_dio_aio_write Christoph Hellwig
2019-10-25 5:29 ` Darrick J. Wong
2019-10-25 2:18 ` [PATCH 3/3] xfs: use xfs_inode_buftarg in xfs_file_ioctl Christoph Hellwig
2019-10-25 5:29 ` Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191025053149.GD913374@magnolia \
--to=darrick.wong@oracle.com \
--cc=hch@lst.de \
--cc=linux-xfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox