diff options
-rw-r--r-- | extras/multipath/ChangeLog | 4 | ||||
-rw-r--r-- | extras/multipath/main.c | 70 |
2 files changed, 53 insertions, 21 deletions
diff --git a/extras/multipath/ChangeLog b/extras/multipath/ChangeLog index dc29400e0e..ee26e06ac0 100644 --- a/extras/multipath/ChangeLog +++ b/extras/multipath/ChangeLog @@ -1,4 +1,8 @@ 2003-12-22 multipath-010 + * introduce dm-simplecmd for RESUME & SUSPEND requests + * split add_map() in setup_map() & dm-addmap() + * setup_map() correctly submits "SUSPEND-RELOAD-RESUME or CREATE" + sequences instead of the bogus "RELOAD or CREATE" * don't print .sg_dev if equal to .dev (2.6) in print_path() * since the kernel code handles defective paths, remove all code to cope with them : diff --git a/extras/multipath/main.c b/extras/multipath/main.c index c57cd4fe7e..293ee06fbc 100644 --- a/extras/multipath/main.c +++ b/extras/multipath/main.c @@ -589,12 +589,50 @@ make_dm_node(char * str) } static int -add_map(struct env * conf, struct path * all_paths, +dm_simplecmd(int task, const char *name) { + int r = 0; + struct dm_task *dmt; + + if (!(dmt = dm_task_create(task))) + return 0; + + if (!dm_task_set_name(dmt, name)) + goto out; + + r = dm_task_run(dmt); + + out: + dm_task_destroy(dmt); + return r; +} + +static int +dm_addmap(int task, const char *name, const char *params, long size) { + struct dm_task *dmt; + + if (!(dmt = dm_task_create(task))) + return 0; + + if (!dm_task_set_name(dmt, name)) + goto addout; + + if (!dm_task_add_target(dmt, 0, size, DM_TARGET, params)) + goto addout; + + if (!dm_task_run(dmt)) + goto addout; + + addout: + dm_task_destroy(dmt); + return 1; +} + +static int +setup_map(struct env * conf, struct path * all_paths, struct multipath * mp, int index, int op) { char params[255]; char * params_p; - struct dm_task *dmt; int i, np; /* defaults for multipath target */ @@ -602,11 +640,6 @@ add_map(struct env * conf, struct path * all_paths, char * dm_ps_name = "round-robin"; int dm_ps_nr_args = 0; - if (!(dmt = dm_task_create(op))) - return 0; - - if (!dm_task_set_name(dmt, mp[index].wwid)) - goto addout; params_p = ¶ms[0]; np = 0; @@ -614,11 +647,9 @@ add_map(struct env * conf, struct path * all_paths, if (0 == all_paths[PINDEX(index,i)].sg_id.scsi_type) np++; } - if (np == 0) - goto addout; if (np < 1) - goto addout; + return 0; params_p += sprintf(params_p, "%i", conf->dm_path_test_int); @@ -650,7 +681,7 @@ add_map(struct env * conf, struct path * all_paths, } if (mp[index].size < 0) - goto addout; + return 0; if (!conf->quiet) { if (op == DM_DEVICE_RELOAD) @@ -661,18 +692,15 @@ add_map(struct env * conf, struct path * all_paths, mp[index].wwid, mp[index].size, DM_TARGET, params); } - if (!dm_task_add_target(dmt, 0, mp[index].size, DM_TARGET, params)) - goto addout; + if (op == DM_DEVICE_RELOAD) + dm_simplecmd(DM_DEVICE_SUSPEND, mp[index].wwid); - if (!dm_task_run(dmt)) - goto addout; + dm_addmap(op, mp[index].wwid, params, mp[index].size); + if (op == DM_DEVICE_RELOAD) + dm_simplecmd(DM_DEVICE_RESUME, mp[index].wwid); make_dm_node(mp[index].wwid); - - addout: - dm_task_destroy(dmt); - return 1; } static int @@ -802,9 +830,9 @@ main(int argc, char *argv[]) for (k=0; k<=nmp; k++) { if (map_present(mp[k].wwid)) { - add_map(&conf, all_paths, mp, k, DM_DEVICE_RELOAD); + setup_map(&conf, all_paths, mp, k, DM_DEVICE_RELOAD); } else { - add_map(&conf, all_paths, mp, k, DM_DEVICE_CREATE); + setup_map(&conf, all_paths, mp, k, DM_DEVICE_CREATE); } } |