multipath-tools: check null path before handle path-failed event
authorGuan Junxiong <guanjunxiong@huawei.com>
Mon, 4 Dec 2017 13:15:50 +0000 (21:15 +0800)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Sat, 13 Jan 2018 09:10:43 +0000 (10:10 +0100)
In the hot-plug storage OS, if we tear down the target storage,
there is a race between the path removing from the path list and
handling the path-failed udev event. Therefore, we need to check
null path before handle path-failed event.

Signed-off-by: Guan Junxiong <guanjunxiong@huawei.com>
multipathd/main.c

index d611597..09fb636 100644 (file)
@@ -1072,7 +1072,7 @@ uev_pathfail_check(struct uevent *uev, struct vectors *vecs)
 {
        char *action = NULL, *devt = NULL;
        struct path *pp;
-       int r;
+       int r = 1;
 
        action = uevent_get_dm_action(uev);
        if (!action)
@@ -1089,15 +1089,17 @@ uev_pathfail_check(struct uevent *uev, struct vectors *vecs)
        lock(&vecs->lock);
        pthread_testcancel();
        pp = find_path_by_devt(vecs->pathvec, devt);
+    if (!pp)
+        goto out_lock;
        r = io_err_stat_handle_pathfail(pp);
-       lock_cleanup_pop(vecs->lock);
-
        if (r)
                condlog(3, "io_err_stat: %s: cannot handle pathfail uevent",
                                pp->dev);
+out_lock:
+       lock_cleanup_pop(vecs->lock);
        FREE(devt);
        FREE(action);
-       return 0;
+       return r;
 out:
        FREE(action);
        return 1;