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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.