[dm-devel] [PATCH] dm-thinp: fix REQ_FLUSH semantics
Christoph Hellwig
hch at infradead.org
Wed Apr 27 10:02:46 UTC 2011
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.
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