On 02/04/14 17:18, Hannes Reinecke wrote: >>> @@ -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"? >> >>From the current logic it means that no valid pg was found, so > calling pg_init would be pointless. > We're calling __choose_pgpath() before that, so if that returns > with current_pg == NULL all paths are down, and calling > pg_init would be pointless. > > But I think I see to have pg_init_required handling cleared up; > I'll be doing a patch to unset it at the start of __choose_pgpath(), > this we we can be sure that it'll be set correctly. I think it is possible that __choose_pgpath() being called twice before pg_init_required is checked. For example, multipath_ioctl() __choose_pgpath() clear pg_init_required select a new pg __switch_pg() set pg_init_required map_io() __choose_pgpath() clear pg_init_required select the same pg (pg_init_required is not set) ... In this case, pg_init should be submitted to the pg but not. -- Jun'ichi Nomura, NEC Corporation -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel