return r;
}
-int dm_remove_device(const char *name, int force, uint64_t size)
+int dm_remove_device(struct crypt_device *cd, const char *name,
+ int force, uint64_t size)
{
int r = -EINVAL;
int retries = force ? RETRY_COUNT : 1;
}
if (r < 0 && !reload)
- dm_remove_device(name, 0, 0);
+ _dm_simple(DM_DEVICE_REMOVE, name, 1);
out_no_removal:
if (cookie && _dm_use_udev())
return r;
}
-int dm_create_device(const char *name,
+int dm_create_device(struct crypt_device *cd, const char *name,
const char *type,
struct crypt_dm_active_device *dmd,
int reload)
return r;
}
-int dm_status_device(const char *name)
+int dm_status_device(struct crypt_device *cd, const char *name)
{
int r;
struct dm_info dmi;
return (dmi.open_count > 0);
}
-int dm_status_suspended(const char *name)
+int dm_status_suspended(struct crypt_device *cd, const char *name)
{
int r;
struct dm_info dmi;
return dmi.suspended ? 1 : 0;
}
-int dm_status_verity_ok(const char *name)
+static int _dm_status_verity_ok(const char *name)
{
int r;
struct dm_info dmi;
return r;
}
+int dm_status_verity_ok(struct crypt_device *cd, const char *name)
+{
+ return _dm_status_verity_ok(name);
+}
+
/* FIXME use hex wrapper, user val wrappers for line parsing */
static int _dm_query_crypt(uint32_t get_flags,
struct dm_info *dmi,
return 0;
}
-int dm_query_device(const char *name, uint32_t get_flags,
- struct crypt_dm_active_device *dmd)
+int dm_query_device(struct crypt_device *cd, const char *name,
+ uint32_t get_flags, struct crypt_dm_active_device *dmd)
{
struct dm_task *dmt;
struct dm_info dmi;
r = _dm_query_verity(get_flags, &dmi, params, dmd);
if (r < 0)
goto out;
- r = dm_status_verity_ok(name);
+ r = _dm_status_verity_ok(name);
if (r < 0)
goto out;
if (r == 0)
return r;
}
-int dm_suspend_and_wipe_key(const char *name)
+int dm_suspend_and_wipe_key(struct crypt_device *cd, const char *name)
{
if (!_dm_check_versions())
return -ENOTSUP;
return 0;
}
-int dm_resume_and_reinstate_key(const char *name,
- size_t key_size,
- const char *key)
+int dm_resume_and_reinstate_key(struct crypt_device *cd, const char *name,
+ size_t key_size, const char *key)
{
int msg_size = key_size * 2 + 10; // key set <key>
char *msg;
log_dbg("Trying to activate loop-AES device %s using cipher %s.",
name, dmd.u.crypt.cipher);
- r = dm_create_device(name, CRYPT_LOOPAES, &dmd, 0);
+ r = dm_create_device(cd, name, CRYPT_LOOPAES, &dmd, 0);
if (!r && !(dm_flags() & req_flags)) {
log_err(cd, _("Kernel doesn't support loop-AES compatible mapping.\n"));
return -EACCES;
}
cleaner_size = dmd.size;
- return dm_create_device(name, "TEMP", &dmd, 0);
+ return dm_create_device(ctx, name, "TEMP", &dmd, 0);
}
static void sigint_handler(int sig __attribute__((unused)))
close(devfd);
devfd = -1;
if(cleaner_name)
- dm_remove_device(cleaner_name, 1, cleaner_size);
+ dm_remove_device(NULL, cleaner_name, 1, cleaner_size);
signal(SIGINT, SIG_DFL);
kill(getpid(), SIGINT);
close(devfd);
devfd = -1;
out2:
- dm_remove_device(cleaner_name, 1, cleaner_size);
+ dm_remove_device(ctx, cleaner_name, 1, cleaner_size);
out1:
signal(SIGINT, SIG_DFL);
cleaner_name = NULL;
return -ENOMEM;
dmd.u.crypt.cipher = dm_cipher;
- r = dm_create_device(name, CRYPT_LUKS1, &dmd, 0);
+ r = dm_create_device(cd, name, CRYPT_LUKS1, &dmd, 0);
free(dm_cipher);
return r;
log_dbg("Trying to activate PLAIN device %s using cipher %s.",
name, dmd.u.crypt.cipher);
- r = dm_create_device(name, CRYPT_PLAIN, &dmd, 0);
+ r = dm_create_device(cd, name, CRYPT_PLAIN, &dmd, 0);
// FIXME
- if (!cd->plain_uuid && dm_query_device(name, DM_ACTIVE_UUID, &dmd) >= 0)
+ if (!cd->plain_uuid && dm_query_device(cd, name, DM_ACTIVE_UUID, &dmd) >= 0)
cd->plain_uuid = CONST_CAST(char*)dmd.uuid;
free(dm_cipher);
char cipher[MAX_CIPHER_LEN], cipher_mode[MAX_CIPHER_LEN];
int key_nums, r;
- r = dm_query_device(name, DM_ACTIVE_DEVICE |
- DM_ACTIVE_UUID |
- DM_ACTIVE_CRYPT_CIPHER |
- DM_ACTIVE_CRYPT_KEYSIZE, &dmd);
+ r = dm_query_device(cd, name,
+ DM_ACTIVE_DEVICE |
+ DM_ACTIVE_UUID |
+ DM_ACTIVE_CRYPT_CIPHER |
+ DM_ACTIVE_CRYPT_KEYSIZE, &dmd);
if (r < 0)
goto out;
};
int r;
- r = dm_query_device(name, DM_ACTIVE_DEVICE |
- DM_ACTIVE_UUID |
- DM_ACTIVE_VERITY_HASH_DEVICE |
- DM_ACTIVE_VERITY_PARAMS, &dmd);
+ r = dm_query_device(cd, name,
+ DM_ACTIVE_DEVICE |
+ DM_ACTIVE_UUID |
+ DM_ACTIVE_VERITY_HASH_DEVICE |
+ DM_ACTIVE_VERITY_PARAMS, &dmd);
if (r < 0)
goto out;
return -ENODEV;
}
- r = dm_query_device(name, DM_ACTIVE_DEVICE | DM_ACTIVE_UUID, &dmd);
+ r = dm_query_device(NULL, name, DM_ACTIVE_DEVICE | DM_ACTIVE_UUID, &dmd);
if (r < 0)
goto out;
log_dbg("Resizing device %s to %" PRIu64 " sectors.", name, new_size);
- r = dm_query_device(name, DM_ACTIVE_DEVICE | DM_ACTIVE_CRYPT_CIPHER |
+ r = dm_query_device(cd, name, DM_ACTIVE_DEVICE | DM_ACTIVE_CRYPT_CIPHER |
DM_ACTIVE_UUID | DM_ACTIVE_CRYPT_KEYSIZE |
DM_ACTIVE_CRYPT_KEY, &dmd);
if (r < 0) {
r = 0;
} else {
dmd.size = new_size;
- r = dm_create_device(name, cd->type, &dmd, 1);
+ r = dm_create_device(cd, name, cd->type, &dmd, 1);
}
out:
if (dmd.target == DM_CRYPT) {
if (!cd && dm_init(NULL, 1) < 0)
return -ENOSYS;
- r = dm_status_suspended(name);
+ r = dm_status_suspended(cd, name);
if (r < 0)
goto out;
goto out;
}
- r = dm_suspend_and_wipe_key(name);
+ r = dm_suspend_and_wipe_key(cd, name);
if (r == -ENOTSUP)
log_err(cd, "Suspend is not supported for device %s.\n", name);
else if (r)
goto out;
}
- r = dm_status_suspended(name);
+ r = dm_status_suspended(cd, name);
if (r < 0)
return r;
if (r >= 0) {
keyslot = r;
- r = dm_resume_and_reinstate_key(name, vk->keylength, vk->key);
+ r = dm_resume_and_reinstate_key(cd, name, vk->keylength, vk->key);
if (r == -ENOTSUP)
log_err(cd, "Resume is not supported for device %s.\n", name);
else if (r)
goto out;
}
- r = dm_status_suspended(name);
+ r = dm_status_suspended(cd, name);
if (r < 0)
return r;
goto out;
keyslot = r;
- r = dm_resume_and_reinstate_key(name, vk->keylength, vk->key);
+ r = dm_resume_and_reinstate_key(cd, name, vk->keylength, vk->key);
if (r)
log_err(cd, "Error during resuming device %s.\n", name);
out:
switch (crypt_status(cd, name)) {
case CRYPT_ACTIVE:
case CRYPT_BUSY:
- r = dm_remove_device(name, 0, 0);
+ r = dm_remove_device(cd, name, 0, 0);
break;
case CRYPT_INACTIVE:
log_err(cd, _("Device %s is not active.\n"), name);
if (!cd && dm_init(NULL, 1) < 0)
return CRYPT_INVALID;
- r = dm_status_device(name);
+ r = dm_status_device(cd, name);
if (!cd)
dm_exit();
struct crypt_dm_active_device dmd;
int r;
- r = dm_query_device(name, 0, &dmd);
+ r = dm_query_device(cd, name, 0, &dmd);
if (r < 0)
return r;
#include <sys/types.h>
#include "utils_dm.h"
+/* These are DM helpers used only by this file */
+int dm_is_dm_device(int major, int minor);
+int dm_is_dm_kernel_name(const char *name);
+char *dm_device_path(const char *prefix, int major, int minor);
+
char *crypt_lookup_dev(const char *dev_id);
int crypt_sysfs_get_rotational(int major, int minor, int *rotational);
} u;
};
-const char *dm_get_dir(void);
int dm_init(struct crypt_device *context, int check_kernel);
void dm_exit(void);
-int dm_remove_device(const char *name, int force, uint64_t size);
-int dm_status_device(const char *name);
-int dm_status_suspended(const char *name);
-int dm_status_verity_ok(const char *name);
-int dm_query_device(const char *name, uint32_t get_flags,
- struct crypt_dm_active_device *dmd);
-int dm_create_device(const char *name,
- const char *type,
- struct crypt_dm_active_device *dmd,
- int reload);
-int dm_suspend_and_wipe_key(const char *name);
-int dm_resume_and_reinstate_key(const char *name,
- size_t key_size,
- const char *key);
-char *dm_device_path(const char *prefix, int major, int minor);
-int dm_is_dm_device(int major, int minor);
-int dm_is_dm_kernel_name(const char *name);
+
+int dm_remove_device(struct crypt_device *cd, const char *name,
+ int force, uint64_t size);
+int dm_status_device(struct crypt_device *cd, const char *name);
+int dm_status_suspended(struct crypt_device *cd, const char *name);
+int dm_status_verity_ok(struct crypt_device *cd, const char *name);
+int dm_query_device(struct crypt_device *cd, const char *name,
+ uint32_t get_flags, struct crypt_dm_active_device *dmd);
+int dm_create_device(struct crypt_device *cd, const char *name,
+ const char *type, struct crypt_dm_active_device *dmd,
+ int reload);
+int dm_suspend_and_wipe_key(struct crypt_device *cd, const char *name);
+int dm_resume_and_reinstate_key(struct crypt_device *cd, const char *name,
+ size_t key_size, const char *key);
+
+const char *dm_get_dir(void);
#endif /* _UTILS_DM_H */
if (r)
return r;
- r = dm_create_device(name, CRYPT_VERITY, &dmd, 0);
+ r = dm_create_device(cd, name, CRYPT_VERITY, &dmd, 0);
if (!r && !(dm_flags() & DM_VERITY_SUPPORTED)) {
log_err(cd, _("Kernel doesn't support dm-verity mapping.\n"));
return -ENOTSUP;
if (r < 0)
return r;
- r = dm_status_verity_ok(name);
+ r = dm_status_verity_ok(cd, name);
if (r < 0)
return r;