Commit bc804a8d authored by Gao Xiang's avatar Gao Xiang
Browse files

erofs: handle end of filesystem properly for file-backed mounts



I/O requests beyond the end of the filesystem should be zeroed out,
similar to loopback devices and that is what we expect.

Fixes: ce63cb62 ("erofs: support unencoded inodes for fileio")
Signed-off-by: default avatarGao Xiang <hsiangkao@linux.alibaba.com>
parent 7cef3c83
Loading
Loading
Loading
Loading
+8 −12
Original line number Diff line number Diff line
@@ -24,21 +24,17 @@ 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) {
		if (ret != rq->bio.bi_iter.bi_size) {
	if (ret >= 0 && ret != rq->bio.bi_iter.bi_size) {
		bio_advance(&rq->bio, ret);
		zero_fill_bio(&rq->bio);
	}
		ret = 0;
	}
	if (rq->bio.bi_end_io) {
		if (ret < 0 && !rq->bio.bi_status)
			rq->bio.bi_status = errno_to_blk_status(ret);
	} else {
	if (!rq->bio.bi_end_io) {
		bio_for_each_folio_all(fi, &rq->bio) {
			DBG_BUGON(folio_test_uptodate(fi.folio));
			erofs_onlinefolio_end(fi.folio, ret, false);
			erofs_onlinefolio_end(fi.folio, ret < 0, false);
		}
	} else if (ret < 0 && !rq->bio.bi_status) {
		rq->bio.bi_status = errno_to_blk_status(ret);
	}
	bio_endio(&rq->bio);
	bio_uninit(&rq->bio);
@@ -48,7 +44,7 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
static void erofs_fileio_rq_submit(struct erofs_fileio_rq *rq)
{
	struct iov_iter iter;
	int ret;
	ssize_t ret;

	if (!rq)
		return;