From: Gao Xiang <hsiang...@redhat.com> Martin reported an issue that directory read could be hung on the latest -rc kernel with some certain image. The root cause is that commit baa2c7c97153 ("block: set .bi_max_vecs as actual allocated vector number") changes .bi_max_vecs behavior. bio->bi_max_vecs is set as actual allocated vector number rather than the requested number now. Let's avoid using .bi_max_vecs completely instead.
Reported-by: Martin DEVERA <de...@eaxlabs.cz> Signed-off-by: Gao Xiang <hsiang...@redhat.com> --- Hi Chao, Could you take some time on reviewing this patchset in advance? I'd like to upstream this regression fix asap since it has noticable impact on 5.12-rc kernel. Thanks, Gao Xiang fs/erofs/data.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/fs/erofs/data.c b/fs/erofs/data.c index f88851c5c250..fa25d0eab5de 100644 --- a/fs/erofs/data.c +++ b/fs/erofs/data.c @@ -231,14 +231,6 @@ static inline struct bio *erofs_read_raw_page(struct bio *bio, goto submit_bio_retry; *last_block = current_block; - - /* shift in advance in case of it followed by too many gaps */ - if (bio->bi_iter.bi_size >= bio->bi_max_vecs * PAGE_SIZE) { - /* err should reassign to 0 after submitting */ - err = 0; - goto submit_bio_out; - } - return bio; err_out: @@ -252,7 +244,6 @@ static inline struct bio *erofs_read_raw_page(struct bio *bio, /* if updated manually, continuous pages has a gap */ if (bio) -submit_bio_out: submit_bio(bio); return err ? ERR_PTR(err) : NULL; } @@ -274,7 +265,8 @@ static int erofs_raw_access_readpage(struct file *file, struct page *page) if (IS_ERR(bio)) return PTR_ERR(bio); - DBG_BUGON(bio); /* since we have only one bio -- must be NULL */ + if (bio) + submit_bio(bio); return 0; } @@ -305,7 +297,6 @@ static void erofs_raw_access_readahead(struct readahead_control *rac) put_page(page); } - /* the rare case (end in gaps) */ if (bio) submit_bio(bio); } -- 2.20.1