Commit 8be31270 authored by Gao Xiang's avatar Gao Xiang Committed by Greg Kroah-Hartman
Browse files

staging: erofs: introduce erofs_grab_bio



this patch renames prepare_bio to erofs_grab_bio, and
adds a nofail option in order to retry in the bio allocator
under memory pressure.

Signed-off-by: default avatarGao Xiang <gaoxiang25@huawei.com>
Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent cca5dd87
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -60,7 +60,8 @@ repeat:
		struct bio *bio;
		int err;

		bio = prepare_bio(sb, blkaddr, 1, read_endio);
		bio = erofs_grab_bio(sb, blkaddr, 1, read_endio, true);

		err = bio_add_page(bio, page, PAGE_SIZE, 0);
		BUG_ON(err != PAGE_SIZE);

@@ -278,7 +279,14 @@ submit_bio_retry:
		if (nblocks > BIO_MAX_PAGES)
			nblocks = BIO_MAX_PAGES;

		bio = prepare_bio(inode->i_sb, blknr, nblocks, read_endio);
		bio = erofs_grab_bio(inode->i_sb,
			blknr, nblocks, read_endio, false);

		if (IS_ERR(bio)) {
			err = PTR_ERR(bio);
			bio = NULL;
			goto err_out;
		}
	}

	err = bio_add_page(bio, page, PAGE_SIZE, 0);
+18 −18
Original line number Diff line number Diff line
@@ -420,26 +420,26 @@ struct erofs_map_blocks {
#define EROFS_GET_BLOCKS_RAW    0x0001

/* data.c */
static inline struct bio *prepare_bio(
	struct super_block *sb,
	erofs_blk_t blkaddr, unsigned nr_pages,
	bio_end_io_t endio)
static inline struct bio *
erofs_grab_bio(struct super_block *sb,
	       erofs_blk_t blkaddr, unsigned int nr_pages,
	       bio_end_io_t endio, bool nofail)
{
	gfp_t gfp = GFP_NOIO;
	struct bio *bio = bio_alloc(gfp, nr_pages);
	const gfp_t gfp = GFP_NOIO;
	struct bio *bio;

	if (unlikely(bio == NULL) &&
		(current->flags & PF_MEMALLOC)) {
	do {
			nr_pages /= 2;
			if (unlikely(!nr_pages)) {
				bio = bio_alloc(gfp | __GFP_NOFAIL, 1);
				BUG_ON(bio == NULL);
		if (nr_pages == 1) {
			bio = bio_alloc(gfp | (nofail ? __GFP_NOFAIL : 0), 1);
			if (unlikely(bio == NULL)) {
				DBG_BUGON(nofail);
				return ERR_PTR(-ENOMEM);
			}
			break;
		}
		bio = bio_alloc(gfp, nr_pages);
		} while (bio == NULL);
	}
		nr_pages /= 2;
	} while (unlikely(bio == NULL));

	bio->bi_end_io = endio;
	bio_set_dev(bio, sb->s_bdev);
+2 −2
Original line number Diff line number Diff line
@@ -1213,8 +1213,8 @@ submit_bio_retry:
		}

		if (bio == NULL) {
			bio = prepare_bio(sb, first_index + i,
				BIO_MAX_PAGES, z_erofs_vle_read_endio);
			bio = erofs_grab_bio(sb, first_index + i,
				BIO_MAX_PAGES, z_erofs_vle_read_endio, true);
			bio->bi_private = tagptr_cast_ptr(bi_private);

			++nr_bios;