Commit fa5d932c authored by Dan Williams's avatar Dan Williams

ext2, ext4, xfs: retrieve dax_device for iomap operations

In preparation for converting fs/dax.c to use dax_direct_access()
instead of bdev_direct_access(), add the plumbing to retrieve the
dax_device associated with a given block_device.
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 817bf402
...@@ -799,6 +799,7 @@ int ext2_get_block(struct inode *inode, sector_t iblock, ...@@ -799,6 +799,7 @@ int ext2_get_block(struct inode *inode, sector_t iblock,
static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length, static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
unsigned flags, struct iomap *iomap) unsigned flags, struct iomap *iomap)
{ {
struct block_device *bdev;
unsigned int blkbits = inode->i_blkbits; unsigned int blkbits = inode->i_blkbits;
unsigned long first_block = offset >> blkbits; unsigned long first_block = offset >> blkbits;
unsigned long max_blocks = (length + (1 << blkbits) - 1) >> blkbits; unsigned long max_blocks = (length + (1 << blkbits) - 1) >> blkbits;
...@@ -812,8 +813,13 @@ static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length, ...@@ -812,8 +813,13 @@ static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
return ret; return ret;
iomap->flags = 0; iomap->flags = 0;
iomap->bdev = inode->i_sb->s_bdev; bdev = inode->i_sb->s_bdev;
iomap->bdev = bdev;
iomap->offset = (u64)first_block << blkbits; iomap->offset = (u64)first_block << blkbits;
if (blk_queue_dax(bdev->bd_queue))
iomap->dax_dev = dax_get_by_host(bdev->bd_disk->disk_name);
else
iomap->dax_dev = NULL;
if (ret == 0) { if (ret == 0) {
iomap->type = IOMAP_HOLE; iomap->type = IOMAP_HOLE;
...@@ -835,6 +841,7 @@ static int ...@@ -835,6 +841,7 @@ static int
ext2_iomap_end(struct inode *inode, loff_t offset, loff_t length, ext2_iomap_end(struct inode *inode, loff_t offset, loff_t length,
ssize_t written, unsigned flags, struct iomap *iomap) ssize_t written, unsigned flags, struct iomap *iomap)
{ {
put_dax(iomap->dax_dev);
if (iomap->type == IOMAP_MAPPED && if (iomap->type == IOMAP_MAPPED &&
written < length && written < length &&
(flags & IOMAP_WRITE)) (flags & IOMAP_WRITE))
......
...@@ -3305,6 +3305,7 @@ static int ext4_releasepage(struct page *page, gfp_t wait) ...@@ -3305,6 +3305,7 @@ static int ext4_releasepage(struct page *page, gfp_t wait)
static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length, static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
unsigned flags, struct iomap *iomap) unsigned flags, struct iomap *iomap)
{ {
struct block_device *bdev;
unsigned int blkbits = inode->i_blkbits; unsigned int blkbits = inode->i_blkbits;
unsigned long first_block = offset >> blkbits; unsigned long first_block = offset >> blkbits;
unsigned long last_block = (offset + length - 1) >> blkbits; unsigned long last_block = (offset + length - 1) >> blkbits;
...@@ -3373,7 +3374,12 @@ static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length, ...@@ -3373,7 +3374,12 @@ static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
} }
iomap->flags = 0; iomap->flags = 0;
iomap->bdev = inode->i_sb->s_bdev; bdev = inode->i_sb->s_bdev;
iomap->bdev = bdev;
if (blk_queue_dax(bdev->bd_queue))
iomap->dax_dev = dax_get_by_host(bdev->bd_disk->disk_name);
else
iomap->dax_dev = NULL;
iomap->offset = first_block << blkbits; iomap->offset = first_block << blkbits;
if (ret == 0) { if (ret == 0) {
...@@ -3406,6 +3412,7 @@ static int ext4_iomap_end(struct inode *inode, loff_t offset, loff_t length, ...@@ -3406,6 +3412,7 @@ static int ext4_iomap_end(struct inode *inode, loff_t offset, loff_t length,
int blkbits = inode->i_blkbits; int blkbits = inode->i_blkbits;
bool truncate = false; bool truncate = false;
put_dax(iomap->dax_dev);
if (!(flags & IOMAP_WRITE) || (flags & IOMAP_FAULT)) if (!(flags & IOMAP_WRITE) || (flags & IOMAP_FAULT))
return 0; return 0;
......
...@@ -976,6 +976,7 @@ xfs_file_iomap_begin( ...@@ -976,6 +976,7 @@ xfs_file_iomap_begin(
int nimaps = 1, error = 0; int nimaps = 1, error = 0;
bool shared = false, trimmed = false; bool shared = false, trimmed = false;
unsigned lockmode; unsigned lockmode;
struct block_device *bdev;
if (XFS_FORCED_SHUTDOWN(mp)) if (XFS_FORCED_SHUTDOWN(mp))
return -EIO; return -EIO;
...@@ -1063,6 +1064,14 @@ xfs_file_iomap_begin( ...@@ -1063,6 +1064,14 @@ xfs_file_iomap_begin(
} }
xfs_bmbt_to_iomap(ip, iomap, &imap); xfs_bmbt_to_iomap(ip, iomap, &imap);
/* optionally associate a dax device with the iomap bdev */
bdev = iomap->bdev;
if (blk_queue_dax(bdev->bd_queue))
iomap->dax_dev = dax_get_by_host(bdev->bd_disk->disk_name);
else
iomap->dax_dev = NULL;
if (shared) if (shared)
iomap->flags |= IOMAP_F_SHARED; iomap->flags |= IOMAP_F_SHARED;
return 0; return 0;
...@@ -1140,6 +1149,7 @@ xfs_file_iomap_end( ...@@ -1140,6 +1149,7 @@ xfs_file_iomap_end(
unsigned flags, unsigned flags,
struct iomap *iomap) struct iomap *iomap)
{ {
put_dax(iomap->dax_dev);
if ((flags & IOMAP_WRITE) && iomap->type == IOMAP_DELALLOC) if ((flags & IOMAP_WRITE) && iomap->type == IOMAP_DELALLOC)
return xfs_file_iomap_end_delalloc(XFS_I(inode), offset, return xfs_file_iomap_end_delalloc(XFS_I(inode), offset,
length, written, iomap); length, written, iomap);
......
...@@ -41,6 +41,7 @@ struct iomap { ...@@ -41,6 +41,7 @@ struct iomap {
u16 type; /* type of mapping */ u16 type; /* type of mapping */
u16 flags; /* flags for mapping */ u16 flags; /* flags for mapping */
struct block_device *bdev; /* block device for I/O */ struct block_device *bdev; /* block device for I/O */
struct dax_device *dax_dev; /* dax_dev for dax operations */
}; };
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment