mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-24 02:18:54 +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
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user