mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-22 17:01:14 +00:00
dm table: add singleton feature
Introduce the concept of a singleton table which contains exactly one target. If a target type sets the DM_TARGET_SINGLETON feature bit device-mapper will ensure that any table that includes that target contains no others. The thin provisioning pool target uses this. Signed-off-by: Alasdair G Kergon <agk@redhat.com>
This commit is contained in:
parent
7f06965390
commit
3791e2fc0e
2 changed files with 26 additions and 4 deletions
|
@ -55,6 +55,7 @@ struct dm_table {
|
|||
struct dm_target *targets;
|
||||
|
||||
unsigned integrity_supported:1;
|
||||
unsigned singleton:1;
|
||||
|
||||
/*
|
||||
* Indicates the rw permissions for the new logical
|
||||
|
@ -740,6 +741,12 @@ int dm_table_add_target(struct dm_table *t, const char *type,
|
|||
char **argv;
|
||||
struct dm_target *tgt;
|
||||
|
||||
if (t->singleton) {
|
||||
DMERR("%s: target type %s must appear alone in table",
|
||||
dm_device_name(t->md), t->targets->type->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((r = check_space(t)))
|
||||
return r;
|
||||
|
||||
|
@ -758,6 +765,15 @@ int dm_table_add_target(struct dm_table *t, const char *type,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (dm_target_needs_singleton(tgt->type)) {
|
||||
if (t->num_targets) {
|
||||
DMERR("%s: target type %s must appear alone in table",
|
||||
dm_device_name(t->md), type);
|
||||
return -EINVAL;
|
||||
}
|
||||
t->singleton = 1;
|
||||
}
|
||||
|
||||
tgt->table = t;
|
||||
tgt->begin = start;
|
||||
tgt->len = len;
|
||||
|
|
|
@ -128,10 +128,6 @@ void dm_put_device(struct dm_target *ti, struct dm_dev *d);
|
|||
* Information about a target type
|
||||
*/
|
||||
|
||||
/*
|
||||
* Target features
|
||||
*/
|
||||
|
||||
struct target_type {
|
||||
uint64_t features;
|
||||
const char *name;
|
||||
|
@ -160,6 +156,16 @@ struct target_type {
|
|||
struct list_head list;
|
||||
};
|
||||
|
||||
/*
|
||||
* Target features
|
||||
*/
|
||||
|
||||
/*
|
||||
* Any table that contains an instance of this target must have only one.
|
||||
*/
|
||||
#define DM_TARGET_SINGLETON 0x00000001
|
||||
#define dm_target_needs_singleton(type) ((type)->features & DM_TARGET_SINGLETON)
|
||||
|
||||
struct dm_target {
|
||||
struct dm_table *table;
|
||||
struct target_type *type;
|
||||
|
|
Loading…
Reference in a new issue