@@ -473,8 +473,32 @@ static int erofs_file_mmap(struct file *file, struct vm_area_struct *vma)
473
473
#define erofs_file_mmap generic_file_readonly_mmap
474
474
#endif
475
475
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
+
476
500
const struct file_operations erofs_file_fops = {
477
- .llseek = generic_file_llseek ,
501
+ .llseek = erofs_file_llseek ,
478
502
.read_iter = erofs_file_read_iter ,
479
503
.mmap = erofs_file_mmap ,
480
504
.get_unmapped_area = thp_get_unmapped_area ,
0 commit comments