From 94dbe149b43d39668630b3be3e8506a6bac8fc7a Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Thu, 24 Apr 2008 22:10:47 +0100 Subject: [PATCH] --- yaml --- r: 93207 b: refs/heads/master c: 7ff14a36159d947872870e7a3e9dcaebc46b23eb h: refs/heads/master i: 93205: 7bc178b9f1d15ae639f70e351a4c76e2d3a9913f 93203: 17aa52d8d9bbdae26410dd311d832b1aa4243158 93199: 6700a539acd2236f286c33b2c9459b3fbbeecef1 v: v3 --- [refs] | 2 +- trunk/drivers/md/dm-io.c | 11 ++++++++--- trunk/drivers/md/dm-kcopyd.c | 2 +- trunk/drivers/md/dm-raid1.c | 2 ++ 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 481a3d9be34d..81d389789c9d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a2aebe03be60ae4da03507a00d60211d5e0327c3 +refs/heads/master: 7ff14a36159d947872870e7a3e9dcaebc46b23eb diff --git a/trunk/drivers/md/dm-io.c b/trunk/drivers/md/dm-io.c index ed9c86cd053e..4789c42d9a3a 100644 --- a/trunk/drivers/md/dm-io.c +++ b/trunk/drivers/md/dm-io.c @@ -353,7 +353,7 @@ static int sync_io(struct dm_io_client *client, unsigned int num_regions, { struct io io; - if (num_regions > 1 && rw != WRITE) { + if (num_regions > 1 && (rw & RW_MASK) != WRITE) { WARN_ON(1); return -EIO; } @@ -390,7 +390,7 @@ static int async_io(struct dm_io_client *client, unsigned int num_regions, { struct io *io; - if (num_regions > 1 && rw != WRITE) { + if (num_regions > 1 && (rw & RW_MASK) != WRITE) { WARN_ON(1); fn(1, context); return -EIO; @@ -436,7 +436,12 @@ static int dp_init(struct dm_io_request *io_req, struct dpages *dp) } /* - * New collapsed (a)synchronous interface + * New collapsed (a)synchronous interface. + * + * If the IO is asynchronous (i.e. it has notify.fn), you must either unplug + * the queue with blk_unplug() some time later or set the BIO_RW_SYNC bit in + * io_req->bi_rw. If you fail to do one of these, the IO will be submitted to + * the disk after q->unplug_delay, which defaults to 3ms in blk-settings.c. */ int dm_io(struct dm_io_request *io_req, unsigned num_regions, struct dm_io_region *where, unsigned long *sync_error_bits) diff --git a/trunk/drivers/md/dm-kcopyd.c b/trunk/drivers/md/dm-kcopyd.c index ee9583bee04d..996802b8a452 100644 --- a/trunk/drivers/md/dm-kcopyd.c +++ b/trunk/drivers/md/dm-kcopyd.c @@ -332,7 +332,7 @@ static int run_io_job(struct kcopyd_job *job) { int r; struct dm_io_request io_req = { - .bi_rw = job->rw, + .bi_rw = job->rw | (1 << BIO_RW_SYNC), .mem.type = DM_IO_PAGE_LIST, .mem.ptr.pl = job->pages, .mem.offset = job->offset, diff --git a/trunk/drivers/md/dm-raid1.c b/trunk/drivers/md/dm-raid1.c index 3b9532fc294c..ff05fe893083 100644 --- a/trunk/drivers/md/dm-raid1.c +++ b/trunk/drivers/md/dm-raid1.c @@ -1297,6 +1297,8 @@ static void do_mirror(struct work_struct *work) do_reads(ms, &reads); do_writes(ms, &writes); do_failures(ms, &failures); + + dm_table_unplug_all(ms->ti->table); }