[dm-devel] [PATCH] dm-thinp: fix REQ_FLUSH semantics
Joe Thornber
thornber at redhat.com
Wed Apr 27 10:09:16 UTC 2011
On Wed, 2011-04-27 at 06:02 -0400, Christoph Hellwig wrote:
> REQ_FLUSH means the metadata needs to be flushed before the data payload
> (if there is one), not after it. And yes, this means the typical
> REQ_FUA|REQ_FLUSH requests imply two flushes.
Not sure what you're getting at here. The bio wasn't issued until after
the commit.
if ((bio->bi_rw & (REQ_FUA | REQ_FLUSH))) {
r = commit(tc);
if (r < 0) {
bio_io_error(bio);
continue;
}
}
remap_bio(tc, bio, pool_block);
generic_make_request(bio);
- Joe
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
>
> Index: linux-2.6/drivers/md/dm-thin-prov.c
> ===================================================================
> --- linux-2.6.orig/drivers/md/dm-thin-prov.c 2011-04-27 11:45:50.957995412 +0200
> +++ linux-2.6/drivers/md/dm-thin-prov.c 2011-04-27 11:45:56.954629592 +0200
> @@ -229,6 +229,14 @@ static void do_bios(struct thinp_c *tc,
> block_t thinp_block, pool_block;
>
> while ((bio = bio_list_pop(bios))) {
> + if (bio->bi_rw & REQ_FLUSH) {
> + r = commit(tc);
> + if (r < 0) {
> + bio_io_error(bio);
> + continue;
> + }
> + }
> +
> thinp_block = _sector_to_block(tc, bio->bi_sector);
> r = thinp_metadata_lookup(tc->tpm, thinp_block, 1, &pool_block);
> if (r == -ENODATA) {
> @@ -258,7 +266,7 @@ static void do_bios(struct thinp_c *tc,
> * whether the overhead of tracking pending blocks
> * is worth it though.
> */
> - if ((bio->bi_rw & (REQ_FUA | REQ_FLUSH))) {
> + if (bio->bi_rw & REQ_FUA) {
> r = commit(tc);
> if (r < 0) {
> bio_io_error(bio);
More information about the dm-devel
mailing list