xfs: add a xfs_inode_buftarg helper
authorChristoph Hellwig <hch@lst.de>
Fri, 25 Oct 2019 05:25:38 +0000 (22:25 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Mon, 28 Oct 2019 15:37:54 +0000 (08:37 -0700)
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>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_aops.c
fs/xfs/xfs_aops.h
fs/xfs/xfs_bmap_util.c
fs/xfs/xfs_file.c
fs/xfs/xfs_inode.h
fs/xfs/xfs_ioctl.c
fs/xfs/xfs_iomap.c
fs/xfs/xfs_iops.c

index 5d3503f..3a688eb 100644 (file)
@@ -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);
 }
index 687b11f..e0bd684 100644 (file)
@@ -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__ */
index 99bf372..ba53201 100644 (file)
@@ -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);
index 2465966..ee4ebb7 100644 (file)
@@ -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;
 }
index 558173f..bcfb35a 100644 (file)
@@ -220,6 +220,13 @@ static inline bool xfs_inode_has_cow_data(struct xfs_inode *ip)
 }
 
 /*
+ * 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.
  */
 #define XFS_IRECLAIM           (1 << 0) /* started reclaiming this inode */
index d58f0d6..b7b5c17 100644 (file)
@@ -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;
        }
 
index e8fb500..8317b93 100644 (file)
@@ -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
index 329a34a..404f2dd 100644 (file)
@@ -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