summaryrefslogtreecommitdiff
path: root/fs/erofs/fileio.c
diff options
context:
space:
mode:
authorGao Xiang <hsiangkao@linux.alibaba.com>2024-08-30 11:28:39 +0800
committerGao Xiang <hsiangkao@linux.alibaba.com>2024-09-10 15:27:09 +0800
commit283213718f5d618dfe88d16a3c63a077a12f15ec (patch)
tree619fb774898d31ec954b6fc22b7b6d8e3037b102 /fs/erofs/fileio.c
parentce63cb62d794c98c7631c2296fa845f2a8d0a4a1 (diff)
downloadlwn-283213718f5d618dfe88d16a3c63a077a12f15ec.tar.gz
lwn-283213718f5d618dfe88d16a3c63a077a12f15ec.zip
erofs: support compressed inodes for fileio
Use pseudo bios just like the previous fscache approach since merged bio_vecs can be filled properly with unique interfaces. Reviewed-by: Sandeep Dhavale <dhavale@google.com> Reviewed-by: Chao Yu <chao@kernel.org> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com> Link: https://lore.kernel.org/r/20240830032840.3783206-3-hsiangkao@linux.alibaba.com
Diffstat (limited to 'fs/erofs/fileio.c')
-rw-r--r--fs/erofs/fileio.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/fs/erofs/fileio.c b/fs/erofs/fileio.c
index 42b346593bf5..3af96b1e2c2a 100644
--- a/fs/erofs/fileio.c
+++ b/fs/erofs/fileio.c
@@ -23,7 +23,6 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
container_of(iocb, struct erofs_fileio_rq, iocb);
struct folio_iter fi;
- DBG_BUGON(rq->bio.bi_end_io);
if (ret > 0) {
if (ret != rq->bio.bi_iter.bi_size) {
bio_advance(&rq->bio, ret);
@@ -31,9 +30,13 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret)
}
ret = 0;
}
- bio_for_each_folio_all(fi, &rq->bio) {
- DBG_BUGON(folio_test_uptodate(fi.folio));
- erofs_onlinefolio_end(fi.folio, ret);
+ if (rq->bio.bi_end_io) {
+ rq->bio.bi_end_io(&rq->bio);
+ } else {
+ bio_for_each_folio_all(fi, &rq->bio) {
+ DBG_BUGON(folio_test_uptodate(fi.folio));
+ erofs_onlinefolio_end(fi.folio, ret);
+ }
}
bio_uninit(&rq->bio);
kfree(rq);
@@ -68,6 +71,17 @@ static struct erofs_fileio_rq *erofs_fileio_rq_alloc(struct erofs_map_dev *mdev)
return rq;
}
+struct bio *erofs_fileio_bio_alloc(struct erofs_map_dev *mdev)
+{
+ return &erofs_fileio_rq_alloc(mdev)->bio;
+}
+
+void erofs_fileio_submit_bio(struct bio *bio)
+{
+ return erofs_fileio_rq_submit(container_of(bio, struct erofs_fileio_rq,
+ bio));
+}
+
static int erofs_fileio_scan_folio(struct erofs_fileio *io, struct folio *folio)
{
struct inode *inode = folio_inode(folio);