From e92d87cef65ab52baf1aaee4e6168ca8214bfdcf Mon Sep 17 00:00:00 2001 From: Peter Rajnoha Date: Mon, 3 May 2010 21:06:53 +0000 Subject: [PATCH] Synchronize "remove" dm task while reverting unsuccessful "create" dm task (with table provided). This remove ioctl generates udev events like any other hence it needs to be synchronized properly as well. Also, add dm task type in debug log when setting a cookie (for better debugging). --- libdm/ioctl/libdm-iface.c | 14 +++++++++++++- libdm/libdm-common.c | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/libdm/ioctl/libdm-iface.c b/libdm/ioctl/libdm-iface.c index a34801213..c0ac36afe 100644 --- a/libdm/ioctl/libdm-iface.c +++ b/libdm/ioctl/libdm-iface.c @@ -1546,6 +1546,7 @@ static int _create_and_load_v4(struct dm_task *dmt) { struct dm_task *task; int r; + uint32_t cookie; /* Use new task struct to create the device */ if (!(task = dm_task_create(DM_DEVICE_CREATE))) { @@ -1625,7 +1626,18 @@ static int _create_and_load_v4(struct dm_task *dmt) dmt->type = DM_DEVICE_REMOVE; dm_free(dmt->uuid); dmt->uuid = NULL; - dmt->cookie_set = 0; + + /* + * Also udev-synchronize "remove" dm task that is a part of this revert! + * But only if the original dm task was supposed to be synchronized. + */ + if (dmt->cookie_set) { + cookie = (dmt->event_nr & ~DM_UDEV_FLAGS_MASK) | + (DM_COOKIE_MAGIC << DM_UDEV_FLAGS_SHIFT); + dm_task_set_cookie(dmt, &cookie, + (dmt->event_nr & DM_UDEV_FLAGS_MASK) >> + DM_UDEV_FLAGS_SHIFT); + } if (!dm_task_run(dmt)) log_error("Failed to revert device creation."); diff --git a/libdm/libdm-common.c b/libdm/libdm-common.c index 2f5faa377..9ae2855b4 100644 --- a/libdm/libdm-common.c +++ b/libdm/libdm-common.c @@ -1192,7 +1192,7 @@ int dm_task_set_cookie(struct dm_task *dmt, uint32_t *cookie, uint16_t flags) dmt->cookie_set = 1; log_debug("Udev cookie 0x%" PRIx32 " (semid %d) assigned to dm_task " - "with flags 0x%" PRIx16, *cookie, semid, flags); + "type %d with flags 0x%" PRIx16, *cookie, semid, dmt->type, flags); return 1;