]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
erofs: set fileio bio failed in short read case
authorSheng Yong <shengyong1@xiaomi.com>
Fri, 27 Feb 2026 02:30:08 +0000 (10:30 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Tue, 17 Mar 2026 02:27:31 +0000 (10:27 +0800)
For file-backed mount, IO requests are handled by vfs_iocb_iter_read().
However, it can be interrupted by SIGKILL, returning the number of
bytes actually copied. Unused folios in bio are unexpectedly marked
as uptodate.

  vfs_read
    filemap_read
      filemap_get_pages
        filemap_readahead
          erofs_fileio_readahead
            erofs_fileio_rq_submit
              vfs_iocb_iter_read
                filemap_read
                  filemap_get_pages  <= detect signal
              erofs_fileio_ki_complete  <= set all folios uptodate

This patch addresses this by setting short read bio with an error
directly.

Fixes: bc804a8d7e86 ("erofs: handle end of filesystem properly for file-backed mounts")
Reported-by: chenguanyou <chenguanyou@xiaomi.com>
Signed-off-by: Yunlei He <heyunlei@xiaomi.com>
Signed-off-by: Sheng Yong <shengyong1@xiaomi.com>
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
fs/erofs/fileio.c

index abe873f01297b8b61845cdac7bb444538812ac26..98cdaa1cd1a7ca1dba072e469abc97ccb7d1af91 100644 (file)
@@ -25,10 +25,8 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
                        container_of(iocb, struct erofs_fileio_rq, iocb);
        struct folio_iter fi;
 
-       if (ret >= 0 && ret != rq->bio.bi_iter.bi_size) {
-               bio_advance(&rq->bio, ret);
-               zero_fill_bio(&rq->bio);
-       }
+       if (ret >= 0 && ret != rq->bio.bi_iter.bi_size)
+               ret = -EIO;
        if (!rq->bio.bi_end_io) {
                bio_for_each_folio_all(fi, &rq->bio) {
                        DBG_BUGON(folio_test_uptodate(fi.folio));