From patchwork Wed Dec 11 06:43:09 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Marzinski X-Patchwork-Id: 3322561 X-Patchwork-Delegate: christophe.varoqui@free.fr 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.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id C94169F37C for ; Wed, 11 Dec 2013 06:47:00 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id B2519203F7 for ; Wed, 11 Dec 2013 06:46:59 +0000 (UTC) Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by mail.kernel.org (Postfix) with ESMTP id 5B20D20396 for ; Wed, 11 Dec 2013 06:46:58 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id rBB6i1t3018614; Wed, 11 Dec 2013 01:44:01 -0500 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id rBB6hksC021230 for ; Wed, 11 Dec 2013 01:43:46 -0500 Received: from dhcp80-209.msp.redhat.com (octiron.msp.redhat.com [10.15.80.209]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id rBB6hj9t025686 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 11 Dec 2013 01:43:46 -0500 Received: from dhcp80-209.msp.redhat.com (localhost [127.0.0.1]) by dhcp80-209.msp.redhat.com (8.14.7/8.14.7) with ESMTP id rBB6hjVd001396; Wed, 11 Dec 2013 00:43:45 -0600 Received: (from bmarzins@localhost) by dhcp80-209.msp.redhat.com (8.14.7/8.14.7/Submit) id rBB6hiNk001395; Wed, 11 Dec 2013 00:43:44 -0600 From: Benjamin Marzinski To: device-mapper development Date: Wed, 11 Dec 2013 00:43:09 -0600 Message-Id: <1386744190-1295-16-git-send-email-bmarzins@redhat.com> In-Reply-To: <1386744190-1295-1-git-send-email-bmarzins@redhat.com> References: <1386744190-1295-1-git-send-email-bmarzins@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-loop: dm-devel@redhat.com Cc: Christophe Varoqui Subject: [dm-devel] [PATCH 15/16] multipathd: allow /dev/ to be used for multipathd commands X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk Reply-To: device-mapper development 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.1 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 Multipathd expects that path and map names used in its interactive commands are sysfs names with no directory. However, users often try used /dev names instead. This patch makes multipathd convert the /dev names to sysfs names like the multipath command does. Signed-off-by: Benjamin Marzinski --- libmultipath/util.c | 22 ++++++++++++++++++++++ libmultipath/util.h | 1 + multipath/main.c | 23 +---------------------- multipathd/cli_handlers.c | 18 ++++++++++++++++++ 4 files changed, 42 insertions(+), 22 deletions(-) diff --git a/libmultipath/util.c b/libmultipath/util.c index a9f5939..5fedf03 100644 --- a/libmultipath/util.c +++ b/libmultipath/util.c @@ -235,6 +235,28 @@ skip_proc: return 0; } +/* This function returns a pointer inside of the supplied pathname string. + * If is_path_device is true, it may also modify the supplied string */ +char *convert_dev(char *name, int is_path_device) +{ + char *ptr; + + if (!name) + return NULL; + if (is_path_device) { + ptr = strstr(name, "cciss/"); + if (ptr) { + ptr += 5; + *ptr = '!'; + } + } + if (!strncmp(name, "/dev/", 5) && strlen(name) > 5) + ptr = name + 5; + else + ptr = name; + return ptr; +} + dev_t parse_devt(const char *dev_t) { int maj, min; diff --git a/libmultipath/util.h b/libmultipath/util.h index 44184a1..0dd72ae 100644 --- a/libmultipath/util.h +++ b/libmultipath/util.h @@ -10,6 +10,7 @@ size_t strlcat(char *dst, const char *src, size_t size); void remove_trailing_chars(char *path, char c); int devt2devname (char *, int, char *); dev_t parse_devt(const char *dev_t); +char *convert_dev(char *dev, int is_path_device); #define safe_sprintf(var, format, args...) \ snprintf(var, sizeof(var), format, ##args) >= sizeof(var) diff --git a/multipath/main.c b/multipath/main.c index 842a787..91eab88 100644 --- a/multipath/main.c +++ b/multipath/main.c @@ -255,16 +255,7 @@ configure (void) vecs.pathvec = pathvec; vecs.mpvec = curmp; - /* - * dev is "/dev/" . "sysfs block dev" - */ - if (conf->dev) { - if (!strncmp(conf->dev, "/dev/", 5) && - strlen(conf->dev) > 5) - dev = conf->dev + 5; - else - dev = conf->dev; - } + dev = convert_dev(conf->dev, (conf->dev_type == DEV_DEVNODE)); /* * if we have a blacklisted device parameter, exit early @@ -428,16 +419,6 @@ get_dev_type(char *dev) { return DEV_DEVMAP; } -static void -convert_dev(char *dev) -{ - char *ptr = strstr(dev, "cciss/"); - if (ptr) { - ptr += 5; - *ptr = '!'; - } -} - int main (int argc, char *argv[]) { @@ -552,8 +533,6 @@ main (int argc, char *argv[]) strncpy(conf->dev, argv[optind], FILE_NAME_SIZE); conf->dev_type = get_dev_type(conf->dev); - if (conf->dev_type == DEV_DEVNODE) - convert_dev(conf->dev); } conf->daemon = 0; diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c index baa43c4..f7fc522 100644 --- a/multipathd/cli_handlers.c +++ b/multipathd/cli_handlers.c @@ -235,6 +235,7 @@ cli_list_map_topology (void * v, char ** reply, int * len, void * data) struct vectors * vecs = (struct vectors *)data; char * param = get_keyparam(v, MAP); + param = convert_dev(param, 0); get_path_layout(vecs->pathvec, 0); mpp = find_mp_by_str(vecs->mpvec, param); @@ -416,6 +417,7 @@ cli_add_path (void * v, char ** reply, int * len, void * data) struct path *pp; int r; + param = convert_dev(param, 1); condlog(2, "%s: add path (operator)", param); if (filter_devnode(conf->blist_devnode, conf->elist_devnode, @@ -459,6 +461,7 @@ cli_del_path (void * v, char ** reply, int * len, void * data) char * param = get_keyparam(v, PATH); struct path *pp; + param = convert_dev(param, 1); condlog(2, "%s: remove path (operator)", param); pp = find_path_by_dev(vecs->pathvec, param); if (!pp) { @@ -478,6 +481,7 @@ cli_add_map (void * v, char ** reply, int * len, void * data) char *alias; int rc; + param = convert_dev(param, 0); condlog(2, "%s: add map (operator)", param); if (filter_wwid(conf->blist_wwid, conf->elist_wwid, param) > 0) { @@ -518,6 +522,7 @@ cli_del_map (void * v, char ** reply, int * len, void * data) char *alias; int rc; + param = convert_dev(param, 0); condlog(2, "%s: remove map (operator)", param); minor = dm_get_minor(param); if (minor < 0) { @@ -549,6 +554,7 @@ cli_reload(void *v, char **reply, int *len, void *data) struct multipath *mpp; int minor; + mapname = convert_dev(mapname, 0); condlog(2, "%s: reload map (operator)", mapname); if (sscanf(mapname, "dm-%d", &minor) == 1) mpp = find_mp_by_minor(vecs->mpvec, minor); @@ -593,6 +599,7 @@ cli_resize(void *v, char **reply, int *len, void *data) struct pathgroup *pgp; struct path *pp; + mapname = convert_dev(mapname, 0); condlog(2, "%s: resize map (operator)", mapname); if (sscanf(mapname, "dm-%d", &minor) == 1) mpp = find_mp_by_minor(vecs->mpvec, minor); @@ -667,6 +674,7 @@ cli_restore_queueing(void *v, char **reply, int *len, void *data) struct multipath *mpp; int minor; + mapname = convert_dev(mapname, 0); condlog(2, "%s: restore map queueing (operator)", mapname); if (sscanf(mapname, "dm-%d", &minor) == 1) mpp = find_mp_by_minor(vecs->mpvec, minor); @@ -718,6 +726,7 @@ cli_disable_queueing(void *v, char **reply, int *len, void *data) struct multipath *mpp; int minor; + mapname = convert_dev(mapname, 0); condlog(2, "%s: disable map queueing (operator)", mapname); if (sscanf(mapname, "dm-%d", &minor) == 1) mpp = find_mp_by_minor(vecs->mpvec, minor); @@ -755,6 +764,7 @@ cli_switch_group(void * v, char ** reply, int * len, void * data) char * mapname = get_keyparam(v, MAP); int groupnum = atoi(get_keyparam(v, GROUP)); + mapname = convert_dev(mapname, 0); condlog(2, "%s: switch to path group #%i (operator)", mapname, groupnum); return dm_switchgroup(mapname, groupnum); @@ -777,6 +787,7 @@ cli_suspend(void * v, char ** reply, int * len, void * data) char * param = get_keyparam(v, MAP); int r = dm_simplecmd_noflush(DM_DEVICE_SUSPEND, param); + param = convert_dev(param, 0); condlog(2, "%s: suspend (operator)", param); if (!r) /* error */ @@ -798,6 +809,7 @@ cli_resume(void * v, char ** reply, int * len, void * data) char * param = get_keyparam(v, MAP); int r = dm_simplecmd_noflush(DM_DEVICE_RESUME, param); + param = convert_dev(param, 0); condlog(2, "%s: resume (operator)", param); if (!r) /* error */ @@ -819,6 +831,7 @@ cli_reinstate(void * v, char ** reply, int * len, void * data) char * param = get_keyparam(v, PATH); struct path * pp; + param = convert_dev(param, 1); pp = find_path_by_dev(vecs->pathvec, param); if (!pp) @@ -839,6 +852,7 @@ cli_reassign (void * v, char ** reply, int * len, void * data) { char * param = get_keyparam(v, MAP); + param = convert_dev(param, 0); condlog(3, "%s: reset devices (operator)", param); dm_reassign(param); @@ -853,6 +867,7 @@ cli_fail(void * v, char ** reply, int * len, void * data) struct path * pp; int r; + param = convert_dev(param, 1); pp = find_path_by_dev(vecs->pathvec, param); if (!pp) @@ -964,6 +979,7 @@ cli_getprstatus (void * v, char ** reply, int * len, void * data) struct vectors * vecs = (struct vectors *)data; char * param = get_keyparam(v, MAP); + param = convert_dev(param, 0); get_path_layout(vecs->pathvec, 0); mpp = find_mp_by_str(vecs->mpvec, param); @@ -993,6 +1009,7 @@ cli_setprstatus(void * v, char ** reply, int * len, void * data) struct vectors * vecs = (struct vectors *)data; char * param = get_keyparam(v, MAP); + param = convert_dev(param, 0); get_path_layout(vecs->pathvec, 0); mpp = find_mp_by_str(vecs->mpvec, param); @@ -1015,6 +1032,7 @@ cli_unsetprstatus(void * v, char ** reply, int * len, void * data) struct vectors * vecs = (struct vectors *)data; char * param = get_keyparam(v, MAP); + param = convert_dev(param, 0); get_path_layout(vecs->pathvec, 0); mpp = find_mp_by_str(vecs->mpvec, param);