--- kpartx/devmapper.c | 41 ++++++++++++++++++++++++++++------------- kpartx/devmapper.h | 4 ++-- kpartx/kpartx.c | 16 ++++++++-------- libmultipath/config.h | 1 - libmultipath/devmapper.c | 19 +++++++++++++------ multipath/main.c | 2 -- 6 files changed, 51 insertions(+), 32 deletions(-) Index: multipath-tools-130222/kpartx/devmapper.c =================================================================== --- multipath-tools-130222.orig/kpartx/devmapper.c +++ multipath-tools-130222/kpartx/devmapper.c @@ -14,13 +14,6 @@ #define MAX_PREFIX_LEN 8 #define PARAMS_SIZE 1024 -#ifndef LIBDM_API_COOKIE -static inline int dm_task_set_cookie(struct dm_task *dmt, uint32_t *c, int a) -{ - return 1; -} -#endif - extern int dm_prereq (char * str, int x, int y, int z) { @@ -60,10 +53,13 @@ dm_prereq (char * str, int x, int y, int } extern int -dm_simplecmd (int task, const char *name, int no_flush, uint32_t *cookie, uint16_t udev_flags) { +dm_simplecmd (int task, const char *name, int no_flush, uint16_t udev_flags) { int r = 0; int udev_wait_flag = (task == DM_DEVICE_RESUME || task == DM_DEVICE_REMOVE); +#ifdef LIBDM_API_COOKIE + uint32_t cookie = 0; +#endif struct dm_task *dmt; if (!(dmt = dm_task_create(task))) @@ -78,10 +74,17 @@ dm_simplecmd (int task, const char *name if (no_flush) dm_task_no_flush(dmt); - if (udev_wait_flag && !dm_task_set_cookie(dmt, cookie, ((udev_sync)? 0 : DM_UDEV_DISABLE_LIBRARY_FALLBACK) | udev_flags)) +#ifdef LIBDM_API_COOKIE + if (!udev_sync) + udev_flags |= DM_UDEV_DISABLE_LIBRARY_FALLBACK; + if (udev_wait_flag && !dm_task_set_cookie(dmt, &cookie, udev_flags)) goto out; +#endif r = dm_task_run(dmt); - +#ifdef LIBDM_API_COOKIE + if (udev_wait_flag) + dm_udev_wait(cookie); +#endif out: dm_task_destroy(dmt); return r; @@ -90,10 +93,14 @@ dm_simplecmd (int task, const char *name extern int dm_addmap (int task, const char *name, const char *target, const char *params, uint64_t size, int ro, const char *uuid, int part, - mode_t mode, uid_t uid, gid_t gid, uint32_t *cookie) { + mode_t mode, uid_t uid, gid_t gid) { int r = 0; struct dm_task *dmt; char *prefixed_uuid = NULL; +#ifdef LIBDM_API_COOKIE + uint32_t cookie = 0; + uint16_t udev_flags = 0; +#endif if (!(dmt = dm_task_create (task))) return 0; @@ -128,10 +135,18 @@ dm_addmap (int task, const char *name, c dm_task_no_open_count(dmt); - if (task == DM_DEVICE_CREATE && !dm_task_set_cookie(dmt, cookie, (udev_sync)? 0 : DM_UDEV_DISABLE_LIBRARY_FALLBACK)) +#ifdef LIBDM_API_COOKIE + if (!udev_sync) + udev_flags = DM_UDEV_DISABLE_LIBRARY_FALLBACK; + if (task == DM_DEVICE_CREATE && + !dm_task_set_cookie(dmt, &cookie, udev_flags)) goto addout; +#endif r = dm_task_run (dmt); - +#ifdef LIBDM_API_COOKIE + if (task == DM_DEVICE_CREATE) + dm_udev_wait(cookie); +#endif addout: dm_task_destroy (dmt); free(prefixed_uuid); Index: multipath-tools-130222/kpartx/devmapper.h =================================================================== --- multipath-tools-130222.orig/kpartx/devmapper.h +++ multipath-tools-130222/kpartx/devmapper.h @@ -11,9 +11,9 @@ extern int udev_sync; int dm_prereq (char *, int, int, int); -int dm_simplecmd (int, const char *, int, uint32_t *, uint16_t); +int dm_simplecmd (int, const char *, int, uint16_t); int dm_addmap (int, const char *, const char *, const char *, uint64_t, - int, const char *, int, mode_t, uid_t, gid_t, uint32_t *); + int, const char *, int, mode_t, uid_t, gid_t); int dm_map_present (char *, char **); char * dm_mapname(int major, int minor); dev_t dm_get_first_dep(char *devname); Index: multipath-tools-130222/kpartx/kpartx.c =================================================================== --- multipath-tools-130222.orig/kpartx/kpartx.c +++ multipath-tools-130222/kpartx/kpartx.c @@ -224,7 +224,6 @@ main(int argc, char **argv){ int hotplug = 0; int loopcreated = 0; struct stat buf; - uint32_t cookie = 0; initpts(); init_crc32(); @@ -300,6 +299,8 @@ main(int argc, char **argv){ #ifdef LIBDM_API_COOKIE if (!udev_sync) dm_udev_set_sync_support(0); + else + dm_udev_set_sync_support(1); #endif if (dm_prereq(DM_TARGET, 0, 0, 0) && (what == ADD || what == DELETE || what == UPDATE)) { @@ -451,7 +452,7 @@ main(int argc, char **argv){ } if (!dm_simplecmd(DM_DEVICE_REMOVE, partname, - 0, &cookie, 0)) { + 0, 0)) { r++; continue; } @@ -508,7 +509,7 @@ main(int argc, char **argv){ if (!dm_addmap(op, partname, DM_TARGET, params, slices[j].size, ro, uuid, j+1, buf.st_mode & 0777, buf.st_uid, - buf.st_gid, &cookie)) { + buf.st_gid)) { fprintf(stderr, "create/reload failed on %s\n", partname); r++; @@ -516,12 +517,13 @@ main(int argc, char **argv){ } if (op == DM_DEVICE_RELOAD && !dm_simplecmd(DM_DEVICE_RESUME, partname, - 1, &cookie, MPATH_UDEV_RELOAD_FLAG)) { + 1, MPATH_UDEV_RELOAD_FLAG)) { fprintf(stderr, "resume failed on %s\n", partname); r++; continue; } + dm_devn(partname, &slices[j].major, &slices[j].minor); @@ -560,7 +562,7 @@ main(int argc, char **argv){ } if (!dm_simplecmd(DM_DEVICE_REMOVE, - partname, 1, &cookie, 0)) { + partname, 1, 0)) { r++; continue; } @@ -586,9 +588,7 @@ main(int argc, char **argv){ } printf("loop deleted : %s\n", device); } -#ifdef LIBDM_API_COOKIE - dm_udev_wait(cookie); -#endif + dm_lib_release(); dm_lib_exit(); Index: multipath-tools-130222/libmultipath/config.h =================================================================== --- multipath-tools-130222.orig/libmultipath/config.h +++ multipath-tools-130222/libmultipath/config.h @@ -129,7 +129,6 @@ struct config { uid_t uid; gid_t gid; mode_t mode; - uint32_t cookie; int reassign_maps; int retain_hwhandler; int detect_prio; Index: multipath-tools-130222/libmultipath/devmapper.c =================================================================== --- multipath-tools-130222.orig/libmultipath/devmapper.c +++ multipath-tools-130222/libmultipath/devmapper.c @@ -215,6 +215,7 @@ dm_simplecmd (int task, const char *name int r = 0; int udev_wait_flag = (need_sync && (task == DM_DEVICE_RESUME || task == DM_DEVICE_REMOVE)); + uint32_t cookie = 0; struct dm_task *dmt; if (!(dmt = dm_task_create (task))) @@ -233,10 +234,12 @@ dm_simplecmd (int task, const char *name if (do_deferred(deferred_remove)) dm_task_deferred_remove(dmt); #endif - if (udev_wait_flag && !dm_task_set_cookie(dmt, &conf->cookie, ((conf->daemon)? DM_UDEV_DISABLE_LIBRARY_FALLBACK : 0) | udev_flags)) + if (udev_wait_flag && !dm_task_set_cookie(dmt, &cookie, ((conf->daemon)? DM_UDEV_DISABLE_LIBRARY_FALLBACK : 0) | udev_flags)) goto out; r = dm_task_run (dmt); + if (udev_wait_flag) + udev_wait(cookie); out: dm_task_destroy (dmt); return r; @@ -264,6 +267,7 @@ dm_addmap (int task, const char *target, int r = 0; struct dm_task *dmt; char *prefixed_uuid = NULL; + uint32_t cookie = 0; if (!(dmt = dm_task_create (task))) return 0; @@ -304,10 +308,12 @@ dm_addmap (int task, const char *target, dm_task_no_open_count(dmt); if (task == DM_DEVICE_CREATE && - !dm_task_set_cookie(dmt, &conf->cookie, (conf->daemon)? DM_UDEV_DISABLE_LIBRARY_FALLBACK : 0)) + !dm_task_set_cookie(dmt, &cookie, (conf->daemon)? DM_UDEV_DISABLE_LIBRARY_FALLBACK : 0)) goto freeout; r = dm_task_run (dmt); + if (task == DM_DEVICE_CREATE) + udev_wait(cookie); freeout: if (prefixed_uuid) FREE(prefixed_uuid); @@ -1366,6 +1372,7 @@ dm_rename (const char * old, char * new) { int r = 0; struct dm_task *dmt; + uint32_t cookie; if (dm_rename_partmaps(old, new)) return r; @@ -1381,12 +1388,12 @@ dm_rename (const char * old, char * new) dm_task_no_open_count(dmt); - if (!dm_task_set_cookie(dmt, &conf->cookie, (conf->daemon)? DM_UDEV_DISABLE_LIBRARY_FALLBACK : 0)) - goto out; - if (!dm_task_run(dmt)) + if (!dm_task_set_cookie(dmt, &cookie, (conf->daemon)? DM_UDEV_DISABLE_LIBRARY_FALLBACK : 0)) goto out; + r = dm_task_run(dmt); + + udev_wait(cookie); - r = 1; out: dm_task_destroy(dmt); return r; Index: multipath-tools-130222/multipath/main.c =================================================================== --- multipath-tools-130222.orig/multipath/main.c +++ multipath-tools-130222/multipath/main.c @@ -681,8 +681,6 @@ main (int argc, char *argv[]) condlog(3, "restart multipath configuration process"); out: - udev_wait(conf->cookie); - dm_lib_release(); dm_lib_exit();