[dm-devel] [PATCH 4/7] dm mpath: remove process_queued_ios()
Junichi Nomura
j-nomura at ce.jp.nec.com
Tue Feb 4 03:24:37 UTC 2014
On 02/04/14 05:28, Mike Snitzer wrote:
> @@ -1216,9 +1185,12 @@ static void pg_init_done(void *data, int errors)
>
> if (!m->pg_init_required)
> m->queue_io = 0;
> -
> - m->pg_init_delay_retry = delay_retry;
> - queue_work(kmultipathd, &m->process_queued_ios);
> + else if (m->current_pg) {
> + m->pg_init_delay_retry = delay_retry;
> + /* Use a small delay to force the use of workqueue context */
> + __pg_init_all_paths(m, 50/HZ);
> + goto out;
> + }
I think the patch is still broken.
When "m->pg_init_required && !m->current_pg",
it ends up with !pg_ready() and no pg_init running.
So map_io() will not be called and IO will stall.
What do you think about my suggestion here:
https://www.redhat.com/archives/dm-devel/2014-February/msg00013.html
Also it's not yet clear why the second parameter of __pg_init_all_paths()
is needed. (At least, "50/HZ" is typo or something.)
> @@ -1591,8 +1563,17 @@ static int multipath_ioctl(struct dm_target *ti, unsigned int cmd,
...
> + if (m->current_pg && m->pg_init_required)
> + __pg_init_all_paths(m, 0);
> + spin_unlock_irqrestore(&m->lock, flags);
> + dm_table_run_md_queue_async(m->ti->table);
> + }
What happens if "!m->current_pg && m->pg_init_required"?
--
Jun'ichi Nomura, NEC Corporation
More information about the dm-devel
mailing list