dm-mpath: move initial pg-init kick into __switch_pg()
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.
/* 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)
--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel