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;