Commit 1751c6ad authored by Li Ruilin's avatar Li Ruilin Committed by Zheng Zengkai
Browse files

bcache: Delay to invalidate cache data in writearound write

euleros inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I4LOJ6


CVE: NA

------------------------------

In writearound cache mode, read request quickly followed by write
request may overwrite the invalidate bkey inserted by the write
request.

The function bch_data_insert() is invoked asynchronously as the bio
subbmited to backend block device, therefore there may be a read
request subbmited after the bch_data_insert() done and ended before
the backend bio is end. This read request will read data from the
backend block device, and insert dirty data to cache device. However
by writearound cache mode, bcache will not invalidate data again,
so that read request after will read dirty data from the cache,
causing a data corruption.

By this patch we delay the invalidation to end of backend bio to
avoid this corruption.

Signed-off-by: default avatarLi Ruilin <liruilin4@huawei.com>
Reviewed-by: default avatarLuan Jianhai <luanjianhai@huawei.com>
Reviewed-by: default avatarPeng Junyi <pengjunyi1@huawei.com>
Acked-by: default avatarXie Xiuqi <xiexiuqi@huawei.com>
Signed-off-by: default avatarCheng Jian <cj.chengjian@huawei.com>
Reviewed-by: default avatarGuangxing Deng <dengguangxing@huawei.com>
Reviewed-by: default avatarchao song <chao.song@huawei.com>
Reviewed-by: default avatarchao song <chao.song@huawei.com>
Reviewed-by: default avatarchao song <chao.song@huawei.com>
Reviewed-by: default avatarchao song <chao.song@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent 08a3ac0e
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -993,8 +993,11 @@ static void cached_dev_write_complete(struct closure *cl)
	struct search *s = container_of(cl, struct search, cl);
	struct cached_dev *dc = container_of(s->d, struct cached_dev, disk);

	if (!s->iop.bypass)
		closure_call(&s->iop.cl, bch_data_insert, NULL, cl);

	up_read_non_owner(&dc->writeback_lock);
	cached_dev_bio_complete(cl);
	continue_at(cl, cached_dev_bio_complete, NULL);
}

static void cached_dev_write(struct cached_dev *dc, struct search *s)
@@ -1077,6 +1080,7 @@ static void cached_dev_write(struct cached_dev *dc, struct search *s)
	}

insert_data:
	if (!s->iop.bypass)
		closure_call(&s->iop.cl, bch_data_insert, NULL, cl);
	continue_at(cl, cached_dev_write_complete, NULL);
}