Skip to content

Commit

Permalink
f2fs: keep io_flags to avoid IO split due to different op_flags in tw…
Browse files Browse the repository at this point in the history
…o fio holders

Let's attach io_flags to bio only, so that we can merge IOs given original
io_flags only.

Fixes: 64bf0ee ("f2fs: pass the bio operation to bio_alloc_bioset")
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
  • Loading branch information
Jaegeuk Kim committed Apr 20, 2022
1 parent 930e260 commit 0adc2ab
Showing 1 changed file with 21 additions and 12 deletions.
33 changes: 21 additions & 12 deletions fs/f2fs/data.c
Original file line number Diff line number Diff line change
Expand Up @@ -388,11 +388,23 @@ int f2fs_target_device_index(struct f2fs_sb_info *sbi, block_t blkaddr)
return 0;
}

static void __attach_io_flag(struct f2fs_io_info *fio, unsigned int io_flag)
static unsigned int f2fs_io_flags(struct f2fs_io_info *fio)
{
unsigned int temp_mask = (1 << NR_TEMP_TYPE) - 1;
unsigned int fua_flag = io_flag & temp_mask;
unsigned int meta_flag = (io_flag >> NR_TEMP_TYPE) & temp_mask;
unsigned int fua_flag, meta_flag, io_flag;
unsigned int op_flags = 0;

if (fio->op != REQ_OP_WRITE)
return 0;
if (fio->type == DATA)
io_flag = fio->sbi->data_io_flag;
else if (fio->type == NODE)
io_flag = fio->sbi->node_io_flag;
else
return 0;

fua_flag = io_flag & temp_mask;
meta_flag = (io_flag >> NR_TEMP_TYPE) & temp_mask;

/*
* data/node io flag bits per temp:
Expand All @@ -401,9 +413,10 @@ static void __attach_io_flag(struct f2fs_io_info *fio, unsigned int io_flag)
* Cold | Warm | Hot | Cold | Warm | Hot |
*/
if ((1 << fio->temp) & meta_flag)
fio->op_flags |= REQ_META;
op_flags |= REQ_META;
if ((1 << fio->temp) & fua_flag)
fio->op_flags |= REQ_FUA;
op_flags |= REQ_FUA;
return op_flags;
}

static struct bio *__bio_alloc(struct f2fs_io_info *fio, int npages)
Expand All @@ -413,14 +426,10 @@ static struct bio *__bio_alloc(struct f2fs_io_info *fio, int npages)
sector_t sector;
struct bio *bio;

if (fio->type == DATA)
__attach_io_flag(fio, sbi->data_io_flag);
else if (fio->type == NODE)
__attach_io_flag(fio, sbi->node_io_flag);

bdev = f2fs_target_device(sbi, fio->new_blkaddr, &sector);
bio = bio_alloc_bioset(bdev, npages, fio->op | fio->op_flags, GFP_NOIO,
&f2fs_bioset);
bio = bio_alloc_bioset(bdev, npages,
fio->op | fio->op_flags | f2fs_io_flags(fio),
GFP_NOIO, &f2fs_bioset);
bio->bi_iter.bi_sector = sector;
if (is_read_io(fio->op)) {
bio->bi_end_io = f2fs_read_end_io;
Expand Down

0 comments on commit 0adc2ab

Please sign in to comment.