/* Compatibility for old device-mapper without udev support */
#ifndef HAVE_DM_TASK_SET_COOKIE
+#define CRYPT_TEMP_UDEV_FLAGS 0
static int dm_task_set_cookie(struct dm_task *dmt, uint32_t *cookie, uint16_t flags) { return 0; }
static int dm_udev_wait(uint32_t cookie) { return 0; };
+#else
+#define CRYPT_TEMP_UDEV_FLAGS DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG | \
+ DM_UDEV_DISABLE_DISK_RULES_FLAG | \
+ DM_UDEV_DISABLE_OTHER_RULES_FLAG
#endif
static int _dm_use_udev()
if (name && !dm_task_set_name(dmt, name))
goto out;
- if (udev_wait && !dm_task_set_cookie(dmt, &cookie, 0));
+ if (udev_wait && !dm_task_set_cookie(dmt, &cookie, 0))
+ goto out;
r = dm_task_run(dmt);
- if (r && udev_wait)
+ if (udev_wait)
(void)dm_udev_wait(cookie);
out:
int reload)
{
struct dm_task *dmt = NULL;
- struct dm_task *dmt_query = NULL;
struct dm_info dmi;
char *params = NULL;
char *error = NULL;
int r = -EINVAL;
uint32_t read_ahead = 0;
uint32_t cookie = 0;
+ uint16_t udev_flags = 0;
params = get_params(device, skip, offset, cipher, key_size, key);
if (!params)
goto out_no_removal;
+ if (type && !strncmp(type, "TEMP", 4))
+ udev_flags = CRYPT_TEMP_UDEV_FLAGS;
+
/* All devices must have DM_UUID, only resize on old device is exception */
if (reload) {
if (!(dmt = dm_task_create(DM_DEVICE_RELOAD)))
if (!dm_task_set_uuid(dmt, dev_uuid))
goto out_no_removal;
- if (_dm_use_udev() && !dm_task_set_cookie(dmt, &cookie, 0))
+ if (_dm_use_udev() && !dm_task_set_cookie(dmt, &cookie, udev_flags))
goto out_no_removal;
}
goto out;
if (uuid && !dm_task_set_uuid(dmt, dev_uuid))
goto out;
- if (_dm_use_udev() && !dm_task_set_cookie(dmt, &cookie, 0))
+ if (_dm_use_udev() && !dm_task_set_cookie(dmt, &cookie, udev_flags))
goto out;
if (!dm_task_run(dmt))
goto out;
}
- if (_dm_use_udev())
- (void)dm_udev_wait(cookie);
-
if (!dm_task_get_info(dmt, &dmi))
goto out;
r = 0;
out:
+ if (_dm_use_udev()) {
+ (void)dm_udev_wait(cookie);
+ cookie = 0;
+ }
+
if (r < 0 && !reload) {
if (get_error())
error = strdup(get_error());
}
out_no_removal:
+ if (cookie && _dm_use_udev())
+ (void)dm_udev_wait(cookie);
+
if (params)
safe_free(params);
if (dmt)
dm_task_destroy(dmt);
- if(dmt_query)
- dm_task_destroy(dmt_query);
+
dm_task_update_nodes();
return r;
}