Newer device-mapper versions use 'cookies' to synchronize with udev.
As this is not available with older versions we need to add stubs
to make it compile on older versions.
And we only need to update the device-mapper version in
dm_lib_prereq() if the flag is set.
Signed-off-by: Hannes Reinecke <hare@suse.de>
CFLAGS += -I. -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
+LIBDM_API_COOKIE = $(shell grep -Ecs '^[a-z]*[[:space:]]+dm_task_set_cookie' /usr/include/libdevmapper.h)
+
+ifneq ($(strip $(LIBDM_API_COOKIE)),0)
+ CFLAGS += -DLIBDM_API_COOKIE
+endif
+
LDFLAGS = -ldevmapper
OBJS = bsd.o dos.o kpartx.o solaris.o unixware.o dasd.o sun.o \
gpt.o mac.o crc32.o lopart.o xstrncpy.o devmapper.o
$(EXEC): $(OBJS)
$(CC) $(OBJS) -o $(EXEC) $(LDFLAGS)
$(GZIP) $(EXEC).8 > $(EXEC).8.gz
-
+
install: $(EXEC) $(EXEC).8
$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)
#define UUID_PREFIX "part%d-"
#define MAX_PREFIX_LEN 8
+#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)
{
exit(1);
}
+#ifdef LIBDM_API_COOKIE
if (!sync)
dm_udev_set_sync_support(0);
+#endif
if (dm_prereq(DM_TARGET, 0, 0, 0) && (what == ADD || what == DELETE)) {
fprintf(stderr, "device mapper prerequisites not met\n");
}
printf("loop deleted : %s\n", device);
}
+#ifdef LIBDM_API_COOKIE
dm_udev_wait(cookie);
+#endif
dm_lib_release();
dm_lib_exit();
CFLAGS += -DLIBDM_API_FLUSH -D_GNU_SOURCE
endif
+LIBDM_API_COOKIE = $(shell grep -Ecs '^[a-z]*[[:space:]]+dm_task_set_cookie' /usr/include/libdevmapper.h)
+
+ifneq ($(strip $(LIBDM_API_COOKIE)),0)
+ CFLAGS += -DLIBDM_API_COOKIE
+endif
+
all: $(LIBS)
$(LIBS): $(OBJS)
#define UUID_PREFIX "mpath-"
#define UUID_PREFIX_LEN 6
+#ifndef LIBDM_API_COOKIE
+static inline int dm_task_set_cookie(struct dm_task *dmt, uint32_t *c, int a)
+{
+ return 1;
+}
+
+void udev_wait(unsigned int c)
+{
+}
+
+void udev_set_sync_support(int c)
+{
+}
+#else
+void udev_wait(unsigned int c)
+{
+ dm_udev_wait(c);
+}
+
+void udev_set_sync_support(int c)
+{
+ dm_udev_set_sync_support(c);
+}
+#endif
+
static void
dm_write_log (int level, const char *file, int line, const char *f, ...)
{
{
char version[64];
int v[3];
+#ifdef LIBDM_API_COOKIE
int minv[3] = {1, 2, 38};
+#else
+ int minv[3] = {1, 2, 8};
+#endif
dm_get_library_version(version, sizeof(version));
condlog(3, "libdevmapper version %s", version);
int dm_rename (char * old, char * new);
char * dm_get_name(char * uuid);
int dm_setgeometry(struct multipath *mpp);
+void udev_wait(unsigned int c);
+void udev_set_sync_support(int c);
#endif /* _DEVMAPPER_H */
}
while ((r = configure()) < 0)
condlog(3, "restart multipath configuration process");
-
+
out:
- dm_udev_wait(conf->cookie);
+ udev_wait(conf->cookie);
sysfs_cleanup();
dm_lib_release();
exit(1);
}
conf->daemon = 1;
- dm_udev_set_sync_support(0);
+ udev_set_sync_support(0);
/*
* fetch and configure both paths and multipaths
*/