Skip to content

Commit a311a08

Browse files
Darrick J. Wongbrauner
authored andcommitted
iomap: constrain the file range passed to iomap_file_unshare
File contents can only be shared (i.e. reflinked) below EOF, so it makes no sense to try to unshare ranges beyond EOF. Constrain the file range parameters here so that we don't have to do that in the callers. Fixes: 5f4e575 ("fs: add iomap_file_dirty") Signed-off-by: Darrick J. Wong <[email protected]> Link: https://lore.kernel.org/r/20241002150213.GC21853@frogsfrogsfrogs Reviewed-by: Christoph Hellwig <[email protected]> Reviewed-by: Brian Foster <[email protected]> Signed-off-by: Christian Brauner <[email protected]>
1 parent f7a4874 commit a311a08

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

fs/dax.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1305,11 +1305,15 @@ int dax_file_unshare(struct inode *inode, loff_t pos, loff_t len,
13051305
struct iomap_iter iter = {
13061306
.inode = inode,
13071307
.pos = pos,
1308-
.len = len,
13091308
.flags = IOMAP_WRITE | IOMAP_UNSHARE | IOMAP_DAX,
13101309
};
1310+
loff_t size = i_size_read(inode);
13111311
int ret;
13121312

1313+
if (pos < 0 || pos >= size)
1314+
return 0;
1315+
1316+
iter.len = min(len, size - pos);
13131317
while ((ret = iomap_iter(&iter, ops)) > 0)
13141318
iter.processed = dax_unshare_iter(&iter);
13151319
return ret;

fs/iomap/buffered-io.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1375,11 +1375,15 @@ iomap_file_unshare(struct inode *inode, loff_t pos, loff_t len,
13751375
struct iomap_iter iter = {
13761376
.inode = inode,
13771377
.pos = pos,
1378-
.len = len,
13791378
.flags = IOMAP_WRITE | IOMAP_UNSHARE,
13801379
};
1380+
loff_t size = i_size_read(inode);
13811381
int ret;
13821382

1383+
if (pos < 0 || pos >= size)
1384+
return 0;
1385+
1386+
iter.len = min(len, size - pos);
13831387
while ((ret = iomap_iter(&iter, ops)) > 0)
13841388
iter.processed = iomap_unshare_iter(&iter);
13851389
return ret;

0 commit comments

Comments
 (0)