From patchwork Wed Apr 4 16:16:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Wilck X-Patchwork-Id: 10322857 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 E2D0F60318 for ; Wed, 4 Apr 2018 16:19:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D2E4828F70 for ; Wed, 4 Apr 2018 16:19:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C782428F7C; Wed, 4 Apr 2018 16:19:19 +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 mx1.redhat.com (mx1.redhat.com [209.132.183.28]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id EADC028F4F for ; Wed, 4 Apr 2018 16:19:18 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0FC9F80F9A; Wed, 4 Apr 2018 16:19:18 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id D0420808CE; Wed, 4 Apr 2018 16:19:17 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 9F99E1800C9F; Wed, 4 Apr 2018 16:19:17 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w34GHqGo012048 for ; Wed, 4 Apr 2018 12:17:52 -0400 Received: by smtp.corp.redhat.com (Postfix) id 8EC7269212; Wed, 4 Apr 2018 16:17:52 +0000 (UTC) Delivered-To: dm-devel@redhat.com Received: from mx1.redhat.com (ext-mx08.extmail.prod.ext.phx2.redhat.com [10.5.110.32]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7871F6A225; Wed, 4 Apr 2018 16:17:51 +0000 (UTC) Received: from prv3-mh.provo.novell.com (prv3-mh.provo.novell.com [137.65.250.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 54505C044CCE; Wed, 4 Apr 2018 16:17:50 +0000 (UTC) Received: from apollon.suse.de.de (prv-ext-foundry1int.gns.novell.com [137.65.251.240]) by prv3-mh.provo.novell.com with ESMTP (TLS encrypted); Wed, 04 Apr 2018 10:17:35 -0600 From: Martin Wilck To: Christophe Varoqui , Benjamin Marzinski Date: Wed, 4 Apr 2018 18:16:14 +0200 Message-Id: <20180404161627.6244-8-mwilck@suse.com> In-Reply-To: <20180404161627.6244-1-mwilck@suse.com> References: <20180404161627.6244-1-mwilck@suse.com> X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207 matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Wed, 04 Apr 2018 16:17:50 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Wed, 04 Apr 2018 16:17:50 +0000 (UTC) for IP:'137.65.250.26' DOMAIN:'prv3-mh.provo.novell.com' HELO:'prv3-mh.provo.novell.com' FROM:'mwilck@suse.com' RCPT:'' X-RedHat-Spam-Score: -2.301 (RCVD_IN_DNSWL_MED, SPF_PASS) 137.65.250.26 prv3-mh.provo.novell.com 137.65.250.26 prv3-mh.provo.novell.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.32 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: dm-devel@redhat.com Cc: Julian Andres Klode , dm-devel@redhat.com, Martin Wilck Subject: [dm-devel] [PATCH v4 07/20] libmultipath: change find_multipaths option to multi-value 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-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Wed, 04 Apr 2018 16:19:18 +0000 (UTC) X-Virus-Scanned: ClamAV using ClamSMTP Change the "find_multipaths" option from yes/no to multi-value. This option now covers the effects of "find_multipaths" as it used to be, plus the -i option to multipath (ignore_wwids) and the -n option to multipathd (ignore_new_devs), excluding such combinations of the former options that are dangerous or inconsistent. The possible values for "find_multipaths" are now: - strict: strictly stick to the WWIDs file; never add new maps automatically (new default; upstream behaviour with with find_multipaths "yes" and commit 64e27ec "multipathd: imply -n if find_multipaths is set") - off|no: multipath like "strict", multipathd like "greedy" (previous upstream default) - on|yes: set up multipath if >1 paths are seen (current Red Hat/Ubuntu behavior with find_multipaths "yes") - greedy: set up multipath for all non-blacklisted devices (current SUSE default) - smart: Like "yes", but try to avoid inconsistencies between udev processing and multipathd processing by waiting for path siblings to appear (fully implemented in follow-up patches) The default has been changed to "strict", because "no" may cause inconsistent behavior between "multipath -u" and multipathd. This is deliberately a conservative choice. The patch also updates the related man pages. Reviewed-by: Benjamin Marzinski Signed-off-by: Martin Wilck Reviewed-by: Benjamin Marzinski --- libmultipath/config.h | 2 -- libmultipath/defaults.h | 2 +- libmultipath/dict.c | 47 ++++++++++++++++++++++++++++++++++++++++++++-- libmultipath/structs.h | 26 +++++++++++++++++++++++++ libmultipath/wwids.c | 8 ++++++-- multipath/main.c | 9 +++++---- multipath/multipath.8 | 9 ++++++++- multipath/multipath.conf.5 | 46 +++++++++++++++++++++++++-------------------- multipathd/main.c | 6 +----- multipathd/multipathd.8 | 8 +++++--- 10 files changed, 123 insertions(+), 40 deletions(-) diff --git a/libmultipath/config.h b/libmultipath/config.h index 329f3ed..c71d972 100644 --- a/libmultipath/config.h +++ b/libmultipath/config.h @@ -139,7 +139,6 @@ struct config { int max_fds; int force_reload; int queue_without_daemon; - int ignore_wwids; int checker_timeout; int flush_on_last_del; int attribute_flags; @@ -168,7 +167,6 @@ struct config { int strict_timing; int retrigger_tries; int retrigger_delay; - int ignore_new_devs; int delayed_reconfig; int uev_wait_timeout; int skip_kpartx; diff --git a/libmultipath/defaults.h b/libmultipath/defaults.h index 2b270ca..690182c 100644 --- a/libmultipath/defaults.h +++ b/libmultipath/defaults.h @@ -17,7 +17,7 @@ #define DEFAULT_NO_PATH_RETRY NO_PATH_RETRY_UNDEF #define DEFAULT_VERBOSITY 2 #define DEFAULT_REASSIGN_MAPS 0 -#define DEFAULT_FIND_MULTIPATHS 0 +#define DEFAULT_FIND_MULTIPATHS FIND_MULTIPATHS_STRICT #define DEFAULT_FAST_IO_FAIL 5 #define DEFAULT_DEV_LOSS_TMO 600 #define DEFAULT_RETAIN_HWHANDLER RETAIN_HWHANDLER_ON diff --git a/libmultipath/dict.c b/libmultipath/dict.c index ac9216c..e695fdc 100644 --- a/libmultipath/dict.c +++ b/libmultipath/dict.c @@ -234,8 +234,51 @@ declare_def_snprint(multipath_dir, print_str) declare_def_handler(partition_delim, set_str) declare_def_snprint(partition_delim, print_str) -declare_def_handler(find_multipaths, set_yes_no) -declare_def_snprint(find_multipaths, print_yes_no) +static const char *find_multipaths_optvals[] = { + [FIND_MULTIPATHS_OFF] = "off", + [FIND_MULTIPATHS_ON] = "on", + [FIND_MULTIPATHS_STRICT] = "strict", + [FIND_MULTIPATHS_GREEDY] = "greedy", +}; + +static int +def_find_multipaths_handler(struct config *conf, vector strvec) +{ + char *buff; + int i; + + if (set_yes_no_undef(strvec, &conf->find_multipaths) == 0 && + conf->find_multipaths != YNU_UNDEF) + return 0; + + buff = set_value(strvec); + if (!buff) + return 1; + + for (i = FIND_MULTIPATHS_OFF; i < __FIND_MULTIPATHS_LAST; i++) { + if (find_multipaths_optvals[i] != NULL && + !strcmp(buff, find_multipaths_optvals[i])) { + conf->find_multipaths = i; + break; + } + } + + if (conf->find_multipaths == YNU_UNDEF) { + condlog(0, "illegal value for find_multipaths: %s", buff); + conf->find_multipaths = DEFAULT_FIND_MULTIPATHS; + } + + FREE(buff); + return 0; +} + +static int +snprint_def_find_multipaths(struct config *conf, char *buff, int len, + const void *data) +{ + return print_str(buff, len, + find_multipaths_optvals[conf->find_multipaths]); +} declare_def_handler(selector, set_str) declare_def_snprint_defstr(selector, print_str, DEFAULT_SELECTOR) diff --git a/libmultipath/structs.h b/libmultipath/structs.h index 88a4b78..c43f2c3 100644 --- a/libmultipath/structs.h +++ b/libmultipath/structs.h @@ -102,6 +102,32 @@ enum yes_no_undef_states { YNU_YES, }; +#define _FIND_MULTIPATHS_F (1 << 1) +#define _FIND_MULTIPATHS_I (1 << 2) +#define _FIND_MULTIPATHS_N (1 << 3) +/* + * _FIND_MULTIPATHS_F must have the same value as YNU_YES. + * Generate a compile time error if that isn't the case. + */ +char ___error1___[-(_FIND_MULTIPATHS_F != YNU_YES)]; + +#define find_multipaths_on(conf) \ + (!!((conf)->find_multipaths & _FIND_MULTIPATHS_F)) +#define ignore_wwids_on(conf) \ + (!!((conf)->find_multipaths & _FIND_MULTIPATHS_I)) +#define ignore_new_devs_on(conf) \ + (!!((conf)->find_multipaths & _FIND_MULTIPATHS_N)) + +enum find_multipaths_states { + FIND_MULTIPATHS_UNDEF = YNU_UNDEF, + FIND_MULTIPATHS_OFF = YNU_NO, + FIND_MULTIPATHS_ON = _FIND_MULTIPATHS_F, + FIND_MULTIPATHS_STRICT = _FIND_MULTIPATHS_F|_FIND_MULTIPATHS_N, + FIND_MULTIPATHS_GREEDY = _FIND_MULTIPATHS_I, + FIND_MULTIPATHS_SMART = _FIND_MULTIPATHS_F|_FIND_MULTIPATHS_I, + __FIND_MULTIPATHS_LAST, +}; + enum flush_states { FLUSH_UNDEF = YNU_UNDEF, FLUSH_DISABLED = YNU_NO, diff --git a/libmultipath/wwids.c b/libmultipath/wwids.c index 11afe09..da685be 100644 --- a/libmultipath/wwids.c +++ b/libmultipath/wwids.c @@ -282,8 +282,12 @@ should_multipath(struct path *pp1, vector pathvec, vector mpvec) struct config *conf; conf = get_multipath_config(); - ignore_new_devs = conf->ignore_new_devs; - find_multipaths = conf->find_multipaths; + ignore_new_devs = ignore_new_devs_on(conf); + find_multipaths = find_multipaths_on(conf); + if (!find_multipaths && !ignore_new_devs) { + put_multipath_config(conf); + return 1; + } put_multipath_config(conf); if (find_multipaths && !ignore_new_devs) return 1; diff --git a/multipath/main.c b/multipath/main.c index 686b037..2be9b9c 100644 --- a/multipath/main.c +++ b/multipath/main.c @@ -441,11 +441,12 @@ configure (struct config *conf, enum mpath_cmds cmd, * Paths listed in the wwids file are always considered valid. */ if (cmd == CMD_VALID_PATH) { - if ((!conf->find_multipaths && conf->ignore_wwids) || - check_wwids_file(refwwid, 0) == 0) + if ((!find_multipaths_on(conf) && ignore_wwids_on(conf)) + || check_wwids_file(refwwid, 0) == 0) r = 0; if (r == 0 || - !conf->find_multipaths || !conf->ignore_wwids) { + !find_multipaths_on(conf) || + !ignore_wwids_on(conf)) { printf("%s %s a valid multipath device path\n", devpath, r == 0 ? "is" : "is not"); goto out; @@ -737,7 +738,7 @@ main (int argc, char *argv[]) conf->force_reload = FORCE_RELOAD_YES; break; case 'i': - conf->ignore_wwids = 1; + conf->find_multipaths |= _FIND_MULTIPATHS_I; break; case 't': r = dump_config(conf); diff --git a/multipath/multipath.8 b/multipath/multipath.8 index 56f8703..329658d 100644 --- a/multipath/multipath.8 +++ b/multipath/multipath.8 @@ -94,7 +94,14 @@ Force devmap reload. . .TP .B \-i -Ignore WWIDs file when processing devices. +Ignore WWIDs file when processing devices. If +\fIfind_multipaths strict\fR or \fIfind_multipaths no\fR is set in +\fImultipath.conf\fR, multipath only considers devices that are +listed in the WWIDs file. This option overrides that behavior. For other values +of \fIfind_multipaths\fR, this option has no effect. See the description of +\fIfind_multipaths\fR in +.BR multipath.conf (5). +This option should only be used in rare circumstances. . .TP .B \-B diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 index c4d0789..6965dac 100644 --- a/multipath/multipath.conf.5 +++ b/multipath/multipath.conf.5 @@ -951,28 +951,34 @@ The default is: \fBno\fR . .TP .B find_multipaths -If set to -.I yes -, instead of trying to create a multipath device for every non-blacklisted -path, multipath will only create a device if one of three condidions are -met. -.I 1 -There are at least two non-blacklisted paths with the same WWID, -.I 2 -the user manually forces the creation, by specifying a device with the multipath -command, or -.I 3 -a path has the same WWID as a multipath device that was previously created -while find_multipaths was set (even if that multipath device doesn't currently -exist). -Whenever a multipath device is created with find_multipaths set, multipath will -remember the WWID of the device, so that it will automatically create the -device again, as soon as it sees a path with that WWID. This should allow most -users to have multipath automatically choose the correct paths to make into -multipath devices, without having to edit the blacklist. +This option controls whether multipath and multipathd try to create multipath +maps over non-blacklisted devices they encounter. This matters a) when a device is +encountered by \fBmultipath -u\fR during udev rule processing (a device is +blocked from further processing by higher layers - such as LVM - if and only +if it\'s considered a valid multipath device path), and b) when multipathd +detects a new device. The following values are possible: .RS +.TP 10 +.I strict +Both multipath and multipathd treat only such devices as multipath devices +which have been part of a multipath map previously, and which are therefore +listed in the \fBwwids_file\fR. Users can manually set up multipath maps using the +\fBmultipathd add map\fR command. Once set up manually, the map is +remembered in the wwids file and will be set up automatically in the future. .TP -The default is: \fBno\fR +.I no +Multipath behaves like \fBstrict\fR. Multipathd behaves like \fBgreedy\fR. +.TP +.I yes +Both multipathd and multipath treat a device as multipath device if the +conditions for \fBstrict\fR are met, or if at least two non-blacklisted paths +with the same WWID have been detected. +.TP +.I greedy +Both multipathd and multipath treat every non-blacklisted device as multipath +device path. +.TP +The default is: \fBstrict\fR .RE . . diff --git a/multipathd/main.c b/multipathd/main.c index 644de72..e6f4e77 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -2405,8 +2405,6 @@ reconfigure (struct vectors * vecs) conf->verbosity = verbosity; if (bindings_read_only) conf->bindings_read_only = bindings_read_only; - if (ignore_new_devs) - conf->ignore_new_devs = ignore_new_devs; uxsock_timeout = conf->uxsock_timeout; old = rcu_dereference(multipath_conf); @@ -2636,8 +2634,6 @@ child (void * param) conf->verbosity = verbosity; if (bindings_read_only) conf->bindings_read_only = bindings_read_only; - if (ignore_new_devs) - conf->ignore_new_devs = ignore_new_devs; uxsock_timeout = conf->uxsock_timeout; rcu_assign_pointer(multipath_conf, conf); if (init_checkers(conf->multipath_dir)) { @@ -2992,7 +2988,7 @@ main (int argc, char *argv[]) bindings_read_only = 1; break; case 'n': - ignore_new_devs = 1; + condlog(0, "WARNING: ignoring deprecated option -n, use 'ignore_wwids = no' instead"); break; case 'w': poll_dmevents = 0; diff --git a/multipathd/multipathd.8 b/multipathd/multipathd.8 index 5c96680..e78ac9e 100644 --- a/multipathd/multipathd.8 +++ b/multipathd/multipathd.8 @@ -25,7 +25,6 @@ multipathd \- Multipath daemon. .RB [\| \-v\ \c .IR verbosity \|] .RB [\| \-B \|] -.RB [\| \-n \|] . . .\" ---------------------------------------------------------------------------- @@ -73,8 +72,11 @@ be viewed by entering '\fIhelp\fR'. When you are finished entering commands, pre . .TP .B \-n -Ignore new devices. multipathd will not create a multipath device unless the -WWID for the device is already listed in the WWIDs file. +\fBIGNORED\fR. Use the option +\fIfind_multipaths\fR to control the treatment of newly detected devices by +multipathd. See +.BR multipath.conf(5). +. . . .\" ----------------------------------------------------------------------------