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:
Alasdair G Kergon 2011-10-31 20:19:00 +00:00
parent 7f06965390
commit 3791e2fc0e
2 changed files with 26 additions and 4 deletions

View File

@ -55,6 +55,7 @@ struct dm_table {
struct dm_target *targets; struct dm_target *targets;
unsigned integrity_supported:1; unsigned integrity_supported:1;
unsigned singleton:1;
/* /*
* Indicates the rw permissions for the new logical * 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; char **argv;
struct dm_target *tgt; 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))) if ((r = check_space(t)))
return r; return r;
@ -758,6 +765,15 @@ int dm_table_add_target(struct dm_table *t, const char *type,
return -EINVAL; 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->table = t;
tgt->begin = start; tgt->begin = start;
tgt->len = len; tgt->len = len;

View File

@ -128,10 +128,6 @@ void dm_put_device(struct dm_target *ti, struct dm_dev *d);
* Information about a target type * Information about a target type
*/ */
/*
* Target features
*/
struct target_type { struct target_type {
uint64_t features; uint64_t features;
const char *name; const char *name;
@ -160,6 +156,16 @@ struct target_type {
struct list_head list; 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_target {
struct dm_table *table; struct dm_table *table;
struct target_type *type; struct target_type *type;