From fb80eeb70d053e927a4c801bffd22b68eb840e12 Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Thu, 10 Dec 2009 23:52:22 +0000 Subject: [PATCH] --- yaml --- r: 176557 b: refs/heads/master c: 12fc0f49dc994d8d90dcf3df13f5b1ee5441288d h: refs/heads/master i: 176555: 04c3d147b9a91364b8e6ad1203c6f3e2f371ae46 v: v3 --- [refs] | 2 +- trunk/drivers/md/dm-io.c | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 68afae1f4a16..f956f3b4be74 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 67a46dad25ccc8910995d8671f7ec17a6bc823cb +refs/heads/master: 12fc0f49dc994d8d90dcf3df13f5b1ee5441288d diff --git a/trunk/drivers/md/dm-io.c b/trunk/drivers/md/dm-io.c index f6a714c5aab0..10f457ca6af2 100644 --- a/trunk/drivers/md/dm-io.c +++ b/trunk/drivers/md/dm-io.c @@ -309,7 +309,11 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, unsigned num_bvecs; sector_t remaining = where->count; - while (remaining) { + /* + * where->count may be zero if rw holds a write barrier and we + * need to send a zero-sized barrier. + */ + do { /* * Allocate a suitably sized-bio. */ @@ -339,7 +343,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, atomic_inc(&io->count); submit_bio(rw, bio); - } + } while (remaining); } static void dispatch_io(int rw, unsigned int num_regions, @@ -360,7 +364,7 @@ static void dispatch_io(int rw, unsigned int num_regions, */ for (i = 0; i < num_regions; i++) { *dp = old_pages; - if (where[i].count) + if (where[i].count || (rw & (1 << BIO_RW_BARRIER))) do_region(rw, i, where + i, dp, io); }