[lvm-devel] LVM2 libdm/libdevmapper.h libdm/libdm-common.c ...
prajnoha at sourceware.org
prajnoha at sourceware.org
Thu Aug 6 15:04:31 UTC 2009
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: prajnoha at sourceware.org 2009-08-06 15:04:30
Modified files:
libdm : libdevmapper.h libdm-common.c
tools : dmsetup.c
Log message:
Add 'udevcomplete_all' command for dmsetup. Export DM_COOKIE_MAGIC in libdevmapper.h.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/libdm/libdevmapper.h.diff?cvsroot=lvm2&r1=1.95&r2=1.96
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/libdm/libdm-common.c.diff?cvsroot=lvm2&r1=1.75&r2=1.76
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/dmsetup.c.diff?cvsroot=lvm2&r1=1.120&r2=1.121
--- LVM2/libdm/libdevmapper.h 2009/08/03 18:01:47 1.95
+++ LVM2/libdm/libdevmapper.h 2009/08/06 15:04:30 1.96
@@ -1014,6 +1014,8 @@
void dm_report_field_set_value(struct dm_report_field *field, const void *value,
const void *sortvalue);
+#define DM_COOKIE_MAGIC 0x0D4D
+
int dm_cookie_supported(void);
/*
--- LVM2/libdm/libdm-common.c 2009/08/06 15:00:25 1.75
+++ LVM2/libdm/libdm-common.c 2009/08/06 15:04:30 1.76
@@ -39,7 +39,6 @@
#endif
#define DEV_DIR "/dev/"
-#define COOKIE_MAGIC 0x0D4D
static char _dm_dir[PATH_MAX] = DEV_DIR DM_DIR;
@@ -837,7 +836,7 @@
static int _get_cookie_sem(uint32_t cookie, int *semid)
{
- if (!(cookie >> 16 & COOKIE_MAGIC)) {
+ if (cookie >> 16 != DM_COOKIE_MAGIC) {
log_error("Could not continue to access notification "
"semaphore identified by cookie value %"
PRIu32 " (0x%x). Incorrect cookie prefix.",
@@ -952,7 +951,7 @@
goto bad;
}
- gen_cookie = COOKIE_MAGIC << 16 | base_cookie;
+ gen_cookie = DM_COOKIE_MAGIC << 16 | base_cookie;
if (base_cookie && (gen_semid = semget((key_t) gen_cookie,
1, 0600 | IPC_CREAT | IPC_EXCL)) < 0) {
@@ -1093,6 +1092,9 @@
if (semop(semid, &sb, 1) < 0) {
if (errno == EINTR)
goto repeat_wait;
+ else if (errno == EIDRM)
+ return 1;
+
log_error("Could not set wait state for notification semaphore "
"identified by cookie value %" PRIu32 " (0x%x): %s",
cookie, cookie, strerror(errno));
--- LVM2/tools/dmsetup.c 2009/08/03 18:01:46 1.120
+++ LVM2/tools/dmsetup.c 2009/08/06 15:04:30 1.121
@@ -40,6 +40,12 @@
#include <fcntl.h>
#include <sys/stat.h>
+#ifdef UDEV_SYNC_SUPPORT
+# include <sys/types.h>
+# include <sys/ipc.h>
+# include <sys/sem.h>
+#endif
+
/* FIXME Unused so far */
#undef HAVE_SYS_STATVFS_H
@@ -273,6 +279,34 @@
struct dm_split_name *split_name;
};
+static char _yes_no_prompt(const char *prompt, ...)
+{
+ int c = 0, ret = 0;
+ va_list ap;
+
+ do {
+ if (c == '\n' || !c) {
+ va_start(ap, prompt);
+ vprintf(prompt, ap);
+ va_end(ap);
+ }
+
+ if ((c = getchar()) == EOF) {
+ ret = 'n';
+ break;
+ }
+
+ c = tolower(c);
+ if ((c == 'y') || (c == 'n'))
+ ret = c;
+ } while (!ret || c != '\n');
+
+ if (c != '\n')
+ printf("\n");
+
+ return ret;
+}
+
static struct dm_task *_get_deps_task(int major, int minor)
{
struct dm_task *dmt;
@@ -763,6 +797,62 @@
return dm_udev_complete(cookie);
}
+#ifndef UDEV_SYNC_SUPPORT
+static int _udevcomplete_all(int argc __attribute((unused)), char **argv __attribute((unused)), void *data __attribute((unused)))
+{
+ return 1;
+}
+
+#else
+
+static int _udevcomplete_all(int argc __attribute((unused)), char **argv __attribute((unused)), void *data __attribute((unused)))
+{
+ int max_id, id, sid;
+ struct seminfo sinfo;
+ struct semid_ds sdata;
+ int counter = 0;
+
+ log_warn("This operation will destroy all semaphores with keys "
+ "that have a prefix %" PRIu16 " (0x%" PRIx16 ").",
+ DM_COOKIE_MAGIC, DM_COOKIE_MAGIC);
+
+ if (_yes_no_prompt("Do you really want to continue? [y/n]: ") == 'n') {
+ log_print("Semaphores with keys prefixed by %" PRIu16
+ " (0x%" PRIx16 ") NOT destroyed.",
+ DM_COOKIE_MAGIC, DM_COOKIE_MAGIC);
+ return 1;
+ }
+
+ if ((max_id = semctl(0, 0, SEM_INFO, &sinfo)) < 0) {
+ log_sys_error("semctl", "SEM_INFO");
+ return 0;
+ }
+
+ for (id = 0; id <= max_id; id++) {
+ if ((sid = semctl(id, 0, SEM_STAT, &sdata)) < 0)
+ continue;
+
+ if (sdata.sem_perm.__key >> 16 == DM_COOKIE_MAGIC) {
+ if (semctl(sid, 0, IPC_RMID, 0) < 0) {
+ log_error("Could not cleanup notification semaphore "
+ "with semid %d and cookie value "
+ "%" PRIu32 " (0x%" PRIx32 ")", sid,
+ sdata.sem_perm.__key, sdata.sem_perm.__key);
+ continue;
+ }
+
+ counter++;
+ }
+ }
+
+ log_print("%d semaphores with keys prefixed by "
+ "%" PRIu16 " (0x%" PRIx16 ") destroyed.",
+ counter, DM_COOKIE_MAGIC, DM_COOKIE_MAGIC);
+
+ return 1;
+}
+#endif
+
static int _version(int argc __attribute((unused)), char **argv __attribute((unused)), void *data __attribute((unused)))
{
char version[80];
@@ -2294,6 +2384,7 @@
{"wait", "<device> [<event_nr>]", 0, 2, _wait},
{"mknodes", "[<device>]", 0, 1, _mknodes},
{"udevcomplete", "<cookie>", 1, 1, _udevcomplete},
+ {"udevcomplete_all", "", 0, 0, _udevcomplete_all},
{"targets", "", 0, 0, _targets},
{"version", "", 0, 0, _version},
{"setgeometry", "<device> <cyl> <head> <sect> <start>", 5, 5, _setgeometry},
More information about the lvm-devel
mailing list