mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-10 07:00:48 +00:00
f2fs: be aware of extent beyond EOF in fiemap
f2fs can support fallocating blocks beyond file size without changing the size, but ->fiemap of f2fs was restricted and can't detect these extents fallocated past EOF, now relieve the restriction. Signed-off-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
6f2d8ed654
commit
58736fa60f
@ -886,7 +886,6 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
|||||||
struct buffer_head map_bh;
|
struct buffer_head map_bh;
|
||||||
sector_t start_blk, last_blk;
|
sector_t start_blk, last_blk;
|
||||||
pgoff_t next_pgofs;
|
pgoff_t next_pgofs;
|
||||||
loff_t isize;
|
|
||||||
u64 logical = 0, phys = 0, size = 0;
|
u64 logical = 0, phys = 0, size = 0;
|
||||||
u32 flags = 0;
|
u32 flags = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@ -903,13 +902,6 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
|||||||
|
|
||||||
inode_lock(inode);
|
inode_lock(inode);
|
||||||
|
|
||||||
isize = i_size_read(inode);
|
|
||||||
if (start >= isize)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (start + len > isize)
|
|
||||||
len = isize - start;
|
|
||||||
|
|
||||||
if (logical_to_blk(inode, len) == 0)
|
if (logical_to_blk(inode, len) == 0)
|
||||||
len = blk_to_logical(inode, 1);
|
len = blk_to_logical(inode, 1);
|
||||||
|
|
||||||
@ -928,13 +920,11 @@ next:
|
|||||||
/* HOLE */
|
/* HOLE */
|
||||||
if (!buffer_mapped(&map_bh)) {
|
if (!buffer_mapped(&map_bh)) {
|
||||||
start_blk = next_pgofs;
|
start_blk = next_pgofs;
|
||||||
/* Go through holes util pass the EOF */
|
|
||||||
if (blk_to_logical(inode, start_blk) < isize)
|
if (blk_to_logical(inode, start_blk) < blk_to_logical(inode,
|
||||||
|
F2FS_I_SB(inode)->max_file_blocks))
|
||||||
goto prep_next;
|
goto prep_next;
|
||||||
/* Found a hole beyond isize means no more extents.
|
|
||||||
* Note that the premise is that filesystems don't
|
|
||||||
* punch holes beyond isize and keep size unchanged.
|
|
||||||
*/
|
|
||||||
flags |= FIEMAP_EXTENT_LAST;
|
flags |= FIEMAP_EXTENT_LAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user