summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ext2/inode.c9
-rw-r--r--fs/ext4/inode.c9
-rw-r--r--fs/xfs/xfs_iomap.c10
-rw-r--r--include/linux/iomap.h1
4 files changed, 27 insertions, 2 deletions
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c
index 128cce540645..4c9d2d44e879 100644
--- a/fs/ext2/inode.c
+++ b/fs/ext2/inode.c
@@ -799,6 +799,7 @@ int ext2_get_block(struct inode *inode, sector_t iblock,
799static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length, 799static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
800 unsigned flags, struct iomap *iomap) 800 unsigned flags, struct iomap *iomap)
801{ 801{
802 struct block_device *bdev;
802 unsigned int blkbits = inode->i_blkbits; 803 unsigned int blkbits = inode->i_blkbits;
803 unsigned long first_block = offset >> blkbits; 804 unsigned long first_block = offset >> blkbits;
804 unsigned long max_blocks = (length + (1 << blkbits) - 1) >> blkbits; 805 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 return ret; 813 return ret;
813 814
814 iomap->flags = 0; 815 iomap->flags = 0;
815 iomap->bdev = inode->i_sb->s_bdev; 816 bdev = inode->i_sb->s_bdev;
817 iomap->bdev = bdev;
816 iomap->offset = (u64)first_block << blkbits; 818 iomap->offset = (u64)first_block << blkbits;
819 if (blk_queue_dax(bdev->bd_queue))
820 iomap->dax_dev = dax_get_by_host(bdev->bd_disk->disk_name);
821 else
822 iomap->dax_dev = NULL;
817 823
818 if (ret == 0) { 824 if (ret == 0) {
819 iomap->type = IOMAP_HOLE; 825 iomap->type = IOMAP_HOLE;
@@ -835,6 +841,7 @@ static int
835ext2_iomap_end(struct inode *inode, loff_t offset, loff_t length, 841ext2_iomap_end(struct inode *inode, loff_t offset, loff_t length,
836 ssize_t written, unsigned flags, struct iomap *iomap) 842 ssize_t written, unsigned flags, struct iomap *iomap)
837{ 843{
844 put_dax(iomap->dax_dev);
838 if (iomap->type == IOMAP_MAPPED && 845 if (iomap->type == IOMAP_MAPPED &&
839 written < length && 846 written < length &&
840 (flags & IOMAP_WRITE)) 847 (flags & IOMAP_WRITE))
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 4247d8d25687..2cb2634daa99 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -3305,6 +3305,7 @@ static int ext4_releasepage(struct page *page, gfp_t wait)
3305static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length, 3305static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
3306 unsigned flags, struct iomap *iomap) 3306 unsigned flags, struct iomap *iomap)
3307{ 3307{
3308 struct block_device *bdev;
3308 unsigned int blkbits = inode->i_blkbits; 3309 unsigned int blkbits = inode->i_blkbits;
3309 unsigned long first_block = offset >> blkbits; 3310 unsigned long first_block = offset >> blkbits;
3310 unsigned long last_block = (offset + length - 1) >> blkbits; 3311 unsigned long last_block = (offset + length - 1) >> blkbits;
@@ -3373,7 +3374,12 @@ retry:
3373 } 3374 }
3374 3375
3375 iomap->flags = 0; 3376 iomap->flags = 0;
3376 iomap->bdev = inode->i_sb->s_bdev; 3377 bdev = inode->i_sb->s_bdev;
3378 iomap->bdev = bdev;
3379 if (blk_queue_dax(bdev->bd_queue))
3380 iomap->dax_dev = dax_get_by_host(bdev->bd_disk->disk_name);
3381 else
3382 iomap->dax_dev = NULL;
3377 iomap->offset = first_block << blkbits; 3383 iomap->offset = first_block << blkbits;
3378 3384
3379 if (ret == 0) { 3385 if (ret == 0) {
@@ -3406,6 +3412,7 @@ static int ext4_iomap_end(struct inode *inode, loff_t offset, loff_t length,
3406 int blkbits = inode->i_blkbits; 3412 int blkbits = inode->i_blkbits;
3407 bool truncate = false; 3413 bool truncate = false;
3408 3414
3415 put_dax(iomap->dax_dev);
3409 if (!(flags & IOMAP_WRITE) || (flags & IOMAP_FAULT)) 3416 if (!(flags & IOMAP_WRITE) || (flags & IOMAP_FAULT))
3410 return 0; 3417 return 0;
3411 3418
diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
index 288ee5b840d7..4b47403f8089 100644
--- a/fs/xfs/xfs_iomap.c
+++ b/fs/xfs/xfs_iomap.c
@@ -976,6 +976,7 @@ xfs_file_iomap_begin(
976 int nimaps = 1, error = 0; 976 int nimaps = 1, error = 0;
977 bool shared = false, trimmed = false; 977 bool shared = false, trimmed = false;
978 unsigned lockmode; 978 unsigned lockmode;
979 struct block_device *bdev;
979 980
980 if (XFS_FORCED_SHUTDOWN(mp)) 981 if (XFS_FORCED_SHUTDOWN(mp))
981 return -EIO; 982 return -EIO;
@@ -1063,6 +1064,14 @@ xfs_file_iomap_begin(
1063 } 1064 }
1064 1065
1065 xfs_bmbt_to_iomap(ip, iomap, &imap); 1066 xfs_bmbt_to_iomap(ip, iomap, &imap);
1067
1068 /* optionally associate a dax device with the iomap bdev */
1069 bdev = iomap->bdev;
1070 if (blk_queue_dax(bdev->bd_queue))
1071 iomap->dax_dev = dax_get_by_host(bdev->bd_disk->disk_name);
1072 else
1073 iomap->dax_dev = NULL;
1074
1066 if (shared) 1075 if (shared)
1067 iomap->flags |= IOMAP_F_SHARED; 1076 iomap->flags |= IOMAP_F_SHARED;
1068 return 0; 1077 return 0;
@@ -1140,6 +1149,7 @@ xfs_file_iomap_end(
1140 unsigned flags, 1149 unsigned flags,
1141 struct iomap *iomap) 1150 struct iomap *iomap)
1142{ 1151{
1152 put_dax(iomap->dax_dev);
1143 if ((flags & IOMAP_WRITE) && iomap->type == IOMAP_DELALLOC) 1153 if ((flags & IOMAP_WRITE) && iomap->type == IOMAP_DELALLOC)
1144 return xfs_file_iomap_end_delalloc(XFS_I(inode), offset, 1154 return xfs_file_iomap_end_delalloc(XFS_I(inode), offset,
1145 length, written, iomap); 1155 length, written, iomap);
diff --git a/include/linux/iomap.h b/include/linux/iomap.h
index 7291810067eb..f753e788da31 100644
--- a/include/linux/iomap.h
+++ b/include/linux/iomap.h
@@ -41,6 +41,7 @@ struct iomap {
41 u16 type; /* type of mapping */ 41 u16 type; /* type of mapping */
42 u16 flags; /* flags for mapping */ 42 u16 flags; /* flags for mapping */
43 struct block_device *bdev; /* block device for I/O */ 43 struct block_device *bdev; /* block device for I/O */
44 struct dax_device *dax_dev; /* dax_dev for dax operations */
44}; 45};
45 46
46/* 47/*