}
static void
-select_action (struct multipath * mpp, vector curmp)
+select_action (struct multipath * mpp, vector curmp, int force_reload)
{
struct multipath * cmpp;
mpp->alias);
return;
}
+ if (force_reload) {
+ mpp->action = ACT_RELOAD;
+ condlog(3, "%s: set ACT_RELOAD (forced by user)",
+ mpp->alias);
+ return;
+ }
if (cmpp->size != mpp->size) {
mpp->action = ACT_RELOAD;
condlog(3, "%s: set ACT_RELOAD (size change)",
}
extern int
-coalesce_paths (struct vectors * vecs, vector newmp, char * refwwid)
+coalesce_paths (struct vectors * vecs, vector newmp, char * refwwid, int force_reload)
{
int r = 1;
int k, i;
memset(empty_buff, 0, WWID_SIZE);
+ if (force_reload) {
+ vector_foreach_slot (pathvec, pp1, k) {
+ pp1->mpp = NULL;
+ }
+ }
vector_foreach_slot (pathvec, pp1, k) {
/* skip this path for some reason */
/*
* at this point, we know we really got a new mp
*/
- if ((mpp = add_map_with_path(vecs, pp1, 0)) == NULL)
+ mpp = add_map_with_path(vecs, pp1, 0);
+ if (!mpp)
return 1;
if (pp1->priority == PRIO_UNDEF)
}
if (mpp->action == ACT_UNDEF)
- select_action(mpp, curmp);
+ select_action(mpp, curmp, force_reload);
r = domap(mpp);
usage (char * progname)
{
fprintf (stderr, VERSION_STRING);
- fprintf (stderr, "Usage: %s\t[-v level] [-d] [-h|-l|-ll|-f|-F]\n",
- progname);
+ fprintf (stderr, "Usage:\n");
+ fprintf (stderr, " %s [-d] [-r] [-v lvl] [-p pol] [-b fil] [dev]\n", progname);
+ fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname);
+ fprintf (stderr, " %s -F [-v lvl]\n", progname);
+ fprintf (stderr, " %s -h\n", progname);
fprintf (stderr,
- "\t\t\t[-p failover|multibus|group_by_serial|group_by_prio]\n" \
- "\t\t\t[device]\n" \
- "\n" \
- "\t-v level\tverbosity level\n" \
- "\t 0\t\t\tno output\n" \
- "\t 1\t\t\tprint created devmap names only\n" \
- "\t 2\t\t\tdefault verbosity\n" \
- "\t 3\t\t\tprint debug information\n" \
- "\t-h\t\tprint this usage text\n" \
- "\t-b file\t\tbindings file location\n" \
- "\t-d\t\tdry run, do not create or update devmaps\n" \
- "\t-l\t\tshow multipath topology (sysfs and DM info)\n" \
- "\t-ll\t\tshow multipath topology (maximum info)\n" \
- "\t-f\t\tflush a multipath device map\n" \
- "\t-F\t\tflush all multipath device maps\n" \
- "\t-p policy\tforce all maps to specified policy :\n" \
- "\t failover\t\t1 path per priority group\n" \
- "\t multibus\t\tall paths in 1 priority group\n" \
- "\t group_by_serial\t1 priority group per serial\n" \
- "\t group_by_prio\t1 priority group per priority lvl\n" \
- "\t group_by_node_name\t1 priority group per target node\n" \
- "\n" \
- "\tdevice\t\tlimit scope to the device's multipath\n" \
- "\t\t\t(udev-style $DEVNAME reference, eg /dev/sdb\n" \
- "\t\t\tor major:minor or a device map name)\n" \
+ "\n"
+ "Where:\n"
+ " -h print this usage text\n" \
+ " -l show multipath topology (sysfs and DM info)\n" \
+ " -ll show multipath topology (maximum info)\n" \
+ " -f flush a multipath device map\n" \
+ " -F flush all multipath device maps\n" \
+ " -d dry run, do not create or update devmaps\n" \
+ " -r force devmap reload\n" \
+ " -p policy failover|multibus|group_by_serial|group_by_prio\n" \
+ " -b fil bindings file location\n" \
+ " -p pol force all maps to specified path grouping policy :\n" \
+ " . failover one path per priority group\n" \
+ " . multibus all paths in one priority group\n" \
+ " . group_by_serial one priority group per serial\n" \
+ " . group_by_prio one priority group per priority lvl\n" \
+ " . group_by_node_name one priority group per target node\n" \
+ " -v lvl verbosity level\n" \
+ " . 0 no output\n" \
+ " . 1 print created devmap names only\n" \
+ " . 2 default verbosity\n" \
+ " . 3 print debug information\n" \
+ " dev action limited to:\n" \
+ " . multipath named 'dev' (ex: mpath0) or\n" \
+ " . multipath whose wwid is 'dev' (ex: 60051..)\n" \
+ " . multipath including the path named 'dev' (ex: /dev/sda)\n" \
+ " . multipath including the path with maj:min 'dev' (ex: 8:0)\n" \
);
exit(1);
/*
* core logic entry point
*/
- r = coalesce_paths(&vecs, NULL, NULL);
+ r = coalesce_paths(&vecs, NULL, NULL, conf->force_reload);
out:
if (refwwid)
condlog(0, "multipath tools need sysfs mounted");
exit(1);
}
- while ((arg = getopt(argc, argv, ":dhl::FfM:v:p:b:")) != EOF ) {
+ while ((arg = getopt(argc, argv, ":dhl::FfM:v:p:b:r")) != EOF ) {
switch(arg) {
case 1: printf("optarg : %s\n",optarg);
break;
usage(argv[0]);
}
break;
+ case 'r':
+ conf->force_reload = 1;
+ break;
case 'h':
usage(argv[0]);
case ':':