mirror of https://gitee.com/openkylin/linux.git
[XFS] kill BMAPI_DEVICE
There is no reason to go into the iomap machinery just to get the right block device for an inode. Instead look at the realtime flag in the inode and grab the right device from the mount structure. I created a new helper, xfs_find_bdev_for_inode instead of opencoding it because I plan to use it in other places in the future. SGI-PV: 970240 SGI-Modid: xfs-linux-melb:xfs-kern:29680a Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Donald Douwsma <donaldd@sgi.com> Signed-off-by: Tim Shimmin <tes@sgi.com>
This commit is contained in:
parent
cf441eeb79
commit
6214ed4461
|
@ -107,6 +107,18 @@ xfs_page_trace(
|
||||||
#define xfs_page_trace(tag, inode, page, pgoff)
|
#define xfs_page_trace(tag, inode, page, pgoff)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
STATIC struct block_device *
|
||||||
|
xfs_find_bdev_for_inode(
|
||||||
|
struct xfs_inode *ip)
|
||||||
|
{
|
||||||
|
struct xfs_mount *mp = ip->i_mount;
|
||||||
|
|
||||||
|
if (ip->i_d.di_flags & XFS_DIFLAG_REALTIME)
|
||||||
|
return mp->m_rtdev_targp->bt_bdev;
|
||||||
|
else
|
||||||
|
return mp->m_ddev_targp->bt_bdev;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Schedule IO completion handling on a xfsdatad if this was
|
* Schedule IO completion handling on a xfsdatad if this was
|
||||||
* the final hold on this ioend. If we are asked to wait,
|
* the final hold on this ioend. If we are asked to wait,
|
||||||
|
@ -1471,28 +1483,21 @@ xfs_vm_direct_IO(
|
||||||
{
|
{
|
||||||
struct file *file = iocb->ki_filp;
|
struct file *file = iocb->ki_filp;
|
||||||
struct inode *inode = file->f_mapping->host;
|
struct inode *inode = file->f_mapping->host;
|
||||||
xfs_iomap_t iomap;
|
struct block_device *bdev;
|
||||||
int maps = 1;
|
|
||||||
int error;
|
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
|
|
||||||
error = xfs_bmap(XFS_I(inode), offset, 0,
|
bdev = xfs_find_bdev_for_inode(XFS_I(inode));
|
||||||
BMAPI_DEVICE, &iomap, &maps);
|
|
||||||
if (error)
|
|
||||||
return -error;
|
|
||||||
|
|
||||||
if (rw == WRITE) {
|
if (rw == WRITE) {
|
||||||
iocb->private = xfs_alloc_ioend(inode, IOMAP_UNWRITTEN);
|
iocb->private = xfs_alloc_ioend(inode, IOMAP_UNWRITTEN);
|
||||||
ret = blockdev_direct_IO_own_locking(rw, iocb, inode,
|
ret = blockdev_direct_IO_own_locking(rw, iocb, inode,
|
||||||
iomap.iomap_target->bt_bdev,
|
bdev, iov, offset, nr_segs,
|
||||||
iov, offset, nr_segs,
|
|
||||||
xfs_get_blocks_direct,
|
xfs_get_blocks_direct,
|
||||||
xfs_end_io_direct);
|
xfs_end_io_direct);
|
||||||
} else {
|
} else {
|
||||||
iocb->private = xfs_alloc_ioend(inode, IOMAP_READ);
|
iocb->private = xfs_alloc_ioend(inode, IOMAP_READ);
|
||||||
ret = blockdev_direct_IO_no_locking(rw, iocb, inode,
|
ret = blockdev_direct_IO_no_locking(rw, iocb, inode,
|
||||||
iomap.iomap_target->bt_bdev,
|
bdev, iov, offset, nr_segs,
|
||||||
iov, offset, nr_segs,
|
|
||||||
xfs_get_blocks_direct,
|
xfs_get_blocks_direct,
|
||||||
xfs_end_io_direct);
|
xfs_end_io_direct);
|
||||||
}
|
}
|
||||||
|
|
|
@ -193,7 +193,7 @@ xfs_iomap(
|
||||||
|
|
||||||
switch (flags &
|
switch (flags &
|
||||||
(BMAPI_READ | BMAPI_WRITE | BMAPI_ALLOCATE |
|
(BMAPI_READ | BMAPI_WRITE | BMAPI_ALLOCATE |
|
||||||
BMAPI_UNWRITTEN | BMAPI_DEVICE)) {
|
BMAPI_UNWRITTEN)) {
|
||||||
case BMAPI_READ:
|
case BMAPI_READ:
|
||||||
xfs_iomap_enter_trace(XFS_IOMAP_READ_ENTER, io, offset, count);
|
xfs_iomap_enter_trace(XFS_IOMAP_READ_ENTER, io, offset, count);
|
||||||
lockmode = XFS_LCK_MAP_SHARED(mp, io);
|
lockmode = XFS_LCK_MAP_SHARED(mp, io);
|
||||||
|
@ -220,13 +220,6 @@ xfs_iomap(
|
||||||
break;
|
break;
|
||||||
case BMAPI_UNWRITTEN:
|
case BMAPI_UNWRITTEN:
|
||||||
goto phase2;
|
goto phase2;
|
||||||
case BMAPI_DEVICE:
|
|
||||||
lockmode = XFS_LCK_MAP_SHARED(mp, io);
|
|
||||||
iomapp->iomap_target = io->io_flags & XFS_IOCORE_RT ?
|
|
||||||
mp->m_rtdev_targp : mp->m_ddev_targp;
|
|
||||||
error = 0;
|
|
||||||
*niomaps = 1;
|
|
||||||
goto out;
|
|
||||||
default:
|
default:
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,6 @@ typedef enum {
|
||||||
BMAPI_MMAP = (1 << 6), /* allocate for mmap write */
|
BMAPI_MMAP = (1 << 6), /* allocate for mmap write */
|
||||||
BMAPI_SYNC = (1 << 7), /* sync write to flush delalloc space */
|
BMAPI_SYNC = (1 << 7), /* sync write to flush delalloc space */
|
||||||
BMAPI_TRYLOCK = (1 << 8), /* non-blocking request */
|
BMAPI_TRYLOCK = (1 << 8), /* non-blocking request */
|
||||||
BMAPI_DEVICE = (1 << 9), /* we only want to know the device */
|
|
||||||
} bmapi_flags_t;
|
} bmapi_flags_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue