On 02/04/2014 09:55 AM, Junichi Nomura wrote: > 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) > ... > But why should 'map_io' calling __choose_pgpath()? Either __choose_path() from ioctl was able to set ->current_pg (in which case __choose_pgpath() wouldn't be called in map_io) or it was not, in which case pg_init_required would need to be reset during __choose_pgpath() when called from map_io(). Am I missing something? Cheers, Hannes -- Dr. Hannes Reinecke zSeries & Storage hare@xxxxxxx +49 911 74053 688 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg) -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel