diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ext4/extents.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 5f7295287de1..4fec6b746382 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -3244,8 +3244,15 @@ static int ext4_ext_fiemap_cb(struct inode *inode, struct ext4_ext_path *path, | |||
3244 | * XXX this might miss a single-block extent at EXT_MAX_BLOCK | 3244 | * XXX this might miss a single-block extent at EXT_MAX_BLOCK |
3245 | */ | 3245 | */ |
3246 | if (ext4_ext_next_allocated_block(path) == EXT_MAX_BLOCK || | 3246 | if (ext4_ext_next_allocated_block(path) == EXT_MAX_BLOCK || |
3247 | newex->ec_block + newex->ec_len - 1 == EXT_MAX_BLOCK) | 3247 | newex->ec_block + newex->ec_len - 1 == EXT_MAX_BLOCK) { |
3248 | loff_t size = i_size_read(inode); | ||
3249 | loff_t bs = EXT4_BLOCK_SIZE(inode->i_sb); | ||
3250 | |||
3248 | flags |= FIEMAP_EXTENT_LAST; | 3251 | flags |= FIEMAP_EXTENT_LAST; |
3252 | if ((flags & FIEMAP_EXTENT_DELALLOC) && | ||
3253 | logical+length > size) | ||
3254 | length = (size - logical + bs - 1) & ~(bs-1); | ||
3255 | } | ||
3249 | 3256 | ||
3250 | error = fiemap_fill_next_extent(fieinfo, logical, physical, | 3257 | error = fiemap_fill_next_extent(fieinfo, logical, physical, |
3251 | length, flags); | 3258 | length, flags); |