1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-02-25 21:57:45 +03:00

Thin pool activation change

To ensure we properly handle LV cluster locking - explicitely do
not allow to change the availability of the thin pool that is in use
for some thin LV.

As soon as the thin volume is created the only way to activate pool
is via implicit dependency.

Ignore thinpool open count for lv/vgchange operations.
This commit is contained in:
Zdenek Kabelac 2011-10-28 20:28:00 +00:00
parent 209bd9887c
commit 98b5d31edd
6 changed files with 31 additions and 12 deletions

View File

@ -782,7 +782,7 @@ int lvs_in_vg_opened(const struct volume_group *vg)
return 0;
dm_list_iterate_items(lvl, &vg->lvs)
if (lv_is_visible(lvl->lv))
if (lv_is_visible(lvl->lv) && !lv_is_used_thin_pool(lvl->lv))
count += (_lv_open_count(vg->cmd, lvl->lv) > 0);
log_debug("Counted %d open LVs in VG %s", count, vg->name);

View File

@ -3210,7 +3210,7 @@ int lv_remove_with_dependencies(struct cmd_context *cmd, struct logical_volume *
}
}
if (lv_is_thin_pool(lv) && dm_list_size(&lv->segs_using_this_lv)) {
if (lv_is_used_thin_pool(lv)) {
/* remove thin LVs first */
if ((force == PROMPT) &&
yes_no_prompt("Do you really want to remove all thin volumes when removing"
@ -4139,23 +4139,26 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg, struct l
} else if (seg_is_thin_volume(lp)) {
pool_lv = first_seg(lv)->pool_lv;
/* Ensure unused thin pool is not active */
if (!lv_is_used_thin_pool(pool_lv) &&
!deactivate_lv(cmd, pool_lv)) {
log_error("Failed to deactivate unused pool %s.",
pool_lv->name);
return NULL;
}
/*
* From now the thin pool de/activation is made
* only via implicit thin volume dependency.
*/
if (!(first_seg(lv)->device_id =
get_free_pool_device_id(first_seg(pool_lv))))
return_NULL;
if (!activate_lv(pool_lv->vg->cmd, pool_lv)) {
log_error("Failed to activate %s/%s to send message.",
pool_lv->vg->name, pool_lv->name);
return NULL;
}
if (!attach_pool_message(first_seg(pool_lv),
DM_THIN_MESSAGE_CREATE_THIN, lv, 0, 0))
return_NULL;
/*
* FIXME: Skipping deactivate_lv(pool_lv) as it is going to be needed anyway
* but revert_new_lv should revert to deactivated state.
*/
}
if (lp->log_count &&

View File

@ -136,6 +136,7 @@
#define lv_is_thin_volume(lv) ((lv)->status & THIN_VOLUME ? 1 : 0)
#define lv_is_thin_pool(lv) ((lv)->status & THIN_POOL ? 1 : 0)
#define lv_is_used_thin_pool(lv) (lv_is_thin_pool(lv) && !dm_list_empty(&(lv)->segs_using_this_lv))
#define lv_is_thin_pool_data(lv) ((lv)->status & THIN_POOL_DATA ? 1 : 0)
#define lv_is_thin_pool_metadata(lv) ((lv)->status & THIN_POOL_METADATA ? 1 : 0)
#define lv_is_mirrored(lv) ((lv)->status & MIRRORED ? 1 : 0)

View File

@ -532,6 +532,12 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
return ECMD_FAILED;
}
if (lv_is_used_thin_pool(lv) &&
(arg_count(cmd, available_ARG))) {
log_error("Can't change pool volume \"%s\".", lv->name);
return ECMD_FAILED;
}
if (lv_is_cow(lv) && !lv_is_virtual_origin(origin_from_cow(lv)) &&
arg_count(cmd, available_ARG)) {
log_error("Can't change snapshot logical volume \"%s\"",

View File

@ -126,6 +126,11 @@ int process_each_lv_in_vg(struct cmd_context *cmd,
if (lv_is_virtual_origin(lvl->lv) && !arg_count(cmd, all_ARG))
continue;
/* Only unused thin pool can change its availability */
if (!lvargs_supplied && lv_is_used_thin_pool(lvl->lv) &&
arg_count(cmd, available_ARG))
continue;
/*
* Only let hidden LVs through it --all was used or the LVs
* were specifically named on the command line.

View File

@ -100,6 +100,10 @@ static int _activate_lvs_in_vg(struct cmd_context *cmd,
if (!lv_is_visible(lv))
continue;
/* Never manipulate with thin pools in use */
if (lv_is_used_thin_pool(lv))
continue;
/* If LV is sparse, activate origin instead */
if (lv_is_cow(lv) && lv_is_virtual_origin(origin_from_cow(lv)))
lv = origin_from_cow(lv);