mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
o activation & active status tests
o lvdisplay fields from kernel o update lv->size on resize
This commit is contained in:
parent
ab2799eb14
commit
3080a75445
@ -10,8 +10,6 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "fs.h"
|
#include "fs.h"
|
||||||
|
|
||||||
#include <devmapper/libdevmapper.h>
|
|
||||||
|
|
||||||
static void _build_lv_name(char *buffer, size_t s, struct logical_volume *lv)
|
static void _build_lv_name(char *buffer, size_t s, struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
snprintf(buffer, s, "%s_%s", lv->vg->name, lv->name);
|
snprintf(buffer, s, "%s_%s", lv->vg->name, lv->name);
|
||||||
@ -33,7 +31,7 @@ static struct dm_task *_setup_task(struct logical_volume *lv, int task)
|
|||||||
return dmt;
|
return dmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _info(struct logical_volume *lv, struct dm_info *info)
|
int lv_info(struct logical_volume *lv, struct dm_info *info)
|
||||||
{
|
{
|
||||||
int r = 0;
|
int r = 0;
|
||||||
struct dm_task *dmt;
|
struct dm_task *dmt;
|
||||||
@ -64,7 +62,7 @@ int lv_active(struct logical_volume *lv)
|
|||||||
int r = -1;
|
int r = -1;
|
||||||
struct dm_info info;
|
struct dm_info info;
|
||||||
|
|
||||||
if (!_info(lv, &info)) {
|
if (!lv_info(lv, &info)) {
|
||||||
stack;
|
stack;
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
@ -77,7 +75,7 @@ int lv_open_count(struct logical_volume *lv)
|
|||||||
int r = -1;
|
int r = -1;
|
||||||
struct dm_info info;
|
struct dm_info info;
|
||||||
|
|
||||||
if (!_info(lv, &info)) {
|
if (!lv_info(lv, &info)) {
|
||||||
stack;
|
stack;
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
@ -153,6 +151,8 @@ int _load(struct logical_volume *lv, int task)
|
|||||||
if (!(r = dm_task_run(dmt)))
|
if (!(r = dm_task_run(dmt)))
|
||||||
stack;
|
stack;
|
||||||
|
|
||||||
|
log_verbose("Logical volume %s activated", lv->name);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
dm_task_destroy(dmt);
|
dm_task_destroy(dmt);
|
||||||
return r;
|
return r;
|
||||||
|
@ -7,10 +7,13 @@
|
|||||||
#ifndef LVM_ACTIVATE_H
|
#ifndef LVM_ACTIVATE_H
|
||||||
#define LVM_ACTIVATE_H
|
#define LVM_ACTIVATE_H
|
||||||
|
|
||||||
|
#include <libdevmapper.h>
|
||||||
|
|
||||||
/* FIXME Snapshot handling? */
|
/* FIXME Snapshot handling? */
|
||||||
|
|
||||||
int lv_active(struct logical_volume *lv);
|
int lv_active(struct logical_volume *lv);
|
||||||
int lv_open_count(struct logical_volume *lv);
|
int lv_open_count(struct logical_volume *lv);
|
||||||
|
int lv_info(struct logical_volume *lv, struct dm_info *info);
|
||||||
|
|
||||||
int lv_activate(struct logical_volume *lv);
|
int lv_activate(struct logical_volume *lv);
|
||||||
int lv_reactivate(struct logical_volume *lv);
|
int lv_reactivate(struct logical_volume *lv);
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#include "fs.h"
|
#include "fs.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
#include <devmapper/libdevmapper.h>
|
#include <libdevmapper.h>
|
||||||
|
|
||||||
void _build_lv_path(char *buffer, size_t len, struct logical_volume *lv)
|
void _build_lv_path(char *buffer, size_t len, struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
|
@ -207,19 +207,24 @@ int pvdisplay_short(struct volume_group *vg, struct physical_volume *pv)
|
|||||||
|
|
||||||
void lvdisplay_colons(struct logical_volume *lv)
|
void lvdisplay_colons(struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
log_print("%s/%s:%s:%d:%d:-1:%d:%" PRIu64 ":%d:-1:%d:%d:-1:-1",
|
int inkernel;
|
||||||
/* FIXME Prefix - attach to struct volume_group? */
|
struct dm_info info;
|
||||||
|
inkernel = lv_info(lv, &info) && info.exists;
|
||||||
|
|
||||||
|
log_print("%s%s/%s:%s:%d:%d:-1:%d:%" PRIu64 ":%d:-1:%d:%d:%d:%d",
|
||||||
|
lv->vg->cmd->dev_dir,
|
||||||
lv->vg->name,
|
lv->vg->name,
|
||||||
lv->name,
|
lv->name,
|
||||||
lv->vg->name,
|
lv->vg->name,
|
||||||
(lv->status & (LVM_READ | LVM_WRITE)) >> 8,
|
(lv->status & (LVM_READ | LVM_WRITE)) >> 8,
|
||||||
lv->status & ACTIVE,
|
inkernel ? 1 : 0,
|
||||||
/* FIXME lv->lv_number, */
|
/* FIXME lv->lv_number, */
|
||||||
lvs_in_vg_opened(lv->vg), lv->size, lv->le_count,
|
inkernel ? info.open_count : 0, lv->size, lv->le_count,
|
||||||
/* FIXME Add num allocated to struct! lv->lv_allocated_le, */
|
/* FIXME Add num allocated to struct! lv->lv_allocated_le, */
|
||||||
((lv->status & ALLOC_STRICT) +
|
((lv->status & ALLOC_STRICT) +
|
||||||
(lv->status & ALLOC_CONTIGUOUS) * 2), lv->read_ahead
|
(lv->status & ALLOC_CONTIGUOUS) * 2), lv->read_ahead,
|
||||||
/* FIXME device num MAJOR(lv->lv_dev), MINOR(lv->lv_dev) */
|
inkernel ? info.major : -1,
|
||||||
|
inkernel ? info.minor : -1
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -228,11 +233,15 @@ int lvdisplay_full(struct logical_volume *lv)
|
|||||||
{
|
{
|
||||||
char *size;
|
char *size;
|
||||||
uint32_t alloc;
|
uint32_t alloc;
|
||||||
|
struct dm_info info;
|
||||||
|
int inkernel;
|
||||||
|
|
||||||
|
inkernel = lv_info(lv, &info) && info.exists;
|
||||||
|
|
||||||
log_print("--- Logical volume ---");
|
log_print("--- Logical volume ---");
|
||||||
|
|
||||||
/* FIXME Add dev_dir */
|
log_print("LV Name %s%s/%s", lv->vg->cmd->dev_dir,
|
||||||
log_print("LV Name %s/%s", lv->vg->name, lv->name);
|
lv->vg->name, lv->name);
|
||||||
log_print("VG Name %s", lv->vg->name);
|
log_print("VG Name %s", lv->vg->name);
|
||||||
|
|
||||||
log_print("LV Write Access %s",
|
log_print("LV Write Access %s",
|
||||||
@ -283,16 +292,19 @@ int lvdisplay_full(struct logical_volume *lv)
|
|||||||
}
|
}
|
||||||
***********/
|
***********/
|
||||||
|
|
||||||
log_print("LV Status %savailable",
|
if (inkernel && info.suspended)
|
||||||
(lv->status & ACTIVE) ? "" : "NOT ");
|
log_print("LV Status suspended");
|
||||||
|
else
|
||||||
|
log_print("LV Status %savailable",
|
||||||
|
inkernel ? "" : "NOT ");
|
||||||
|
|
||||||
/********* FIXME lv_number
|
/********* FIXME lv_number
|
||||||
log_print("LV # %u", lv->lv_number + 1);
|
log_print("LV # %u", lv->lv_number + 1);
|
||||||
************/
|
************/
|
||||||
|
|
||||||
/********* FIXME lv_open
|
if (inkernel)
|
||||||
log_print("# open %u\n", lv->lv_open);
|
log_print("# open %u", info.open_count);
|
||||||
**********/
|
|
||||||
/********
|
/********
|
||||||
#ifdef LVM_FUTURE
|
#ifdef LVM_FUTURE
|
||||||
printf("Mirror copies %u\n", lv->lv_mirror_copies);
|
printf("Mirror copies %u\n", lv->lv_mirror_copies);
|
||||||
@ -374,7 +386,7 @@ int lvdisplay_full(struct logical_volume *lv)
|
|||||||
(ALLOC_STRICT | ALLOC_CONTIGUOUS)) ? "strict/contiguous" :
|
(ALLOC_STRICT | ALLOC_CONTIGUOUS)) ? "strict/contiguous" :
|
||||||
"");
|
"");
|
||||||
|
|
||||||
log_print("Read ahead sectors %u\n", lv->read_ahead);
|
log_print("Read ahead sectors %u", lv->read_ahead);
|
||||||
|
|
||||||
/****************
|
/****************
|
||||||
#ifdef LVM_FUTURE
|
#ifdef LVM_FUTURE
|
||||||
@ -386,15 +398,15 @@ int lvdisplay_full(struct logical_volume *lv)
|
|||||||
#endif
|
#endif
|
||||||
*************/
|
*************/
|
||||||
|
|
||||||
/********* FIXME blockdev
|
if (inkernel)
|
||||||
printf("Block device %d:%d\n",
|
log_print("Block device %d:%d", info.major,
|
||||||
MAJOR(lv->lv_dev), MINOR(lv->lv_dev));
|
info.minor);
|
||||||
*************/
|
|
||||||
|
log_print(" ");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void lvdisplay_extents(struct logical_volume *lv)
|
void lvdisplay_extents(struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
int le;
|
int le;
|
||||||
|
@ -296,6 +296,7 @@ int lv_reduce(struct logical_volume *lv, uint32_t extents)
|
|||||||
}
|
}
|
||||||
|
|
||||||
lv->le_count = extents;
|
lv->le_count = extents;
|
||||||
|
lv->size = extents * lv->vg->extent_size;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -325,6 +326,7 @@ int lv_extend(struct logical_volume *lv, uint32_t extents,
|
|||||||
memcpy(new_lv, lv, sizeof(*lv));
|
memcpy(new_lv, lv, sizeof(*lv));
|
||||||
new_lv->map = new_map;
|
new_lv->map = new_map;
|
||||||
new_lv->le_count += extents;
|
new_lv->le_count += extents;
|
||||||
|
new_lv->size += extents * lv->vg->extent_size;
|
||||||
|
|
||||||
if (!_allocate(new_lv->vg, new_lv, acceptable_pvs, lv->le_count)) {
|
if (!_allocate(new_lv->vg, new_lv, acceptable_pvs, lv->le_count)) {
|
||||||
stack;
|
stack;
|
||||||
|
@ -44,14 +44,17 @@ int lvchange(int argc, char **argv)
|
|||||||
|
|
||||||
static int lvchange_single(struct logical_volume *lv)
|
static int lvchange_single(struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
char *vg_name;
|
|
||||||
int doit = 0;
|
int doit = 0;
|
||||||
|
|
||||||
if (!(lv->vg->status & ACTIVE)) {
|
/******* Removed requirement for VG to be active before making changes
|
||||||
|
if (!(lv->vg->status & ACTIVE) &&
|
||||||
|
!(arg_count(available_ARG) &&
|
||||||
|
strcmp(arg_str_value(available_ARG, "n"), "n"))) {
|
||||||
log_error("Volume group %s must be active before changing a "
|
log_error("Volume group %s must be active before changing a "
|
||||||
"logical volume", vg_name);
|
"logical volume", vg->name);
|
||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
********/
|
||||||
|
|
||||||
if (lv->status & SNAPSHOT_ORG) {
|
if (lv->status & SNAPSHOT_ORG) {
|
||||||
log_error("Can't change logical volume %s under snapshot",
|
log_error("Can't change logical volume %s under snapshot",
|
||||||
@ -84,8 +87,6 @@ static int lvchange_single(struct logical_volume *lv)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME activate change */
|
|
||||||
|
|
||||||
log_print("Logical volume %s changed", lv->name);
|
log_print("Logical volume %s changed", lv->name);
|
||||||
|
|
||||||
/* FIXME do_autobackup */
|
/* FIXME do_autobackup */
|
||||||
@ -131,19 +132,12 @@ static int lvchange_permission(struct logical_volume *lv)
|
|||||||
static int lvchange_availability(struct logical_volume *lv)
|
static int lvchange_availability(struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
int lv_stat = 0;
|
int lv_stat = 0;
|
||||||
|
int active;
|
||||||
|
|
||||||
if (strcmp(arg_str_value(available_ARG, "n"), "n"))
|
if (strcmp(arg_str_value(available_ARG, "n"), "n"))
|
||||||
lv_stat |= ACTIVE;
|
lv_stat |= ACTIVE;
|
||||||
|
|
||||||
if ((lv_stat & ACTIVE) && (lv->status & ACTIVE)) {
|
active = lv_active(lv);
|
||||||
log_error("Logical volume %s is already active", lv->name);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(lv_stat & ACTIVE) && !(lv->status & ACTIVE)) {
|
|
||||||
log_error("Logical volume %s is already not active", lv->name);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lv_stat & ACTIVE) {
|
if (lv_stat & ACTIVE) {
|
||||||
lv->status |= ACTIVE;
|
lv->status |= ACTIVE;
|
||||||
@ -153,17 +147,32 @@ static int lvchange_availability(struct logical_volume *lv)
|
|||||||
log_verbose("Deactivating logical volume %s", lv->name);
|
log_verbose("Deactivating logical volume %s", lv->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
log_very_verbose("Updating logical volume %s on disk(s)", lv->name);
|
if ((lv_stat & ACTIVE) && (lv->status & ACTIVE))
|
||||||
if (!fid->ops->vg_write(fid, lv->vg))
|
log_verbose("Logical volume %s is already active on disk",
|
||||||
return 0;
|
lv->name);
|
||||||
|
else if (!(lv_stat & ACTIVE) && !(lv->status & ACTIVE))
|
||||||
|
log_verbose("Logical volume %s is already inactive on disk",
|
||||||
|
lv->name);
|
||||||
|
else {
|
||||||
|
log_very_verbose("Updating logical volume %s on disk(s)",
|
||||||
|
lv->name);
|
||||||
|
if (!fid->ops->vg_write(fid, lv->vg))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
log_very_verbose("Updating %s in kernel", lv->name);
|
if ((lv_stat & ACTIVE) && (active & ACTIVE))
|
||||||
if (lv_stat & ACTIVE) {
|
log_verbose("Logical volume %s is already active", lv->name);
|
||||||
if (!lv_activate(lv))
|
else if (!(lv_stat & ACTIVE) && !(active & ACTIVE))
|
||||||
return 0;
|
log_verbose("Logical volume %s is already inactive", lv->name);
|
||||||
} else {
|
else {
|
||||||
if (!lv_deactivate(lv))
|
log_very_verbose("Updating %s in kernel", lv->name);
|
||||||
return 0;
|
if (lv_stat & ACTIVE) {
|
||||||
|
if (!lv_activate(lv))
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
if (!lv_deactivate(lv))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -115,11 +115,13 @@ int lvcreate(int argc, char **argv)
|
|||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******* Removed check
|
||||||
if (!(vg->status & ACTIVE)) {
|
if (!(vg->status & ACTIVE)) {
|
||||||
log_error("Volume group %s must be active before changing a "
|
log_error("Volume group %s must be active before changing a "
|
||||||
"logical volume", vg_name);
|
"logical volume", vg_name);
|
||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
********/
|
||||||
|
|
||||||
if (lv_name && (lvh = find_lv_in_vg(vg, lv_name))) {
|
if (lv_name && (lvh = find_lv_in_vg(vg, lv_name))) {
|
||||||
log_error("Logical volume %s already exists in "
|
log_error("Logical volume %s already exists in "
|
||||||
|
@ -721,6 +721,7 @@ static int init(void)
|
|||||||
|
|
||||||
/* FIXME: Override from config file. (Append trailing slash if reqd) */
|
/* FIXME: Override from config file. (Append trailing slash if reqd) */
|
||||||
cmd->dev_dir = "/dev/";
|
cmd->dev_dir = "/dev/";
|
||||||
|
dm_set_dev_dir(cmd->dev_dir);
|
||||||
|
|
||||||
if (!(cmd->cf = create_config_file())) {
|
if (!(cmd->cf = create_config_file())) {
|
||||||
stack;
|
stack;
|
||||||
@ -744,6 +745,8 @@ static int init(void)
|
|||||||
__init_log(cmd->cf);
|
__init_log(cmd->cf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dm_log_init(print_log);
|
||||||
|
|
||||||
if (!dev_cache_setup(cmd->cf)) {
|
if (!dev_cache_setup(cmd->cf)) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -37,11 +37,14 @@ static int lvremove_single(struct logical_volume *lv)
|
|||||||
struct volume_group *vg;
|
struct volume_group *vg;
|
||||||
|
|
||||||
vg = lv->vg;
|
vg = lv->vg;
|
||||||
|
|
||||||
|
/******* Removed requirement
|
||||||
if (!(vg->status & ACTIVE)) {
|
if (!(vg->status & ACTIVE)) {
|
||||||
log_error("Volume group %s must be active before removing a "
|
log_error("Volume group %s must be active before removing a "
|
||||||
"logical volume", vg->name);
|
"logical volume", vg->name);
|
||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
********/
|
||||||
|
|
||||||
if (lv->status & SNAPSHOT_ORG) {
|
if (lv->status & SNAPSHOT_ORG) {
|
||||||
log_error("Can't remove logical volume %s under snapshot",
|
log_error("Can't remove logical volume %s under snapshot",
|
||||||
@ -49,14 +52,11 @@ static int lvremove_single(struct logical_volume *lv)
|
|||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/********** FIXME Ensure logical volume is not open on *any* machine
|
/* FIXME Force option? */
|
||||||
if (lv->open) {
|
if (lv_open_count(lv)) {
|
||||||
log_error("can't remove open %s logical volume %s",
|
log_error("Can't remove open logical volume %s", lv->name);
|
||||||
lv->status & SNAPSHOT ? "snapshot" : "",
|
|
||||||
lv->name);
|
|
||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
************/
|
|
||||||
|
|
||||||
if (!arg_count(force_ARG)) {
|
if (!arg_count(force_ARG)) {
|
||||||
if (yes_no_prompt
|
if (yes_no_prompt
|
||||||
@ -67,6 +67,10 @@ static int lvremove_single(struct logical_volume *lv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!lv_deactivate(lv)) {
|
||||||
|
log_error("Unable to deactivate logical volume %s", lv->name);
|
||||||
|
}
|
||||||
|
|
||||||
log_verbose("Releasing logical volume %s", lv->name);
|
log_verbose("Releasing logical volume %s", lv->name);
|
||||||
if (!lv_remove(vg, lv)) {
|
if (!lv_remove(vg, lv)) {
|
||||||
log_error("Error releasing logical volume %s", lv->name);
|
log_error("Error releasing logical volume %s", lv->name);
|
||||||
|
@ -89,11 +89,13 @@ int lvrename(int argc, char **argv)
|
|||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******* Removed requirement
|
||||||
if (!(vg->status & ACTIVE)) {
|
if (!(vg->status & ACTIVE)) {
|
||||||
log_error("Volume group %s must be active before changing a "
|
log_error("Volume group %s must be active before changing a "
|
||||||
"logical volume", vg_name);
|
"logical volume", vg_name);
|
||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
*******/
|
||||||
|
|
||||||
if ((lvh = find_lv_in_vg(vg, lv_name_new))) {
|
if ((lvh = find_lv_in_vg(vg, lv_name_new))) {
|
||||||
log_error("Logical volume %s already exists in "
|
log_error("Logical volume %s already exists in "
|
||||||
@ -120,7 +122,8 @@ int lvrename(int argc, char **argv)
|
|||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME Update symlink. lv_reactivate? */
|
/* FIXME Update symlink. */
|
||||||
|
lv_reactivate(lv);
|
||||||
|
|
||||||
/* FIXME backup */
|
/* FIXME backup */
|
||||||
|
|
||||||
|
@ -95,11 +95,13 @@ int lvresize(int argc, char **argv)
|
|||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******* Remove requirement
|
||||||
if (!(vg->status & ACTIVE)) {
|
if (!(vg->status & ACTIVE)) {
|
||||||
log_error("Volume group %s must be active before changing a "
|
log_error("Volume group %s must be active before changing a "
|
||||||
"logical volume", vg_name);
|
"logical volume", vg_name);
|
||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
********/
|
||||||
|
|
||||||
/* does LV exist? */
|
/* does LV exist? */
|
||||||
if (!(lvh = find_lv_in_vg(vg, lv_name))) {
|
if (!(lvh = find_lv_in_vg(vg, lv_name))) {
|
||||||
@ -110,11 +112,13 @@ int lvresize(int argc, char **argv)
|
|||||||
|
|
||||||
lv = &list_item(lvh, struct lv_list)->lv;
|
lv = &list_item(lvh, struct lv_list)->lv;
|
||||||
|
|
||||||
|
/******* Remove requirement
|
||||||
if (!(lv->status & ACTIVE)) {
|
if (!(lv->status & ACTIVE)) {
|
||||||
log_error("Logical volume %s must be active before change",
|
log_error("Logical volume %s must be active before change",
|
||||||
lv_name);
|
lv_name);
|
||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
********/
|
||||||
|
|
||||||
if (size) {
|
if (size) {
|
||||||
/* No of 512-byte sectors */
|
/* No of 512-byte sectors */
|
||||||
@ -196,7 +200,7 @@ int lvresize(int argc, char **argv)
|
|||||||
if (argc)
|
if (argc)
|
||||||
log_print("Ignoring PVs on command line when reducing");
|
log_print("Ignoring PVs on command line when reducing");
|
||||||
|
|
||||||
if (lv->status & ACTIVE || lv_active(lv)) {
|
if (lv_active(lv)) {
|
||||||
dummy =
|
dummy =
|
||||||
display_size(extents * vg->extent_size / 2,
|
display_size(extents * vg->extent_size / 2,
|
||||||
SIZE_SHORT);
|
SIZE_SHORT);
|
||||||
|
@ -131,9 +131,11 @@ int pvchange_single(struct physical_volume *pv)
|
|||||||
pv->status &= ~ALLOCATED_PV;
|
pv->status &= ~ALLOCATED_PV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******* Ignore active
|
||||||
if (!(pv->status & ACTIVE)) {
|
if (!(pv->status & ACTIVE)) {
|
||||||
log_verbose("Physical volume %s inactive", pv_name);
|
log_verbose("Physical volume %s inactive", pv_name);
|
||||||
}
|
}
|
||||||
|
********/
|
||||||
|
|
||||||
log_verbose("Updating physical volume %s", pv_name);
|
log_verbose("Updating physical volume %s", pv_name);
|
||||||
if (*pv->vg_name) {
|
if (*pv->vg_name) {
|
||||||
|
@ -50,10 +50,12 @@ static int pvcreate_check(const char *name)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******* Removed check
|
||||||
if (pv->status & ACTIVE) {
|
if (pv->status & ACTIVE) {
|
||||||
log_error("Can't create on active physical volume %s", name);
|
log_error("Can't create on active physical volume %s", name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
********/
|
||||||
|
|
||||||
/* we must have -ff to overwrite a non orphan */
|
/* we must have -ff to overwrite a non orphan */
|
||||||
if (arg_count(force_ARG) < 2) {
|
if (arg_count(force_ARG) < 2) {
|
||||||
|
@ -78,20 +78,18 @@ static int vgchange_single(const char *vg_name)
|
|||||||
|
|
||||||
void vgchange_available(struct volume_group *vg)
|
void vgchange_available(struct volume_group *vg)
|
||||||
{
|
{
|
||||||
int lv_open;
|
int lv_open, lv_active;
|
||||||
struct list *pvh;
|
struct list *lvh;
|
||||||
int available = !strcmp(arg_str_value(available_ARG, "n"), "y");
|
int available = !strcmp(arg_str_value(available_ARG, "n"), "y");
|
||||||
|
|
||||||
/* FIXME Kernel status to override disk flags ! */
|
/* Ignore existing disk status */
|
||||||
if (available && (vg->status & ACTIVE)) {
|
if (available && (vg->status & ACTIVE))
|
||||||
log_error("Volume group '%s' is already active", vg->name);
|
log_verbose("Volume group %s is already active on disk",
|
||||||
return;
|
vg->name);
|
||||||
}
|
|
||||||
|
|
||||||
if (!available && !(vg->status & ACTIVE)) {
|
if (!available && !(vg->status & ACTIVE))
|
||||||
log_error("Volume group '%s' is already not active", vg->name);
|
log_verbose("Volume group %s is already inactive on disk",
|
||||||
return;
|
vg->name);
|
||||||
}
|
|
||||||
|
|
||||||
/* FIXME: Force argument to deactivate them? */
|
/* FIXME: Force argument to deactivate them? */
|
||||||
if (!available && (lv_open = lvs_in_vg_opened(vg))) {
|
if (!available && (lv_open = lvs_in_vg_opened(vg))) {
|
||||||
@ -100,15 +98,19 @@ void vgchange_available(struct volume_group *vg)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (available && (lv_active = lvs_in_vg_activated(vg)))
|
||||||
|
log_verbose("%d logical volume(s) in volume group %s "
|
||||||
|
"already active", lv_active, vg->name);
|
||||||
|
|
||||||
if (available) {
|
if (available) {
|
||||||
vg->status |= ACTIVE;
|
vg->status |= ACTIVE;
|
||||||
list_iterate(pvh, &vg->pvs)
|
list_iterate(lvh, &vg->lvs)
|
||||||
list_item(pvh, struct pv_list)->pv.status
|
list_item(lvh, struct lv_list)->lv.status
|
||||||
|= ACTIVE;
|
|= ACTIVE;
|
||||||
} else {
|
} else {
|
||||||
vg->status &= ~ACTIVE;
|
vg->status &= ~ACTIVE;
|
||||||
list_iterate(pvh, &vg->pvs)
|
list_iterate(lvh, &vg->lvs)
|
||||||
list_item(pvh, struct pv_list)->pv.status
|
list_item(lvh, struct lv_list)->lv.status
|
||||||
&= ~ACTIVE;
|
&= ~ACTIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,13 +119,13 @@ void vgchange_available(struct volume_group *vg)
|
|||||||
|
|
||||||
if (available && (lv_open = activate_lvs_in_vg(vg)))
|
if (available && (lv_open = activate_lvs_in_vg(vg)))
|
||||||
log_verbose("Activated %d logical volumes in "
|
log_verbose("Activated %d logical volumes in "
|
||||||
"volume group '%s'", lv_open, vg->name);
|
"volume group %s", lv_open, vg->name);
|
||||||
|
|
||||||
if (!available && (lv_open = deactivate_lvs_in_vg(vg)))
|
if (!available && (lv_open = deactivate_lvs_in_vg(vg)))
|
||||||
log_verbose("Deactivated %d logical volumes in "
|
log_verbose("Deactivated %d logical volumes in "
|
||||||
"volume group '%s'", lv_open, vg->name);
|
"volume group %s", lv_open, vg->name);
|
||||||
|
|
||||||
log_print("Volume group %s successfully changed", vg->name);
|
log_print("Volume group %s updated", vg->name);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,7 @@ int vgcreate(int argc, char **argv)
|
|||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* create the new vg */
|
/* Create the new VG */
|
||||||
if (!(vg = vg_create(fid, vg_name, extent_size, max_pv, max_lv,
|
if (!(vg = vg_create(fid, vg_name, extent_size, max_pv, max_lv,
|
||||||
argc - 1, argv + 1)))
|
argc - 1, argv + 1)))
|
||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
@ -84,15 +84,11 @@ int vgcreate(int argc, char **argv)
|
|||||||
log_error("Warning: Setting maxphysicalvolumes to %d",
|
log_error("Warning: Setting maxphysicalvolumes to %d",
|
||||||
vg->max_pv);
|
vg->max_pv);
|
||||||
|
|
||||||
/* store vg on disk(s) */
|
/* Store VG on disk(s) */
|
||||||
if (!fid->ops->vg_write(fid, vg))
|
if (!fid->ops->vg_write(fid, vg))
|
||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
|
|
||||||
/* FIXME Create /dev/vg */
|
log_print("Volume group %s successfully created", vg->name);
|
||||||
/* FIXME Activate */
|
|
||||||
|
|
||||||
log_print("Volume group %s successfully created and activated",
|
|
||||||
vg_name);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -46,10 +46,10 @@ int vgextend(int argc, char **argv)
|
|||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(vg->status & ACTIVE)) {
|
/******* Ignore active
|
||||||
|
if (!(vg->status & ACTIVE))
|
||||||
log_error("Volume group '%s' is not active.", vg_name);
|
log_error("Volume group '%s' is not active.", vg_name);
|
||||||
return ECMD_FAILED;
|
********/
|
||||||
}
|
|
||||||
|
|
||||||
if (!(vg->status & EXTENDABLE_VG)) {
|
if (!(vg->status & EXTENDABLE_VG)) {
|
||||||
log_error("Volume group '%s' is not extendable.", vg_name);
|
log_error("Volume group '%s' is not extendable.", vg_name);
|
||||||
|
@ -54,10 +54,12 @@ int vgreduce(int argc, char **argv)
|
|||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******* Ignore active status
|
||||||
if (!(vg->status & ACTIVE)) {
|
if (!(vg->status & ACTIVE)) {
|
||||||
log_error("Volume group %s is not active", vg_name);
|
log_error("Volume group %s is not active", vg_name);
|
||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
*******/
|
||||||
|
|
||||||
if (!(vg->status & EXTENDABLE_VG)) {
|
if (!(vg->status & EXTENDABLE_VG)) {
|
||||||
log_error("Volume group %s is not reducable", vg_name);
|
log_error("Volume group %s is not reducable", vg_name);
|
||||||
|
@ -40,10 +40,12 @@ static int vgremove_single(const char *vg_name)
|
|||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******* Ignore active status
|
||||||
if (vg->status & ACTIVE) {
|
if (vg->status & ACTIVE) {
|
||||||
log_error("Volume group %s is still active", vg_name);
|
log_error("Volume group %s is still active", vg_name);
|
||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
********/
|
||||||
|
|
||||||
if (vg->lv_count) {
|
if (vg->lv_count) {
|
||||||
log_error("Volume group %s still contains %d logical volume(s)",
|
log_error("Volume group %s still contains %d logical volume(s)",
|
||||||
|
@ -118,6 +118,8 @@ int vgrename(int argc, char **argv)
|
|||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******* FIXME Any LV things to update? */
|
||||||
|
|
||||||
/***********
|
/***********
|
||||||
if ((ret = do_autobackup(vg_name_new, vg_old)))
|
if ((ret = do_autobackup(vg_name_new, vg_old)))
|
||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
|
@ -50,20 +50,22 @@ static int vgscan_single(const char *vg_name)
|
|||||||
log_print("Found %sactive volume group %s",
|
log_print("Found %sactive volume group %s",
|
||||||
(vg->status & ACTIVE) ? "" : "in", vg_name);
|
(vg->status & ACTIVE) ? "" : "in", vg_name);
|
||||||
|
|
||||||
|
/******* Ignore active flag
|
||||||
if (!(vg->status & ACTIVE)) {
|
if (!(vg->status & ACTIVE)) {
|
||||||
|
return 0;
|
||||||
vg->status |= ACTIVE;
|
vg->status |= ACTIVE;
|
||||||
if (!(fid->ops->vg_write(fid, vg))) {
|
if (!(fid->ops->vg_write(fid, vg))) {
|
||||||
log_error("Failed to activate volume group %s",
|
log_error("Failed to activate volume group %s",
|
||||||
vg_name);
|
vg_name);
|
||||||
return ECMD_FAILED;
|
return ECMD_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
*********/
|
||||||
|
|
||||||
/* FIXME: Creates /dev/vg */
|
|
||||||
activate_lvs_in_vg(vg);
|
|
||||||
|
|
||||||
log_print("Volume Group %s activated", vg_name);
|
log_print("%d logical volumes in volume group %s activated",
|
||||||
|
activate_lvs_in_vg(vg), vg_name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user