Hi Martin,

You are right!! This problem was found in 0.7.7. Now I know it
is fixed with commit 9b715bf9 in 0.8.1.
I will use the commit 9b715bf9 to fix it. Thanks for your
review and answer very much.

Regarts
Lixiaokeng

On 2021/6/24 18:19, Martin Wilck wrote:
> On Do, 2021-06-24 at 16:47 +0800, lixiaokeng wrote:
>> If one multipath device has two paths, the first is down (network
>> failure) and the second is up, then we register a prkey to the
>> device. The first path will register successfully but the second
>> won't. Then fix the network. The uev_update_path will race with
>> check_path. If uev_update_path -> pathinfo is called before
>> check_path, the state of the first path will be set PATH_UP
>> without checking persistent reservation registration.
>>
>> Here we add checking in uev_update_path.
>>
>> Signed-off-by: Lixiaokeng <lixiaok...@huawei.com>
>> ---
>>  multipathd/main.c | 14 ++++++++++++++
>>  1 file changed, 14 insertions(+)
>>
>> diff --git a/multipathd/main.c b/multipathd/main.c
>> index 2251e02c..0948bf81 100644
>> --- a/multipathd/main.c
>> +++ b/multipathd/main.c
>> @@ -1316,6 +1316,7 @@ uev_update_path (struct uevent *uev, struct
>> vectors * vecs)
>>         struct path * pp;
>>         struct config *conf;
>>         int needs_reinit = 0;
>> +       int oldstate;
>>
>>         switch ((rc = change_foreign(uev->udev))) {
>>         case FOREIGN_OK:
>> @@ -1366,9 +1367,22 @@ uev_update_path (struct uevent *uev, struct
>> vectors * vecs)
>>                         pp->udev = udev_device_ref(uev->udev);
>>                         conf = get_multipath_config();
>>                         pthread_cleanup_push(put_multipath_config,
>> conf);
>> +                       oldstate = pp->state;
>> +
>>                         if (pathinfo(pp, conf, DI_SYSFS|DI_NOIO) !=
>> PATHINFO_OK)
>>                                 condlog(1, "%s: pathinfo failed after
>> change uevent",
>>                                         uev->kernel);
>> +
>> +                       if (pp->state != oldstate && (pp->state ==
>> PATH_UP || pp->state == PATH_GHOST)) {
> 
> 
> I don't understand. pathinfo(DI_SYSFS|DI_NOIO) doesn't modify 
> pp->state.  So your first condition should always be false.
> Am I overlooking something?
> 
> Regards
> Martin
> 
> 
> .
> 


--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel

Reply via email to