From patchwork Wed Apr 27 11:10:39 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Reinecke X-Patchwork-Id: 8955261 Return-Path: X-Original-To: patchwork-dm-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 2EFC99F1C1 for ; Wed, 27 Apr 2016 11:15:11 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 42E0B200DC for ; Wed, 27 Apr 2016 11:15:10 +0000 (UTC) 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.kernel.org (Postfix) with ESMTPS id 27ACC200CC for ; Wed, 27 Apr 2016 11:15:08 +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 u3RBCCwA005747; Wed, 27 Apr 2016 07:12:12 -0400 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id u3RBBN5s012509 for ; Wed, 27 Apr 2016 07:11:23 -0400 Received: from mx1.redhat.com (ext-mx08.extmail.prod.ext.phx2.redhat.com [10.5.110.32]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u3RBBNjI031520 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 27 Apr 2016 07:11:23 -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 ED67EC01AA2E; Wed, 27 Apr 2016 11:11:21 +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 0488FADE8; Wed, 27 Apr 2016 11:11:11 +0000 (UTC) From: Hannes Reinecke To: Christophe Varoqui Date: Wed, 27 Apr 2016 13:10:39 +0200 Message-Id: <1461755458-29225-39-git-send-email-hare@suse.de> In-Reply-To: <1461755458-29225-1-git-send-email-hare@suse.de> References: <1461755458-29225-1-git-send-email-hare@suse.de> X-RedHat-Spam-Score: -0.607 (BAYES_50, DCC_REPUT_00_12, RCVD_IN_DNSWL_NONE, 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.27 X-Scanned-By: MIMEDefang 2.78 on 10.5.110.32 X-loop: dm-devel@redhat.com Cc: dm-devel@redhat.com, Mike Snitzer Subject: [dm-devel] [PATCH 38/57] libmultipath: Fixup 'DM_DEVICE_RELOAD' handling 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-Spam-Status: No, score=-7.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP libdevmapper has the 'quirk' that DM_DEVICE_CREATE is translated internally into a create/load/resume sequence, and the associated cookie will wait for the last 'resume' to complete. However, DM_DEVICE_RELOAD has no such translation, so if there is a cookie assigned to it the caller _cannot_ wait for it, as the cookie will only ever be completed upon the next DM_DEVICE_RESUME. multipathd already has some provisions for that (but even there the cookie handling is dodgy), but 'multipath -r' doesn't know about this. So to avoid any future irritations this patch updates the dm_addmad_reload() call to handle the cookie correctly, and removes the special handling from multipathd. Signed-off-by: Hannes Reinecke --- libmultipath/configure.c | 16 ++++------------ libmultipath/devmapper.c | 39 +++++++++++++++++++++++++++------------ libmultipath/devmapper.h | 2 +- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/libmultipath/configure.c b/libmultipath/configure.c index d093cfd..dee749b 100644 --- a/libmultipath/configure.c +++ b/libmultipath/configure.c @@ -625,16 +625,11 @@ domap (struct multipath * mpp, char * params) break; case ACT_RELOAD: - r = dm_addmap_reload(mpp, params); - if (r) - r = dm_simplecmd_noflush(DM_DEVICE_RESUME, mpp->alias, - 0, MPATH_UDEV_RELOAD_FLAG); + r = dm_addmap_reload(mpp, params, 0); break; case ACT_RESIZE: - r = dm_addmap_reload(mpp, params); - if (r) - r = dm_simplecmd_flush(DM_DEVICE_RESUME, mpp->alias, 0); + r = dm_addmap_reload(mpp, params, 1); break; case ACT_RENAME: @@ -643,11 +638,8 @@ domap (struct multipath * mpp, char * params) case ACT_RENAME2: r = dm_rename(mpp->alias_old, mpp->alias); - if (r) { - r = dm_addmap_reload(mpp, params); - if (r) - r = dm_simplecmd_noflush(DM_DEVICE_RESUME, mpp->alias, 0, MPATH_UDEV_RELOAD_FLAG); - } + if (r) + r = dm_addmap_reload(mpp, params, 0); break; default: diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c index 12ccf1a..15c91c9 100644 --- a/libmultipath/devmapper.c +++ b/libmultipath/devmapper.c @@ -315,12 +315,13 @@ dm_addmap (int task, const char *target, struct multipath *mpp, if (mpp->attribute_flags & (1 << ATTR_GID) && !dm_task_set_gid(dmt, mpp->gid)) goto freeout; - condlog(4, "%s: addmap [0 %llu %s %s]", mpp->alias, mpp->size, + condlog(4, "%s: %s [0 %llu %s %s]", mpp->alias, + task == DM_DEVICE_RELOAD ? "reload" : "addmap", mpp->size, target, params); dm_task_no_open_count(dmt); - if (task == DM_DEVICE_CREATE && + if (cookie && !dm_task_set_cookie(dmt, cookie, DM_UDEV_DISABLE_LIBRARY_FALLBACK)) { dm_udev_complete(*cookie); @@ -328,10 +329,11 @@ dm_addmap (int task, const char *target, struct multipath *mpp, } r = dm_task_run (dmt); - if (task == DM_DEVICE_CREATE) { + if (cookie) { if (!r) dm_udev_complete(*cookie); - else + else if (task != DM_DEVICE_CREATE) + /* Do not wait on a cookie for DM_DEVICE_RELOAD */ dm_udev_wait(*cookie); } freeout: @@ -377,16 +379,29 @@ dm_addmap_create (struct multipath *mpp, char * params) { #define ADDMAP_RO 1 extern int -dm_addmap_reload (struct multipath *mpp, char *params) { +dm_addmap_reload (struct multipath *mpp, char *params, int flush) { + int r; uint32_t cookie = 0; + uint16_t udev_flags = flush ? 0 : MPATH_UDEV_RELOAD_FLAG; - if (dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params, - ADDMAP_RW, &cookie)) - return 1; - if (errno != EROFS) - return 0; - return dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params, - ADDMAP_RO, &cookie); + /* + * DM_DEVICE_RELOAD cannot wait on a cookie, as + * the cookie will only ever be released after an + * DM_DEVICE_RESUME. So call DM_DEVICE_RESUME + * after each DM_DEVICE_RELOAD. + */ + r = dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params, + ADDMAP_RW, &cookie); + if (!r) { + if (errno != EROFS) + return 0; + r = dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params, + ADDMAP_RO, &cookie); + } + if (r) + r = dm_simplecmd(DM_DEVICE_RESUME, mpp->alias, flush, + udev_flags, 0, &cookie); + return r; } extern int diff --git a/libmultipath/devmapper.h b/libmultipath/devmapper.h index 8dd0963..97f3742 100644 --- a/libmultipath/devmapper.h +++ b/libmultipath/devmapper.h @@ -18,7 +18,7 @@ int dm_drv_version (unsigned int * version, char * str); int dm_simplecmd_flush (int, const char *, uint16_t); int dm_simplecmd_noflush (int, const char *, int, uint16_t); int dm_addmap_create (struct multipath *mpp, char *params); -int dm_addmap_reload (struct multipath *mpp, char *params); +int dm_addmap_reload (struct multipath *mpp, char *params, int flush); int dm_map_present (const char *); int dm_get_map(const char *, unsigned long long *, char *); int dm_get_status(char *, char *);