mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
Add registration of thin_pool segment
Register thin and thin_pool segment via multiple_segtypes.
This commit is contained in:
parent
f9b92564a7
commit
9d32170d5c
@ -1030,6 +1030,11 @@ static int _init_segtypes(struct cmd_context *cmd)
|
|||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef THIN_INTERNAL
|
||||||
|
if (!init_thin_segtypes(cmd, &seglib))
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_LIBDL
|
#ifdef HAVE_LIBDL
|
||||||
/* Load any formats in shared libs unless static */
|
/* Load any formats in shared libs unless static */
|
||||||
if (!is_static() &&
|
if (!is_static() &&
|
||||||
|
@ -40,6 +40,7 @@ struct dev_manager;
|
|||||||
#define SEG_REPLICATOR_DEV 0x00000200U
|
#define SEG_REPLICATOR_DEV 0x00000200U
|
||||||
#define SEG_RAID 0x00000400U
|
#define SEG_RAID 0x00000400U
|
||||||
#define SEG_THIN 0x00000800U
|
#define SEG_THIN 0x00000800U
|
||||||
|
#define SEG_THIN_POOL 0x00001000U
|
||||||
#define SEG_UNKNOWN 0x80000000U
|
#define SEG_UNKNOWN 0x80000000U
|
||||||
|
|
||||||
#define seg_is_mirrored(seg) ((seg)->segtype->flags & SEG_AREAS_MIRRORED ? 1 : 0)
|
#define seg_is_mirrored(seg) ((seg)->segtype->flags & SEG_AREAS_MIRRORED ? 1 : 0)
|
||||||
@ -50,6 +51,7 @@ struct dev_manager;
|
|||||||
#define seg_is_virtual(seg) ((seg)->segtype->flags & SEG_VIRTUAL ? 1 : 0)
|
#define seg_is_virtual(seg) ((seg)->segtype->flags & SEG_VIRTUAL ? 1 : 0)
|
||||||
#define seg_is_raid(seg) ((seg)->segtype->flags & SEG_RAID ? 1 : 0)
|
#define seg_is_raid(seg) ((seg)->segtype->flags & SEG_RAID ? 1 : 0)
|
||||||
#define seg_is_thin(seg) ((seg)->segtype->flags & SEG_THIN ? 1 : 0)
|
#define seg_is_thin(seg) ((seg)->segtype->flags & SEG_THIN ? 1 : 0)
|
||||||
|
#define seg_is_thin_pool(seg) ((seg)->segtype->flags & SEG_THIN_POOL ? 1 : 0)
|
||||||
#define seg_can_split(seg) ((seg)->segtype->flags & SEG_CAN_SPLIT ? 1 : 0)
|
#define seg_can_split(seg) ((seg)->segtype->flags & SEG_CAN_SPLIT ? 1 : 0)
|
||||||
#define seg_cannot_be_zeroed(seg) ((seg)->segtype->flags & SEG_CANNOT_BE_ZEROED ? 1 : 0)
|
#define seg_cannot_be_zeroed(seg) ((seg)->segtype->flags & SEG_CANNOT_BE_ZEROED ? 1 : 0)
|
||||||
#define seg_monitored(seg) ((seg)->segtype->flags & SEG_MONITORED ? 1 : 0)
|
#define seg_monitored(seg) ((seg)->segtype->flags & SEG_MONITORED ? 1 : 0)
|
||||||
@ -59,6 +61,7 @@ struct dev_manager;
|
|||||||
#define segtype_is_mirrored(segtype) ((segtype)->flags & SEG_AREAS_MIRRORED ? 1 : 0)
|
#define segtype_is_mirrored(segtype) ((segtype)->flags & SEG_AREAS_MIRRORED ? 1 : 0)
|
||||||
#define segtype_is_raid(segtype) ((segtype)->flags & SEG_RAID ? 1 : 0)
|
#define segtype_is_raid(segtype) ((segtype)->flags & SEG_RAID ? 1 : 0)
|
||||||
#define segtype_is_thin(segtype) ((segtype)->flags & SEG_THIN ? 1 : 0)
|
#define segtype_is_thin(segtype) ((segtype)->flags & SEG_THIN ? 1 : 0)
|
||||||
|
#define segtype_is_thin_pool(segtype) ((segtype)->flags & SEG_THIN_POOL ? 1 : 0)
|
||||||
#define segtype_is_virtual(segtype) ((segtype)->flags & SEG_VIRTUAL ? 1 : 0)
|
#define segtype_is_virtual(segtype) ((segtype)->flags & SEG_VIRTUAL ? 1 : 0)
|
||||||
|
|
||||||
struct segment_type {
|
struct segment_type {
|
||||||
@ -137,6 +140,10 @@ int init_raid_segtypes(struct cmd_context *cmd, struct segtype_library *seglib);
|
|||||||
int init_replicator_segtype(struct cmd_context *cmd, struct segtype_library *seglib);
|
int init_replicator_segtype(struct cmd_context *cmd, struct segtype_library *seglib);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef THIN_INTERNAL
|
||||||
|
int init_thin_segtypes(struct cmd_context *cmd, struct segtype_library *seglib);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef SNAPSHOT_INTERNAL
|
#ifdef SNAPSHOT_INTERNAL
|
||||||
struct segment_type *init_snapshot_segtype(struct cmd_context *cmd);
|
struct segment_type *init_snapshot_segtype(struct cmd_context *cmd);
|
||||||
#endif
|
#endif
|
||||||
@ -149,8 +156,4 @@ struct segment_type *init_mirrored_segtype(struct cmd_context *cmd);
|
|||||||
struct segment_type *init_crypt_segtype(struct cmd_context *cmd);
|
struct segment_type *init_crypt_segtype(struct cmd_context *cmd);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef THIN_INTERNAL
|
|
||||||
struct segment_type *init_thin_segtype(struct cmd_context *cmd);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -30,6 +30,22 @@
|
|||||||
/* Dm kernel module name for thin provisiong */
|
/* Dm kernel module name for thin provisiong */
|
||||||
#define THIN_MODULE "thin-pool"
|
#define THIN_MODULE "thin-pool"
|
||||||
|
|
||||||
|
static const char *_thin_pool_name(const struct lv_segment *seg)
|
||||||
|
{
|
||||||
|
return seg->segtype->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int _thin_pool_text_import(struct lv_segment *seg, const struct config_node *sn,
|
||||||
|
struct dm_hash_table *pv_hash __attribute__((unused)))
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _thin_pool_text_export(const struct lv_segment *seg, struct formatter *f)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static const char *_thin_name(const struct lv_segment *seg)
|
static const char *_thin_name(const struct lv_segment *seg)
|
||||||
{
|
{
|
||||||
@ -67,7 +83,7 @@ static int _thin_target_present(struct cmd_context *cmd,
|
|||||||
static int _present = 0;
|
static int _present = 0;
|
||||||
|
|
||||||
if (!_checked) {
|
if (!_checked) {
|
||||||
_present = target_present(cmd, "thin-pool", 1);
|
_present = target_present(cmd, THIN_MODULE, 1);
|
||||||
_checked = 1;
|
_checked = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,6 +109,14 @@ static void _thin_destroy(struct segment_type *segtype)
|
|||||||
dm_free(segtype);
|
dm_free(segtype);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct segtype_handler _thin_pool_ops = {
|
||||||
|
.name = _thin_pool_name,
|
||||||
|
.text_import = _thin_pool_text_import,
|
||||||
|
.text_export = _thin_pool_text_export,
|
||||||
|
.modules_needed = _thin_modules_needed,
|
||||||
|
.destroy = _thin_destroy,
|
||||||
|
};
|
||||||
|
|
||||||
static struct segtype_handler _thin_ops = {
|
static struct segtype_handler _thin_ops = {
|
||||||
.name = _thin_name,
|
.name = _thin_name,
|
||||||
.text_import = _thin_text_import,
|
.text_import = _thin_text_import,
|
||||||
@ -106,30 +130,48 @@ static struct segtype_handler _thin_ops = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifdef THIN_INTERNAL
|
#ifdef THIN_INTERNAL
|
||||||
struct segment_type *init_thin_segtype(struct cmd_context *cmd)
|
int init_thin_segtypes(struct cmd_context *cmd, struct segtype_library *seglib)
|
||||||
#else /* Shared */
|
#else /* Shared */
|
||||||
struct segment_type *init_segtype(struct cmd_context *cmd);
|
int init_multiple_segtypes(struct cmd_context *cmd, struct segtype_library *seglib);
|
||||||
struct segment_type *init_segtype(struct cmd_context *cmd)
|
int init_multiple_segtypes(struct cmd_context *cmd, struct segtype_library *seglib)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
struct segment_type *segtype = dm_zalloc(sizeof(*segtype));
|
static const struct {
|
||||||
|
struct segtype_handler *ops;
|
||||||
|
const char name[16];
|
||||||
|
uint32_t flags;
|
||||||
|
} reg_segtypes[] = {
|
||||||
|
{ &_thin_pool_ops, "thin_pool", SEG_THIN_POOL },
|
||||||
|
{ &_thin_ops, "thin", SEG_THIN }
|
||||||
|
};
|
||||||
|
|
||||||
if (!segtype)
|
struct segment_type *segtype;
|
||||||
return_NULL;
|
unsigned i;
|
||||||
|
|
||||||
segtype->cmd = cmd;
|
for (i = 0; i < sizeof(reg_segtypes)/sizeof(reg_segtypes[0]); ++i) {
|
||||||
segtype->ops = &_thin_ops;
|
segtype = dm_zalloc(sizeof(*segtype));
|
||||||
segtype->name = "thin";
|
|
||||||
segtype->private = NULL;
|
if (!segtype) {
|
||||||
segtype->flags = SEG_THIN;
|
log_error("Failed to allocate memory for %s segtype",
|
||||||
|
reg_segtypes[i].name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
segtype->ops = reg_segtypes[i].ops;
|
||||||
|
segtype->name = reg_segtypes[i].name;
|
||||||
|
segtype->flags = reg_segtypes[i].flags;
|
||||||
|
|
||||||
#ifdef DEVMAPPER_SUPPORT
|
#ifdef DEVMAPPER_SUPPORT
|
||||||
# ifdef DMEVENTD
|
# ifdef DMEVENTD
|
||||||
if (_get_thin_dso_path(cmd))
|
if (_get_thin_dso_path(cmd))
|
||||||
segtype->flags |= SEG_MONITORED;
|
segtype->flags |= SEG_MONITORED;
|
||||||
# endif /* DMEVENTD */
|
# endif /* DMEVENTD */
|
||||||
#endif
|
#endif
|
||||||
log_very_verbose("Initialised segtype: %s", segtype->name);
|
if (!lvm_register_segtype(seglib, segtype))
|
||||||
|
return_0;
|
||||||
|
|
||||||
return segtype;
|
log_very_verbose("Initialised segtype: %s", segtype->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user