[dm-devel] [PATCH] [PATCH] option to multipath to not modify the bindinfs file
Malahal Naineni
malahal at us.ibm.com
Fri Aug 27 05:39:36 UTC 2010
Christophe, Hannes: any comments on this approach to fix the uuid issue
reported earlier here
http://permalink.gmane.org/gmane.linux.kernel.device-mapper.devel/12027
Thanks, Malahal.
Malahal Naineni [malahal at us.ibm.com] wrote:
> initramfs is mounted read-write causing multipath to update the
> initramfs bindings file and name all multipath devices it finds using
> friendly names. The actual changes to the file are thrown away as they
> are only written to the memory image rather than to the disk image. This
> may cause the in memory updated initramfs bindings file inconsistent
> with the actual bindings file in the active root file system image when
> devices are added or removed.
>
> In other words, the boot time updated initramfs bindings file may have
> 'uuid1 map to mpatha' and 'uuid2 map to mpathb', but the active root fs
> bindings file may have 'uuid1 map to mpathb' and 'uuid2 map to mpatha'
>
> The option, -B, will not modify the bindings file. It will only use the
> bindings file if needed. This option to multipath should be used when
> invoked in the initramfs context to avoid the inconsistency.
>
> Signed-off-by: Malahal Naineni (malahal at us.ibm.com)
>
> diff -r b359f4953289 -r e2c6d0d327f6 libmultipath/alias.c
> --- a/libmultipath/alias.c Sun Aug 15 10:48:09 2010 -0700
> +++ b/libmultipath/alias.c Mon Aug 16 13:02:41 2010 -0700
> @@ -353,7 +353,8 @@ allocate_binding(int fd, char *wwid, int
> }
>
> char *
> -get_user_friendly_alias(char *wwid, char *file, char *prefix)
> +get_user_friendly_alias(char *wwid, char *file, char *prefix,
> + int bindings_read_only)
> {
> char *alias;
> int fd, scan_fd, id;
> @@ -394,7 +395,7 @@ get_user_friendly_alias(char *wwid, char
> return NULL;
> }
>
> - if (!alias && can_write)
> + if (!alias && can_write && !bindings_read_only)
> alias = allocate_binding(fd, wwid, id, prefix);
>
> fclose(f);
> diff -r b359f4953289 -r e2c6d0d327f6 libmultipath/alias.h
> --- a/libmultipath/alias.h Sun Aug 15 10:48:09 2010 -0700
> +++ b/libmultipath/alias.h Mon Aug 16 13:02:41 2010 -0700
> @@ -8,5 +8,6 @@
> "# alias wwid\n" \
> "#\n"
>
> -char *get_user_friendly_alias(char *wwid, char *file, char *prefix);
> +char *get_user_friendly_alias(char *wwid, char *file, char *prefix,
> + int bindings_readonly);
> char *get_user_friendly_wwid(char *alias, char *file);
> diff -r b359f4953289 -r e2c6d0d327f6 libmultipath/config.c
> --- a/libmultipath/config.c Sun Aug 15 10:48:09 2010 -0700
> +++ b/libmultipath/config.c Mon Aug 16 13:02:41 2010 -0700
> @@ -458,6 +458,7 @@ load_config (char * file)
> conf->minio = 1000;
> conf->max_fds = 0;
> conf->bindings_file = DEFAULT_BINDINGS_FILE;
> + conf->bindings_read_only = 0;
> conf->multipath_dir = set_default(DEFAULT_MULTIPATHDIR);
> conf->flush_on_last_del = 0;
> conf->attribute_flags = 0;
> diff -r b359f4953289 -r e2c6d0d327f6 libmultipath/config.h
> --- a/libmultipath/config.h Sun Aug 15 10:48:09 2010 -0700
> +++ b/libmultipath/config.h Mon Aug 16 13:02:41 2010 -0700
> @@ -74,6 +74,7 @@ struct config {
> int rr_weight;
> int no_path_retry;
> int user_friendly_names;
> + int bindings_read_only;
> int pg_timeout;
> int max_fds;
> int force_reload;
> diff -r b359f4953289 -r e2c6d0d327f6 libmultipath/propsel.c
> --- a/libmultipath/propsel.c Sun Aug 15 10:48:09 2010 -0700
> +++ b/libmultipath/propsel.c Mon Aug 16 13:02:41 2010 -0700
> @@ -245,7 +245,7 @@ select_alias (struct multipath * mp)
> if (conf->user_friendly_names) {
> select_alias_prefix(mp);
> mp->alias = get_user_friendly_alias(mp->wwid,
> - conf->bindings_file, mp->alias_prefix);
> + conf->bindings_file, mp->alias_prefix, conf->bindings_read_only);
> }
> if (mp->alias == NULL)
> mp->alias = dm_get_name(mp->wwid);
> diff -r b359f4953289 -r e2c6d0d327f6 multipath/main.c
> --- a/multipath/main.c Sun Aug 15 10:48:09 2010 -0700
> +++ b/multipath/main.c Mon Aug 16 13:02:41 2010 -0700
> @@ -350,7 +350,7 @@ main (int argc, char *argv[])
> condlog(0, "multipath tools need sysfs mounted");
> exit(1);
> }
> - while ((arg = getopt(argc, argv, ":dhl::FfM:v:p:b:r")) != EOF ) {
> + while ((arg = getopt(argc, argv, ":dhl::FfM:v:p:b:Br")) != EOF ) {
> switch(arg) {
> case 1: printf("optarg : %s\n",optarg);
> break;
> @@ -364,6 +364,9 @@ main (int argc, char *argv[])
> case 'b':
> conf->bindings_file = optarg;
> break;
> + case 'B':
> + conf->bindings_read_only = 1;
> + break;
> case 'd':
> conf->dry_run = 1;
> break;
> diff -r b359f4953289 -r e2c6d0d327f6 multipath/multipath.8
> --- a/multipath/multipath.8 Sun Aug 15 10:48:09 2010 -0700
> +++ b/multipath/multipath.8 Mon Aug 16 13:02:41 2010 -0700
> @@ -6,7 +6,7 @@ multipath \- Device mapper target autoco
> .RB [\| \-v\ \c
> .IR verbosity \|]
> .RB [\| \-d \|]
> -.RB [\| \-h | \-l | \-ll | \-f | \-F \|]
> +.RB [\| \-h | \-l | \-ll | \-f | \-F | \-B \|]
> .RB [\| \-p\ \c
> .BR failover | multibus | group_by_serial | group_by_prio | group_by_node_name \|]
> .RB [\| device \|]
> @@ -47,6 +47,9 @@ flush a multipath device map specified a
> .B \-F
> flush all unused multipath device maps
> .TP
> +.B \-B
> +treat the bindings file as read only
> +.TP
> .BI \-p " policy"
> force maps to specified policy:
> .RS 1.2i
>
> --
> dm-devel mailing list
> dm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel
More information about the dm-devel
mailing list