--- libmultipath/config.c | 4 ++++ libmultipath/config.h | 1 + libmultipath/configure.c | 3 +++ libmultipath/dict.c | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 41 insertions(+) Index: multipath-tools-130222/libmultipath/configure.c =================================================================== --- multipath-tools-130222.orig/libmultipath/configure.c +++ multipath-tools-130222/libmultipath/configure.c @@ -422,6 +422,9 @@ select_action (struct multipath * mpp, v condlog(2, "%s: unable to rename %s to %s (%s is used by %s)", mpp->wwid, cmpp->alias, mpp->alias, mpp->alias, cmpp_by_name->wwid); + /* reset alias to existing alias */ + FREE(mpp->alias); + mpp->alias = STRDUP(cmpp->alias); mpp->action = ACT_NOTHING; return; } Index: multipath-tools-130222/libmultipath/config.c =================================================================== --- multipath-tools-130222.orig/libmultipath/config.c +++ multipath-tools-130222/libmultipath/config.c @@ -675,6 +675,7 @@ load_config (char * file, struct udev *u conf->processed_main_config = 0; conf->retrigger_tries = DEFAULT_RETRIGGER_TRIES; conf->retrigger_delay = DEFAULT_RETRIGGER_DELAY; + conf->new_bindings_in_boot = 0; /* * preload default hwtable @@ -794,6 +795,9 @@ load_config (char * file, struct udev *u if (conf->ignore_new_boot_devs) in_initrd(); + if (conf->new_bindings_in_boot == 0 && in_initrd()) + conf->bindings_read_only = 1; + return 0; out: free_config(conf); Index: multipath-tools-130222/libmultipath/config.h =================================================================== --- multipath-tools-130222.orig/libmultipath/config.h +++ multipath-tools-130222/libmultipath/config.h @@ -141,6 +141,7 @@ struct config { int delay_wait_checks; int retrigger_tries; int retrigger_delay; + int new_bindings_in_boot; unsigned int version[3]; char * dev; Index: multipath-tools-130222/libmultipath/dict.c =================================================================== --- multipath-tools-130222.orig/libmultipath/dict.c +++ multipath-tools-130222/libmultipath/dict.c @@ -871,6 +871,29 @@ def_retrigger_delay_handler(vector strve return 0; } +static int +def_new_bindings_in_boot_handler(vector strvec) +{ + char * buff; + + buff = set_value(strvec); + + if (!buff) + return 1; + + if ((strlen(buff) == 2 && !strcmp(buff, "no")) || + (strlen(buff) == 1 && !strcmp(buff, "0"))) + conf->new_bindings_in_boot = 0; + else if ((strlen(buff) == 3 && !strcmp(buff, "yes")) || + (strlen(buff) == 1 && !strcmp(buff, "1"))) + conf->new_bindings_in_boot = 1; + else + conf->new_bindings_in_boot = 0; + + FREE(buff); + return 0; +} + /* * blacklist block handlers */ @@ -3238,6 +3261,15 @@ snprint_def_retrigger_delay (char * buff } static int +snprint_def_new_bindings_in_boot(char * buff, int len, void * data) +{ + if (conf->new_bindings_in_boot == 1) + return snprintf(buff, len, "yes"); + else + return snprintf(buff, len, "no"); +} + +static int snprint_ble_simple (char * buff, int len, void * data) { struct blentry * ble = (struct blentry *)data; @@ -3313,6 +3345,7 @@ init_keywords(void) install_keyword("delay_wait_checks", &def_delay_wait_checks_handler, &snprint_def_delay_wait_checks); install_keyword("retrigger_tries", &def_retrigger_tries_handler, &snprint_def_retrigger_tries); install_keyword("retrigger_delay", &def_retrigger_delay_handler, &snprint_def_retrigger_delay); + install_keyword("new_bindings_in_boot", &def_new_bindings_in_boot_handler, &snprint_def_new_bindings_in_boot); __deprecated install_keyword("default_selector", &def_selector_handler, NULL); __deprecated install_keyword("default_path_grouping_policy", &def_pgpolicy_handler, NULL); __deprecated install_keyword("default_uid_attribute", &def_uid_attribute_handler, NULL);