Thread (66 messages) 66 messages, 11 authors, 2010-09-18

Re: [PATCH 23/41] dm: implement REQ_FLUSH/FUA support for bio-based dm

From: Mike Snitzer <hidden>
Date: 2010-09-07 22:15:43
Also in: dm-devel, linux-fsdevel, linux-raid, linux-scsi, lkml

On Tue, Sep 07 2010 at  5:17pm -0400,
Mike Snitzer [off-list ref] wrote:
On Mon, Sep 06 2010 at  7:14am -0400,
Milan Broz [off-list ref] wrote:
quoted
On 09/03/2010 12:29 PM, Tejun Heo wrote:
quoted
+++ b/drivers/md/dm-crypt.c
@@ -1278,7 +1278,7 @@ static int crypt_map(struct dm_target *ti, struct bio *bio,
 	struct dm_crypt_io *io;
 	struct crypt_config *cc;
 
-	if (unlikely(bio_empty_barrier(bio))) {
+	if (bio->bi_rw & REQ_FLUSH) {
 		cc = ti->private;
 		bio->bi_bdev = cc->dev->bdev;
 		return DM_MAPIO_REMAPPED;
...
quoted
+++ b/drivers/md/dm.c
@@ -1400,14 +1391,22 @@ static void __split_and_process_bio(struct mapped_device *md, struct bio *bio)
 	ci.io->md = md;
 	spin_lock_init(&ci.io->endio_lock);
 	ci.sector = bio->bi_sector;
-	ci.sector_count = bio_sectors(bio);
-	if (unlikely(bio_empty_barrier(bio)))
+	if (!(bio->bi_rw & REQ_FLUSH))
+		ci.sector_count = bio_sectors(bio);
+	else {
+		/* all FLUSH bio's reaching here should be empty */
+		WARN_ON_ONCE(bio_has_data(bio));
 		ci.sector_count = 1;
+	}

I would add BUG_ON(bio_has_data(bio)) either to dm-crypt target or directly to DM core
in this path.
I agree, that WARN_ON_ONCE should be changed to BUG_ON.  This is a
guarantee that the block layer now provides so it seems correct to have
the DM core bug if that guarantee isn't actually provided.
I was mistaken, DM enforces that guarantee... ;)

(but block layer will also enforce empty flush for request-based)

But it wasn't clear until Christoph and I looked closer.  The point
stands though; we should BUG_ON rather than WARN_ON_ONCE.

I'll send a follow-on patch to help clean this code up a bit more (based
on Christoph's suggestions).  Mainly just making the flush paths a bit
more distinct and adding some comments.

Mike
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help