summaryrefslogtreecommitdiffstats
path: root/fs/ext4/inode.c
diff options
context:
space:
mode:
authorAndreas Gruenbacher2017-10-01 23:57:54 +0200
committerTheodore Ts'o2017-10-01 23:57:54 +0200
commit7046ae35329f6d3cd39ae22d96d9525e45e748f2 (patch)
tree36e5e48ac89d51b965d860b2d5525060121f5c21 /fs/ext4/inode.c
parentiomap: Add IOMAP_F_DATA_INLINE flag (diff)
downloadkernel-qcow2-linux-7046ae35329f6d3cd39ae22d96d9525e45e748f2.tar.gz
kernel-qcow2-linux-7046ae35329f6d3cd39ae22d96d9525e45e748f2.tar.xz
kernel-qcow2-linux-7046ae35329f6d3cd39ae22d96d9525e45e748f2.zip
ext4: Add iomap support for inline data
Report inline data as a IOMAP_F_DATA_INLINE mapping. This allows to use iomap_seek_hole and iomap_seek_data in ext4_llseek and makes switching to iomap_fiemap in ext4_fiemap easier. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Reviewed-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r--fs/ext4/inode.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index d9e633c12aae..7755f41bdfc3 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -3404,8 +3404,20 @@ static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
struct ext4_map_blocks map;
int ret;
- if (WARN_ON_ONCE(ext4_has_inline_data(inode)))
- return -ERANGE;
+
+ if (flags & IOMAP_REPORT) {
+ if (ext4_has_inline_data(inode)) {
+ ret = ext4_inline_data_iomap(inode, iomap);
+ if (ret != -EAGAIN) {
+ if (ret == 0 && offset >= iomap->length)
+ ret = -ENOENT;
+ return ret;
+ }
+ }
+ } else {
+ if (WARN_ON_ONCE(ext4_has_inline_data(inode)))
+ return -ERANGE;
+ }
map.m_lblk = first_block;
map.m_len = last_block - first_block + 1;