* cleanup buftarg lookup
@ 2019-10-25 2:18 Christoph Hellwig
2019-10-25 2:18 ` [PATCH 1/3] xfs: add a xfs_inode_buftarg helper Christoph Hellwig
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Christoph Hellwig @ 2019-10-25 2:18 UTC (permalink / raw
To: linux-xfs
Hi all,
this series merges our two helpers to look up the data device for a
given file, and uses that helper in a few more places.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/3] xfs: add a xfs_inode_buftarg helper
2019-10-25 2:18 cleanup buftarg lookup Christoph Hellwig
@ 2019-10-25 2:18 ` Christoph Hellwig
2019-10-25 5:31 ` Darrick J. Wong
2019-10-25 2:18 ` [PATCH 2/3] xfs: use xfs_inode_buftarg in xfs_file_dio_aio_write Christoph Hellwig
2019-10-25 2:18 ` [PATCH 3/3] xfs: use xfs_inode_buftarg in xfs_file_ioctl Christoph Hellwig
2 siblings, 1 reply; 7+ messages in thread
From: Christoph Hellwig @ 2019-10-25 2:18 UTC (permalink / raw
To: linux-xfs
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>
---
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;
- 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
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/3] xfs: use xfs_inode_buftarg in xfs_file_dio_aio_write
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 2:18 ` 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
2 siblings, 1 reply; 7+ messages in thread
From: Christoph Hellwig @ 2019-10-25 2:18 UTC (permalink / raw
To: linux-xfs
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
fs/xfs/xfs_file.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index ee4ebb7904f6..156238d5af19 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -487,8 +487,7 @@ xfs_file_dio_aio_write(
int unaligned_io = 0;
int iolock;
size_t count = iov_iter_count(from);
- struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ?
- mp->m_rtdev_targp : mp->m_ddev_targp;
+ struct xfs_buftarg *target = xfs_inode_buftarg(ip);
/* DIO must be aligned to device logical sector size */
if ((iocb->ki_pos | count) & target->bt_logical_sectormask)
--
2.20.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/3] xfs: use xfs_inode_buftarg in xfs_file_ioctl
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 2:18 ` [PATCH 2/3] xfs: use xfs_inode_buftarg in xfs_file_dio_aio_write Christoph Hellwig
@ 2019-10-25 2:18 ` Christoph Hellwig
2019-10-25 5:29 ` Darrick J. Wong
2 siblings, 1 reply; 7+ messages in thread
From: Christoph Hellwig @ 2019-10-25 2:18 UTC (permalink / raw
To: linux-xfs
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
fs/xfs/xfs_ioctl.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
index b7b5c17131cd..0fed56d3175c 100644
--- a/fs/xfs/xfs_ioctl.c
+++ b/fs/xfs/xfs_ioctl.c
@@ -2135,10 +2135,8 @@ xfs_file_ioctl(
return xfs_ioc_space(filp, cmd, &bf);
}
case XFS_IOC_DIOINFO: {
- struct dioattr da;
- xfs_buftarg_t *target =
- XFS_IS_REALTIME_INODE(ip) ?
- mp->m_rtdev_targp : mp->m_ddev_targp;
+ struct xfs_buftarg *target = xfs_inode_buftarg(ip);
+ struct dioattr da;
da.d_mem = da.d_miniosz = target->bt_logical_sectorsize;
da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1);
--
2.20.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 3/3] xfs: use xfs_inode_buftarg in xfs_file_ioctl
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
0 siblings, 0 replies; 7+ messages in thread
From: Darrick J. Wong @ 2019-10-25 5:29 UTC (permalink / raw
To: Christoph Hellwig; +Cc: linux-xfs
On Fri, Oct 25, 2019 at 11:18:52AM +0900, Christoph Hellwig wrote:
> Signed-off-by: Christoph Hellwig <hch@lst.de>
Looks ok,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
--D
> ---
> fs/xfs/xfs_ioctl.c | 6 ++----
> 1 file changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
> index b7b5c17131cd..0fed56d3175c 100644
> --- a/fs/xfs/xfs_ioctl.c
> +++ b/fs/xfs/xfs_ioctl.c
> @@ -2135,10 +2135,8 @@ xfs_file_ioctl(
> return xfs_ioc_space(filp, cmd, &bf);
> }
> case XFS_IOC_DIOINFO: {
> - struct dioattr da;
> - xfs_buftarg_t *target =
> - XFS_IS_REALTIME_INODE(ip) ?
> - mp->m_rtdev_targp : mp->m_ddev_targp;
> + struct xfs_buftarg *target = xfs_inode_buftarg(ip);
> + struct dioattr da;
>
> da.d_mem = da.d_miniosz = target->bt_logical_sectorsize;
> da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1);
> --
> 2.20.1
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/3] xfs: use xfs_inode_buftarg in xfs_file_dio_aio_write
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
0 siblings, 0 replies; 7+ messages in thread
From: Darrick J. Wong @ 2019-10-25 5:29 UTC (permalink / raw
To: Christoph Hellwig; +Cc: linux-xfs
On Fri, Oct 25, 2019 at 11:18:51AM +0900, Christoph Hellwig wrote:
> Signed-off-by: Christoph Hellwig <hch@lst.de>
Looks ok,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
--D
> ---
> fs/xfs/xfs_file.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
> index ee4ebb7904f6..156238d5af19 100644
> --- a/fs/xfs/xfs_file.c
> +++ b/fs/xfs/xfs_file.c
> @@ -487,8 +487,7 @@ xfs_file_dio_aio_write(
> int unaligned_io = 0;
> int iolock;
> size_t count = iov_iter_count(from);
> - struct xfs_buftarg *target = XFS_IS_REALTIME_INODE(ip) ?
> - mp->m_rtdev_targp : mp->m_ddev_targp;
> + struct xfs_buftarg *target = xfs_inode_buftarg(ip);
>
> /* DIO must be aligned to device logical sector size */
> if ((iocb->ki_pos | count) & target->bt_logical_sectormask)
> --
> 2.20.1
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/3] xfs: add a xfs_inode_buftarg helper
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
0 siblings, 0 replies; 7+ messages in thread
From: Darrick J. Wong @ 2019-10-25 5:31 UTC (permalink / raw
To: Christoph Hellwig; +Cc: linux-xfs
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
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2019-10-25 5:33 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
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
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.