* [PATCH v2] erofs: support SEEK_HOLE/SEEK_DATA in inode_share mode
@ 2026-08-20 13:40 Jingbo Xu
0 siblings, 0 replies; only message in thread
From: Jingbo Xu @ 2026-08-20 13:40 UTC (permalink / raw)
To: xiang, chao, linux-erofs; +Cc: linux-kernel
When inode_share is enabled, erofs_ishare_fops.llseek falls back to
generic_file_llseek, which treats the whole file as data and always
returns i_size for SEEK_HOLE, hiding real holes in sparse files.
Switch it to erofs_file_llseek instead. For user files f_mapping->host
is always the real erofs inode, so SEEK_HOLE/SEEK_DATA resolve the
per-file on-disk layout via iomap_seek_hole()/iomap_seek_data().
Reviewed-by: Gao Xiang <xiang@kernel.org>
Signed-off-by: Jingbo Xu <jefflexu@linux.alibaba.com>
---
fs/erofs/data.c | 2 +-
fs/erofs/internal.h | 1 +
fs/erofs/ishare.c | 2 +-
3 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/fs/erofs/data.c b/fs/erofs/data.c
index d2f01245ee79..09d668deb86d 100644
--- a/fs/erofs/data.c
+++ b/fs/erofs/data.c
@@ -509,7 +509,7 @@ static int erofs_file_mmap_prepare(struct vm_area_desc *desc)
#define erofs_file_mmap_prepare generic_file_readonly_mmap_prepare
#endif
-static loff_t erofs_file_llseek(struct file *file, loff_t offset, int whence)
+loff_t erofs_file_llseek(struct file *file, loff_t offset, int whence)
{
struct inode *inode = file->f_mapping->host;
const struct iomap_ops *ops = &erofs_iomap_ops;
diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h
index 57bd21859c65..0cd434d939ba 100644
--- a/fs/erofs/internal.h
+++ b/fs/erofs/internal.h
@@ -411,6 +411,7 @@ void *erofs_read_metabuf(struct erofs_buf *buf, struct super_block *sb,
int erofs_map_dev(struct super_block *sb, struct erofs_map_dev *dev);
int erofs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
u64 start, u64 len);
+loff_t erofs_file_llseek(struct file *file, loff_t offset, int whence);
int erofs_map_blocks(struct inode *inode, struct erofs_map_blocks *map);
void erofs_onlinefolio_init(struct folio *folio);
void erofs_onlinefolio_split(struct folio *folio);
diff --git a/fs/erofs/ishare.c b/fs/erofs/ishare.c
index fa7d4112dec5..4c7be60565cb 100644
--- a/fs/erofs/ishare.c
+++ b/fs/erofs/ishare.c
@@ -156,7 +156,7 @@ static int erofs_ishare_fadvise(struct file *file, loff_t offset,
const struct file_operations erofs_ishare_fops = {
.open = erofs_ishare_file_open,
- .llseek = generic_file_llseek,
+ .llseek = erofs_file_llseek,
.read_iter = erofs_ishare_file_read_iter,
.mmap = erofs_ishare_mmap,
.release = erofs_ishare_file_release,
--
2.19.1.6.gb485710b
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-08-20 13:40 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-20 13:40 [PATCH v2] erofs: support SEEK_HOLE/SEEK_DATA in inode_share mode Jingbo Xu
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.