diff options
-rw-r--r-- | fs/ext2/inode.c | 9 | ||||
-rw-r--r-- | fs/ext4/inode.c | 9 | ||||
-rw-r--r-- | fs/xfs/xfs_iomap.c | 10 | ||||
-rw-r--r-- | include/linux/iomap.h | 1 |
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, | |||
799 | static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length, | 799 | static 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 | |||
835 | ext2_iomap_end(struct inode *inode, loff_t offset, loff_t length, | 841 | ext2_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) | |||
3305 | static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length, | 3305 | static 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 | /* |