From patchwork Fri Jun 3 07:24:32 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Reinecke X-Patchwork-Id: 9152003 X-Patchwork-Delegate: christophe.varoqui@free.fr Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 67989607D5 for ; Fri, 3 Jun 2016 07:28:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5989F2804C for ; Fri, 3 Jun 2016 07:28:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4E5C928332; Fri, 3 Jun 2016 07:28:10 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from mx4-phx2.redhat.com (mx4-phx2.redhat.com [209.132.183.25]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id CCE5428309 for ; Fri, 3 Jun 2016 07:28:09 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx4-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id u537ObPj017057; Fri, 3 Jun 2016 03:24:37 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id u537Oaxc008806 for ; Fri, 3 Jun 2016 03:24:36 -0400 Received: from mx1.redhat.com (ext-mx06.extmail.prod.ext.phx2.redhat.com [10.5.110.30]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u537Oa5j002026 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 3 Jun 2016 03:24:36 -0400 Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 281FF3B71B for ; Fri, 3 Jun 2016 07:24:35 +0000 (UTC) X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id A0403AAAD; Fri, 3 Jun 2016 07:24:33 +0000 (UTC) From: Hannes Reinecke To: Christophe Varoqui Date: Fri, 3 Jun 2016 09:24:32 +0200 Message-Id: <1464938672-3075-1-git-send-email-hare@suse.de> X-Greylist: Sender IP whitelisted by DNSRBL, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Fri, 03 Jun 2016 07:24:35 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Fri, 03 Jun 2016 07:24:35 +0000 (UTC) for IP:'195.135.220.15' DOMAIN:'mx2.suse.de' HELO:'mx2.suse.de' FROM:'hare@suse.de' RCPT:'' X-RedHat-Spam-Score: -3.327 (BAYES_50, DCC_REPUT_00_12, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, SPF_PASS) 195.135.220.15 mx2.suse.de 195.135.220.15 mx2.suse.de X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Scanned-By: MIMEDefang 2.78 on 10.5.110.30 X-loop: dm-devel@redhat.com Cc: dm-devel@redhat.com, Hannes Reinecke Subject: [dm-devel] [PATCH] multipathd: rework patch 'move 'filter_devnode' under vector lock' X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dm-devel-bounces@redhat.com Errors-To: dm-devel-bounces@redhat.com X-Virus-Scanned: ClamAV using ClamSMTP The original patch was causing a segfault during booting when calling 'lock_cleanup_pop()' in uev_add_path(). As the patch itself was quite intrusive (and the segfault was promising really hard to debug; all pointers were valid when calling lock_cleanup_pop()) I've reverted it and replaced it by a simpler version which would just store the blacklists in a local copy, and update the pointers upon reconfiguration. As pointer updates can be assumed to be atomic the blacklists will always be valid so we do not need any synchronisation here. Signed-off-by: Hannes Reinecke --- multipathd/main.c | 49 ++++++++++++++++++++++--------------------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/multipathd/main.c b/multipathd/main.c index 2c7486d..774a74e 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -108,6 +108,8 @@ pthread_cond_t config_cond = PTHREAD_COND_INITIALIZER; struct vectors * gvecs; struct udev * udev; +vector blist_devnode; +vector elist_devnode; const char * daemon_status(void) @@ -580,11 +582,6 @@ uev_add_path (struct uevent *uev, struct vectors * vecs) pthread_cleanup_push(cleanup_lock, &vecs->lock); lock(vecs->lock); pthread_testcancel(); - if (filter_devnode(conf->blist_devnode, conf->elist_devnode, - uev->kernel) > 0) { - ret = 0; - goto out_unlock; - } pp = find_path_by_dev(vecs->pathvec, uev->kernel); if (pp) { int r; @@ -642,7 +639,6 @@ uev_add_path (struct uevent *uev, struct vectors * vecs) free_path(pp); ret = 1; } -out_unlock: lock_cleanup_pop(vecs->lock); return ret; } @@ -786,23 +782,22 @@ fail: static int uev_remove_path (struct uevent *uev, struct vectors * vecs) { - struct path *pp = NULL; - int ret = 0; + struct path *pp; + int ret; condlog(2, "%s: remove path (uevent)", uev->kernel); pthread_cleanup_push(cleanup_lock, &vecs->lock); lock(vecs->lock); pthread_testcancel(); - if (filter_devnode(conf->blist_devnode, conf->elist_devnode, - uev->kernel) == 0) { - pp = find_path_by_dev(vecs->pathvec, uev->kernel); - if (pp) - ret = ev_remove_path(pp, vecs); - else - /* Not an error; path might have been purged earlier */ - condlog(0, "%s: path already removed", uev->kernel); - } + pp = find_path_by_dev(vecs->pathvec, uev->kernel); + if (pp) + ret = ev_remove_path(pp, vecs); lock_cleanup_pop(vecs->lock); + if (!pp) { + /* Not an error; path might have been purged earlier */ + condlog(0, "%s: path already removed", uev->kernel); + return 0; + } return ret; } @@ -912,7 +907,7 @@ uev_update_path (struct uevent *uev, struct vectors * vecs) ro = uevent_get_disk_ro(uev); if (ro >= 0) { - struct path * pp = NULL; + struct path * pp; struct multipath *mpp = NULL; condlog(2, "%s: update path write_protect to '%d' (uevent)", @@ -925,10 +920,6 @@ uev_update_path (struct uevent *uev, struct vectors * vecs) * need to be at the same indentation level, hence * this slightly convoluted codepath. */ - if (filter_devnode(conf->blist_devnode, conf->elist_devnode, - uev->kernel) > 0) { - goto out_unlock; - } pp = find_path_by_dev(vecs->pathvec, uev->kernel); if (pp) { if (pp->initialized == INIT_REQUESTED_UDEV) { @@ -948,13 +939,11 @@ uev_update_path (struct uevent *uev, struct vectors * vecs) uev->kernel, mpp->alias, retval); } } - out_unlock: lock_cleanup_pop(vecs->lock); if (!pp) { - if (retval) - condlog(0, "%s: spurious uevent, path not found", - uev->kernel); - return retval; + condlog(0, "%s: spurious uevent, path not found", + uev->kernel); + return 1; } if (retval == 2) return uev_add_path(uev, vecs); @@ -1072,6 +1061,10 @@ uev_trigger (struct uevent * uev, void * trigger_data) /* * path add/remove event */ + if (filter_devnode(blist_devnode, elist_devnode, + uev->kernel) > 0) + goto out; + if (!strncmp(uev->action, "add", 3)) { r = uev_add_path(uev, vecs); goto out; @@ -1897,6 +1890,8 @@ reconfigure (struct vectors * vecs) conf = old; } uxsock_timeout = conf->uxsock_timeout; + blist_devnode = conf->blist_devnode; + elist_devnode = conf->elist_devnode; return retval; }