[dm-devel] [PATCH] multipathd: fix missing persistent reseravtion for active path

lixiaokeng lixiaokeng at huawei.com
Sat Sep 11 03:28:00 UTC 2021



On 2021/9/11 0:17, Martin Wilck wrote:
> Hello lixiaokeng,
> 
> thanks for your patch.
> 
> On Fri, 2021-09-10 at 20:31 +0800, lixiaokeng wrote:
>> There are two paths(sucu as sda and adb) for one LUN. The two
>> paths log in, but before the two uevents have been processed
>> (for example there are many uevent), users use multipathd add
>> path /dev/sda to cause mpatha and use mpathpersist -o -I to
>> register prkey for mpatha. The add map uevent is after add path
>> uevent, the the uevent(add sdb) will delay and missing persistent
>> reseravtion check.
>>
>> Here, we add persistent reseravtion check in ev_add_map if
>> mpp->wait_for_udev > 1.
>>
>> Signed-off-by: Lixiaokeng <lixiaokeng at huawei.com>
>> ---
>>  multipathd/main.c | 9 +++++++++
>>  1 file changed, 9 insertions(+)
>>
>> diff --git a/multipathd/main.c b/multipathd/main.c
>> index 3aff241d..ef456c34 100644
>> --- a/multipathd/main.c
>> +++ b/multipathd/main.c
>> @@ -706,6 +706,8 @@ ev_add_map (char * dev, const char * alias,
>> struct vectors * vecs)
>>         struct multipath * mpp;
>>         int delayed_reconfig, reassign_maps;
>>         struct config *conf;
>> +       struct path *pp;
>> +       int i;
>>
>>         if (dm_is_mpath(alias) != 1) {
>>                 condlog(4, "%s: not a multipath map", alias);
>> @@ -721,6 +723,13 @@ ev_add_map (char * dev, const char * alias,
>> struct vectors * vecs)
>>                         if (update_map(mpp, vecs, 0))
>>                                 /* setup multipathd removed the map
>> */
>>                                 return 1;
> 
> Should you make this conditional on mpp->prflag, perhaps?
> After all, sda has already been added, sp prflag should should be set
> if that was successful.
> 
Hi Martin:

Thanks for your reply. I will add conditional on mpp->prflag.

> I think this should rather be added to update_map(). Ben?

I have considered putting it after adopt_paths() in update_map().
But I'm not sure which one is better. If you and Ben think adding
to update_map() is better, I will move it to there.

Here is anotherthing. If two new paths(sdc) for maptha
(with sda sdb path) log in. mpathpersist -o -I for mpatha, the
sda and sdb will be registered. Before update_prflag() and
update_prkey() in do_mpath_persistent_reserve_out, the uevent
(add sdc) is finshed, then sdc will missing registering.

This is just my theoretical analysis. I'm not sure if this is
a real problem.

> 
> 
>> +
>> +                       vector_foreach_slot(mpp->paths, pp, i) {
>> +                               if ((pp->state == PATH_UP)  || (pp-
>>> state == PATH_GHOST)) {
>> +                                       /* persistent reseravtion
>> check*/
> 
> Typo above.
> 
>> +                                       mpath_pr_event_handle(pp);
>> +                               }
>> +                       }
>>                 }
>>                 conf = get_multipath_config();
>>                 delayed_reconfig = conf->delayed_reconfig;
> 
> 
> Thanks,
> Martin
> 
> .
> 





More information about the dm-devel mailing list