[dm-devel] [PATCH 4/4] dm-mpath: move initial pg-init kick into __switch_pg()
Kiyoshi Ueda
k-ueda at ct.jp.nec.com
Mon Feb 1 04:24:08 UTC 2010
This patch moves initial pg-init kick into __switch_pg().
This has 2 meanings below:
- Fix the issue that ioctl isn't processed until any I/O is issued.
multipath_ioctl() doesn't kick pg-init even if it selects a path
in a new pg, so it returns with -EAGAIN. That state never be
changed and ioctl is always returns with -EAGAIN until any I/O is
issued and pg-init is kicked.
By this patch, multipath_ioctl() kicks pg-init when it selects
a path in a new pg, so following ioctl will be processed in
the near future without any I/O.
- By this patch, process_queued_ios() has no pg-init handling and
it works just for queued I/Os in the multipath internal queue.
So this patch makes removing multipath internal queue easy.
Signed-off-by: Kiyoshi Ueda <k-ueda at ct.jp.nec.com>
Signed-off-by: Jun'ichi Nomura <j-nomura at ce.jp.nec.com>
Cc: Alasdair G Kergon <agk at redhat.com>
---
drivers/md/dm-mpath.c | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
Index: 2.6.33-rc6/drivers/md/dm-mpath.c
===================================================================
--- 2.6.33-rc6.orig/drivers/md/dm-mpath.c
+++ 2.6.33-rc6/drivers/md/dm-mpath.c
@@ -256,14 +256,22 @@ static void __switch_pg(struct multipath
/* Must we initialise the PG first, and queue I/O till it's ready? */
if (m->hw_handler_name) {
- m->pg_init_required = 1;
m->queue_io = 1;
+
+ /* Reset pg_init_count in 0 anyway to start a new pg-init */
+ m->pg_init_count = 0;
+ if (!m->pg_init_in_progress)
+ __pg_init(m);
+ else
+ /*
+ * Mark to start a pg-init again when the current one
+ * completes.
+ */
+ m->pg_init_required = 1;
} else {
m->pg_init_required = 0;
m->queue_io = 0;
}
-
- m->pg_init_count = 0;
}
static int __choose_path_in_pg(struct multipath *m, struct priority_group *pg,
@@ -365,9 +373,7 @@ static int map_io(struct multipath *m, s
/* Queue for the daemon to resubmit */
list_add_tail(&clone->queuelist, &m->queued_ios);
m->queue_size++;
- if (m->pg_init_required && !m->pg_init_in_progress && pgpath)
- __pg_init(m);
- else if (!m->queue_io)
+ if (!m->queue_io)
queue_work(kmultipathd, &m->process_queued_ios);
pgpath = NULL;
r = DM_MAPIO_SUBMITTED;
@@ -473,9 +479,6 @@ static void process_queued_ios(struct wo
(!pgpath && !m->queue_if_no_path))
must_queue = 0;
- if (m->pg_init_required && !m->pg_init_in_progress && pgpath)
- __pg_init(m);
-
out:
spin_unlock_irqrestore(&m->lock, flags);
if (!must_queue)
More information about the dm-devel
mailing list