f2fs: move bio_private allocation out of f2fs_bio_alloc()
Subsystems (2)
PATCH RESEND 1/1 f2fs: move bio_private allocation out of f2fs_bio_alloc()
bio->bi_private is not always needed. As in the reading data path, end_read_io does not need bio_private for further using, so moving bio_private allocation out of f2fs_bio_alloc(). Alloc it in the submit_write_page(), and ignore it in the f2fs_readpage().
Signed-off-by Gu Zheng <[email protected]>
--- fs/f2fs/data.c | 1 - fs/f2fs/segment.c | 19 +++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-)
fs/f2fs/data.c +0 -1
@@ -365,7 +365,6 @@ static void read_end_io(struct bio *bio, int err) }unlock_page (page); }while (bvec >= bio->bi_io_vec); -kfree (bio->bi_private);bio_put (bio); }
fs/f2fs/segment.c +11 -8
@@ -611,18 +611,12 @@ static void f2fs_end_io_write(struct bio *bio, int err)struct bio *f2fs_bio_alloc (struct block_device *bdev,int npages) {struct bio *bio; -struct bio_private *priv; -retry: - priv =kmalloc (sizeof (struct bio_private ),GFP_NOFS ); -if (!priv) { -cond_resched (); - goto retry; - }/* No failure on bio allocation */ bio =bio_alloc (GFP_NOIO , npages); bio->bi_bdev = bdev; - bio->bi_private = priv; + bio->bi_private =NULL ; +return bio; }
@@ -681,8 +675,17 @@ static void submit_write_page(struct f2fs_sb_info *sbi, struct page *page,do_submit_bio (sbi, type, false); alloc_new:if (sbi->bio[type] ==NULL ) { +struct bio_private *priv; +retry: + priv =kmalloc (sizeof (struct bio_private ),GFP_NOFS ); +if (!priv) { +cond_resched (); + goto retry; + } + sbi->bio[type] =f2fs_bio_alloc (bdev,max_hw_blocks (sbi)); sbi->bio[type]->bi_sector =SECTOR_FROM_BLOCK (sbi, blk_addr); + sbi->bio[type]->bi_private = priv;/* * The end_io will be assigned at the sumbission phase. * Until then, let bio_add_page() merge consecutive IOs as much
Signature · 1 line
1.7.7