mirror of
git://sourceware.org/git/lvm2.git
synced 2025-12-25 20:23:49 +03:00
Compare commits
41 Commits
dm_v1_01_0
...
dm_v1_01_0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
893ec9a302 | ||
|
|
05f65c38e6 | ||
|
|
2e9d062ec0 | ||
|
|
6b0b394e61 | ||
|
|
25621396c9 | ||
|
|
82aa0271f3 | ||
|
|
653cab13f8 | ||
|
|
b526f86b49 | ||
|
|
53c0f00888 | ||
|
|
f0c4d9de40 | ||
|
|
03ef8cec83 | ||
|
|
85f2a2e8c2 | ||
|
|
584b3e6642 | ||
|
|
39b7ef841d | ||
|
|
aa16a9098d | ||
|
|
7b8c2707bc | ||
|
|
60e26a31a7 | ||
|
|
3473c25c14 | ||
|
|
e52f022026 | ||
|
|
b1a7df8e43 | ||
|
|
0fd2479b7c | ||
|
|
273857f914 | ||
|
|
a08b85dbc8 | ||
|
|
a0aedf299a | ||
|
|
3c61426844 | ||
|
|
786f228076 | ||
|
|
004da28792 | ||
|
|
6e2be6efb6 | ||
|
|
a994dfcfbc | ||
|
|
7a8ea2ac93 | ||
|
|
0da3965d19 | ||
|
|
885fd7bb46 | ||
|
|
08771f9c89 | ||
|
|
8be48195a5 | ||
|
|
98ce2d650e | ||
|
|
3af327116a | ||
|
|
b75434db93 | ||
|
|
04e912aacd | ||
|
|
d7be352f87 | ||
|
|
96be3ec22c | ||
|
|
32e7e0d790 |
37
WHATS_NEW
37
WHATS_NEW
@@ -1,6 +1,37 @@
|
||||
Version 2.01.14 -
|
||||
================================
|
||||
Fix pool format handler to work with pv segment code
|
||||
Version 2.01.15 -
|
||||
=================================
|
||||
Fix chunksize field in reports.
|
||||
Don't hide snapshots from default 'lvs' output.
|
||||
Add is_dm_major() for use in duplicate device detection in lvmcache_add().
|
||||
Really switch device number in lvmcache when it says it is doing so.
|
||||
Option for bitset memory allocation using malloc as well as pool.
|
||||
Don't assume exactly two mirrors when parsing mirror status.
|
||||
Suppress fsync() error message on filesystems that don't support it.
|
||||
Fix yes_no_prompt() error handling.
|
||||
Add lvm.conf comment warning against multiple filter lines.
|
||||
Tidy lvmconf.sh.
|
||||
Add format1 dev_write debug messages.
|
||||
Add clustered VG attribute to report.
|
||||
Move lvconvert parameters into struct lvconvert_params.
|
||||
Add clustered VG flag to LV lock requests.
|
||||
Change LV locking macros to take lv instead of lvid.
|
||||
Prepend 'cluster' activation parameter to mirror log when appropriate.
|
||||
Pass exclusive flag to lv_activate and on to target activation code.
|
||||
Prevent snapshot creation in a clustered VG for now.
|
||||
Factor out adjusted_mirror_region_size() and generate_log_name_format().
|
||||
Move compose_log_line() into mirror directory.
|
||||
Factor out _get_library_path().
|
||||
Don't kill idling clvmd threads.
|
||||
clvmd no longer takes out locks for non-clustered LVs.
|
||||
Recognise ATA over Ethernet (aoe) devices.
|
||||
|
||||
Version 2.01.14 - 4th August 2005
|
||||
=================================
|
||||
Fix lvconvert PV parameter in help string.
|
||||
Prevent snapshots getting activated in a clustered VG.
|
||||
Separate out _build_dev_string.
|
||||
Move zero_lv to toollib.
|
||||
Fix pool format handler to work with pv segment code.
|
||||
|
||||
Version 2.01.13 - 13th July 2005
|
||||
================================
|
||||
|
||||
10
WHATS_NEW_DM
10
WHATS_NEW_DM
@@ -1,5 +1,13 @@
|
||||
Version 1.01.04 - 2 Aug 2005
|
||||
Version 1.01.05 - 26 Sep 2005
|
||||
=============================
|
||||
Resync list.h with LVM2.
|
||||
Remember increased buffer size and use for subsequent calls.
|
||||
On 'buffer full' condition, double buffer size and repeat ioctl.
|
||||
Fix termination of getopt_long() option array.
|
||||
Report 'buffer full' condition with v4 ioctl as well as with v1.
|
||||
|
||||
Version 1.01.04 - 2 Aug 2005
|
||||
============================
|
||||
Fix dmsetup ls -j and status --target with empty table.
|
||||
|
||||
Version 1.01.03 - 13 Jun 2005
|
||||
|
||||
@@ -109,7 +109,7 @@ int do_command(struct local_client *client, struct clvm_header *msg, int msglen,
|
||||
|
||||
case CLVMD_CMD_LOCK_LV:
|
||||
/* This is the biggie */
|
||||
lock_cmd = args[0];
|
||||
lock_cmd = args[0] & 0x3F;
|
||||
lock_flags = args[1];
|
||||
lockname = &args[2];
|
||||
status = do_lock_lv(lock_cmd, lock_flags, lockname);
|
||||
@@ -161,7 +161,7 @@ static int lock_vg(struct local_client *client)
|
||||
client->bits.localsock.private = (void *)lock_hash;
|
||||
}
|
||||
|
||||
lock_cmd = args[0];
|
||||
lock_cmd = args[0] & 0x3F;
|
||||
lock_flags = args[1];
|
||||
lockname = &args[2];
|
||||
DEBUGLOG("doing PRE command LOCK_VG '%s' at %x (client=%p)\n", lockname, lock_cmd, client);
|
||||
|
||||
@@ -747,6 +747,7 @@ static int read_from_local_sock(struct local_client *thisfd)
|
||||
|
||||
/* If the client went away in mid command then tidy up */
|
||||
if (thisfd->bits.localsock.in_progress) {
|
||||
pthread_kill(thisfd->bits.localsock.threadid, SIGUSR2);
|
||||
pthread_mutex_lock(&thisfd->bits.localsock.mutex);
|
||||
thisfd->bits.localsock.state = POST_COMMAND;
|
||||
pthread_cond_signal(&thisfd->bits.localsock.cond);
|
||||
@@ -763,7 +764,6 @@ static int read_from_local_sock(struct local_client *thisfd)
|
||||
thisfd->bits.localsock.state = PRE_COMMAND;
|
||||
pthread_cond_signal(&thisfd->bits.localsock.cond);
|
||||
pthread_mutex_unlock(&thisfd->bits.localsock.mutex);
|
||||
pthread_kill(thisfd->bits.localsock.threadid, SIGUSR2);
|
||||
|
||||
jstat =
|
||||
pthread_join(thisfd->bits.localsock.threadid,
|
||||
|
||||
@@ -168,11 +168,12 @@ int hold_unlock(char *resource)
|
||||
*/
|
||||
|
||||
/* Activate LV exclusive or non-exclusive */
|
||||
static int do_activate_lv(char *resource, int mode)
|
||||
static int do_activate_lv(char *resource, unsigned char lock_flags, int mode)
|
||||
{
|
||||
int oldmode;
|
||||
int status;
|
||||
int activate_lv;
|
||||
int exclusive = 0;
|
||||
struct lvinfo lvi;
|
||||
|
||||
/* Is it already open ? */
|
||||
@@ -189,13 +190,17 @@ static int do_activate_lv(char *resource, int mode)
|
||||
return 0; /* Success, we did nothing! */
|
||||
|
||||
/* Do we need to activate exclusively? */
|
||||
if (activate_lv == 2)
|
||||
if ((activate_lv == 2) || (mode == LKM_EXMODE)) {
|
||||
exclusive = 1;
|
||||
mode = LKM_EXMODE;
|
||||
}
|
||||
|
||||
/* OK, try to get the lock */
|
||||
status = hold_lock(resource, mode, LKF_NOQUEUE);
|
||||
if (status)
|
||||
return errno;
|
||||
/* Try to get the lock if it's a clustered volume group */
|
||||
if (lock_flags & LCK_CLUSTER_VG) {
|
||||
status = hold_lock(resource, mode, LKF_NOQUEUE);
|
||||
if (status)
|
||||
return errno;
|
||||
}
|
||||
|
||||
/* If it's suspended then resume it */
|
||||
if (!lv_info_by_lvid(cmd, resource, &lvi, 0))
|
||||
@@ -206,7 +211,7 @@ static int do_activate_lv(char *resource, int mode)
|
||||
return EIO;
|
||||
|
||||
/* Now activate it */
|
||||
if (!lv_activate(cmd, resource))
|
||||
if (!lv_activate(cmd, resource, exclusive))
|
||||
return EIO;
|
||||
|
||||
return 0;
|
||||
@@ -255,14 +260,14 @@ static int do_suspend_lv(char *resource)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int do_deactivate_lv(char *resource)
|
||||
static int do_deactivate_lv(char *resource, unsigned char lock_flags)
|
||||
{
|
||||
int oldmode;
|
||||
int status;
|
||||
|
||||
/* Is it open ? */
|
||||
oldmode = get_current_lock(resource);
|
||||
if (oldmode == -1) {
|
||||
if (oldmode == -1 && (lock_flags & LCK_CLUSTER_VG)) {
|
||||
DEBUGLOG("do_deactivate_lock, lock not already held\n");
|
||||
return 0; /* We don't need to do anything */
|
||||
}
|
||||
@@ -270,9 +275,11 @@ static int do_deactivate_lv(char *resource)
|
||||
if (!lv_deactivate(cmd, resource))
|
||||
return EIO;
|
||||
|
||||
status = hold_unlock(resource);
|
||||
if (status)
|
||||
return errno;
|
||||
if (lock_flags & LCK_CLUSTER_VG) {
|
||||
status = hold_unlock(resource);
|
||||
if (status)
|
||||
return errno;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -283,7 +290,7 @@ int do_lock_lv(unsigned char command, unsigned char lock_flags, char *resource)
|
||||
{
|
||||
int status = 0;
|
||||
|
||||
DEBUGLOG("do_lock_lv: resource '%s', cmd = 0x%x, flags = %d\n",
|
||||
DEBUGLOG("do_lock_lv: resource '%s', cmd = 0x%x, flags = %x\n",
|
||||
resource, command, lock_flags);
|
||||
|
||||
if (!cmd->config_valid || config_files_changed(cmd)) {
|
||||
@@ -296,7 +303,7 @@ int do_lock_lv(unsigned char command, unsigned char lock_flags, char *resource)
|
||||
|
||||
switch (command) {
|
||||
case LCK_LV_EXCLUSIVE:
|
||||
status = do_activate_lv(resource, LKM_EXMODE);
|
||||
status = do_activate_lv(resource, lock_flags, LKM_EXMODE);
|
||||
break;
|
||||
|
||||
case LCK_LV_SUSPEND:
|
||||
@@ -309,11 +316,11 @@ int do_lock_lv(unsigned char command, unsigned char lock_flags, char *resource)
|
||||
break;
|
||||
|
||||
case LCK_LV_ACTIVATE:
|
||||
status = do_activate_lv(resource, LKM_CRMODE);
|
||||
status = do_activate_lv(resource, lock_flags, LKM_CRMODE);
|
||||
break;
|
||||
|
||||
case LCK_LV_DEACTIVATE:
|
||||
status = do_deactivate_lv(resource);
|
||||
status = do_deactivate_lv(resource, lock_flags);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -433,23 +440,24 @@ static void drop_vg_locks()
|
||||
*/
|
||||
static void *get_initial_state()
|
||||
{
|
||||
char lv[64], vg[64], flags[25];
|
||||
char lv[64], vg[64], flags[25], vg_flags[25];
|
||||
char uuid[65];
|
||||
char line[255];
|
||||
FILE *lvs =
|
||||
popen
|
||||
("lvm lvs --nolocking --noheadings -o vg_uuid,lv_uuid,lv_attr",
|
||||
("lvm lvs --nolocking --noheadings -o vg_uuid,lv_uuid,lv_attr,vg_attr",
|
||||
"r");
|
||||
|
||||
if (!lvs)
|
||||
return NULL;
|
||||
|
||||
while (fgets(line, sizeof(line), lvs)) {
|
||||
if (sscanf(line, "%s %s %s\n", vg, lv, flags) == 3) {
|
||||
if (sscanf(line, "%s %s %s %s\n", vg, lv, flags, vg_flags) == 4) {
|
||||
|
||||
/* States: s:suspended a:active S:dropped snapshot I:invalid snapshot */
|
||||
if (strlen(vg) == 38 && /* is is a valid UUID ? */
|
||||
(flags[4] == 'a' || flags[4] == 's')) { /* is it active or suspended? */
|
||||
(flags[4] == 'a' || flags[4] == 's') && /* is it active or suspended? */
|
||||
vg_flags[5] == 'c') { /* is it clustered ? */
|
||||
/* Convert hyphen-separated UUIDs into one */
|
||||
memcpy(&uuid[0], &vg[0], 6);
|
||||
memcpy(&uuid[6], &vg[7], 4);
|
||||
|
||||
@@ -33,8 +33,12 @@ devices {
|
||||
# pattern, the device is accepted; otherwise if any name matches any 'r'
|
||||
# pattern it is rejected; otherwise it is accepted.
|
||||
|
||||
# Remember to run vgscan after you change this parameter to ensure
|
||||
# that the cache file gets regenerated (see below).
|
||||
# Don't have more than one filter line active at once: only one gets used.
|
||||
|
||||
# Run vgscan after you change this parameter to ensure that
|
||||
# the cache file gets regenerated (see below).
|
||||
# If it doesn't do what you expect, check the output of 'vgscan -vvvv'.
|
||||
|
||||
|
||||
# By default we accept every block device:
|
||||
filter = [ "a/.*/" ]
|
||||
|
||||
@@ -130,11 +130,11 @@ int lv_activation_filter(struct cmd_context *cmd, const char *lvid_s,
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
int lv_activate(struct cmd_context *cmd, const char *lvid_s)
|
||||
int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s)
|
||||
int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s, int exclusive)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
@@ -701,7 +701,8 @@ int lv_activation_filter(struct cmd_context *cmd, const char *lvid_s,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _lv_activate(struct cmd_context *cmd, const char *lvid_s, int filter)
|
||||
static int _lv_activate(struct cmd_context *cmd, const char *lvid_s,
|
||||
int exclusive, int filter)
|
||||
{
|
||||
struct logical_volume *lv;
|
||||
struct lvinfo info;
|
||||
@@ -732,6 +733,9 @@ static int _lv_activate(struct cmd_context *cmd, const char *lvid_s, int filter)
|
||||
if (info.exists && !info.suspended)
|
||||
return 1;
|
||||
|
||||
if (exclusive)
|
||||
lv->status |= ACTIVATE_EXCL;
|
||||
|
||||
memlock_inc();
|
||||
r = _lv_activate_lv(lv);
|
||||
memlock_dec();
|
||||
@@ -741,15 +745,15 @@ static int _lv_activate(struct cmd_context *cmd, const char *lvid_s, int filter)
|
||||
}
|
||||
|
||||
/* Activate LV */
|
||||
int lv_activate(struct cmd_context *cmd, const char *lvid_s)
|
||||
int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive)
|
||||
{
|
||||
return _lv_activate(cmd, lvid_s, 0);
|
||||
return _lv_activate(cmd, lvid_s, exclusive, 0);
|
||||
}
|
||||
|
||||
/* Activate LV only if it passes filter */
|
||||
int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s)
|
||||
int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s, int exclusive)
|
||||
{
|
||||
return _lv_activate(cmd, lvid_s, 1);
|
||||
return _lv_activate(cmd, lvid_s, exclusive, 1);
|
||||
}
|
||||
|
||||
int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv)
|
||||
|
||||
@@ -46,8 +46,9 @@ int lv_suspend(struct cmd_context *cmd, const char *lvid_s);
|
||||
int lv_suspend_if_active(struct cmd_context *cmd, const char *lvid_s);
|
||||
int lv_resume(struct cmd_context *cmd, const char *lvid_s);
|
||||
int lv_resume_if_active(struct cmd_context *cmd, const char *lvid_s);
|
||||
int lv_activate(struct cmd_context *cmd, const char *lvid_s);
|
||||
int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s);
|
||||
int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive);
|
||||
int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s,
|
||||
int exclusive);
|
||||
int lv_deactivate(struct cmd_context *cmd, const char *lvid_s);
|
||||
|
||||
int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv);
|
||||
|
||||
@@ -727,51 +727,25 @@ static int _emit_target_line(struct dev_manager *dm, struct dm_task *dmt,
|
||||
return 1;
|
||||
}
|
||||
|
||||
int compose_log_line(struct dev_manager *dm, struct lv_segment *seg,
|
||||
char *params, size_t paramsize, int *pos, int areas,
|
||||
uint32_t region_size)
|
||||
int build_dev_string(struct dev_manager *dm, char *dlid, char *devbuf,
|
||||
size_t bufsize, const char *desc)
|
||||
{
|
||||
int tw;
|
||||
char devbuf[10];
|
||||
char *name;
|
||||
struct dev_layer *dl;
|
||||
|
||||
if (!seg->log_lv)
|
||||
tw = lvm_snprintf(params, paramsize, "core 1 %u %u ",
|
||||
region_size, areas);
|
||||
else {
|
||||
if (!(name = build_dm_name(dm->mem, seg->log_lv->vg->name,
|
||||
seg->log_lv->name, NULL))) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(dl = hash_lookup(dm->layers, seg->log_lv->lvid.s))) {
|
||||
log_error("device layer %s missing from hash",
|
||||
seg->log_lv->lvid.s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!dm_format_dev(devbuf, sizeof(devbuf), dl->info.major,
|
||||
dl->info.minor)) {
|
||||
log_error("Failed to format device number as dm "
|
||||
"target (%u,%u)",
|
||||
dl->info.major, dl->info.minor);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* FIXME add sync parm? */
|
||||
tw = lvm_snprintf(params, paramsize, "disk 2 %s %u %u ",
|
||||
devbuf, region_size, areas);
|
||||
if (!(dl = hash_lookup(dm->layers, dlid))) {
|
||||
log_error("%s device layer %s missing from hash",
|
||||
desc, dlid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (tw < 0) {
|
||||
stack;
|
||||
return -1;
|
||||
if (!dm_format_dev(devbuf, bufsize, dl->info.major,
|
||||
dl->info.minor)) {
|
||||
log_error("Failed to format %s device number for %s as dm "
|
||||
"target (%u,%u)",
|
||||
desc, dlid, dl->info.major, dl->info.minor);
|
||||
return 0;
|
||||
}
|
||||
|
||||
*pos += tw;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -783,7 +757,6 @@ int compose_areas_line(struct dev_manager *dm, struct lv_segment *seg,
|
||||
int tw = 0;
|
||||
const char *trailing_space;
|
||||
uint64_t esize = seg->lv->vg->extent_size;
|
||||
struct dev_layer *dl;
|
||||
char devbuf[10];
|
||||
|
||||
for (s = start_area; s < areas; s++, *pos += tw) {
|
||||
@@ -804,18 +777,9 @@ int compose_areas_line(struct dev_manager *dm, struct lv_segment *seg,
|
||||
(esize * seg_pe(seg, s))),
|
||||
trailing_space);
|
||||
else if (seg_type(seg, s) == AREA_LV) {
|
||||
if (!(dl = hash_lookup(dm->layers,
|
||||
seg_lv(seg, s)->lvid.s))) {
|
||||
log_error("device layer %s missing from hash",
|
||||
seg_lv(seg, s)->lvid.s);
|
||||
return 0;
|
||||
}
|
||||
if (!dm_format_dev
|
||||
(devbuf, sizeof(devbuf), dl->info.major,
|
||||
dl->info.minor)) {
|
||||
log_error
|
||||
("Failed to format device number as dm target (%u,%u)",
|
||||
dl->info.major, dl->info.minor);
|
||||
if (!build_dev_string(dm, seg_lv(seg, s)->lvid.s, devbuf,
|
||||
sizeof(devbuf), "LV")) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
tw = lvm_snprintf(params + *pos, paramsize - *pos,
|
||||
@@ -824,7 +788,7 @@ int compose_areas_line(struct dev_manager *dm, struct lv_segment *seg,
|
||||
trailing_space);
|
||||
} else {
|
||||
log_error("Internal error: Unassigned area found in LV %s.",
|
||||
seg->lv);
|
||||
seg->lv->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -892,22 +856,14 @@ static int _populate_origin(struct dev_manager *dm,
|
||||
{
|
||||
char *real;
|
||||
char params[PATH_MAX + 32];
|
||||
struct dev_layer *dlr;
|
||||
|
||||
if (!(real = _build_dlid(dm->mem, dl->lv->lvid.s, "real"))) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(dlr = hash_lookup(dm->layers, real))) {
|
||||
log_error("Couldn't find real device layer %s in hash", real);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!dm_format_dev(params, sizeof(params), dlr->info.major,
|
||||
dlr->info.minor)) {
|
||||
log_error("Couldn't create origin device parameters for '%s'.",
|
||||
real);
|
||||
if (!build_dev_string(dm, real, params, sizeof(params), "origin")) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -928,7 +884,6 @@ static int _populate_snapshot(struct dev_manager *dm,
|
||||
char *origin, *cow;
|
||||
char params[PATH_MAX * 2 + 32];
|
||||
struct lv_segment *snap_seg;
|
||||
struct dev_layer *dlo, *dlc;
|
||||
char devbufo[10], devbufc[10];
|
||||
uint64_t size;
|
||||
|
||||
@@ -948,28 +903,13 @@ static int _populate_snapshot(struct dev_manager *dm,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(dlo = hash_lookup(dm->layers, origin))) {
|
||||
log_error("Couldn't find origin device layer %s in hash",
|
||||
origin);
|
||||
if (!build_dev_string(dm, origin, devbufo, sizeof(devbufo), "origin")) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(dlc = hash_lookup(dm->layers, cow))) {
|
||||
log_error("Couldn't find cow device layer %s in hash", cow);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!dm_format_dev(devbufo, sizeof(devbufo), dlo->info.major,
|
||||
dlo->info.minor)) {
|
||||
log_error("Couldn't create origin device parameters for '%s'.",
|
||||
snap_seg->origin->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!dm_format_dev(devbufc, sizeof(devbufc), dlc->info.major,
|
||||
dlc->info.minor)) {
|
||||
log_error("Couldn't create cow device parameters for '%s'.",
|
||||
snap_seg->cow->name);
|
||||
if (!build_dev_string(dm, cow, devbufc, sizeof(devbufc), "cow")) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1420,11 +1360,19 @@ static int _expand_lv(struct dev_manager *dm, struct logical_volume *lv)
|
||||
/*
|
||||
* FIXME: this doesn't cope with recursive snapshots yet.
|
||||
*/
|
||||
if ((snap_seg = find_cow(lv)))
|
||||
if ((snap_seg = find_cow(lv))) {
|
||||
if (lv->vg->status & CLUSTERED) {
|
||||
log_error("Clustered snapshots are not yet supported");
|
||||
return 0;
|
||||
}
|
||||
return _expand_snapshot(dm, lv, snap_seg);
|
||||
|
||||
else if (lv_is_origin(lv))
|
||||
} else if (lv_is_origin(lv)) {
|
||||
if (lv->vg->status & CLUSTERED) {
|
||||
log_error("Clustered snapshots are not yet supported");
|
||||
return 0;
|
||||
}
|
||||
return _expand_origin(dm, lv);
|
||||
}
|
||||
|
||||
return _expand_vanilla(dm, lv, 0);
|
||||
}
|
||||
|
||||
@@ -23,8 +23,7 @@ int compose_areas_line(struct dev_manager *dm, struct lv_segment *seg,
|
||||
char *params, size_t paramsize, int *pos,
|
||||
int start_area, int areas);
|
||||
|
||||
int compose_log_line(struct dev_manager *dm, struct lv_segment *seg,
|
||||
char *params, size_t paramsize, int *pos, int areas,
|
||||
uint32_t region_size);
|
||||
int build_dev_string(struct dev_manager *dm, char *dlid, char *devbuf,
|
||||
size_t bufsize, const char *desc);
|
||||
|
||||
#endif
|
||||
|
||||
15
lib/cache/lvmcache.c
vendored
15
lib/cache/lvmcache.c
vendored
@@ -495,17 +495,32 @@ struct lvmcache_info *lvmcache_add(struct labeller *labeller, const char *pvid,
|
||||
pvid, dev_name(dev),
|
||||
dev_name(existing->dev));
|
||||
return NULL;
|
||||
} else if (is_dm_major(MAJOR(existing->dev->dev)) &&
|
||||
!is_dm_major(MAJOR(dev->dev))) {
|
||||
log_very_verbose("Ignoring duplicate PV %s on "
|
||||
"%s - using dm %s",
|
||||
pvid, dev_name(dev),
|
||||
dev_name(existing->dev));
|
||||
return NULL;
|
||||
} else if (MAJOR(existing->dev->dev) != md_major() &&
|
||||
MAJOR(dev->dev) == md_major())
|
||||
log_very_verbose("Duplicate PV %s on %s - "
|
||||
"using md %s", pvid,
|
||||
dev_name(existing->dev),
|
||||
dev_name(dev));
|
||||
else if (!is_dm_major(MAJOR(existing->dev->dev)) &&
|
||||
is_dm_major(MAJOR(dev->dev)))
|
||||
log_very_verbose("Duplicate PV %s on %s - "
|
||||
"using dm %s", pvid,
|
||||
dev_name(existing->dev),
|
||||
dev_name(dev));
|
||||
else
|
||||
log_error("Found duplicate PV %s: using %s not "
|
||||
"%s", pvid, dev_name(dev),
|
||||
dev_name(existing->dev));
|
||||
}
|
||||
/* Switch over to new preferred device */
|
||||
existing->dev = dev;
|
||||
info = existing;
|
||||
/* Has labeller changed? */
|
||||
if (info->label->labeller != labeller) {
|
||||
|
||||
@@ -23,12 +23,21 @@ bitset_t bitset_create(struct pool *mem, unsigned num_bits)
|
||||
{
|
||||
unsigned n = (num_bits / BITS_PER_INT) + 2;
|
||||
size_t size = sizeof(int) * n;
|
||||
unsigned *bs = pool_zalloc(mem, size);
|
||||
bitset_t bs;
|
||||
|
||||
if (mem)
|
||||
bs = pool_zalloc(mem, size);
|
||||
else
|
||||
bs = dbg_malloc(size);
|
||||
|
||||
if (!bs)
|
||||
return NULL;
|
||||
|
||||
*bs = num_bits;
|
||||
|
||||
if (!mem)
|
||||
bit_clear_all(bs);
|
||||
|
||||
return bs;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "lvm-string.h"
|
||||
#include "config.h"
|
||||
#include "metadata.h"
|
||||
#include "bitset.h"
|
||||
|
||||
#include <dirent.h>
|
||||
#include <unistd.h>
|
||||
@@ -38,12 +39,18 @@ typedef struct {
|
||||
} device_info_t;
|
||||
|
||||
static int _md_major = -1;
|
||||
static bitset_t _dm_bitset;
|
||||
|
||||
int md_major(void)
|
||||
{
|
||||
return _md_major;
|
||||
}
|
||||
|
||||
int is_dm_major(int major)
|
||||
{
|
||||
return bit(_dm_bitset, major) ? 1 : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Devices are only checked for partition tables if their minor number
|
||||
* is a multiple of the number corresponding to their type below
|
||||
@@ -71,6 +78,7 @@ static const device_info_t device_info[] = {
|
||||
{"iseries/vd", 8}, /* iSeries disks */
|
||||
{"gnbd", 1}, /* Network block device */
|
||||
{"ramdisk", 1}, /* RAM disk */
|
||||
{"aoe", 16}, /* ATA over Ethernet */
|
||||
{NULL, 0}
|
||||
};
|
||||
|
||||
@@ -180,6 +188,11 @@ static int _scan_proc_dev(const char *proc, const struct config_node *cn)
|
||||
if (!strncmp("md", line + i, 2) && isspace(*(line + i + 2)))
|
||||
_md_major = line_maj;
|
||||
|
||||
/* Look for dm devices */
|
||||
if (!strncmp("device-mapper", line + i, 13) &&
|
||||
isspace(*(line + i + 13)))
|
||||
bit_set(_dm_bitset, line_maj);
|
||||
|
||||
/* Go through the valid device names and if there is a
|
||||
match store max number of partitions */
|
||||
for (j = 0; device_info[j].name != NULL; j++) {
|
||||
@@ -250,6 +263,12 @@ struct dev_filter *lvm_type_filter_create(const char *proc,
|
||||
f->destroy = lvm_type_filter_destroy;
|
||||
f->private = NULL;
|
||||
|
||||
if (!(_dm_bitset = bitset_create(NULL, NUMBER_OF_MAJORS))) {
|
||||
stack;
|
||||
dbg_free(f);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!_scan_proc_dev(proc, cn)) {
|
||||
stack;
|
||||
return NULL;
|
||||
@@ -260,6 +279,7 @@ struct dev_filter *lvm_type_filter_create(const char *proc,
|
||||
|
||||
void lvm_type_filter_destroy(struct dev_filter *f)
|
||||
{
|
||||
bitset_destroy(_dm_bitset);
|
||||
dbg_free(f);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ struct dev_filter *lvm_type_filter_create(const char *proc,
|
||||
void lvm_type_filter_destroy(struct dev_filter *f);
|
||||
|
||||
int md_major(void);
|
||||
|
||||
int is_dm_major(int major);
|
||||
int max_partitions(int major);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -506,6 +506,9 @@ static int _write_vgd(struct disk_list *data)
|
||||
struct vg_disk *vgd = &data->vgd;
|
||||
uint64_t pos = data->pvd.vg_on_disk.base;
|
||||
|
||||
log_debug("Writing %s VG metadata to %s at %" PRIu64 " len %" PRIsize_t,
|
||||
data->pvd.vg_name, dev_name(data->dev), pos, sizeof(*vgd));
|
||||
|
||||
_xlate_vgd(vgd);
|
||||
if (!dev_write(data->dev, pos, sizeof(*vgd), vgd))
|
||||
fail;
|
||||
@@ -528,6 +531,10 @@ static int _write_uuids(struct disk_list *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
log_debug("Writing %s uuidlist to %s at %" PRIu64 " len %"
|
||||
PRIsize_t, data->pvd.vg_name, dev_name(data->dev),
|
||||
pos, NAME_LEN);
|
||||
|
||||
if (!dev_write(data->dev, pos, NAME_LEN, ul->uuid))
|
||||
fail;
|
||||
|
||||
@@ -539,6 +546,10 @@ static int _write_uuids(struct disk_list *data)
|
||||
|
||||
static int _write_lvd(struct device *dev, uint64_t pos, struct lv_disk *disk)
|
||||
{
|
||||
log_debug("Writing %s LV %s metadata to %s at %" PRIu64 " len %"
|
||||
PRIsize_t, disk->vg_name, disk->lv_name, dev_name(dev),
|
||||
pos, sizeof(*disk));
|
||||
|
||||
_xlate_lvd(disk);
|
||||
if (!dev_write(dev, pos, sizeof(*disk), disk))
|
||||
fail;
|
||||
@@ -581,6 +592,10 @@ static int _write_extents(struct disk_list *data)
|
||||
struct pe_disk *extents = data->extents;
|
||||
uint64_t pos = data->pvd.pe_on_disk.base;
|
||||
|
||||
log_debug("Writing %s extents metadata to %s at %" PRIu64 " len %"
|
||||
PRIsize_t, data->pvd.vg_name, dev_name(data->dev),
|
||||
pos, len);
|
||||
|
||||
_xlate_extents(extents, data->pvd.pe_total);
|
||||
if (!dev_write(data->dev, pos, len, extents))
|
||||
fail;
|
||||
@@ -613,6 +628,10 @@ static int _write_pvd(struct disk_list *data)
|
||||
memset(buf, 0, size);
|
||||
memcpy(buf, &data->pvd, sizeof(struct pv_disk));
|
||||
|
||||
log_debug("Writing %s PV metadata to %s at %" PRIu64 " len %"
|
||||
PRIsize_t, data->pvd.vg_name, dev_name(data->dev),
|
||||
pos, size);
|
||||
|
||||
_xlate_pvd((struct pv_disk *) buf);
|
||||
if (!dev_write(data->dev, pos, size, buf)) {
|
||||
dbg_free(buf);
|
||||
|
||||
@@ -57,6 +57,7 @@ static struct flag _lv_flags[] = {
|
||||
{MIRRORED, NULL},
|
||||
{VIRTUAL, NULL},
|
||||
{SNAPSHOT, NULL},
|
||||
{ACTIVATE_EXCL, NULL},
|
||||
{0, NULL}
|
||||
};
|
||||
|
||||
|
||||
@@ -666,7 +666,7 @@ static int _vg_write_file(struct format_instance *fid, struct volume_group *vg,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (fsync(fd)) {
|
||||
if (fsync(fd) && (errno != EROFS) && (errno != EINVAL)) {
|
||||
log_sys_error("fsync", tc->path_edit);
|
||||
fclose(fp);
|
||||
return 0;
|
||||
|
||||
@@ -327,8 +327,8 @@ static int _lock_for_cluster(unsigned char cmd, unsigned int flags, char *name)
|
||||
args = alloca(len);
|
||||
strcpy(args + 2, name);
|
||||
|
||||
args[0] = flags & 0xBF; /* Maskoff LOCAL flag */
|
||||
args[1] = 0; /* Not used now */
|
||||
args[0] = flags & 0x7F; /* Maskoff lock flags */
|
||||
args[1] = flags & 0xC0; /* Bitmap flags */
|
||||
|
||||
/*
|
||||
* VG locks are just that: locks, and have no side effects
|
||||
@@ -339,7 +339,8 @@ static int _lock_for_cluster(unsigned char cmd, unsigned int flags, char *name)
|
||||
*/
|
||||
if (cmd == CLVMD_CMD_LOCK_VG ||
|
||||
(flags & LCK_TYPE_MASK) == LCK_EXCL ||
|
||||
(flags & LCK_LOCAL))
|
||||
(flags & LCK_LOCAL) ||
|
||||
!(flags & LCK_CLUSTER_VG))
|
||||
node = ".";
|
||||
|
||||
status = _cluster_request(cmd, node, args, len,
|
||||
|
||||
@@ -243,7 +243,7 @@ static int _file_lock_resource(struct cmd_context *cmd, const char *resource,
|
||||
break;
|
||||
case LCK_READ:
|
||||
log_debug("Locking LV %s (R)", resource);
|
||||
if (!lv_activate_with_filter(cmd, resource))
|
||||
if (!lv_activate_with_filter(cmd, resource, 0))
|
||||
return 0;
|
||||
break;
|
||||
case LCK_WRITE:
|
||||
@@ -253,7 +253,7 @@ static int _file_lock_resource(struct cmd_context *cmd, const char *resource,
|
||||
break;
|
||||
case LCK_EXCL:
|
||||
log_debug("Locking LV %s (EX)", resource);
|
||||
if (!lv_activate_with_filter(cmd, resource))
|
||||
if (!lv_activate_with_filter(cmd, resource, 1))
|
||||
return 0;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -268,7 +268,7 @@ int resume_lvs(struct cmd_context *cmd, struct list *lvs)
|
||||
struct lv_list *lvl;
|
||||
|
||||
list_iterate_items(lvl, lvs)
|
||||
resume_lv(cmd, lvl->lv->lvid.s);
|
||||
resume_lv(cmd, lvl->lv);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -280,11 +280,11 @@ int suspend_lvs(struct cmd_context *cmd, struct list *lvs)
|
||||
struct lv_list *lvl;
|
||||
|
||||
list_iterate_items(lvl, lvs) {
|
||||
if (!suspend_lv(cmd, lvl->lv->lvid.s)) {
|
||||
if (!suspend_lv(cmd, lvl->lv)) {
|
||||
log_error("Failed to suspend %s", lvl->lv->name);
|
||||
list_uniterate(lvh, lvs, &lvl->list) {
|
||||
lvl = list_item(lvh, struct lv_list);
|
||||
resume_lv(cmd, lvl->lv->lvid.s);
|
||||
resume_lv(cmd, lvl->lv);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -301,11 +301,11 @@ int activate_lvs_excl(struct cmd_context *cmd, struct list *lvs)
|
||||
struct lv_list *lvl;
|
||||
|
||||
list_iterate_items(lvl, lvs) {
|
||||
if (!activate_lv_excl(cmd, lvl->lv->lvid.s)) {
|
||||
if (!activate_lv_excl(cmd, lvl->lv)) {
|
||||
log_error("Failed to activate %s", lvl->lv->name);
|
||||
list_uniterate(lvh, lvs, &lvl->list) {
|
||||
lvl = list_item(lvh, struct lv_list);
|
||||
activate_lv(cmd, lvl->lv->lvid.s);
|
||||
activate_lv(cmd, lvl->lv);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -65,6 +65,7 @@ int check_lvm1_vg_inactive(struct cmd_context *cmd, const char *vgname);
|
||||
#define LCK_NONBLOCK 0x00000010 /* Don't block waiting for lock? */
|
||||
#define LCK_HOLD 0x00000020 /* Hold lock when lock_vol returns? */
|
||||
#define LCK_LOCAL 0x00000040 /* Don't propagate to other nodes */
|
||||
#define LCK_CLUSTER_VG 0x00000080 /* VG is clustered */
|
||||
|
||||
/*
|
||||
* Common combinations
|
||||
@@ -79,22 +80,27 @@ int check_lvm1_vg_inactive(struct cmd_context *cmd, const char *vgname);
|
||||
#define LCK_LV_ACTIVATE (LCK_LV | LCK_READ | LCK_NONBLOCK)
|
||||
#define LCK_LV_DEACTIVATE (LCK_LV | LCK_NULL | LCK_NONBLOCK)
|
||||
|
||||
#define LCK_LV_CLUSTERED(lv) \
|
||||
(((lv)->vg->status & CLUSTERED) ? LCK_CLUSTER_VG : 0)
|
||||
|
||||
#define lock_lv_vol(cmd, lv, flags) \
|
||||
lock_vol(cmd, (lv)->lvid.s, flags | LCK_LV_CLUSTERED(lv))
|
||||
|
||||
#define unlock_vg(cmd, vol) lock_vol(cmd, vol, LCK_VG_UNLOCK)
|
||||
|
||||
#define resume_lv(cmd, vol) lock_vol(cmd, vol, LCK_LV_RESUME)
|
||||
#define suspend_lv(cmd, vol) lock_vol(cmd, vol, LCK_LV_SUSPEND | LCK_HOLD)
|
||||
#define deactivate_lv(cmd, vol) lock_vol(cmd, vol, LCK_LV_DEACTIVATE)
|
||||
#define activate_lv(cmd, vol) lock_vol(cmd, vol, LCK_LV_ACTIVATE | LCK_HOLD)
|
||||
#define activate_lv_excl(cmd, vol) \
|
||||
lock_vol(cmd, vol, LCK_LV_EXCLUSIVE | LCK_HOLD)
|
||||
#define activate_lv_local(cmd, vol) \
|
||||
lock_vol(cmd, vol, LCK_LV_ACTIVATE | LCK_HOLD | LCK_LOCAL)
|
||||
#define deactivate_lv_local(cmd, vol) \
|
||||
lock_vol(cmd, vol, LCK_LV_DEACTIVATE | LCK_LOCAL)
|
||||
#define resume_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_RESUME)
|
||||
#define suspend_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_SUSPEND | LCK_HOLD)
|
||||
#define deactivate_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_DEACTIVATE)
|
||||
#define activate_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_ACTIVATE | LCK_HOLD)
|
||||
#define activate_lv_excl(cmd, lv) \
|
||||
lock_lv_vol(cmd, lv, LCK_LV_EXCLUSIVE | LCK_HOLD)
|
||||
#define activate_lv_local(cmd, lv) \
|
||||
lock_lv_vol(cmd, lv, LCK_LV_ACTIVATE | LCK_HOLD | LCK_LOCAL)
|
||||
#define deactivate_lv_local(cmd, lv) \
|
||||
lock_lv_vol(cmd, lv, LCK_LV_DEACTIVATE | LCK_LOCAL)
|
||||
|
||||
/* Process list of LVs */
|
||||
int suspend_lvs(struct cmd_context *cmd, struct list *lvs);
|
||||
int resume_lvs(struct cmd_context *cmd, struct list *lvs);
|
||||
int activate_lvs_excl(struct cmd_context *cmd, struct list *lvs);
|
||||
|
||||
|
||||
|
||||
@@ -58,11 +58,11 @@ static int _no_lock_resource(struct cmd_context *cmd, const char *resource,
|
||||
case LCK_UNLOCK:
|
||||
return lv_resume_if_active(cmd, resource);
|
||||
case LCK_READ:
|
||||
return lv_activate_with_filter(cmd, resource);
|
||||
return lv_activate_with_filter(cmd, resource, 0);
|
||||
case LCK_WRITE:
|
||||
return lv_suspend_if_active(cmd, resource);
|
||||
case LCK_EXCL:
|
||||
return lv_activate_with_filter(cmd, resource);
|
||||
return lv_activate_with_filter(cmd, resource, 1);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
#define VIRTUAL 0x00010000 /* LV - internal use only */
|
||||
#define MIRROR_LOG 0x00020000 /* LV */
|
||||
#define MIRROR_IMAGE 0x00040000 /* LV */
|
||||
#define ACTIVATE_EXCL 0x00080000 /* LV - internal use only */
|
||||
|
||||
#define LVM_READ 0x00000100 /* LV VG */
|
||||
#define LVM_WRITE 0x00000200 /* LV VG */
|
||||
@@ -543,6 +544,8 @@ int vg_remove_snapshot(struct logical_volume *cow);
|
||||
* Mirroring functions
|
||||
*/
|
||||
struct alloc_handle;
|
||||
uint32_t adjusted_mirror_region_size(uint32_t extent_size, uint32_t extents,
|
||||
uint32_t region_size);
|
||||
int create_mirror_layers(struct alloc_handle *ah,
|
||||
uint32_t first_area,
|
||||
uint32_t num_mirrors,
|
||||
|
||||
@@ -22,6 +22,26 @@
|
||||
#include "lv_alloc.h"
|
||||
#include "lvm-string.h"
|
||||
|
||||
/*
|
||||
* Ensure region size is compatible with volume size.
|
||||
*/
|
||||
uint32_t adjusted_mirror_region_size(uint32_t extent_size, uint32_t extents,
|
||||
uint32_t region_size)
|
||||
{
|
||||
uint32_t region_max;
|
||||
|
||||
region_max = (1 << (ffs(extents) - 1)) * extent_size;
|
||||
|
||||
if (region_max < region_size) {
|
||||
region_size = region_max;
|
||||
log_print("Using reduced mirror region size of %" PRIu32
|
||||
" sectors", region_max);
|
||||
return region_max;
|
||||
}
|
||||
|
||||
return region_size;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reduce mirrored_seg to num_mirrors images.
|
||||
*/
|
||||
|
||||
@@ -165,6 +165,47 @@ static struct mirror_state *_init_target(struct pool *mem,
|
||||
return mirr_state;
|
||||
}
|
||||
|
||||
static int _compose_log_line(struct dev_manager *dm, struct lv_segment *seg,
|
||||
char *params, size_t paramsize, int *pos,
|
||||
int areas, uint32_t region_size)
|
||||
{
|
||||
int tw;
|
||||
char devbuf[10];
|
||||
const char *clustered = "";
|
||||
|
||||
/*
|
||||
* Use clustered mirror log for non-exclusive activation
|
||||
* in clustered VG.
|
||||
*/
|
||||
if ((!(seg->lv->status & ACTIVATE_EXCL) &&
|
||||
(seg->lv->vg->status & CLUSTERED)))
|
||||
clustered = "cluster ";
|
||||
|
||||
if (!seg->log_lv)
|
||||
tw = lvm_snprintf(params, paramsize, "%score 1 %u %u ",
|
||||
clustered, region_size, areas);
|
||||
else {
|
||||
if (!build_dev_string(dm, seg->log_lv->lvid.s, devbuf,
|
||||
sizeof(devbuf), "log")) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* FIXME add sync parm? */
|
||||
tw = lvm_snprintf(params, paramsize, "%sdisk 2 %s %u %u ",
|
||||
clustered, devbuf, region_size, areas);
|
||||
}
|
||||
|
||||
if (tw < 0) {
|
||||
stack;
|
||||
return -1;
|
||||
}
|
||||
|
||||
*pos += tw;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _compose_target_line(struct dev_manager *dm, struct pool *mem,
|
||||
struct config_tree *cft, void **target_state,
|
||||
struct lv_segment *seg, char *params,
|
||||
@@ -220,8 +261,8 @@ static int _compose_target_line(struct dev_manager *dm, struct pool *mem,
|
||||
}
|
||||
}
|
||||
|
||||
if ((ret = compose_log_line(dm, seg, params, paramsize, pos,
|
||||
areas, region_size)) <= 0) {
|
||||
if ((ret = _compose_log_line(dm, seg, params, paramsize, pos,
|
||||
areas, region_size)) <= 0) {
|
||||
stack;
|
||||
return ret;
|
||||
}
|
||||
@@ -238,18 +279,41 @@ static int _target_percent(void **target_state, struct pool *mem,
|
||||
{
|
||||
struct mirror_state *mirr_state;
|
||||
uint64_t numerator, denominator;
|
||||
unsigned mirror_count, m;
|
||||
int used;
|
||||
char *pos = params;
|
||||
|
||||
if (!*target_state)
|
||||
*target_state = _init_target(mem, cft);
|
||||
|
||||
mirr_state = *target_state;
|
||||
|
||||
/* Status line: <#mirrors> (maj:min)+ <synced>/<total_regions> */
|
||||
log_debug("Mirror status: %s", params);
|
||||
if (sscanf(params, "%*d %*x:%*x %*x:%*x %" PRIu64
|
||||
"/%" PRIu64, &numerator, &denominator) != 2) {
|
||||
log_error("Failure parsing mirror status: %s", params);
|
||||
|
||||
if (sscanf(pos, "%u %n", mirror_count, used) != 1) {
|
||||
log_error("Failure parsing mirror status mirror count: %s",
|
||||
params);
|
||||
return 0;
|
||||
}
|
||||
pos += used;
|
||||
|
||||
for (m = 0; m < mirror_count; m++) {
|
||||
if (sscanf(pos, "%*x:%*x %n", &used) != 0) {
|
||||
log_error("Failure parsing mirror status devices: %s",
|
||||
params);
|
||||
return 0;
|
||||
}
|
||||
pos += used;
|
||||
}
|
||||
|
||||
if (sscanf(pos, "%" PRIu64 "/%" PRIu64 "%n", &numerator, &denominator,
|
||||
&used) != 2) {
|
||||
log_error("Failure parsing mirror status fraction: %s", params);
|
||||
return 0;
|
||||
}
|
||||
pos += used;
|
||||
|
||||
*total_numerator += numerator;
|
||||
*total_denominator += denominator;
|
||||
|
||||
|
||||
@@ -236,7 +236,7 @@ void sync_dir(const char *file)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (fsync(fd) == -1)
|
||||
if (fsync(fd) && (errno != EROFS) && (errno != EINVAL))
|
||||
log_sys_error("fsync", dir);
|
||||
|
||||
close(fd);
|
||||
|
||||
@@ -22,21 +22,28 @@
|
||||
#include <sys/stat.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
void *load_shared_library(struct config_tree *cft, const char *libname,
|
||||
const char *desc)
|
||||
static void _get_library_path(struct config_tree *cft, const char *libname,
|
||||
char *path, int path_len)
|
||||
{
|
||||
char path[PATH_MAX];
|
||||
struct stat info;
|
||||
const char *lib_dir;
|
||||
void *library;
|
||||
|
||||
/* If libname doesn't begin with '/' then use lib_dir/libname,
|
||||
* if present */
|
||||
if (libname[0] == '/' ||
|
||||
!(lib_dir = find_config_str(cft->root, "global/library_dir", 0)) ||
|
||||
(lvm_snprintf(path, sizeof(path), "%s/%s", lib_dir,
|
||||
(lvm_snprintf(path, path_len, "%s/%s", lib_dir,
|
||||
libname) == -1) || stat(path, &info) == -1)
|
||||
strncpy(path, libname, sizeof(path));
|
||||
strncpy(path, libname, path_len);
|
||||
}
|
||||
|
||||
void *load_shared_library(struct config_tree *cft, const char *libname,
|
||||
const char *desc)
|
||||
{
|
||||
char path[PATH_MAX];
|
||||
void *library;
|
||||
|
||||
_get_library_path(cft, libname, path, sizeof(path));
|
||||
|
||||
log_very_verbose("Opening shared %s library %s", desc, path);
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ FIELD(VGS, vg, STR, "VG Tags", tags, 7, tags, "vg_tags")
|
||||
FIELD(SEGS, seg, STR, "Type", list, 4, segtype, "segtype")
|
||||
FIELD(SEGS, seg, NUM, "#Str", area_count, 4, uint32, "stripes")
|
||||
FIELD(SEGS, seg, NUM, "Stripe", stripe_size, 6, size32, "stripesize")
|
||||
FIELD(SEGS, seg, NUM, "Chunk", chunk_size, 5, size32, "chunksize")
|
||||
FIELD(SEGS, seg, NUM, "Chunk", list, 5, chunksize, "chunksize")
|
||||
FIELD(SEGS, seg, NUM, "Region", region_size, 6, size32, "regionsize")
|
||||
FIELD(SEGS, seg, NUM, "Start", list, 5, segstart, "seg_start")
|
||||
FIELD(SEGS, seg, NUM, "SSize", list, 5, segsize, "seg_size")
|
||||
|
||||
@@ -432,7 +432,7 @@ static int _vgstatus_disp(struct report_handle *rh, struct field *field,
|
||||
const struct volume_group *vg = (const struct volume_group *) data;
|
||||
char *repstr;
|
||||
|
||||
if (!(repstr = pool_zalloc(rh->mem, 6))) {
|
||||
if (!(repstr = pool_zalloc(rh->mem, 7))) {
|
||||
log_error("pool_alloc failed");
|
||||
return 0;
|
||||
}
|
||||
@@ -459,6 +459,11 @@ static int _vgstatus_disp(struct report_handle *rh, struct field *field,
|
||||
|
||||
repstr[4] = _alloc_policy_char(vg->alloc);
|
||||
|
||||
if (vg->status & CLUSTERED)
|
||||
repstr[5] = 'c';
|
||||
else
|
||||
repstr[5] = '-';
|
||||
|
||||
field->report_string = repstr;
|
||||
field->sort_value = (const void *) field->report_string;
|
||||
|
||||
@@ -519,7 +524,8 @@ static int _lvname_disp(struct report_handle *rh, struct field *field,
|
||||
char *repstr;
|
||||
size_t len;
|
||||
|
||||
if (lv->status & VISIBLE_LV) {
|
||||
/* FIXME Remove need for snapshot special case */
|
||||
if (lv->status & VISIBLE_LV || lv_is_cow(lv)) {
|
||||
repstr = lv->name;
|
||||
return _string_disp(rh, field, &repstr);
|
||||
}
|
||||
@@ -654,6 +660,21 @@ static int _segsize_disp(struct report_handle *rh, struct field *field,
|
||||
return _size64_disp(rh, field, &size);
|
||||
}
|
||||
|
||||
static int _chunksize_disp(struct report_handle *rh, struct field *field,
|
||||
const void *data)
|
||||
{
|
||||
const struct lv_segment *seg = (const struct lv_segment *) data;
|
||||
struct lv_segment *snap_seg;
|
||||
uint64_t size;
|
||||
|
||||
if ((snap_seg = find_cow(seg->lv)))
|
||||
size = (uint64_t) snap_seg->chunk_size;
|
||||
else
|
||||
size = 0;
|
||||
|
||||
return _size64_disp(rh, field, &size);
|
||||
}
|
||||
|
||||
static int _pvused_disp(struct report_handle *rh, struct field *field,
|
||||
const void *data)
|
||||
{
|
||||
|
||||
@@ -63,6 +63,7 @@ static int _log_suppress = 0;
|
||||
static int _control_fd = -1;
|
||||
static int _version_checked = 0;
|
||||
static int _version_ok = 1;
|
||||
static unsigned _ioctl_buffer_double_factor = 0;
|
||||
|
||||
/*
|
||||
* Support both old and new major numbers to ease the transition.
|
||||
@@ -610,8 +611,10 @@ static int _dm_task_run_v1(struct dm_task *dmt)
|
||||
if (dmt->type == DM_DEVICE_TABLE)
|
||||
dmi->flags |= DM_STATUS_TABLE_FLAG;
|
||||
|
||||
log_debug("dm %s %s %s %s", _cmd_data_v1[dmt->type].name, dmi->name,
|
||||
dmi->uuid, dmt->newname ? dmt->newname : "");
|
||||
log_debug("dm %s %s %s%s%s [%u]", _cmd_data_v1[dmt->type].name,
|
||||
dmi->name, dmi->uuid, dmt->newname ? " " : "",
|
||||
dmt->newname ? dmt->newname : "",
|
||||
dmi->data_size);
|
||||
if (dmt->type == DM_DEVICE_LIST) {
|
||||
if (!_dm_names_v1(dmi))
|
||||
goto bad;
|
||||
@@ -1026,7 +1029,7 @@ static void *_add_target(struct target *t, void *out, void *end)
|
||||
return out;
|
||||
}
|
||||
|
||||
static struct dm_ioctl *_flatten(struct dm_task *dmt)
|
||||
static struct dm_ioctl *_flatten(struct dm_task *dmt, unsigned repeat_count)
|
||||
{
|
||||
const size_t min_size = 16 * 1024;
|
||||
const int (*version)[3];
|
||||
@@ -1077,6 +1080,10 @@ static struct dm_ioctl *_flatten(struct dm_task *dmt)
|
||||
if (len < min_size)
|
||||
len = min_size;
|
||||
|
||||
/* Increase buffer size if repeating because buffer was too small */
|
||||
while (repeat_count--)
|
||||
len *= 2;
|
||||
|
||||
if (!(dmi = malloc(len)))
|
||||
return NULL;
|
||||
|
||||
@@ -1276,10 +1283,59 @@ static int _create_and_load_v4(struct dm_task *dmt)
|
||||
return r;
|
||||
}
|
||||
|
||||
static struct dm_ioctl *_do_dm_ioctl(struct dm_task *dmt, unsigned command,
|
||||
unsigned repeat_count)
|
||||
{
|
||||
struct dm_ioctl *dmi;
|
||||
|
||||
dmi = _flatten(dmt, repeat_count);
|
||||
if (!dmi) {
|
||||
log_error("Couldn't create ioctl argument");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (dmt->type == DM_DEVICE_TABLE)
|
||||
dmi->flags |= DM_STATUS_TABLE_FLAG;
|
||||
|
||||
dmi->flags |= DM_EXISTS_FLAG; /* FIXME */
|
||||
|
||||
if (dmt->no_open_count)
|
||||
dmi->flags |= DM_SKIP_BDGET_FLAG;
|
||||
|
||||
log_debug("dm %s %s %s%s%s %c %.0llu %s [%u]",
|
||||
_cmd_data_v4[dmt->type].name,
|
||||
dmi->name, dmi->uuid, dmt->newname ? " " : "",
|
||||
dmt->newname ? dmt->newname : "",
|
||||
dmt->no_open_count ? 'N' : 'O',
|
||||
dmt->sector, dmt->message ? dmt->message : "",
|
||||
dmi->data_size);
|
||||
#ifdef DM_IOCTLS
|
||||
if (ioctl(_control_fd, command, dmi) < 0) {
|
||||
if (errno == ENXIO && ((dmt->type == DM_DEVICE_INFO) ||
|
||||
(dmt->type == DM_DEVICE_MKNODES)))
|
||||
dmi->flags &= ~DM_EXISTS_FLAG; /* FIXME */
|
||||
else {
|
||||
if (_log_suppress)
|
||||
log_verbose("device-mapper ioctl "
|
||||
"cmd %d failed: %s",
|
||||
_IOC_NR(command), strerror(errno));
|
||||
else
|
||||
log_error("device-mapper ioctl "
|
||||
"cmd %d failed: %s",
|
||||
_IOC_NR(command), strerror(errno));
|
||||
free(dmi);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
#else /* Userspace alternative for testing */
|
||||
#endif
|
||||
return dmi;
|
||||
}
|
||||
|
||||
int dm_task_run(struct dm_task *dmt)
|
||||
{
|
||||
struct dm_ioctl *dmi = NULL;
|
||||
unsigned int command;
|
||||
struct dm_ioctl *dmi;
|
||||
unsigned command;
|
||||
|
||||
#ifdef DM_COMPAT
|
||||
if (_dm_version == 1)
|
||||
@@ -1290,7 +1346,7 @@ int dm_task_run(struct dm_task *dmt)
|
||||
(sizeof(_cmd_data_v4) / sizeof(*_cmd_data_v4))) {
|
||||
log_error("Internal error: unknown device-mapper task %d",
|
||||
dmt->type);
|
||||
goto bad;
|
||||
return 0;
|
||||
}
|
||||
|
||||
command = _cmd_data_v4[dmt->type].cmd;
|
||||
@@ -1306,43 +1362,25 @@ int dm_task_run(struct dm_task *dmt)
|
||||
if (!_open_control())
|
||||
return 0;
|
||||
|
||||
dmi = _flatten(dmt);
|
||||
if (!dmi) {
|
||||
log_error("Couldn't create ioctl argument");
|
||||
repeat_ioctl:
|
||||
if (!(dmi = _do_dm_ioctl(dmt, command, _ioctl_buffer_double_factor)))
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (dmt->type == DM_DEVICE_TABLE)
|
||||
dmi->flags |= DM_STATUS_TABLE_FLAG;
|
||||
|
||||
dmi->flags |= DM_EXISTS_FLAG; /* FIXME */
|
||||
|
||||
if (dmt->no_open_count)
|
||||
dmi->flags |= DM_SKIP_BDGET_FLAG;
|
||||
|
||||
log_debug("dm %s %s %s %s%c %.0llu %s", _cmd_data_v4[dmt->type].name,
|
||||
dmi->name, dmi->uuid, dmt->newname ? dmt->newname : "",
|
||||
dmt->no_open_count ? 'N' : 'O',
|
||||
dmt->sector, dmt->message ? dmt->message : "");
|
||||
#ifdef DM_IOCTLS
|
||||
if (ioctl(_control_fd, command, dmi) < 0) {
|
||||
if (errno == ENXIO && ((dmt->type == DM_DEVICE_INFO) ||
|
||||
(dmt->type == DM_DEVICE_MKNODES)))
|
||||
dmi->flags &= ~DM_EXISTS_FLAG; /* FIXME */
|
||||
else {
|
||||
if (_log_suppress)
|
||||
log_verbose("device-mapper ioctl "
|
||||
"cmd %d failed: %s",
|
||||
_IOC_NR(command), strerror(errno));
|
||||
else
|
||||
log_error("device-mapper ioctl "
|
||||
"cmd %d failed: %s",
|
||||
_IOC_NR(command), strerror(errno));
|
||||
goto bad;
|
||||
if (dmi->flags & DM_BUFFER_FULL_FLAG) {
|
||||
switch (dmt->type) {
|
||||
case DM_DEVICE_LIST_VERSIONS:
|
||||
case DM_DEVICE_LIST:
|
||||
case DM_DEVICE_DEPS:
|
||||
case DM_DEVICE_STATUS:
|
||||
case DM_DEVICE_TABLE:
|
||||
case DM_DEVICE_WAITEVENT:
|
||||
_ioctl_buffer_double_factor++;
|
||||
free(dmi);
|
||||
goto repeat_ioctl;
|
||||
default:
|
||||
log_error("Warning: libdevmapper buffer too small for data");
|
||||
}
|
||||
}
|
||||
#else /* Userspace alternative for testing */
|
||||
#endif
|
||||
|
||||
switch (dmt->type) {
|
||||
case DM_DEVICE_CREATE:
|
||||
|
||||
@@ -111,6 +111,7 @@ struct dm_task *dm_task_create(int type)
|
||||
dmt->uid = DEVICE_UID;
|
||||
dmt->gid = DEVICE_GID;
|
||||
dmt->mode = DEVICE_MODE;
|
||||
dmt->no_open_count = 0;
|
||||
|
||||
return dmt;
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ vg_tags.
|
||||
Any "vg_" prefixes are optional. Columns mentioned in either \fBpvs (8)\fP
|
||||
or \fBlvs (8)\fP can also be chosen, but columns cannot be taken from both
|
||||
at the same time. The vg_attr bits are: (w)riteable, (r)eadonly,
|
||||
resi(z)eable, e(x)ported, (p)artial.
|
||||
resi(z)eable, e(x)ported, (p)artial and (c)lustered.
|
||||
.TP
|
||||
.I \-O, \-\-sort
|
||||
Comma-separated ordered list of columns to sort by. Replaces the default
|
||||
|
||||
378
po/lvm2.po
378
po/lvm2.po
@@ -1,13 +1,12 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# Copyright (C) YEAR Free Software Foundation, Inc.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2005-07-13 20:17+0100\n"
|
||||
"POT-Creation-Date: 2005-08-04 00:07+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -67,73 +66,76 @@ msgstr ""
|
||||
#: activate/dev_manager.c:555 activate/dev_manager.c:615
|
||||
#: activate/dev_manager.c:621 activate/dev_manager.c:628
|
||||
#: activate/dev_manager.c:657 activate/dev_manager.c:714
|
||||
#: activate/dev_manager.c:723 activate/dev_manager.c:745
|
||||
#: activate/dev_manager.c:769 activate/dev_manager.c:832
|
||||
#: activate/dev_manager.c:857 activate/dev_manager.c:898
|
||||
#: activate/dev_manager.c:918 activate/dev_manager.c:942
|
||||
#: activate/dev_manager.c:947 activate/dev_manager.c:978
|
||||
#: activate/dev_manager.c:986 activate/dev_manager.c:1003
|
||||
#: activate/dev_manager.c:1008 activate/dev_manager.c:1023
|
||||
#: activate/dev_manager.c:1028 activate/dev_manager.c:1061
|
||||
#: activate/dev_manager.c:1071 activate/dev_manager.c:1087
|
||||
#: activate/dev_manager.c:1097 activate/dev_manager.c:1119
|
||||
#: activate/dev_manager.c:1128 activate/dev_manager.c:1142
|
||||
#: activate/dev_manager.c:1150 activate/dev_manager.c:1163
|
||||
#: activate/dev_manager.c:1183 activate/dev_manager.c:1188
|
||||
#: activate/dev_manager.c:1194 activate/dev_manager.c:1216
|
||||
#: activate/dev_manager.c:1236 activate/dev_manager.c:1255
|
||||
#: activate/dev_manager.c:1266 activate/dev_manager.c:1281
|
||||
#: activate/dev_manager.c:1293 activate/dev_manager.c:1307
|
||||
#: activate/dev_manager.c:1320 activate/dev_manager.c:1330
|
||||
#: activate/dev_manager.c:1370 activate/dev_manager.c:1381
|
||||
#: activate/dev_manager.c:1391 activate/dev_manager.c:1399
|
||||
#: activate/dev_manager.c:1406 activate/dev_manager.c:1474
|
||||
#: activate/dev_manager.c:1493 activate/dev_manager.c:1515
|
||||
#: activate/dev_manager.c:1523 activate/dev_manager.c:1551
|
||||
#: activate/dev_manager.c:1556 activate/dev_manager.c:1585
|
||||
#: activate/dev_manager.c:1591 activate/dev_manager.c:1612
|
||||
#: activate/dev_manager.c:1630 activate/dev_manager.c:1644
|
||||
#: activate/dev_manager.c:1654 activate/dev_manager.c:1664
|
||||
#: activate/dev_manager.c:1682 activate/dev_manager.c:1705
|
||||
#: activate/dev_manager.c:1739 activate/dev_manager.c:1755
|
||||
#: activate/dev_manager.c:1812 activate/dev_manager.c:1821
|
||||
#: activate/dev_manager.c:1830 activate/dev_manager.c:1839
|
||||
#: activate/dev_manager.c:1844 activate/dev_manager.c:1849
|
||||
#: activate/dev_manager.c:1861 activate/dev_manager.c:1871
|
||||
#: activate/dev_manager.c:1877 activate/dev_manager.c:1913
|
||||
#: activate/dev_manager.c:1918 activate/dev_manager.c:1950
|
||||
#: activate/dev_manager.c:1968 activate/dev_manager.c:2144
|
||||
#: activate/dev_manager.c:2156 activate/dev_manager.c:2162
|
||||
#: activate/dev_manager.c:2176 activate/dev_manager.c:2181
|
||||
#: activate/dev_manager.c:2188 activate/dev_manager.c:2196
|
||||
#: activate/dev_manager.c:2204 activate/dev_manager.c:2210
|
||||
#: activate/dev_manager.c:2217 activate/dev_manager.c:2222
|
||||
#: activate/dev_manager.c:2250 activate/fs.c:234 activate/fs.c:241
|
||||
#: activate/fs.c:248 activate/fs.c:251 activate/fs.c:325 archiver.c:68
|
||||
#: archiver.c:75 archiver.c:87 archiver.c:163 archiver.c:236 archiver.c:286
|
||||
#: archiver.c:303 archiver.c:345 archiver.c:350 cache/lvmcache.c:474
|
||||
#: cache/lvmcache.c:515 cache/lvmcache.c:546 commands/toolcontext.c:276
|
||||
#: commands/toolcontext.c:295 commands/toolcontext.c:302
|
||||
#: commands/toolcontext.c:379 commands/toolcontext.c:394
|
||||
#: commands/toolcontext.c:418 commands/toolcontext.c:469
|
||||
#: commands/toolcontext.c:662 commands/toolcontext.c:758 config/config.c:105
|
||||
#: config/config.c:110 config/config.c:140 config/config.c:161
|
||||
#: config/config.c:192 config/config.c:239 config/config.c:244
|
||||
#: config/config.c:406 config/config.c:424 config/config.c:429
|
||||
#: config/config.c:439 config/config.c:453 config/config.c:469
|
||||
#: config/config.c:525 config/config.c:708 datastruct/btree.c:90
|
||||
#: datastruct/hash.c:96 datastruct/hash.c:109 datastruct/str_list.c:24
|
||||
#: datastruct/str_list.c:38 datastruct/str_list.c:47 datastruct/str_list.c:77
|
||||
#: device/dev-cache.c:204 device/dev-cache.c:217 device/dev-cache.c:262
|
||||
#: device/dev-cache.c:266 device/dev-cache.c:337 device/dev-cache.c:368
|
||||
#: device/dev-cache.c:407 device/dev-cache.c:453 device/dev-cache.c:458
|
||||
#: device/dev-io.c:174 device/dev-io.c:204 device/dev-io.c:348
|
||||
#: device/dev-io.c:516 device/dev-io.c:537 device/dev-io.c:555
|
||||
#: device/dev-io.c:574 device/dev-io.c:602 device/dev-md.c:41
|
||||
#: device/dev-md.c:49 device/dev-md.c:64 device/device.c:61 device/device.c:66
|
||||
#: device/device.c:90 display/display.c:211 display/display.c:242
|
||||
#: display/display.c:300 display/display.c:346 display/display.c:577
|
||||
#: display/display.c:613 error/errseg.c:90 filters/filter-composite.c:54
|
||||
#: activate/dev_manager.c:723 activate/dev_manager.c:766
|
||||
#: activate/dev_manager.c:772 activate/dev_manager.c:782
|
||||
#: activate/dev_manager.c:821 activate/dev_manager.c:835
|
||||
#: activate/dev_manager.c:860 activate/dev_manager.c:900
|
||||
#: activate/dev_manager.c:905 activate/dev_manager.c:913
|
||||
#: activate/dev_manager.c:936 activate/dev_manager.c:941
|
||||
#: activate/dev_manager.c:947 activate/dev_manager.c:952
|
||||
#: activate/dev_manager.c:958 activate/dev_manager.c:966
|
||||
#: activate/dev_manager.c:983 activate/dev_manager.c:988
|
||||
#: activate/dev_manager.c:1003 activate/dev_manager.c:1008
|
||||
#: activate/dev_manager.c:1041 activate/dev_manager.c:1051
|
||||
#: activate/dev_manager.c:1067 activate/dev_manager.c:1077
|
||||
#: activate/dev_manager.c:1099 activate/dev_manager.c:1108
|
||||
#: activate/dev_manager.c:1122 activate/dev_manager.c:1130
|
||||
#: activate/dev_manager.c:1143 activate/dev_manager.c:1163
|
||||
#: activate/dev_manager.c:1168 activate/dev_manager.c:1174
|
||||
#: activate/dev_manager.c:1196 activate/dev_manager.c:1216
|
||||
#: activate/dev_manager.c:1235 activate/dev_manager.c:1246
|
||||
#: activate/dev_manager.c:1261 activate/dev_manager.c:1273
|
||||
#: activate/dev_manager.c:1287 activate/dev_manager.c:1300
|
||||
#: activate/dev_manager.c:1310 activate/dev_manager.c:1350
|
||||
#: activate/dev_manager.c:1361 activate/dev_manager.c:1371
|
||||
#: activate/dev_manager.c:1379 activate/dev_manager.c:1386
|
||||
#: activate/dev_manager.c:1462 activate/dev_manager.c:1481
|
||||
#: activate/dev_manager.c:1503 activate/dev_manager.c:1511
|
||||
#: activate/dev_manager.c:1539 activate/dev_manager.c:1544
|
||||
#: activate/dev_manager.c:1573 activate/dev_manager.c:1579
|
||||
#: activate/dev_manager.c:1600 activate/dev_manager.c:1618
|
||||
#: activate/dev_manager.c:1632 activate/dev_manager.c:1642
|
||||
#: activate/dev_manager.c:1652 activate/dev_manager.c:1670
|
||||
#: activate/dev_manager.c:1693 activate/dev_manager.c:1727
|
||||
#: activate/dev_manager.c:1743 activate/dev_manager.c:1800
|
||||
#: activate/dev_manager.c:1809 activate/dev_manager.c:1818
|
||||
#: activate/dev_manager.c:1827 activate/dev_manager.c:1832
|
||||
#: activate/dev_manager.c:1837 activate/dev_manager.c:1849
|
||||
#: activate/dev_manager.c:1859 activate/dev_manager.c:1865
|
||||
#: activate/dev_manager.c:1901 activate/dev_manager.c:1906
|
||||
#: activate/dev_manager.c:1938 activate/dev_manager.c:1956
|
||||
#: activate/dev_manager.c:2132 activate/dev_manager.c:2144
|
||||
#: activate/dev_manager.c:2150 activate/dev_manager.c:2164
|
||||
#: activate/dev_manager.c:2169 activate/dev_manager.c:2176
|
||||
#: activate/dev_manager.c:2184 activate/dev_manager.c:2192
|
||||
#: activate/dev_manager.c:2198 activate/dev_manager.c:2205
|
||||
#: activate/dev_manager.c:2210 activate/dev_manager.c:2238 activate/fs.c:234
|
||||
#: activate/fs.c:241 activate/fs.c:248 activate/fs.c:251 activate/fs.c:325
|
||||
#: archiver.c:68 archiver.c:75 archiver.c:87 archiver.c:163 archiver.c:236
|
||||
#: archiver.c:286 archiver.c:303 archiver.c:345 archiver.c:350
|
||||
#: cache/lvmcache.c:474 cache/lvmcache.c:515 cache/lvmcache.c:546
|
||||
#: commands/toolcontext.c:276 commands/toolcontext.c:295
|
||||
#: commands/toolcontext.c:302 commands/toolcontext.c:379
|
||||
#: commands/toolcontext.c:394 commands/toolcontext.c:418
|
||||
#: commands/toolcontext.c:469 commands/toolcontext.c:662
|
||||
#: commands/toolcontext.c:758 config/config.c:105 config/config.c:110
|
||||
#: config/config.c:140 config/config.c:161 config/config.c:192
|
||||
#: config/config.c:239 config/config.c:244 config/config.c:406
|
||||
#: config/config.c:424 config/config.c:429 config/config.c:439
|
||||
#: config/config.c:453 config/config.c:469 config/config.c:525
|
||||
#: config/config.c:708 datastruct/btree.c:90 datastruct/hash.c:96
|
||||
#: datastruct/hash.c:109 datastruct/str_list.c:24 datastruct/str_list.c:38
|
||||
#: datastruct/str_list.c:47 datastruct/str_list.c:77 device/dev-cache.c:204
|
||||
#: device/dev-cache.c:217 device/dev-cache.c:262 device/dev-cache.c:266
|
||||
#: device/dev-cache.c:337 device/dev-cache.c:368 device/dev-cache.c:407
|
||||
#: device/dev-cache.c:453 device/dev-cache.c:458 device/dev-io.c:174
|
||||
#: device/dev-io.c:204 device/dev-io.c:348 device/dev-io.c:516
|
||||
#: device/dev-io.c:537 device/dev-io.c:555 device/dev-io.c:574
|
||||
#: device/dev-io.c:602 device/dev-md.c:41 device/dev-md.c:49
|
||||
#: device/dev-md.c:64 device/device.c:61 device/device.c:66 device/device.c:90
|
||||
#: display/display.c:211 display/display.c:242 display/display.c:300
|
||||
#: display/display.c:346 display/display.c:577 display/display.c:613
|
||||
#: error/errseg.c:90 filters/filter-composite.c:54
|
||||
#: filters/filter-persistent.c:45 filters/filter-persistent.c:105
|
||||
#: filters/filter-persistent.c:110 filters/filter-persistent.c:239
|
||||
#: filters/filter-persistent.c:245 filters/filter-persistent.c:257
|
||||
@@ -200,11 +202,11 @@ msgstr ""
|
||||
#: format_text/export.c:113 format_text/export.c:178 format_text/export.c:188
|
||||
#: format_text/export.c:279 format_text/export.c:280 format_text/export.c:281
|
||||
#: format_text/export.c:282 format_text/export.c:284 format_text/export.c:285
|
||||
#: format_text/export.c:286 format_text/export.c:289 format_text/export.c:299
|
||||
#: format_text/export.c:288 format_text/export.c:289 format_text/export.c:299
|
||||
#: format_text/export.c:303 format_text/export.c:305 format_text/export.c:308
|
||||
#: format_text/export.c:311 format_text/export.c:315 format_text/export.c:318
|
||||
#: format_text/export.c:322 format_text/export.c:326 format_text/export.c:329
|
||||
#: format_text/export.c:330 format_text/export.c:334 format_text/export.c:335
|
||||
#: format_text/export.c:330 format_text/export.c:334 format_text/export.c:336
|
||||
#: format_text/export.c:360 format_text/export.c:367 format_text/export.c:371
|
||||
#: format_text/export.c:372 format_text/export.c:376 format_text/export.c:380
|
||||
#: format_text/export.c:382 format_text/export.c:385 format_text/export.c:388
|
||||
@@ -214,11 +216,11 @@ msgstr ""
|
||||
#: format_text/export.c:428 format_text/export.c:432 format_text/export.c:433
|
||||
#: format_text/export.c:437 format_text/export.c:440 format_text/export.c:445
|
||||
#: format_text/export.c:450 format_text/export.c:461 format_text/export.c:463
|
||||
#: format_text/export.c:470 format_text/export.c:474 format_text/export.c:479
|
||||
#: format_text/export.c:470 format_text/export.c:476 format_text/export.c:482
|
||||
#: format_text/export.c:490 format_text/export.c:500 format_text/export.c:501
|
||||
#: format_text/export.c:506 format_text/export.c:510 format_text/export.c:513
|
||||
#: format_text/export.c:516 format_text/export.c:520 format_text/export.c:523
|
||||
#: format_text/export.c:527 format_text/export.c:531 format_text/export.c:533
|
||||
#: format_text/export.c:528 format_text/export.c:531 format_text/export.c:533
|
||||
#: format_text/export.c:535 format_text/export.c:536 format_text/export.c:537
|
||||
#: format_text/export.c:542 format_text/export.c:548 format_text/export.c:563
|
||||
#: format_text/export.c:573 format_text/export.c:582 format_text/export.c:588
|
||||
@@ -275,10 +277,10 @@ msgstr ""
|
||||
#: lvchange.c:87 lvchange.c:93 lvchange.c:107 lvchange.c:114 lvchange.c:121
|
||||
#: lvchange.c:171 lvchange.c:179 lvchange.c:213 lvchange.c:298 lvchange.c:356
|
||||
#: lvchange.c:364 lvconvert.c:43 lvconvert.c:73 lvconvert.c:90 lvconvert.c:219
|
||||
#: lvcreate.c:141 lvcreate.c:309 lvcreate.c:333 lvcreate.c:349 lvcreate.c:511
|
||||
#: lvcreate.c:599 lvcreate.c:653 lvcreate.c:660 lvcreate.c:665 lvcreate.c:671
|
||||
#: lvcreate.c:678 lvcreate.c:705 lvcreate.c:745 lvcreate.c:753 lvcreate.c:759
|
||||
#: lvcreate.c:766 lvcreate.c:856 lvmcmdline.c:946 lvremove.c:86 lvrename.c:87
|
||||
#: lvcreate.c:141 lvcreate.c:309 lvcreate.c:333 lvcreate.c:349 lvcreate.c:469
|
||||
#: lvcreate.c:557 lvcreate.c:611 lvcreate.c:618 lvcreate.c:623 lvcreate.c:629
|
||||
#: lvcreate.c:636 lvcreate.c:663 lvcreate.c:703 lvcreate.c:711 lvcreate.c:717
|
||||
#: lvcreate.c:724 lvcreate.c:814 lvmcmdline.c:946 lvremove.c:86 lvrename.c:87
|
||||
#: lvrename.c:144 lvrename.c:155 lvrename.c:162 lvrename.c:167 lvresize.c:417
|
||||
#: lvresize.c:474 lvresize.c:481 lvresize.c:488 lvresize.c:500 lvresize.c:507
|
||||
#: lvresize.c:513 lvresize.c:532 lvresize.c:546 lvresize.c:571
|
||||
@@ -326,7 +328,7 @@ msgstr ""
|
||||
#: regex/ttree.c:111 report/report.c:576 report/report.c:604
|
||||
#: report/report.c:736 snapshot/snapshot.c:75 snapshot/snapshot.c:84
|
||||
#: snapshot/snapshot.c:85 snapshot/snapshot.c:86 snapshot/snapshot.c:155
|
||||
#: striped/striped.c:91 striped/striped.c:171 striped/striped.c:220
|
||||
#: striped/striped.c:92 striped/striped.c:171 striped/striped.c:220
|
||||
#: toollib.c:760 toollib.c:810 toollib.c:857 uuid/uuid.c:91 uuid/uuid.c:95
|
||||
#: vgcfgbackup.c:65 vgcfgbackup.c:74 vgcfgbackup.c:81 vgchange.c:302
|
||||
#: vgmerge.c:160 vgreduce.c:28 vgreduce.c:90 vgreduce.c:96 vgreduce.c:104
|
||||
@@ -492,157 +494,135 @@ msgstr ""
|
||||
msgid "Adding target: %llu %llu %s %s"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:750 activate/dev_manager.c:809
|
||||
#: activate/dev_manager.c:736
|
||||
#, c-format
|
||||
msgid "device layer %s missing from hash"
|
||||
msgid "%s device layer %s missing from hash"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:757 activate/dev_manager.c:816
|
||||
#: activate/dev_manager.c:743
|
||||
#, c-format
|
||||
msgid "Failed to format device number as dm target (%u,%u)"
|
||||
msgid "Failed to format %s device number for %s as dm target (%u,%u)"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:826
|
||||
#: activate/dev_manager.c:829
|
||||
#, c-format
|
||||
msgid "Internal error: Unassigned area found in LV %s."
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:849
|
||||
#: activate/dev_manager.c:852
|
||||
msgid "Insufficient space for target parameters."
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:862
|
||||
#, c-format
|
||||
#: activate/dev_manager.c:865
|
||||
msgid "Insufficient space in params[%zu] for target parameters."
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:868
|
||||
#: activate/dev_manager.c:871
|
||||
msgid "Target parameter size too big. Aborting."
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:882
|
||||
#: activate/dev_manager.c:885
|
||||
#, c-format
|
||||
msgid "Unable to build table for '%s'"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:903
|
||||
#, c-format
|
||||
msgid "Couldn't find real device layer %s in hash"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:909 activate/dev_manager.c:964
|
||||
#, c-format
|
||||
msgid "Couldn't create origin device parameters for '%s'."
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:914
|
||||
#: activate/dev_manager.c:909
|
||||
#, c-format
|
||||
msgid "Adding target: 0 %llu snapshot-origin %s"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:936
|
||||
#: activate/dev_manager.c:930
|
||||
#, c-format
|
||||
msgid "Couldn't find snapshot for '%s'."
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:952
|
||||
#, c-format
|
||||
msgid "Couldn't find origin device layer %s in hash"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:958
|
||||
#, c-format
|
||||
msgid "Couldn't find cow device layer %s in hash"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:971
|
||||
#, c-format
|
||||
msgid "Couldn't create cow device parameters for '%s'."
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:984
|
||||
#: activate/dev_manager.c:964
|
||||
#, c-format
|
||||
msgid "Adding target: 0 %llu snapshot %s"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:1068 activate/dev_manager.c:1148
|
||||
#: activate/dev_manager.c:1048 activate/dev_manager.c:1128
|
||||
#, c-format
|
||||
msgid "Getting device info for %s"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:1094
|
||||
#: activate/dev_manager.c:1074
|
||||
#, c-format
|
||||
msgid "Getting device status percentage for %s"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:1125
|
||||
#: activate/dev_manager.c:1105
|
||||
#, c-format
|
||||
msgid "Getting device mirror status percentage for %s"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:1460 activate/dev_manager.c:1620
|
||||
#: activate/dev_manager.c:1405 activate/dev_manager.c:1411
|
||||
msgid "Clustered snapshots are not yet supported"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:1448 activate/dev_manager.c:1608
|
||||
#, c-format
|
||||
msgid "Couldn't find device layer '%s'."
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:1540
|
||||
#: activate/dev_manager.c:1528
|
||||
#, c-format
|
||||
msgid "_suspend_parents couldn't find device layer '%s' - skipping."
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:1546
|
||||
#: activate/dev_manager.c:1534
|
||||
#, c-format
|
||||
msgid "BUG: pre-suspend loop detected (%s)"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:1574
|
||||
#: activate/dev_manager.c:1562
|
||||
#, c-format
|
||||
msgid "_resume_with_deps couldn't find device layer '%s' - skipping."
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:1580 activate/dev_manager.c:1625
|
||||
#: activate/dev_manager.c:1568 activate/dev_manager.c:1613
|
||||
#, c-format
|
||||
msgid "BUG: pre-create loop detected (%s)"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:1732 activate/dev_manager.c:1748
|
||||
#: activate/dev_manager.c:1720 activate/dev_manager.c:1736
|
||||
#, c-format
|
||||
msgid ""
|
||||
"_populate_pre_suspend_lists: Couldn't find device layer '%s' - skipping."
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:1794
|
||||
#: activate/dev_manager.c:1782
|
||||
#, c-format
|
||||
msgid "Couldn't deactivate device %s"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:1910
|
||||
#: activate/dev_manager.c:1898
|
||||
#, c-format
|
||||
msgid "Found existing layer '%s'"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:2090
|
||||
#: activate/dev_manager.c:2078
|
||||
#, c-format
|
||||
msgid "Can't expand LV: %s target support missing from kernel?"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:2102
|
||||
#: activate/dev_manager.c:2090
|
||||
msgid "Can't expand LV: Mirror support missing from tools?"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:2109
|
||||
#: activate/dev_manager.c:2097
|
||||
msgid "Can't expand LV: Mirror support missing from kernel?"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:2117
|
||||
#: activate/dev_manager.c:2105
|
||||
msgid "Can't expand LV: Snapshot support missing from tools?"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:2124
|
||||
#: activate/dev_manager.c:2112
|
||||
msgid "Can't expand LV: Snapshot support missing from kernel?"
|
||||
msgstr ""
|
||||
|
||||
#: activate/dev_manager.c:2152
|
||||
#: activate/dev_manager.c:2140
|
||||
#, c-format
|
||||
msgid "Found active lv %s%s"
|
||||
msgstr ""
|
||||
@@ -1394,12 +1374,10 @@ msgid "Attempt to close device '%s' which is not open."
|
||||
msgstr ""
|
||||
|
||||
#: device/dev-io.c:579
|
||||
#, c-format
|
||||
msgid "Wiping %s at %llu length %zu"
|
||||
msgstr ""
|
||||
|
||||
#: device/dev-io.c:582
|
||||
#, c-format
|
||||
msgid "Wiping %s at sector %llu length %zu sectors"
|
||||
msgstr ""
|
||||
|
||||
@@ -3194,6 +3172,10 @@ msgstr ""
|
||||
msgid "Test mode: Metadata will NOT be updated."
|
||||
msgstr ""
|
||||
|
||||
#: log/log.c:264
|
||||
msgid "vsnprintf failed: skipping external logging function"
|
||||
msgstr ""
|
||||
|
||||
#: lvchange.c:26
|
||||
#, c-format
|
||||
msgid "Logical volume \"%s\" is already writable"
|
||||
@@ -3343,7 +3325,7 @@ msgstr ""
|
||||
msgid "%s: reactivation failed"
|
||||
msgstr ""
|
||||
|
||||
#: lvchange.c:330 lvcreate.c:724 pvchange.c:49 vgchange.c:322 vgcreate.c:111
|
||||
#: lvchange.c:330 lvcreate.c:682 pvchange.c:49 vgchange.c:322 vgcreate.c:111
|
||||
msgid "Failed to get tag"
|
||||
msgstr ""
|
||||
|
||||
@@ -3352,7 +3334,7 @@ msgstr ""
|
||||
msgid "Logical volume %s/%s does not support tags"
|
||||
msgstr ""
|
||||
|
||||
#: lvchange.c:342 lvcreate.c:735
|
||||
#: lvchange.c:342 lvcreate.c:693
|
||||
#, c-format
|
||||
msgid "Failed to add tag %s to %s/%s"
|
||||
msgstr ""
|
||||
@@ -3494,20 +3476,20 @@ msgstr ""
|
||||
msgid "Checking for existing volume group \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: lvconvert.c:192 lvcreate.c:851 lvrename.c:105 lvresize.c:566 pvchange.c:59
|
||||
#: lvconvert.c:192 lvcreate.c:809 lvrename.c:105 lvresize.c:566 pvchange.c:59
|
||||
#: pvmove.c:61 vgcreate.c:144 vgextend.c:47 vgmerge.c:33 vgmerge.c:57
|
||||
#: vgreduce.c:265 vgrename.c:68 vgrename.c:102 vgsplit.c:189 vgsplit.c:213
|
||||
#, c-format
|
||||
msgid "Can't get lock for %s"
|
||||
msgstr ""
|
||||
|
||||
#: lvconvert.c:197 lvcreate.c:480 lvrename.c:110 pvmove.c:66 vgdisplay.c:24
|
||||
#: lvconvert.c:197 lvcreate.c:438 lvrename.c:110 pvmove.c:66 vgdisplay.c:24
|
||||
#: vgmerge.c:38 vgmerge.c:64 vgreduce.c:271 vgrename.c:73 vgsplit.c:194
|
||||
#, c-format
|
||||
msgid "Volume group \"%s\" doesn't exist"
|
||||
msgstr ""
|
||||
|
||||
#: lvconvert.c:202 lvcreate.c:485 lvrename.c:115 metadata/metadata.c:1166
|
||||
#: lvconvert.c:202 lvcreate.c:443 lvrename.c:115 metadata/metadata.c:1166
|
||||
#: polldaemon.c:200 pvchange.c:72 pvmove.c:72 toollib.c:42 vgchange.c:415
|
||||
#: vgck.c:32 vgconvert.c:54 vgextend.c:57 vgmerge.c:44 vgmerge.c:69
|
||||
#: vgreduce.c:321 vgremove.c:35 vgrename.c:80 vgsplit.c:200
|
||||
@@ -3515,7 +3497,7 @@ msgstr ""
|
||||
msgid "Volume group \"%s\" is exported"
|
||||
msgstr ""
|
||||
|
||||
#: lvconvert.c:207 lvcreate.c:490 lvremove.c:27 lvrename.c:120 pvchange.c:78
|
||||
#: lvconvert.c:207 lvcreate.c:448 lvremove.c:27 lvrename.c:120 pvchange.c:78
|
||||
#: pvmove.c:78 vgchange.c:410 vgconvert.c:49 vgexport.c:38 vgextend.c:62
|
||||
#: vgmerge.c:50 vgmerge.c:74 vgreduce.c:327 vgrename.c:86 vgsplit.c:206
|
||||
#, c-format
|
||||
@@ -3661,168 +3643,149 @@ msgstr ""
|
||||
msgid "--major and --minor incompatible with -Mn"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:433
|
||||
msgid "Name allocation failed - device not zeroed"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:439
|
||||
#, c-format
|
||||
msgid "Name too long - device not zeroed (%s)"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:443
|
||||
#, c-format
|
||||
msgid "Zeroing start of logical volume \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:446
|
||||
#, c-format
|
||||
msgid "%s: not found: device not zeroed"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:477 pvmove.c:300 toollib.c:350 vgreduce.c:263
|
||||
#: lvcreate.c:435 pvmove.c:300 toollib.c:350 vgreduce.c:263
|
||||
#, c-format
|
||||
msgid "Finding volume group \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:495 lvrename.c:125
|
||||
#: lvcreate.c:453 lvrename.c:125
|
||||
#, c-format
|
||||
msgid "Logical volume \"%s\" already exists in volume group \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:501
|
||||
#: lvcreate.c:459
|
||||
msgid "Metadata does not support mirroring."
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:518
|
||||
#: lvcreate.c:476
|
||||
#, c-format
|
||||
msgid "Setting stripe size %d KB to physical extent size %u KB"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:531 lvresize.c:206
|
||||
#: lvcreate.c:489 lvresize.c:206
|
||||
#, c-format
|
||||
msgid "Rounding up size to full physical extent %s"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:539
|
||||
#: lvcreate.c:497
|
||||
#, c-format
|
||||
msgid "Rounding size (%d extents) up to stripe boundary size (%d extents)"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:547
|
||||
#: lvcreate.c:505
|
||||
msgid "Can't create snapshot without using device-mapper kernel driver"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:552
|
||||
#: lvcreate.c:510
|
||||
#, c-format
|
||||
msgid "Couldn't find origin volume '%s'."
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:557
|
||||
#: lvcreate.c:515
|
||||
msgid "Snapshots of snapshots are not supported yet."
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:562
|
||||
#: lvcreate.c:520
|
||||
msgid "Snapshots of locked devices are not supported yet"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:571
|
||||
#: lvcreate.c:529
|
||||
#, c-format
|
||||
msgid "Unable to create logical volume %s with no extents"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:578
|
||||
#: lvcreate.c:536
|
||||
#, c-format
|
||||
msgid "Insufficient free extents (%u) in volume group %s: %u required"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:584
|
||||
#: lvcreate.c:542
|
||||
#, c-format
|
||||
msgid "Number of stripes (%u) must not exceed number of physical volumes (%d)"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:591
|
||||
#: lvcreate.c:549
|
||||
msgid "Can't create mirror without using device-mapper kernel driver."
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:610
|
||||
#: lvcreate.c:568
|
||||
msgid "Failed to generate LV name."
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:622 mirror/mirrored.c:218
|
||||
#: lvcreate.c:580 mirror/mirrored.c:218
|
||||
#, c-format
|
||||
msgid "Using reduced mirror region size of %u sectors"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:630 lvcreate.c:636 lvcreate.c:644
|
||||
#: lvcreate.c:588 lvcreate.c:594 lvcreate.c:602
|
||||
msgid "log_name allocation failed. Remove new LV and retry."
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:683
|
||||
#: lvcreate.c:641
|
||||
msgid "Aborting. Failed to activate mirror log. Remove new LVs and retry."
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:689
|
||||
#: lvcreate.c:647
|
||||
msgid "Aborting. Failed to wipe mirror log. Remove new LV and retry."
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:695
|
||||
#: lvcreate.c:653
|
||||
msgid "Aborting. Failed to deactivate mirror log. Remove new LV and retry."
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:710
|
||||
#: lvcreate.c:668
|
||||
msgid "Setting read ahead sectors"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:718
|
||||
#: lvcreate.c:676
|
||||
#, c-format
|
||||
msgid "Setting device number to (%d, %d)"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:729 vgchange.c:327
|
||||
#: lvcreate.c:687 vgchange.c:327
|
||||
#, c-format
|
||||
msgid "Volume group %s does not support tags"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:773
|
||||
#: lvcreate.c:731
|
||||
msgid ""
|
||||
"Aborting. Failed to activate snapshot exception store. Remove new LV and "
|
||||
"retry."
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:776
|
||||
#: lvcreate.c:734
|
||||
msgid "Failed to activate new LV."
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:783
|
||||
#: lvcreate.c:741
|
||||
msgid ""
|
||||
"Aborting. Failed to wipe snapshot exception store. Remove new LV and retry."
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:788
|
||||
#: lvcreate.c:746
|
||||
#, c-format
|
||||
msgid "WARNING: \"%s\" not zeroed"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:797
|
||||
#: lvcreate.c:755
|
||||
msgid "Couldn't deactivate new snapshot."
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:803
|
||||
#: lvcreate.c:761
|
||||
#, c-format
|
||||
msgid "Failed to suspend origin %s"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:809
|
||||
#: lvcreate.c:767
|
||||
msgid "Couldn't create snapshot."
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:818
|
||||
#: lvcreate.c:776
|
||||
#, c-format
|
||||
msgid "Problem reactivating origin %s"
|
||||
msgstr ""
|
||||
|
||||
#: lvcreate.c:825
|
||||
#: lvcreate.c:783
|
||||
#, c-format
|
||||
msgid "Logical volume \"%s\" created"
|
||||
msgstr ""
|
||||
@@ -4124,7 +4087,6 @@ msgid "Logical volume names must have the same volume group (\"%s\" or \"%s\")"
|
||||
msgstr ""
|
||||
|
||||
#: lvrename.c:76
|
||||
#, c-format
|
||||
msgid "New logical volume path exceeds maximum length of %zu!"
|
||||
msgstr ""
|
||||
|
||||
@@ -5111,7 +5073,6 @@ msgid "Unable to open external %s library %s"
|
||||
msgstr ""
|
||||
|
||||
#: mm/dbg_malloc.c:239
|
||||
#, c-format
|
||||
msgid "Huge memory allocation (size %zu) rejected - metadata corruption?"
|
||||
msgstr ""
|
||||
|
||||
@@ -5139,7 +5100,6 @@ msgid "memlock_count dec to %d"
|
||||
msgstr ""
|
||||
|
||||
#: mm/pool-fast.c:45
|
||||
#, c-format
|
||||
msgid "Couldn't create memory pool %s (size %zu)"
|
||||
msgstr ""
|
||||
|
||||
@@ -5148,7 +5108,6 @@ msgid "Internal error: pool_free asked to free pointer not in pool"
|
||||
msgstr ""
|
||||
|
||||
#: mm/pool-fast.c:223
|
||||
#, c-format
|
||||
msgid "Out of memory. Requested %zu bytes."
|
||||
msgstr ""
|
||||
|
||||
@@ -5222,7 +5181,7 @@ msgstr ""
|
||||
msgid "Unable to find volume group of \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: pvchange.c:84
|
||||
#: pvchange.c:85
|
||||
#, c-format
|
||||
msgid "Unable to find \"%s\" in volume group \"%s\""
|
||||
msgstr ""
|
||||
@@ -5592,11 +5551,11 @@ msgstr ""
|
||||
msgid "Ignoring remaining command line arguments"
|
||||
msgstr ""
|
||||
|
||||
#: pvmove.c:313
|
||||
#: pvmove.c:314
|
||||
msgid "ABORTING: Failed to generate list of moving LVs"
|
||||
msgstr ""
|
||||
|
||||
#: pvmove.c:321
|
||||
#: pvmove.c:322
|
||||
msgid "ABORTING: Temporary mirror activation failed."
|
||||
msgstr ""
|
||||
|
||||
@@ -6145,6 +6104,25 @@ msgstr ""
|
||||
msgid "%s: already exists in filesystem"
|
||||
msgstr ""
|
||||
|
||||
#: toollib.c:1077
|
||||
msgid "Name allocation failed - device not zeroed"
|
||||
msgstr ""
|
||||
|
||||
#: toollib.c:1083
|
||||
#, c-format
|
||||
msgid "Name too long - device not zeroed (%s)"
|
||||
msgstr ""
|
||||
|
||||
#: toollib.c:1087
|
||||
#, c-format
|
||||
msgid "Zeroing start of logical volume \"%s\""
|
||||
msgstr ""
|
||||
|
||||
#: toollib.c:1090
|
||||
#, c-format
|
||||
msgid "%s: not found: device not zeroed"
|
||||
msgstr ""
|
||||
|
||||
#: uuid/uuid.c:133
|
||||
msgid "UUID contains invalid character"
|
||||
msgstr ""
|
||||
|
||||
@@ -1,9 +1,20 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
|
||||
#
|
||||
# This file is part of the lvm2-cluster package.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing to use,
|
||||
# modify, copy, or redistribute it subject to the terms and conditions
|
||||
# of the GNU General Public License v.2.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
#
|
||||
# Edit an lvm.conf file to adjust various properties
|
||||
#
|
||||
#
|
||||
#
|
||||
|
||||
function usage
|
||||
{
|
||||
@@ -138,7 +149,7 @@ then
|
||||
if [ "$have_global" = "1" ]
|
||||
then
|
||||
echo "global keys but no 'global {' found, can't edit file"
|
||||
exit 12
|
||||
exit 13
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -161,7 +172,7 @@ EOF
|
||||
if [ $? != 0 ]
|
||||
then
|
||||
echo "failed to create temporary config file, $CONFIGFILE not updated"
|
||||
exit 1
|
||||
exit 14
|
||||
fi
|
||||
else
|
||||
#
|
||||
@@ -208,7 +219,7 @@ else
|
||||
if [ $? != 0 ]
|
||||
then
|
||||
echo "sed failed, $CONFIGFILE not updated"
|
||||
exit 1
|
||||
exit 15
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
@@ -87,7 +87,7 @@ xx(lvconvert,
|
||||
"\t[-m|--mirrors Mirrors]\n"
|
||||
"\t[-v|--verbose]\n"
|
||||
"\t[--version]" "\n"
|
||||
"\tLogicalVolume[Path] [LogicalVolume[Path]...]\n",
|
||||
"\tLogicalVolume[Path] [PhysicalVolume[Path]...]\n",
|
||||
|
||||
alloc_ARG, mirrors_ARG, test_ARG)
|
||||
|
||||
|
||||
@@ -1041,7 +1041,7 @@ static int _process_switches(int *argc, char ***argv)
|
||||
{"uuid", 1, &ind, UUID_ARG},
|
||||
{"verbose", 1, &ind, VERBOSE_ARG},
|
||||
{"version", 0, &ind, VERSION_ARG},
|
||||
{"", 0, NULL, 0}
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
#else
|
||||
struct option long_options;
|
||||
|
||||
@@ -52,19 +52,19 @@ static int lvchange_permission(struct cmd_context *cmd,
|
||||
|
||||
backup(lv->vg);
|
||||
|
||||
if (!suspend_lv(cmd, lv->lvid.s)) {
|
||||
if (!suspend_lv(cmd, lv)) {
|
||||
log_error("Failed to lock %s", lv->name);
|
||||
vg_revert(lv->vg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!vg_commit(lv->vg)) {
|
||||
resume_lv(cmd, lv->lvid.s);
|
||||
resume_lv(cmd, lv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
log_very_verbose("Updating permissions for \"%s\" in kernel", lv->name);
|
||||
if (!resume_lv(cmd, lv->lvid.s)) {
|
||||
if (!resume_lv(cmd, lv)) {
|
||||
log_error("Problem reactivating %s", lv->name);
|
||||
return 0;
|
||||
}
|
||||
@@ -83,13 +83,13 @@ static int lvchange_availability(struct cmd_context *cmd,
|
||||
if (activate == CHANGE_ALN) {
|
||||
log_verbose("Deactivating logical volume \"%s\" locally",
|
||||
lv->name);
|
||||
if (!deactivate_lv_local(cmd, lv->lvid.s)) {
|
||||
if (!deactivate_lv_local(cmd, lv)) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
} else if (activate == CHANGE_AN) {
|
||||
log_verbose("Deactivating logical volume \"%s\"", lv->name);
|
||||
if (!deactivate_lv(cmd, lv->lvid.s)) {
|
||||
if (!deactivate_lv(cmd, lv)) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
@@ -103,21 +103,21 @@ static int lvchange_availability(struct cmd_context *cmd,
|
||||
if (lv_is_origin(lv) || (activate == CHANGE_AE)) {
|
||||
log_verbose("Activating logical volume \"%s\" "
|
||||
"exclusively", lv->name);
|
||||
if (!activate_lv_excl(cmd, lv->lvid.s)) {
|
||||
if (!activate_lv_excl(cmd, lv)) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
} else if (activate == CHANGE_ALY) {
|
||||
log_verbose("Activating logical volume \"%s\" locally",
|
||||
lv->name);
|
||||
if (!activate_lv_local(cmd, lv->lvid.s)) {
|
||||
if (!activate_lv_local(cmd, lv)) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
log_verbose("Activating logical volume \"%s\"",
|
||||
lv->name);
|
||||
if (!activate_lv(cmd, lv->lvid.s)) {
|
||||
if (!activate_lv(cmd, lv)) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
@@ -137,7 +137,7 @@ static int lvchange_availability(struct cmd_context *cmd,
|
||||
static int lvchange_refresh(struct cmd_context *cmd, struct logical_volume *lv)
|
||||
{
|
||||
log_verbose("Refreshing logical volume \"%s\" (if active)", lv->name);
|
||||
if (!suspend_lv(cmd, lv->lvid.s) || !resume_lv(cmd, lv->lvid.s))
|
||||
if (!suspend_lv(cmd, lv) || !resume_lv(cmd, lv))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
@@ -216,19 +216,19 @@ static int lvchange_readahead(struct cmd_context *cmd,
|
||||
|
||||
backup(lv->vg);
|
||||
|
||||
if (!suspend_lv(cmd, lv->lvid.s)) {
|
||||
if (!suspend_lv(cmd, lv)) {
|
||||
log_error("Failed to lock %s", lv->name);
|
||||
vg_revert(lv->vg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!vg_commit(lv->vg)) {
|
||||
resume_lv(cmd, lv->lvid.s);
|
||||
resume_lv(cmd, lv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
log_very_verbose("Updating permissions for \"%s\" in kernel", lv->name);
|
||||
if (!resume_lv(cmd, lv->lvid.s)) {
|
||||
if (!resume_lv(cmd, lv)) {
|
||||
log_error("Problem reactivating %s", lv->name);
|
||||
return 0;
|
||||
}
|
||||
@@ -274,7 +274,7 @@ static int lvchange_persistent(struct cmd_context *cmd,
|
||||
active = 1;
|
||||
}
|
||||
log_verbose("Ensuring %s is inactive.", lv->name);
|
||||
if (!deactivate_lv(cmd, lv->lvid.s)) {
|
||||
if (!deactivate_lv(cmd, lv)) {
|
||||
log_error("%s: deactivation failed", lv->name);
|
||||
return 0;
|
||||
}
|
||||
@@ -286,7 +286,7 @@ static int lvchange_persistent(struct cmd_context *cmd,
|
||||
if (active) {
|
||||
log_verbose("Re-activating logical volume \"%s\"",
|
||||
lv->name);
|
||||
if (!activate_lv(cmd, lv->lvid.s)) {
|
||||
if (!activate_lv(cmd, lv)) {
|
||||
log_error("%s: reactivation failed", lv->name);
|
||||
return 0;
|
||||
}
|
||||
@@ -301,19 +301,19 @@ static int lvchange_persistent(struct cmd_context *cmd,
|
||||
|
||||
backup(lv->vg);
|
||||
|
||||
if (!suspend_lv(cmd, lv->lvid.s)) {
|
||||
if (!suspend_lv(cmd, lv)) {
|
||||
log_error("Failed to lock %s", lv->name);
|
||||
vg_revert(lv->vg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!vg_commit(lv->vg)) {
|
||||
resume_lv(cmd, lv->lvid.s);
|
||||
resume_lv(cmd, lv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
log_very_verbose("Updating permissions for \"%s\" in kernel", lv->name);
|
||||
if (!resume_lv(cmd, lv->lvid.s)) {
|
||||
if (!resume_lv(cmd, lv)) {
|
||||
log_error("Problem reactivating %s", lv->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -15,24 +15,56 @@
|
||||
#include "tools.h"
|
||||
|
||||
struct lvconvert_params {
|
||||
const char *lv_name;
|
||||
uint32_t mirrors;
|
||||
|
||||
alloc_policy_t alloc;
|
||||
|
||||
int pv_count;
|
||||
char **pvs;
|
||||
struct list *pvh;
|
||||
};
|
||||
|
||||
static int _read_params(struct lvconvert_params *lp, struct cmd_context *cmd,
|
||||
int argc, char **argv)
|
||||
{
|
||||
memset(lp, 0, sizeof(*lp));
|
||||
|
||||
lp->alloc = ALLOC_INHERIT;
|
||||
if (arg_count(cmd, alloc_ARG))
|
||||
lp->alloc = (alloc_policy_t) arg_uint_value(cmd, alloc_ARG,
|
||||
lp->alloc);
|
||||
|
||||
if (!arg_count(cmd, mirrors_ARG)) {
|
||||
log_error("--mirrors argument required");
|
||||
return 0;
|
||||
}
|
||||
|
||||
lp->mirrors = arg_uint_value(cmd, mirrors_ARG, 0) + 1;
|
||||
|
||||
if (!argc) {
|
||||
log_error("Please give logical volume path");
|
||||
return 0;
|
||||
}
|
||||
|
||||
lp->lv_name = argv[0];
|
||||
argv++, argc--;
|
||||
|
||||
lp->pv_count = argc;
|
||||
lp->pvs = argv;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lvconvert_mirrors(struct cmd_context * cmd, struct logical_volume * lv,
|
||||
struct list *allocatable_pvs)
|
||||
struct lvconvert_params *lp)
|
||||
{
|
||||
struct lv_segment *first_seg;
|
||||
uint32_t mirrors, existing_mirrors;
|
||||
alloc_policy_t alloc = ALLOC_INHERIT;
|
||||
uint32_t existing_mirrors;
|
||||
// struct alloc_handle *ah = NULL;
|
||||
// struct logical_volume *log_lv;
|
||||
|
||||
if (arg_count(cmd, alloc_ARG))
|
||||
alloc = (alloc_policy_t) arg_uint_value(cmd, alloc_ARG, alloc);
|
||||
|
||||
mirrors = arg_uint_value(cmd, mirrors_ARG, 0) + 1;
|
||||
|
||||
if ((mirrors == 1)) {
|
||||
if ((lp->mirrors == 1)) {
|
||||
if (!(lv->status & MIRRORED)) {
|
||||
log_error("Logical volume %s is already not mirrored.",
|
||||
lv->name);
|
||||
@@ -53,13 +85,13 @@ static int lvconvert_mirrors(struct cmd_context * cmd, struct logical_volume * l
|
||||
list_iterate_items(first_seg, &lv->segments)
|
||||
break;
|
||||
existing_mirrors = first_seg->area_count;
|
||||
if (mirrors == existing_mirrors) {
|
||||
if (lp->mirrors == existing_mirrors) {
|
||||
log_error("Logical volume %s already has %"
|
||||
PRIu32 " mirror(s).", lv->name,
|
||||
mirrors - 1);
|
||||
lp->mirrors - 1);
|
||||
return 1;
|
||||
}
|
||||
if (mirrors > existing_mirrors) {
|
||||
if (lp->mirrors > existing_mirrors) {
|
||||
/* FIXME Unless anywhere, remove PV of log_lv
|
||||
* from allocatable_pvs & allocate
|
||||
* (mirrors - existing_mirrors) new areas
|
||||
@@ -69,7 +101,7 @@ static int lvconvert_mirrors(struct cmd_context * cmd, struct logical_volume * l
|
||||
"supported yet.");
|
||||
return 0;
|
||||
} else {
|
||||
if (!remove_mirror_images(first_seg, mirrors)) {
|
||||
if (!remove_mirror_images(first_seg, lp->mirrors)) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
@@ -93,20 +125,20 @@ static int lvconvert_mirrors(struct cmd_context * cmd, struct logical_volume * l
|
||||
|
||||
backup(lv->vg);
|
||||
|
||||
if (!suspend_lv(cmd, lv->lvid.s)) {
|
||||
if (!suspend_lv(cmd, lv)) {
|
||||
log_error("Failed to lock %s", lv->name);
|
||||
vg_revert(lv->vg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!vg_commit(lv->vg)) {
|
||||
resume_lv(cmd, lv->lvid.s);
|
||||
resume_lv(cmd, lv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
log_very_verbose("Updating \"%s\" in kernel", lv->name);
|
||||
|
||||
if (!resume_lv(cmd, lv->lvid.s)) {
|
||||
if (!resume_lv(cmd, lv)) {
|
||||
log_error("Problem reactivating %s", lv->name);
|
||||
return 0;
|
||||
}
|
||||
@@ -116,8 +148,8 @@ static int lvconvert_mirrors(struct cmd_context * cmd, struct logical_volume * l
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lvconvert_single(struct cmd_context * cmd, struct logical_volume * lv,
|
||||
int argc, char **argv, void *handle)
|
||||
static int lvconvert_single(struct cmd_context *cmd, struct logical_volume *lv,
|
||||
void *handle)
|
||||
{
|
||||
struct lvconvert_params *lp = handle;
|
||||
|
||||
@@ -146,7 +178,7 @@ static int lvconvert_single(struct cmd_context * cmd, struct logical_volume * lv
|
||||
if (arg_count(cmd, mirrors_ARG)) {
|
||||
if (!archive(lv->vg))
|
||||
return ECMD_FAILED;
|
||||
if (!lvconvert_mirrors(cmd, lv, lp->pvh))
|
||||
if (!lvconvert_mirrors(cmd, lv, lp))
|
||||
return ECMD_FAILED;
|
||||
}
|
||||
|
||||
@@ -155,7 +187,7 @@ static int lvconvert_single(struct cmd_context * cmd, struct logical_volume * lv
|
||||
|
||||
int lvconvert(struct cmd_context * cmd, int argc, char **argv)
|
||||
{
|
||||
const char *vg_name, *lv_name;
|
||||
const char *vg_name;
|
||||
char *st;
|
||||
int consistent = 1;
|
||||
struct volume_group *vg;
|
||||
@@ -163,28 +195,20 @@ int lvconvert(struct cmd_context * cmd, int argc, char **argv)
|
||||
struct lvconvert_params lp;
|
||||
int ret = ECMD_FAILED;
|
||||
|
||||
if (!arg_count(cmd, mirrors_ARG)) {
|
||||
log_error("--mirrors argument required");
|
||||
if (!_read_params(&lp, cmd, argc, argv)) {
|
||||
stack;
|
||||
return EINVALID_CMD_LINE;
|
||||
}
|
||||
|
||||
if (!argc) {
|
||||
log_error("Please give logical volume path(s)");
|
||||
return EINVALID_CMD_LINE;
|
||||
}
|
||||
|
||||
lv_name = argv[0];
|
||||
argv++, argc--;
|
||||
|
||||
vg_name = extract_vgname(cmd, lv_name);
|
||||
vg_name = extract_vgname(cmd, lp.lv_name);
|
||||
|
||||
if (!validate_name(vg_name)) {
|
||||
log_error("Please provide a valid volume group name");
|
||||
return EINVALID_CMD_LINE;
|
||||
}
|
||||
|
||||
if ((st = strrchr(lv_name, '/')))
|
||||
lv_name = st + 1;
|
||||
if ((st = strrchr(lp.lv_name, '/')))
|
||||
lp.lv_name = st + 1;
|
||||
|
||||
log_verbose("Checking for existing volume group \"%s\"", vg_name);
|
||||
|
||||
@@ -208,21 +232,22 @@ int lvconvert(struct cmd_context * cmd, int argc, char **argv)
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!(lvl = find_lv_in_vg(vg, lv_name))) {
|
||||
if (!(lvl = find_lv_in_vg(vg, lp.lv_name))) {
|
||||
log_error("Logical volume \"%s\" not found in "
|
||||
"volume group \"%s\"", lv_name, vg_name);
|
||||
"volume group \"%s\"", lp.lv_name, vg_name);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (argc) {
|
||||
if (!(lp.pvh = create_pv_list(cmd->mem, vg, argc, argv, 1))) {
|
||||
if (lp.pv_count) {
|
||||
if (!(lp.pvh = create_pv_list(cmd->mem, vg, lp.pv_count,
|
||||
lp.pvs, 1))) {
|
||||
stack;
|
||||
goto error;
|
||||
}
|
||||
} else
|
||||
lp.pvh = &vg->pvs;
|
||||
|
||||
ret = lvconvert_single(cmd, lvl->lv, argc, argv, &lp);
|
||||
ret = lvconvert_single(cmd, lvl->lv, &lp);
|
||||
|
||||
error:
|
||||
unlock_vg(cmd, vg_name);
|
||||
|
||||
@@ -414,51 +414,9 @@ static int _read_params(struct lvcreate_params *lp, struct cmd_context *cmd,
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Volumes may be zeroed to remove old application data.
|
||||
*/
|
||||
static int _zero_lv(struct cmd_context *cmd, struct logical_volume *lv)
|
||||
{
|
||||
struct device *dev;
|
||||
char *name;
|
||||
|
||||
/*
|
||||
* FIXME:
|
||||
* <clausen> also, more than 4k
|
||||
* <clausen> say, reiserfs puts it's superblock 32k in, IIRC
|
||||
* <ejt_> k, I'll drop a fixme to that effect
|
||||
* (I know the device is at least 4k, but not 32k)
|
||||
*/
|
||||
if (!(name = pool_alloc(cmd->mem, PATH_MAX))) {
|
||||
log_error("Name allocation failed - device not zeroed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (lvm_snprintf(name, PATH_MAX, "%s%s/%s", cmd->dev_dir,
|
||||
lv->vg->name, lv->name) < 0) {
|
||||
log_error("Name too long - device not zeroed (%s)", lv->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
log_verbose("Zeroing start of logical volume \"%s\"", lv->name);
|
||||
|
||||
if (!(dev = dev_cache_get(name, NULL))) {
|
||||
log_error("%s: not found: device not zeroed", name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!dev_open_quiet(dev))
|
||||
return 0;
|
||||
|
||||
dev_zero(dev, UINT64_C(0), (size_t) 4096);
|
||||
dev_close_immediate(dev);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _lvcreate(struct cmd_context *cmd, struct lvcreate_params *lp)
|
||||
{
|
||||
uint32_t size_rest, region_max;
|
||||
uint32_t size_rest;
|
||||
uint32_t status = 0;
|
||||
uint64_t tmp_size;
|
||||
struct volume_group *vg;
|
||||
@@ -548,6 +506,11 @@ static int _lvcreate(struct cmd_context *cmd, struct lvcreate_params *lp)
|
||||
"device-mapper kernel driver");
|
||||
return 0;
|
||||
}
|
||||
/* FIXME Allow exclusive activation. */
|
||||
if (vg->status & CLUSTERED) {
|
||||
log_error("Clustered snapshots are not yet supported.");
|
||||
return 0;
|
||||
}
|
||||
if (!(org = find_lv(vg, lp->origin))) {
|
||||
log_err("Couldn't find origin volume '%s'.",
|
||||
lp->origin);
|
||||
@@ -614,39 +577,20 @@ static int _lvcreate(struct cmd_context *cmd, struct lvcreate_params *lp)
|
||||
}
|
||||
|
||||
if (lp->mirrors > 1) {
|
||||
/* FIXME Adjust lp->region_size if necessary */
|
||||
region_max = (1 << (ffs(lp->extents) - 1)) * vg->extent_size;
|
||||
|
||||
if (region_max < lp->region_size) {
|
||||
lp->region_size = region_max;
|
||||
log_print("Using reduced mirror region size of %" PRIu32
|
||||
" sectors", lp->region_size);
|
||||
}
|
||||
lp->region_size = adjusted_mirror_region_size(vg->extent_size,
|
||||
lp->extents,
|
||||
lp->region_size);
|
||||
|
||||
/* FIXME Calculate how many extents needed for the log */
|
||||
|
||||
len = strlen(lv_name) + 32;
|
||||
if (!(log_name = alloca(len))) {
|
||||
if (!(log_name = alloca(len)) ||
|
||||
!(generate_log_name_format(vg, lv_name, log_name, len))) {
|
||||
log_error("log_name allocation failed. "
|
||||
"Remove new LV and retry.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (lvm_snprintf(log_name, len, "%s_mlog", lv_name) < 0) {
|
||||
log_error("log_name allocation failed. "
|
||||
"Remove new LV and retry.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (find_lv_in_vg(vg, log_name)) {
|
||||
if (lvm_snprintf(log_name, len, "%s_mlog_%%d",
|
||||
lv_name) < 0) {
|
||||
log_error("log_name allocation failed. "
|
||||
"Remove new LV and retry.");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(log_lv = lv_create_empty(vg->fid, log_name, NULL,
|
||||
VISIBLE_LV | LVM_READ | LVM_WRITE,
|
||||
lp->alloc, 0, vg))) {
|
||||
@@ -679,19 +623,19 @@ static int _lvcreate(struct cmd_context *cmd, struct lvcreate_params *lp)
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!activate_lv(cmd, log_lv->lvid.s)) {
|
||||
if (!activate_lv(cmd, log_lv)) {
|
||||
log_error("Aborting. Failed to activate mirror log. "
|
||||
"Remove new LVs and retry.");
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (activation() && !_zero_lv(cmd, log_lv)) {
|
||||
if (activation() && !zero_lv(cmd, log_lv)) {
|
||||
log_error("Aborting. Failed to wipe mirror log. "
|
||||
"Remove new LV and retry.");
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!deactivate_lv(cmd, log_lv->lvid.s)) {
|
||||
if (!deactivate_lv(cmd, log_lv)) {
|
||||
log_error("Aborting. Failed to deactivate mirror log. "
|
||||
"Remove new LV and retry.");
|
||||
goto error;
|
||||
@@ -767,7 +711,7 @@ static int _lvcreate(struct cmd_context *cmd, struct lvcreate_params *lp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!activate_lv(cmd, lv->lvid.s)) {
|
||||
if (!activate_lv(cmd, lv)) {
|
||||
if (lp->snapshot)
|
||||
/* FIXME Remove the failed lv we just added */
|
||||
log_error("Aborting. Failed to activate snapshot "
|
||||
@@ -778,7 +722,7 @@ static int _lvcreate(struct cmd_context *cmd, struct lvcreate_params *lp)
|
||||
}
|
||||
|
||||
if ((lp->zero || lp->snapshot) && activation()) {
|
||||
if (!_zero_lv(cmd, lv) && lp->snapshot) {
|
||||
if (!zero_lv(cmd, lv) && lp->snapshot) {
|
||||
/* FIXME Remove the failed lv we just added */
|
||||
log_error("Aborting. Failed to wipe snapshot "
|
||||
"exception store. Remove new LV and retry.");
|
||||
@@ -793,13 +737,13 @@ static int _lvcreate(struct cmd_context *cmd, struct lvcreate_params *lp)
|
||||
/* Reset permission after zeroing */
|
||||
if (!(lp->permission & LVM_WRITE))
|
||||
lv->status &= ~LVM_WRITE;
|
||||
if (!deactivate_lv(cmd, lv->lvid.s)) {
|
||||
if (!deactivate_lv(cmd, lv)) {
|
||||
log_err("Couldn't deactivate new snapshot.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* FIXME write/commit/backup sequence issue */
|
||||
if (!suspend_lv(cmd, org->lvid.s)) {
|
||||
if (!suspend_lv(cmd, org)) {
|
||||
log_error("Failed to suspend origin %s", org->name);
|
||||
return 0;
|
||||
}
|
||||
@@ -814,7 +758,7 @@ static int _lvcreate(struct cmd_context *cmd, struct lvcreate_params *lp)
|
||||
if (!vg_write(vg) || !vg_commit(vg))
|
||||
return 0;
|
||||
|
||||
if (!resume_lv(cmd, org->lvid.s)) {
|
||||
if (!resume_lv(cmd, org)) {
|
||||
log_error("Problem reactivating origin %s", org->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -350,21 +350,30 @@ int segtype_arg(struct cmd_context *cmd, struct arg *a)
|
||||
|
||||
char yes_no_prompt(const char *prompt, ...)
|
||||
{
|
||||
int c = 0;
|
||||
int c = 0, ret = 0;
|
||||
va_list ap;
|
||||
|
||||
while (c != 'y' && c != 'n') {
|
||||
if (c == '\n' || c == 0) {
|
||||
do {
|
||||
if (c == '\n' || !c) {
|
||||
va_start(ap, prompt);
|
||||
vprintf(prompt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
c = tolower(getchar());
|
||||
}
|
||||
|
||||
while (getchar() != '\n') ;
|
||||
if ((c = getchar()) == EOF) {
|
||||
ret = 'n';
|
||||
break;
|
||||
}
|
||||
|
||||
return c;
|
||||
c = tolower(c);
|
||||
if ((c == 'y') || (c == 'n'))
|
||||
ret = c;
|
||||
} while (!ret || c != '\n');
|
||||
|
||||
if (c != '\n')
|
||||
printf("\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __alloc(int size)
|
||||
|
||||
@@ -74,7 +74,7 @@ static int lvremove_single(struct cmd_context *cmd, struct logical_volume *lv,
|
||||
if (!archive(vg))
|
||||
return ECMD_FAILED;
|
||||
|
||||
if (!deactivate_lv(cmd, lv->lvid.s)) {
|
||||
if (!deactivate_lv(cmd, lv)) {
|
||||
log_error("Unable to deactivate logical volume \"%s\"",
|
||||
lv->name);
|
||||
return ECMD_FAILED;
|
||||
|
||||
@@ -158,18 +158,18 @@ int lvrename(struct cmd_context *cmd, int argc, char **argv)
|
||||
|
||||
backup(lv->vg);
|
||||
|
||||
if (!suspend_lv(cmd, lv->lvid.s)) {
|
||||
if (!suspend_lv(cmd, lv)) {
|
||||
stack;
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!vg_commit(vg)) {
|
||||
stack;
|
||||
resume_lv(cmd, lv->lvid.s);
|
||||
resume_lv(cmd, lv);
|
||||
goto error;
|
||||
}
|
||||
|
||||
resume_lv(cmd, lv->lvid.s);
|
||||
resume_lv(cmd, lv);
|
||||
|
||||
unlock_vg(cmd, vg_name);
|
||||
|
||||
|
||||
@@ -124,7 +124,7 @@ static int _lvresize(struct cmd_context *cmd, struct lvresize_params *lp)
|
||||
uint32_t extents_used = 0;
|
||||
uint32_t size_rest;
|
||||
alloc_policy_t alloc;
|
||||
char *lock_lvid;
|
||||
struct logical_volume *lock_lv;
|
||||
struct lv_list *lvl;
|
||||
int consistent = 1;
|
||||
struct lv_segment *seg;
|
||||
@@ -518,11 +518,11 @@ static int _lvresize(struct cmd_context *cmd, struct lvresize_params *lp)
|
||||
|
||||
/* If snapshot, must suspend all associated devices */
|
||||
if ((snap_seg = find_cow(lv)))
|
||||
lock_lvid = snap_seg->origin->lvid.s;
|
||||
lock_lv = snap_seg->origin;
|
||||
else
|
||||
lock_lvid = lv->lvid.s;
|
||||
lock_lv = lv;
|
||||
|
||||
if (!suspend_lv(cmd, lock_lvid)) {
|
||||
if (!suspend_lv(cmd, lock_lv)) {
|
||||
log_error("Failed to suspend %s", lp->lv_name);
|
||||
vg_revert(vg);
|
||||
return ECMD_FAILED;
|
||||
@@ -530,11 +530,11 @@ static int _lvresize(struct cmd_context *cmd, struct lvresize_params *lp)
|
||||
|
||||
if (!vg_commit(vg)) {
|
||||
stack;
|
||||
resume_lv(cmd, lock_lvid);
|
||||
resume_lv(cmd, lock_lv);
|
||||
return ECMD_FAILED;
|
||||
}
|
||||
|
||||
if (!resume_lv(cmd, lock_lvid)) {
|
||||
if (!resume_lv(cmd, lock_lv)) {
|
||||
log_error("Problem reactivating %s", lp->lv_name);
|
||||
return ECMD_FAILED;
|
||||
}
|
||||
|
||||
@@ -219,7 +219,7 @@ static int _update_metadata(struct cmd_context *cmd, struct volume_group *vg,
|
||||
|
||||
/* Suspend mirrors on subsequent calls */
|
||||
if (!first_time) {
|
||||
if (!suspend_lv(cmd, lv_mirr->lvid.s)) {
|
||||
if (!suspend_lv(cmd, lv_mirr)) {
|
||||
stack;
|
||||
resume_lvs(cmd, lvs_changed);
|
||||
vg_revert(vg);
|
||||
@@ -231,15 +231,16 @@ static int _update_metadata(struct cmd_context *cmd, struct volume_group *vg,
|
||||
if (!vg_commit(vg)) {
|
||||
log_error("ABORTING: Volume group metadata update failed.");
|
||||
if (!first_time)
|
||||
resume_lv(cmd, lv_mirr->lvid.s);
|
||||
resume_lv(cmd, lv_mirr);
|
||||
resume_lvs(cmd, lvs_changed);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Activate the temporary mirror LV */
|
||||
/* Only the first mirror segment gets activated as a mirror */
|
||||
/* FIXME: Add option to use a log */
|
||||
if (first_time) {
|
||||
if (!activate_lv(cmd, lv_mirr->lvid.s)) {
|
||||
if (!activate_lv_excl(cmd, lv_mirr)) {
|
||||
if (!test_mode())
|
||||
log_error("ABORTING: Temporary mirror "
|
||||
"activation failed. "
|
||||
@@ -248,7 +249,7 @@ static int _update_metadata(struct cmd_context *cmd, struct volume_group *vg,
|
||||
resume_lvs(cmd, lvs_changed);
|
||||
return 0;
|
||||
}
|
||||
} else if (!resume_lv(cmd, lv_mirr->lvid.s)) {
|
||||
} else if (!resume_lv(cmd, lv_mirr)) {
|
||||
log_error("Unable to reactivate logical volume \"%s\"",
|
||||
lv_mirr->name);
|
||||
resume_lvs(cmd, lvs_changed);
|
||||
@@ -317,7 +318,7 @@ static int _set_up_pvmove(struct cmd_context *cmd, const char *pv_name,
|
||||
}
|
||||
|
||||
/* Ensure mirror LV is active */
|
||||
if (!activate_lv(cmd, lv_mirr->lvid.s)) {
|
||||
if (!activate_lv_excl(cmd, lv_mirr)) {
|
||||
log_error
|
||||
("ABORTING: Temporary mirror activation failed.");
|
||||
unlock_vg(cmd, pv->vg_name);
|
||||
@@ -414,7 +415,7 @@ static int _finish_pvmove(struct cmd_context *cmd, struct volume_group *vg,
|
||||
}
|
||||
|
||||
/* Suspend mirror LV to flush pending I/O */
|
||||
if (!suspend_lv(cmd, lv_mirr->lvid.s)) {
|
||||
if (!suspend_lv(cmd, lv_mirr)) {
|
||||
log_error("Suspension of temporary mirror LV failed");
|
||||
r = 0;
|
||||
}
|
||||
@@ -424,13 +425,13 @@ static int _finish_pvmove(struct cmd_context *cmd, struct volume_group *vg,
|
||||
log_error("ABORTING: Failed to write new data locations "
|
||||
"to disk.");
|
||||
vg_revert(vg);
|
||||
resume_lv(cmd, lv_mirr->lvid.s);
|
||||
resume_lv(cmd, lv_mirr);
|
||||
resume_lvs(cmd, lvs_changed);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Release mirror LV. (No pending I/O because it's been suspended.) */
|
||||
if (!resume_lv(cmd, lv_mirr->lvid.s)) {
|
||||
if (!resume_lv(cmd, lv_mirr)) {
|
||||
log_error("Unable to reactivate logical volume \"%s\"",
|
||||
lv_mirr->name);
|
||||
r = 0;
|
||||
@@ -440,7 +441,7 @@ static int _finish_pvmove(struct cmd_context *cmd, struct volume_group *vg,
|
||||
resume_lvs(cmd, lvs_changed);
|
||||
|
||||
/* Deactivate mirror LV */
|
||||
if (!deactivate_lv(cmd, lv_mirr->lvid.s)) {
|
||||
if (!deactivate_lv(cmd, lv_mirr)) {
|
||||
log_error("ABORTING: Unable to deactivate temporary logical "
|
||||
"volume \"%s\"", lv_mirr->name);
|
||||
r = 0;
|
||||
|
||||
@@ -35,7 +35,9 @@ static int _vgs_single(struct cmd_context *cmd, const char *vg_name,
|
||||
static int _lvs_single(struct cmd_context *cmd, struct logical_volume *lv,
|
||||
void *handle)
|
||||
{
|
||||
if (!arg_count(cmd, all_ARG) && !(lv->status & VISIBLE_LV))
|
||||
/* FIXME Avoid snapshot special-case */
|
||||
if (!arg_count(cmd, all_ARG) && !(lv->status & VISIBLE_LV) &&
|
||||
!(lv_is_cow(lv)))
|
||||
return ECMD_PROCESSED;
|
||||
|
||||
if (!report_object(handle, lv->vg, lv, NULL, NULL, NULL))
|
||||
@@ -81,7 +83,9 @@ static int _pvsegs_sub_single(struct cmd_context *cmd, struct volume_group *vg,
|
||||
static int _lvsegs_single(struct cmd_context *cmd, struct logical_volume *lv,
|
||||
void *handle)
|
||||
{
|
||||
if (!arg_count(cmd, all_ARG) && !(lv->status & VISIBLE_LV))
|
||||
/* FIXME Avoid snapshot special-case */
|
||||
if (!arg_count(cmd, all_ARG) && !(lv->status & VISIBLE_LV) &&
|
||||
!(lv_is_cow(lv)))
|
||||
return ECMD_PROCESSED;
|
||||
|
||||
return process_each_segment_in_lv(cmd, lv, handle, _segs_single);
|
||||
|
||||
@@ -1057,3 +1057,64 @@ int validate_vg_name(struct cmd_context *cmd, const char *vg_name)
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int generate_log_name_format(struct volume_group *vg, const char *lv_name,
|
||||
char *buffer, size_t size)
|
||||
{
|
||||
if (lvm_snprintf(buffer, size, "%s_mlog", lv_name) < 0) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (find_lv_in_vg(vg, buffer) &&
|
||||
lvm_snprintf(buffer, size, "%s_mlog_%%d",
|
||||
lv_name) < 0) {
|
||||
stack;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Volumes may be zeroed to remove old application data.
|
||||
*/
|
||||
int zero_lv(struct cmd_context *cmd, struct logical_volume *lv)
|
||||
{
|
||||
struct device *dev;
|
||||
char *name;
|
||||
|
||||
/*
|
||||
* FIXME:
|
||||
* <clausen> also, more than 4k
|
||||
* <clausen> say, reiserfs puts it's superblock 32k in, IIRC
|
||||
* <ejt_> k, I'll drop a fixme to that effect
|
||||
* (I know the device is at least 4k, but not 32k)
|
||||
*/
|
||||
if (!(name = pool_alloc(cmd->mem, PATH_MAX))) {
|
||||
log_error("Name allocation failed - device not zeroed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (lvm_snprintf(name, PATH_MAX, "%s%s/%s", cmd->dev_dir,
|
||||
lv->vg->name, lv->name) < 0) {
|
||||
log_error("Name too long - device not zeroed (%s)", lv->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
log_verbose("Zeroing start of logical volume \"%s\"", lv->name);
|
||||
|
||||
if (!(dev = dev_cache_get(name, NULL))) {
|
||||
log_error("%s: not found: device not zeroed", name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!dev_open_quiet(dev))
|
||||
return 0;
|
||||
|
||||
dev_zero(dev, UINT64_C(0), (size_t) 4096);
|
||||
dev_close_immediate(dev);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -94,4 +94,9 @@ int apply_lvname_restrictions(const char *name);
|
||||
|
||||
int validate_vg_name(struct cmd_context *cmd, const char *vg_name);
|
||||
|
||||
int generate_log_name_format(struct volume_group *vg, const char *lv_name,
|
||||
char *buffer, size_t size);
|
||||
|
||||
int zero_lv(struct cmd_context *cmd, struct logical_volume *lv);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -37,18 +37,18 @@ static int _activate_lvs_in_vg(struct cmd_context *cmd,
|
||||
continue;
|
||||
|
||||
if (activate == CHANGE_AN) {
|
||||
if (!deactivate_lv(cmd, lv->lvid.s))
|
||||
if (!deactivate_lv(cmd, lv))
|
||||
continue;
|
||||
} else if (activate == CHANGE_ALN) {
|
||||
if (!deactivate_lv_local(cmd, lv->lvid.s))
|
||||
if (!deactivate_lv_local(cmd, lv))
|
||||
continue;
|
||||
} else if (lv_is_origin(lv) || (activate == CHANGE_AE)) {
|
||||
if (!activate_lv_excl(cmd, lv->lvid.s))
|
||||
if (!activate_lv_excl(cmd, lv))
|
||||
continue;
|
||||
} else if (activate == CHANGE_ALY) {
|
||||
if (!activate_lv_local(cmd, lv->lvid.s))
|
||||
if (!activate_lv_local(cmd, lv))
|
||||
continue;
|
||||
} else if (!activate_lv(cmd, lv->lvid.s))
|
||||
} else if (!activate_lv(cmd, lv))
|
||||
continue;
|
||||
|
||||
if ((lv->status & PVMOVE) &&
|
||||
@@ -182,6 +182,7 @@ static int _vgchange_clustered(struct cmd_context *cmd,
|
||||
struct volume_group *vg)
|
||||
{
|
||||
int clustered = !strcmp(arg_str_value(cmd, clustered_ARG, "n"), "y");
|
||||
struct lv_list *lvl;
|
||||
|
||||
if (clustered && (vg->status & CLUSTERED)) {
|
||||
log_error("Volume group \"%s\" is already clustered",
|
||||
@@ -195,6 +196,17 @@ static int _vgchange_clustered(struct cmd_context *cmd,
|
||||
return ECMD_FAILED;
|
||||
}
|
||||
|
||||
if (clustered) {
|
||||
list_iterate_items(lvl, &vg->lvs) {
|
||||
if (lvl->lv->origin_count || lvl->lv->snapshot) {
|
||||
log_error("Volume group %s contains snapshots "
|
||||
"that are not yet supported.",
|
||||
vg->name);
|
||||
return ECMD_FAILED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!archive(vg))
|
||||
return ECMD_FAILED;
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ static int _remove_lv(struct cmd_context *cmd, struct logical_volume *lv,
|
||||
log_verbose("Deactivating (if active) logical volume %s",
|
||||
lv->name);
|
||||
|
||||
if (!deactivate_lv(cmd, lv->lvid.s)) {
|
||||
if (!deactivate_lv(cmd, lv)) {
|
||||
log_error("Failed to deactivate LV %s", lv->name);
|
||||
return 0;
|
||||
}
|
||||
@@ -69,7 +69,7 @@ static int _remove_lv(struct cmd_context *cmd, struct logical_volume *lv,
|
||||
log_verbose("Deactivating (if active) logical volume %s "
|
||||
"(origin of %s)", snap_seg->origin->name, lv->name);
|
||||
|
||||
if (!deactivate_lv(cmd, snap_seg->origin->lvid.s)) {
|
||||
if (!deactivate_lv(cmd, snap_seg->origin)) {
|
||||
log_error("Failed to deactivate LV %s",
|
||||
snap_seg->origin->name);
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user