Skip to content

Commit 83a8836

Browse files
committed
erofs: add SEEK_{DATA,HOLE} support
Many userspace programs (including erofs-utils itself) use SEEK_DATA / SEEK_HOLE to parse hole extents in addition to FIEMAP. Reviewed-by: Chao Yu <[email protected]> Signed-off-by: Gao Xiang <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 59b723c commit 83a8836

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

fs/erofs/data.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,8 +473,32 @@ static int erofs_file_mmap(struct file *file, struct vm_area_struct *vma)
473473
#define erofs_file_mmap generic_file_readonly_mmap
474474
#endif
475475

476+
static loff_t erofs_file_llseek(struct file *file, loff_t offset, int whence)
477+
{
478+
struct inode *inode = file->f_mapping->host;
479+
const struct iomap_ops *ops = &erofs_iomap_ops;
480+
481+
if (erofs_inode_is_data_compressed(EROFS_I(inode)->datalayout))
482+
#ifdef CONFIG_EROFS_FS_ZIP
483+
ops = &z_erofs_iomap_report_ops;
484+
#else
485+
return generic_file_llseek(file, offset, whence);
486+
#endif
487+
488+
if (whence == SEEK_HOLE)
489+
offset = iomap_seek_hole(inode, offset, ops);
490+
else if (whence == SEEK_DATA)
491+
offset = iomap_seek_data(inode, offset, ops);
492+
else
493+
return generic_file_llseek(file, offset, whence);
494+
495+
if (offset < 0)
496+
return offset;
497+
return vfs_setpos(file, offset, inode->i_sb->s_maxbytes);
498+
}
499+
476500
const struct file_operations erofs_file_fops = {
477-
.llseek = generic_file_llseek,
501+
.llseek = erofs_file_llseek,
478502
.read_iter = erofs_file_read_iter,
479503
.mmap = erofs_file_mmap,
480504
.get_unmapped_area = thp_get_unmapped_area,

0 commit comments

Comments
 (0)