From patchwork Mon Jul 4 07:08:41 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Reinecke X-Patchwork-Id: 9211769 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 87AD660572 for ; Mon, 4 Jul 2016 07:13:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6DDB7284A5 for ; Mon, 4 Jul 2016 07:13:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5E8FC28603; Mon, 4 Jul 2016 07:13:47 +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=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from mx5-phx2.redhat.com (mx5-phx2.redhat.com [209.132.183.37]) (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 0876B284A5 for ; Mon, 4 Jul 2016 07:13:44 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx5-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u6479icv009357; Mon, 4 Jul 2016 03:09:44 -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 u6479F10017822 for ; Mon, 4 Jul 2016 03:09:15 -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 u6479For002745 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 4 Jul 2016 03:09:15 -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 E4426C05B1E5; Mon, 4 Jul 2016 07:09:11 +0000 (UTC) X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 03E76AD9E; Mon, 4 Jul 2016 07:09:06 +0000 (UTC) From: Hannes Reinecke To: Christophe Varoqui Date: Mon, 4 Jul 2016 09:08:41 +0200 Message-Id: <1467616126-10036-22-git-send-email-hare@suse.de> In-Reply-To: <1467616126-10036-1-git-send-email-hare@suse.de> References: <1467616126-10036-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.32]); Mon, 04 Jul 2016 07:09:12 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 04 Jul 2016 07:09:12 +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.188 (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.27 X-Scanned-By: MIMEDefang 2.78 on 10.5.110.32 X-loop: dm-devel@redhat.com Cc: Hannes Reinecke , dm-devel@redhat.com Subject: [dm-devel] [PATCH 21/26] libmultipath: use explicit 'config' argument for configuration file parsing 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 When parsing the configuration file we should be passing in 'struct config' as an explicit argument. Signed-off-by: Hannes Reinecke --- libmpathpersist/mpath_persist.c | 2 +- libmultipath/config.c | 8 ++--- libmultipath/configure.c | 36 +++++++++---------- libmultipath/dict.c | 77 +++++++++++++++++++++-------------------- libmultipath/discovery.c | 8 ++--- libmultipath/parser.c | 25 +++++++------ libmultipath/parser.h | 18 +++++----- libmultipath/print.c | 12 +++---- libmultipath/print.h | 10 +++--- libmultipath/propsel.c | 72 +++++++++++++++++++------------------- libmultipath/propsel.h | 48 ++++++++++++------------- libmultipath/structs_vec.c | 16 ++++----- libmultipath/structs_vec.h | 4 ++- libmultipath/waiter.c | 1 + mpathpersist/main.c | 1 + multipath/main.c | 12 +++---- multipathd/cli_handlers.c | 10 +++--- multipathd/main.c | 6 ++-- 18 files changed, 189 insertions(+), 177 deletions(-) diff --git a/libmpathpersist/mpath_persist.c b/libmpathpersist/mpath_persist.c index d557da3..1c51397 100644 --- a/libmpathpersist/mpath_persist.c +++ b/libmpathpersist/mpath_persist.c @@ -317,7 +317,7 @@ int mpath_persistent_reserve_out ( int fd, int rq_servact, int rq_scope, goto out1; } - select_reservation_key(mpp); + select_reservation_key(conf, mpp); switch(rq_servact) { diff --git a/libmultipath/config.c b/libmultipath/config.c index 3e59205..28e94b9 100644 --- a/libmultipath/config.c +++ b/libmultipath/config.c @@ -542,7 +542,7 @@ free_config (struct config * conf) /* if multipath fails to process the config directory, it should continue, * with just a warning message */ static void -process_config_dir(vector keywords, char *dir) +process_config_dir(struct config *conf, vector keywords, char *dir) { struct dirent **namelist; int i, n; @@ -569,7 +569,7 @@ process_config_dir(vector keywords, char *dir) old_hwtable_size = VECTOR_SIZE(conf->hwtable); snprintf(path, LINE_MAX, "%s/%s", dir, namelist[i]->d_name); path[LINE_MAX-1] = '\0'; - process_file(path); + process_file(conf, path); if (VECTOR_SIZE(conf->hwtable) > old_hwtable_size) factorize_hwtable(conf->hwtable, old_hwtable_size); @@ -640,7 +640,7 @@ load_config (char * file) int builtin_hwtable_size; builtin_hwtable_size = VECTOR_SIZE(conf->hwtable); - if (process_file(file)) { + if (process_file(conf, file)) { condlog(0, "error parsing config file"); goto out; } @@ -658,7 +658,7 @@ load_config (char * file) if (conf->config_dir == NULL) conf->config_dir = set_default(DEFAULT_CONFIG_DIR); if (conf->config_dir && conf->config_dir[0] != '\0') - process_config_dir(conf->keywords, conf->config_dir); + process_config_dir(conf, conf->keywords, conf->config_dir); /* * fill the voids left in the config file diff --git a/libmultipath/configure.c b/libmultipath/configure.c index 53d89b0..5da49b8 100644 --- a/libmultipath/configure.c +++ b/libmultipath/configure.c @@ -275,24 +275,24 @@ setup_map (struct multipath * mpp, char * params, int params_size) /* * properties selectors */ - select_pgfailback(mpp); - select_pgpolicy(mpp); - select_selector(mpp); - select_features(mpp); - select_hwhandler(mpp); - select_rr_weight(mpp); - select_minio(mpp); - select_no_path_retry(mpp); - select_mode(mpp); - select_uid(mpp); - select_gid(mpp); - select_fast_io_fail(mpp); - select_dev_loss(mpp); - select_reservation_key(mpp); - select_retain_hwhandler(mpp); - select_deferred_remove(mpp); - select_delay_watch_checks(mpp); - select_delay_wait_checks(mpp); + select_pgfailback(conf, mpp); + select_pgpolicy(conf, mpp); + select_selector(conf, mpp); + select_features(conf, mpp); + select_hwhandler(conf, mpp); + select_rr_weight(conf, mpp); + select_minio(conf, mpp); + select_no_path_retry(conf, mpp); + select_mode(conf, mpp); + select_uid(conf, mpp); + select_gid(conf, mpp); + select_fast_io_fail(conf, mpp); + select_dev_loss(conf, mpp); + select_reservation_key(conf, mpp); + select_retain_hwhandler(conf, mpp); + select_deferred_remove(conf, mpp); + select_delay_watch_checks(conf, mpp); + select_delay_wait_checks(conf, mpp); sysfs_set_scsi_tmo(mpp, conf->checkint); /* diff --git a/libmultipath/dict.c b/libmultipath/dict.c index 9920a9b..ed0502a 100644 --- a/libmultipath/dict.c +++ b/libmultipath/dict.c @@ -135,21 +135,21 @@ print_yes_no_undef (char *buff, int len, void *ptr) #define declare_def_handler(option, function) \ static int \ -def_ ## option ## _handler (vector strvec) \ +def_ ## option ## _handler (struct config *conf, vector strvec) \ { \ return function (strvec, &conf->option); \ } #define declare_def_snprint(option, function) \ static int \ -snprint_def_ ## option (char * buff, int len, void * data) \ +snprint_def_ ## option (struct config *conf, char * buff, int len, void * data) \ { \ return function (buff, len, &conf->option); \ } #define declare_def_snprint_defint(option, function, value) \ static int \ -snprint_def_ ## option (char * buff, int len, void * data) \ +snprint_def_ ## option (struct config *conf, char * buff, int len, void * data) \ { \ int i = value; \ if (!conf->option) \ @@ -159,7 +159,7 @@ snprint_def_ ## option (char * buff, int len, void * data) \ #define declare_def_snprint_defstr(option, function, value) \ static int \ -snprint_def_ ## option (char * buff, int len, void * data) \ +snprint_def_ ## option (struct config *conf, char * buff, int len, void * data) \ { \ char *s = value; \ if (!conf->option) \ @@ -169,7 +169,7 @@ snprint_def_ ## option (char * buff, int len, void * data) \ #define declare_hw_handler(option, function) \ static int \ -hw_ ## option ## _handler (vector strvec) \ +hw_ ## option ## _handler (struct config *conf, vector strvec) \ { \ struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable); \ if (!hwe) \ @@ -179,7 +179,7 @@ hw_ ## option ## _handler (vector strvec) \ #define declare_hw_snprint(option, function) \ static int \ -snprint_hw_ ## option (char * buff, int len, void * data) \ +snprint_hw_ ## option (struct config *conf, char * buff, int len, void * data) \ { \ struct hwentry * hwe = (struct hwentry *)data; \ return function (buff, len, &hwe->option); \ @@ -187,7 +187,7 @@ snprint_hw_ ## option (char * buff, int len, void * data) \ #define declare_ovr_handler(option, function) \ static int \ -ovr_ ## option ## _handler (vector strvec) \ +ovr_ ## option ## _handler (struct config *conf, vector strvec) \ { \ if (!conf->overrides) \ return 1; \ @@ -196,14 +196,14 @@ ovr_ ## option ## _handler (vector strvec) \ #define declare_ovr_snprint(option, function) \ static int \ -snprint_ovr_ ## option (char * buff, int len, void * data) \ +snprint_ovr_ ## option (struct config *conf, char * buff, int len, void * data) \ { \ return function (buff, len, &conf->overrides->option); \ } #define declare_mp_handler(option, function) \ static int \ -mp_ ## option ## _handler (vector strvec) \ +mp_ ## option ## _handler (struct config *conf, vector strvec) \ { \ struct mpentry * mpe = VECTOR_LAST_SLOT(conf->mptable); \ if (!mpe) \ @@ -213,7 +213,7 @@ mp_ ## option ## _handler (vector strvec) \ #define declare_mp_snprint(option, function) \ static int \ -snprint_mp_ ## option (char * buff, int len, void * data) \ +snprint_mp_ ## option (struct config *conf, char * buff, int len, void * data) \ { \ struct mpentry * mpe = (struct mpentry *)data; \ return function (buff, len, &mpe->option); \ @@ -324,7 +324,8 @@ declare_mp_snprint(minio_rq, print_nonzero) declare_def_handler(queue_without_daemon, set_yes_no) static int -snprint_def_queue_without_daemon (char * buff, int len, void * data) +snprint_def_queue_without_daemon (struct config *conf, + char * buff, int len, void * data) { switch (conf->queue_without_daemon) { case QUE_NO_DAEMON_OFF: @@ -403,7 +404,7 @@ declare_def_handler(strict_timing, set_yes_no) declare_def_snprint(strict_timing, print_yes_no) static int -def_config_dir_handler(vector strvec) +def_config_dir_handler(struct config *conf, vector strvec) { /* this is only valid in the main config file */ if (conf->processed_main_config) @@ -414,14 +415,14 @@ declare_def_snprint(config_dir, print_str) #define declare_def_attr_handler(option, function) \ static int \ -def_ ## option ## _handler (vector strvec) \ +def_ ## option ## _handler (struct config *conf, vector strvec) \ { \ return function (strvec, &conf->option, &conf->attribute_flags);\ } #define declare_def_attr_snprint(option, function) \ static int \ -snprint_def_ ## option (char * buff, int len, void * data) \ +snprint_def_ ## option (struct config *conf, char * buff, int len, void * data) \ { \ return function (buff, len, &conf->option, \ &conf->attribute_flags); \ @@ -429,7 +430,7 @@ snprint_def_ ## option (char * buff, int len, void * data) \ #define declare_mp_attr_handler(option, function) \ static int \ -mp_ ## option ## _handler (vector strvec) \ +mp_ ## option ## _handler (struct config *conf, vector strvec) \ { \ struct mpentry * mpe = VECTOR_LAST_SLOT(conf->mptable); \ if (!mpe) \ @@ -439,7 +440,7 @@ mp_ ## option ## _handler (vector strvec) \ #define declare_mp_attr_snprint(option, function) \ static int \ -snprint_mp_ ## option (char * buff, int len, void * data) \ +snprint_mp_ ## option (struct config *conf, char * buff, int len, void * data) \ { \ struct mpentry * mpe = (struct mpentry *)data; \ return function (buff, len, &mpe->option, \ @@ -708,7 +709,7 @@ get_sys_max_fds(int *max_fds) static int -max_fds_handler(vector strvec) +max_fds_handler(struct config *conf, vector strvec) { char * buff; int r = 0, max_fds; @@ -738,7 +739,7 @@ max_fds_handler(vector strvec) } static int -snprint_max_fds (char * buff, int len, void * data) +snprint_max_fds (struct config *conf, char * buff, int len, void * data) { int r = 0, max_fds; @@ -898,7 +899,7 @@ declare_mp_handler(no_path_retry, set_no_path_retry) declare_mp_snprint(no_path_retry, print_no_path_retry) static int -def_log_checker_err_handler(vector strvec) +def_log_checker_err_handler(struct config *conf, vector strvec) { char * buff; @@ -917,7 +918,7 @@ def_log_checker_err_handler(vector strvec) } static int -snprint_def_log_checker_err (char * buff, int len, void * data) +snprint_def_log_checker_err (struct config *conf, char * buff, int len, void * data) { if (conf->log_checker_err == LOG_CHKR_ERR_ONCE) return snprintf(buff, len, "once"); @@ -1050,7 +1051,7 @@ declare_mp_handler(delay_wait_checks, set_delay_checks) declare_mp_snprint(delay_wait_checks, print_delay_checks) static int -def_uxsock_timeout_handler(vector strvec) +def_uxsock_timeout_handler(struct config *conf, vector strvec) { unsigned int uxsock_timeout; char *buff; @@ -1073,7 +1074,7 @@ def_uxsock_timeout_handler(vector strvec) * blacklist block handlers */ static int -blacklist_handler(vector strvec) +blacklist_handler(struct config *conf, vector strvec) { if (!conf->blist_devnode) conf->blist_devnode = vector_alloc(); @@ -1092,7 +1093,7 @@ blacklist_handler(vector strvec) } static int -blacklist_exceptions_handler(vector strvec) +blacklist_exceptions_handler(struct config *conf, vector strvec) { if (!conf->elist_devnode) conf->elist_devnode = vector_alloc(); @@ -1112,7 +1113,7 @@ blacklist_exceptions_handler(vector strvec) #define declare_ble_handler(option) \ static int \ -ble_ ## option ## _handler (vector strvec) \ +ble_ ## option ## _handler (struct config *conf, vector strvec) \ { \ char * buff; \ \ @@ -1128,7 +1129,7 @@ ble_ ## option ## _handler (vector strvec) \ #define declare_ble_device_handler(name, option, vend, prod) \ static int \ -ble_ ## option ## _ ## name ## _handler (vector strvec) \ +ble_ ## option ## _ ## name ## _handler (struct config *conf, vector strvec) \ { \ char * buff; \ \ @@ -1150,13 +1151,13 @@ declare_ble_handler(blist_property) declare_ble_handler(elist_property) static int -snprint_def_uxsock_timeout(char * buff, int len, void * data) +snprint_def_uxsock_timeout(struct config *conf, char * buff, int len, void * data) { return snprintf(buff, len, "%u", conf->uxsock_timeout); } static int -snprint_ble_simple (char * buff, int len, void * data) +snprint_ble_simple (struct config *conf, char * buff, int len, void * data) { struct blentry * ble = (struct blentry *)data; @@ -1164,13 +1165,13 @@ snprint_ble_simple (char * buff, int len, void * data) } static int -ble_device_handler(vector strvec) +ble_device_handler(struct config *conf, vector strvec) { return alloc_ble_device(conf->blist_device); } static int -ble_except_device_handler(vector strvec) +ble_except_device_handler(struct config *conf, vector strvec) { return alloc_ble_device(conf->elist_device); } @@ -1181,7 +1182,7 @@ declare_ble_device_handler(product, blist_device, NULL, buff) declare_ble_device_handler(product, elist_device, NULL, buff) static int -snprint_bled_vendor (char * buff, int len, void * data) +snprint_bled_vendor (struct config *conf, char * buff, int len, void * data) { struct blentry_device * bled = (struct blentry_device *)data; @@ -1189,7 +1190,7 @@ snprint_bled_vendor (char * buff, int len, void * data) } static int -snprint_bled_product (char * buff, int len, void * data) +snprint_bled_product (struct config *conf, char * buff, int len, void * data) { struct blentry_device * bled = (struct blentry_device *)data; @@ -1200,7 +1201,7 @@ snprint_bled_product (char * buff, int len, void * data) * devices block handlers */ static int -devices_handler(vector strvec) +devices_handler(struct config *conf, vector strvec) { if (!conf->hwtable) conf->hwtable = vector_alloc(); @@ -1212,7 +1213,7 @@ devices_handler(vector strvec) } static int -device_handler(vector strvec) +device_handler(struct config *conf, vector strvec) { struct hwentry * hwe; @@ -1249,7 +1250,7 @@ declare_hw_snprint(hwhandler, print_str) * overrides handlers */ static int -overrides_handler(vector strvec) +overrides_handler(struct config *conf, vector strvec) { if (!conf->overrides) conf->overrides = alloc_hwe(); @@ -1266,7 +1267,7 @@ overrides_handler(vector strvec) * multipaths block handlers */ static int -multipaths_handler(vector strvec) +multipaths_handler(struct config *conf, vector strvec) { if (!conf->mptable) conf->mptable = vector_alloc(); @@ -1278,7 +1279,7 @@ multipaths_handler(vector strvec) } static int -multipath_handler(vector strvec) +multipath_handler(struct config *conf, vector strvec) { struct mpentry * mpe; @@ -1307,7 +1308,7 @@ declare_mp_snprint(alias, print_str) */ static int -deprecated_handler(vector strvec) +deprecated_handler(struct config *conf, vector strvec) { char * buff; @@ -1321,7 +1322,7 @@ deprecated_handler(vector strvec) } static int -snprint_deprecated (char * buff, int len, void * data) +snprint_deprecated (struct config *conf, char * buff, int len, void * data) { return 0; } diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c index 69b7b34..b059f32 100644 --- a/libmultipath/discovery.c +++ b/libmultipath/discovery.c @@ -1412,7 +1412,7 @@ get_state (struct path * pp, struct config *conf, int daemon) return PATH_UNCHECKED; } } - select_checker(pp); + select_checker(conf, pp); if (!checker_selected(c)) { condlog(3, "%s: No checker selected", pp->dev); return PATH_UNCHECKED; @@ -1452,8 +1452,8 @@ get_prio (struct path * pp) struct prio * p = &pp->prio; if (!prio_selected(p)) { - select_detect_prio(pp); - select_prio(pp); + select_detect_prio(conf, pp); + select_prio(conf, pp); if (!prio_selected(p)) { condlog(3, "%s: no prio selected", pp->dev); pp->priority = PRIO_UNDEF; @@ -1520,7 +1520,7 @@ get_uid (struct path * pp, int path_state) ssize_t len = 0; if (!pp->uid_attribute && !pp->getuid) - select_getuid(pp); + select_getuid(conf, pp); if (!pp->udev) { condlog(1, "%s: no udev information", pp->dev); diff --git a/libmultipath/parser.c b/libmultipath/parser.c index e4296ee..96bc872 100644 --- a/libmultipath/parser.c +++ b/libmultipath/parser.c @@ -20,6 +20,8 @@ #include #include +#include "vector.h" +#include "config.h" #include "parser.h" #include "memory.h" #include "debug.h" @@ -37,8 +39,9 @@ void set_current_keywords (vector *k) } int -keyword_alloc(vector keywords, char *string, int (*handler) (vector), - int (*print) (char *, int, void *), int unique) +keyword_alloc(vector keywords, char *string, + int (*handler) (struct config *, vector), + int (*print) (struct config *, char *, int, void *), int unique) { struct keyword *keyword; @@ -62,7 +65,7 @@ keyword_alloc(vector keywords, char *string, int (*handler) (vector), } int -install_keyword_root(char *string, int (*handler) (vector)) +install_keyword_root(char *string, int (*handler) (struct config *, vector)) { int r = keyword_alloc(keywords, string, handler, NULL, 1); if (!r) @@ -83,8 +86,8 @@ install_sublevel_end(void) } int -_install_keyword(char *string, int (*handler) (vector), - int (*print) (char *, int, void *), int unique) +_install_keyword(char *string, int (*handler) (struct config *, vector), + int (*print) (struct config *, char *, int, void *), int unique) { int i = 0; struct keyword *keyword; @@ -179,7 +182,7 @@ snprint_keyword(char *buff, int len, char *fmt, struct keyword *kw, void *data) fwd += snprintf(buff + fwd, len - fwd, "%s", kw->string); break; case 'v': - r = kw->print(buff + fwd, len - fwd, data); + r = kw->print(conf, buff + fwd, len - fwd, data); if (!r) { /* no output if no value */ buff = '\0'; return 0; @@ -466,7 +469,7 @@ validate_config_strvec(vector strvec, char *file) } static int -process_stream(FILE *stream, vector keywords, char *file) +process_stream(struct config *conf, FILE *stream, vector keywords, char *file) { int i; int r = 0, t; @@ -520,7 +523,7 @@ process_stream(FILE *stream, vector keywords, char *file) goto out; } if (keyword->handler) { - t = (*keyword->handler) (strvec); + t = (*keyword->handler) (conf, strvec); r += t; if (t) condlog(1, "multipath.conf +%d, parsing failed: %s", @@ -529,7 +532,7 @@ process_stream(FILE *stream, vector keywords, char *file) if (keyword->sub) { kw_level++; - r += process_stream(stream, + r += process_stream(conf, stream, keyword->sub, file); kw_level--; } @@ -562,7 +565,7 @@ int alloc_keywords(void) /* Data initialization */ int -process_file(char *file) +process_file(struct config *conf, char *file) { int r; FILE *stream; @@ -580,7 +583,7 @@ process_file(char *file) /* Stream handling */ line_nr = 0; - r = process_stream(stream, keywords, file); + r = process_stream(conf, stream, keywords, file); fclose(stream); //free_keywords(keywords); diff --git a/libmultipath/parser.h b/libmultipath/parser.h index 70697f4..822b2b4 100644 --- a/libmultipath/parser.h +++ b/libmultipath/parser.h @@ -33,6 +33,7 @@ /* local includes */ #include "vector.h" +#include "config.h" /* Global definitions */ #define EOB "}" @@ -41,8 +42,8 @@ /* ketword definition */ struct keyword { char *string; - int (*handler) (vector); - int (*print) (char *, int, void *); + int (*handler) (struct config *, vector); + int (*print) (struct config *, char *, int, void *); vector sub; int unique; }; @@ -57,13 +58,14 @@ struct keyword { for (i = 0; i < (k)->sub->allocated && ((p) = (k)->sub->slot[i]); i++) /* Prototypes */ -extern int keyword_alloc(vector keywords, char *string, int (*handler) (vector), - int (*print) (char *, int, void *), int unique); -extern int install_keyword_root(char *string, int (*handler) (vector)); +extern int keyword_alloc(vector keywords, char *string, + int (*handler) (struct config *, vector), + int (*print) (struct config *, char *, int, void *), int unique); +extern int install_keyword_root(char *string, int (*handler) (struct config *, vector)); extern void install_sublevel(void); extern void install_sublevel_end(void); -extern int _install_keyword(char *string, int (*handler) (vector), - int (*print) (char *, int, void *), int unique); +extern int _install_keyword(char *string, int (*handler) (struct config *, vector), + int (*print) (struct config *, char *, int, void *), int unique); #define install_keyword(str, vec, pri) _install_keyword(str, vec, pri, 1) #define install_keyword_multi(str, vec, pri) _install_keyword(str, vec, pri, 0) extern void dump_keywords(vector keydump, int level); @@ -71,7 +73,7 @@ extern void free_keywords(vector keywords); extern vector alloc_strvec(char *string); extern void *set_value(vector strvec); extern int alloc_keywords(void); -extern int process_file(char *conf_file); +extern int process_file(struct config *conf, char *conf_file); extern struct keyword * find_keyword(vector v, char * name); void set_current_keywords (vector *k); int snprint_keyword(char *buff, int len, char *fmt, struct keyword *kw, diff --git a/libmultipath/print.c b/libmultipath/print.c index 03c7859..fe3902f 100644 --- a/libmultipath/print.c +++ b/libmultipath/print.c @@ -16,11 +16,11 @@ #include "vector.h" #include "structs.h" #include "structs_vec.h" -#include "print.h" #include "dmparser.h" #include "config.h" #include "configure.h" #include "pgpolicies.h" +#include "print.h" #include "defaults.h" #include "parser.h" #include "blacklist.h" @@ -1354,7 +1354,7 @@ out: } extern int -snprint_defaults (char * buff, int len) +snprint_defaults (struct config *conf, char * buff, int len) { int fwd = 0; int i; @@ -1436,7 +1436,7 @@ snprint_blacklist_devgroup (char *buff, int len, int *fwd, vector *vec) } extern int -snprint_blacklist_report (char * buff, int len) +snprint_blacklist_report (struct config *conf, char * buff, int len) { int threshold = MAX_LINE_LEN; int fwd = 0; @@ -1499,7 +1499,7 @@ snprint_blacklist_report (char * buff, int len) } extern int -snprint_blacklist (char * buff, int len) +snprint_blacklist (struct config *conf, char * buff, int len) { int i; struct blentry * ble; @@ -1576,7 +1576,7 @@ snprint_blacklist (char * buff, int len) } extern int -snprint_blacklist_except (char * buff, int len) +snprint_blacklist_except (struct config *conf, char * buff, int len) { int i; struct blentry * ele; @@ -1685,7 +1685,7 @@ snprint_status (char * buff, int len, struct vectors *vecs) } extern int -snprint_devices (char * buff, int len, struct vectors *vecs) +snprint_devices (struct config *conf, char * buff, int len, struct vectors *vecs) { DIR *blkdir; struct dirent *blkdev; diff --git a/libmultipath/print.h b/libmultipath/print.h index 72758ad..023f520 100644 --- a/libmultipath/print.h +++ b/libmultipath/print.h @@ -102,13 +102,13 @@ int snprint_multipath_topology_json (char * buff, int len, struct vectors * vecs); int snprint_multipath_map_json (char * buff, int len, struct multipath * mpp, int last); -int snprint_defaults (char *, int); -int snprint_blacklist (char *, int); -int snprint_blacklist_except (char *, int); -int snprint_blacklist_report (char *, int); +int snprint_defaults (struct config *, char *, int); +int snprint_blacklist (struct config *, char *, int); +int snprint_blacklist_except (struct config *, char *, int); +int snprint_blacklist_report (struct config *, char *, int); int snprint_wildcards (char *, int); int snprint_status (char *, int, struct vectors *); -int snprint_devices (char *, int, struct vectors *); +int snprint_devices (struct config *, char *, int, struct vectors *); int snprint_hwtable (char *, int, vector); int snprint_mptable (char *, int, vector); int snprint_overrides (char *, int, struct hwentry *); diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c index 28e7414..beb0798 100644 --- a/libmultipath/propsel.c +++ b/libmultipath/propsel.c @@ -82,7 +82,7 @@ do_attr_set(var, mp->mpe, shift, "(LUN setting)") do_attr_set(var, conf, shift, "(config file default)") extern int -select_mode (struct multipath *mp) +select_mode (struct config *conf, struct multipath *mp) { char *origin; @@ -96,7 +96,7 @@ out: } extern int -select_uid (struct multipath *mp) +select_uid (struct config *conf, struct multipath *mp) { char *origin; @@ -110,7 +110,7 @@ out: } extern int -select_gid (struct multipath *mp) +select_gid (struct config *conf, struct multipath *mp) { char *origin; @@ -129,7 +129,7 @@ out: * stop at first explicit setting found */ extern int -select_rr_weight (struct multipath * mp) +select_rr_weight (struct config *conf, struct multipath * mp) { char *origin, buff[13]; @@ -145,7 +145,7 @@ out: } extern int -select_pgfailback (struct multipath * mp) +select_pgfailback (struct config *conf, struct multipath * mp) { char *origin, buff[13]; @@ -161,7 +161,7 @@ out: } extern int -select_pgpolicy (struct multipath * mp) +select_pgpolicy (struct config *conf, struct multipath * mp) { char *origin, buff[POLICY_NAME_SIZE]; @@ -183,7 +183,7 @@ out: } extern int -select_selector (struct multipath * mp) +select_selector (struct config *conf, struct multipath * mp) { char *origin; @@ -200,7 +200,7 @@ out: } static void -select_alias_prefix (struct multipath * mp) +select_alias_prefix (struct config *conf, struct multipath * mp) { char *origin; @@ -214,7 +214,7 @@ out: } static int -want_user_friendly_names(struct multipath * mp) +want_user_friendly_names(struct config *conf, struct multipath * mp) { char *origin; @@ -237,7 +237,7 @@ out: } extern int -select_alias (struct multipath * mp) +select_alias (struct config *conf, struct multipath * mp) { char *origin = NULL; @@ -248,10 +248,10 @@ select_alias (struct multipath * mp) } mp->alias = NULL; - if (!want_user_friendly_names(mp)) + if (!want_user_friendly_names(conf, mp)) goto out; - select_alias_prefix(mp); + select_alias_prefix(conf, mp); if (strlen(mp->alias_old) > 0) { mp->alias = use_existing_alias(mp->wwid, conf->bindings_file, @@ -277,7 +277,7 @@ out: } extern int -select_features (struct multipath * mp) +select_features (struct config *conf, struct multipath * mp) { char *origin; @@ -303,7 +303,7 @@ out: } extern int -select_hwhandler (struct multipath * mp) +select_hwhandler (struct config *conf, struct multipath * mp) { char *origin; @@ -318,7 +318,7 @@ out: } extern int -select_checker(struct path *pp) +select_checker(struct config *conf, struct path *pp) { char *origin, *checker_name; struct checker * c = &pp->checker; @@ -347,7 +347,7 @@ out: } extern int -select_getuid (struct path * pp) +select_getuid (struct config *conf, struct path * pp) { char *origin; @@ -369,7 +369,7 @@ out: } void -detect_prio(struct path * pp) +detect_prio(struct config *conf, struct path * pp) { int ret; struct prio *p = &pp->prio; @@ -387,24 +387,24 @@ detect_prio(struct path * pp) prio_get(conf->multipath_dir, p, PRIO_ALUA, DEFAULT_PRIO_ARGS); } -#define set_prio(dir, src, msg) \ +#define set_prio(dir, src, msg) \ do { \ if (src && src->prio_name) { \ - prio_get(dir, p, src->prio_name, src->prio_args); \ + prio_get(dir, p, src->prio_name, src->prio_args); \ origin = msg; \ goto out; \ } \ } while(0) extern int -select_prio (struct path * pp) +select_prio (struct config *conf, struct path * pp) { char *origin; struct mpentry * mpe; struct prio * p = &pp->prio; if (pp->detect_prio == DETECT_PRIO_ON) { - detect_prio(pp); + detect_prio(conf, pp); if (prio_selected(p)) { origin = "(detected setting)"; goto out; @@ -435,7 +435,7 @@ out: } extern int -select_no_path_retry(struct multipath *mp) +select_no_path_retry(struct config *conf, struct multipath *mp) { char *origin = NULL; char buff[12]; @@ -464,7 +464,7 @@ out: } int -select_minio_rq (struct multipath * mp) +select_minio_rq (struct config *conf, struct multipath * mp) { char *origin; @@ -479,7 +479,7 @@ out: } int -select_minio_bio (struct multipath * mp) +select_minio_bio (struct config *conf, struct multipath * mp) { char *origin; @@ -494,18 +494,18 @@ out: } extern int -select_minio (struct multipath * mp) +select_minio (struct config *conf, struct multipath * mp) { unsigned int minv_dmrq[3] = {1, 1, 0}; if (VERSION_GE(conf->version, minv_dmrq)) - return select_minio_rq(mp); + return select_minio_rq(conf, mp); else - return select_minio_bio(mp); + return select_minio_bio(conf, mp); } extern int -select_fast_io_fail(struct multipath *mp) +select_fast_io_fail(struct config *conf, struct multipath *mp) { char *origin, buff[12]; @@ -520,7 +520,7 @@ out: } extern int -select_dev_loss(struct multipath *mp) +select_dev_loss(struct config *conf, struct multipath *mp) { char *origin, buff[12]; @@ -536,7 +536,7 @@ out: } extern int -select_flush_on_last_del(struct multipath *mp) +select_flush_on_last_del(struct config *conf, struct multipath *mp) { char *origin; @@ -554,7 +554,7 @@ out: } extern int -select_reservation_key (struct multipath * mp) +select_reservation_key (struct config *conf, struct multipath * mp) { char *origin, buff[12]; @@ -569,7 +569,7 @@ out: } extern int -select_retain_hwhandler (struct multipath * mp) +select_retain_hwhandler (struct config *conf, struct multipath * mp) { char *origin; unsigned int minv_dm_retain[3] = {1, 5, 0}; @@ -591,7 +591,7 @@ out: } extern int -select_detect_prio (struct path * pp) +select_detect_prio (struct config *conf, struct path * pp) { char *origin; @@ -606,7 +606,7 @@ out: } extern int -select_deferred_remove (struct multipath *mp) +select_deferred_remove (struct config *conf, struct multipath *mp) { char *origin; @@ -632,7 +632,7 @@ out: } extern int -select_delay_watch_checks(struct multipath *mp) +select_delay_watch_checks(struct config *conf, struct multipath *mp) { char *origin, buff[12]; @@ -648,7 +648,7 @@ out: } extern int -select_delay_wait_checks(struct multipath *mp) +select_delay_wait_checks(struct config *conf, struct multipath *mp) { char *origin, buff[12]; diff --git a/libmultipath/propsel.h b/libmultipath/propsel.h index f9598e7..5941a5f 100644 --- a/libmultipath/propsel.h +++ b/libmultipath/propsel.h @@ -1,24 +1,24 @@ -int select_rr_weight (struct multipath * mp); -int select_pgfailback (struct multipath * mp); -int select_pgpolicy (struct multipath * mp); -int select_selector (struct multipath * mp); -int select_alias (struct multipath * mp); -int select_features (struct multipath * mp); -int select_hwhandler (struct multipath * mp); -int select_checker(struct path *pp); -int select_getuid (struct path * pp); -int select_prio (struct path * pp); -int select_no_path_retry(struct multipath *mp); -int select_flush_on_last_del(struct multipath *mp); -int select_minio(struct multipath *mp); -int select_mode(struct multipath *mp); -int select_uid(struct multipath *mp); -int select_gid(struct multipath *mp); -int select_fast_io_fail(struct multipath *mp); -int select_dev_loss(struct multipath *mp); -int select_reservation_key(struct multipath *mp); -int select_retain_hwhandler (struct multipath * mp); -int select_detect_prio(struct path * pp); -int select_deferred_remove(struct multipath *mp); -int select_delay_watch_checks (struct multipath * mp); -int select_delay_wait_checks (struct multipath * mp); +int select_rr_weight (struct config *conf, struct multipath * mp); +int select_pgfailback (struct config *conf, struct multipath * mp); +int select_pgpolicy (struct config *conf, struct multipath * mp); +int select_selector (struct config *conf, struct multipath * mp); +int select_alias (struct config *conf, struct multipath * mp); +int select_features (struct config *conf, struct multipath * mp); +int select_hwhandler (struct config *conf, struct multipath * mp); +int select_checker(struct config *conf, struct path *pp); +int select_getuid (struct config *conf, struct path * pp); +int select_prio (struct config *conf, struct path * pp); +int select_no_path_retry(struct config *conf, struct multipath *mp); +int select_flush_on_last_del(struct config *conf, struct multipath *mp); +int select_minio(struct config *conf, struct multipath *mp); +int select_mode(struct config *conf, struct multipath *mp); +int select_uid(struct config *conf, struct multipath *mp); +int select_gid(struct config *conf, struct multipath *mp); +int select_fast_io_fail(struct config *conf, struct multipath *mp); +int select_dev_loss(struct config *conf, struct multipath *mp); +int select_reservation_key(struct config *conf, struct multipath *mp); +int select_retain_hwhandler (struct config *conf, struct multipath * mp); +int select_detect_prio(struct config *conf, struct path * pp); +int select_deferred_remove(struct config *conf, struct multipath *mp); +int select_delay_watch_checks (struct config *conf, struct multipath * mp); +int select_delay_wait_checks (struct config *conf, struct multipath * mp); diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c index dee6447..74db124 100644 --- a/libmultipath/structs_vec.c +++ b/libmultipath/structs_vec.c @@ -6,13 +6,13 @@ #include "vector.h" #include "defaults.h" #include "debug.h" +#include "config.h" #include "structs.h" #include "structs_vec.h" #include "sysfs.h" #include "waiter.h" #include "devmapper.h" #include "dmparser.h" -#include "config.h" #include "propsel.h" #include "discovery.h" #include "prio.h" @@ -337,11 +337,11 @@ update_multipath_strings (struct multipath *mpp, vector pathvec, int is_daemon) } extern void -set_no_path_retry(struct multipath *mpp) +set_no_path_retry(struct config *conf, struct multipath *mpp) { mpp->retry_tick = 0; mpp->nr_active = pathcount(mpp, PATH_UP) + pathcount(mpp, PATH_GHOST); - select_no_path_retry(mpp); + select_no_path_retry(conf, mpp); switch (mpp->no_path_retry) { case NO_PATH_RETRY_UNDEF: @@ -396,10 +396,10 @@ __setup_multipath (struct vectors * vecs, struct multipath * mpp, mpp->alias); } if (reset) { - select_rr_weight(mpp); - select_pgfailback(mpp); - set_no_path_retry(mpp); - select_flush_on_last_del(mpp); + select_rr_weight(conf, mpp); + select_pgfailback(conf, mpp); + set_no_path_retry(conf, mpp); + select_flush_on_last_del(conf, mpp); if (VECTOR_SIZE(mpp->paths) != 0) dm_cancel_deferred_remove(mpp); } @@ -475,7 +475,7 @@ add_map_with_path (struct vectors * vecs, strcpy(mpp->wwid, pp->wwid); find_existing_alias(mpp, vecs); - if (select_alias(mpp)) + if (select_alias(conf, mpp)) goto out; mpp->size = pp->size; diff --git a/libmultipath/structs_vec.h b/libmultipath/structs_vec.h index c8e78b5..8ef547d 100644 --- a/libmultipath/structs_vec.h +++ b/libmultipath/structs_vec.h @@ -1,6 +1,8 @@ #ifndef _STRUCTS_VEC_H #define _STRUCTS_VEC_H +#include "vector.h" +#include "config.h" #include "lock.h" /* struct mutex_lock { @@ -13,7 +15,7 @@ struct vectors { vector mpvec; }; -void set_no_path_retry(struct multipath *mpp); +void set_no_path_retry(struct config *conf, struct multipath *mpp); int adopt_paths (vector pathvec, struct multipath * mpp); void orphan_paths (vector pathvec, struct multipath * mpp); diff --git a/libmultipath/waiter.c b/libmultipath/waiter.c index 6937034..219876b 100644 --- a/libmultipath/waiter.c +++ b/libmultipath/waiter.c @@ -13,6 +13,7 @@ #include "vector.h" #include "memory.h" #include "checkers.h" +#include "config.h" #include "structs.h" #include "structs_vec.h" #include "devmapper.h" diff --git a/mpathpersist/main.c b/mpathpersist/main.c index b80d3bc..5194511 100644 --- a/mpathpersist/main.c +++ b/mpathpersist/main.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include diff --git a/multipath/main.c b/multipath/main.c index a6f593f..0d95572 100644 --- a/multipath/main.c +++ b/multipath/main.c @@ -38,11 +38,11 @@ #include #include #include +#include #include #include #include #include -#include #include #include #include @@ -395,7 +395,7 @@ out: } static int -dump_config (void) +dump_config (struct config *conf) { char * c, * tmp = NULL; char * reply; @@ -411,19 +411,19 @@ dump_config (void) return 1; } c = tmp = reply; - c += snprint_defaults(c, reply + maxlen - c); + c += snprint_defaults(conf, c, reply + maxlen - c); again = ((c - reply) == maxlen); if (again) { reply = REALLOC(reply, maxlen *= 2); continue; } - c += snprint_blacklist(c, reply + maxlen - c); + c += snprint_blacklist(conf, c, reply + maxlen - c); again = ((c - reply) == maxlen); if (again) { reply = REALLOC(reply, maxlen *= 2); continue; } - c += snprint_blacklist_except(c, reply + maxlen - c); + c += snprint_blacklist_except(conf, c, reply + maxlen - c); again = ((c - reply) == maxlen); if (again) { reply = REALLOC(reply, maxlen *= 2); @@ -549,7 +549,7 @@ main (int argc, char *argv[]) conf->ignore_wwids = 1; break; case 't': - r = dump_config(); + r = dump_config(conf); goto out_free_config; case 'h': usage(argv[0]); diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c index 90259ae..36c77da 100644 --- a/multipathd/cli_handlers.c +++ b/multipathd/cli_handlers.c @@ -233,17 +233,17 @@ show_config (char ** r, int * len) if (!reply) return 1; c = reply; - c += snprint_defaults(c, reply + maxlen - c); + c += snprint_defaults(conf, c, reply + maxlen - c); again = ((c - reply) == maxlen); REALLOC_REPLY(reply, again, maxlen); if (again) continue; - c += snprint_blacklist(c, reply + maxlen - c); + c += snprint_blacklist(conf, c, reply + maxlen - c); again = ((c - reply) == maxlen); REALLOC_REPLY(reply, again, maxlen); if (again) continue; - c += snprint_blacklist_except(c, reply + maxlen - c); + c += snprint_blacklist_except(conf, c, reply + maxlen - c); again = ((c - reply) == maxlen); REALLOC_REPLY(reply, again, maxlen); if (again) @@ -1162,7 +1162,7 @@ show_blacklist (char ** r, int * len) return 1; c = reply; - c += snprint_blacklist_report(c, maxlen); + c += snprint_blacklist_report(conf, c, maxlen); again = ((c - reply) == maxlen); REALLOC_REPLY(reply, again, maxlen); } @@ -1196,7 +1196,7 @@ show_devices (char ** r, int * len, struct vectors *vecs) return 1; c = reply; - c += snprint_devices(c, maxlen, vecs); + c += snprint_devices(conf, c, maxlen, vecs); again = ((c - reply) == maxlen); REALLOC_REPLY(reply, again, maxlen); } diff --git a/multipathd/main.c b/multipathd/main.c index f0caca5..66388f8 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -21,8 +21,6 @@ #include #endif #include -#include -#include #include /* @@ -65,6 +63,10 @@ int uxsock_timeout; #include #include #include + +#include +#include + #include "prioritizers/alua_rtpg.h" #include "main.h"