mirror of
https://github.com/torvalds/linux.git
synced 2026-09-26 01:52:03 +02:00
erofs: support SEEK_HOLE/SEEK_DATA in inode_share mode
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> Reviewed-by: Chao Yu <chao@kernel.org> Signed-off-by: Gao Xiang <xiang@kernel.org>
This commit is contained in:
parent
ab74edaeb1
commit
8ebf958978
|
|
@ -507,7 +507,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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user