You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

288 lines
8.6 KiB

---
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();