mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-02 01:18:26 +03:00
Add new --sysinit option for vgchange and lvchange.
A shortcut for --ignorelockingfailure, --ignoremonitoring, --poll n options and LVM_SUPPRESS_LOCKING_FAILURE_MESSAGES environment variable used all at once in initialisation scripts (e.g. rc.sysinit or initrd).
This commit is contained in:
parent
3283f817eb
commit
d50c6d4bf5
@ -1,5 +1,6 @@
|
|||||||
Version 2.02.65 -
|
Version 2.02.65 -
|
||||||
=================================
|
=================================
|
||||||
|
Add new --sysinit option for vgchange and lvchange.
|
||||||
Suppress duplicate error messages about read failures and missing devices.
|
Suppress duplicate error messages about read failures and missing devices.
|
||||||
Install plugins to $(libdir)/device-mapper and $(libdir)/lvm2.
|
Install plugins to $(libdir)/device-mapper and $(libdir)/lvm2.
|
||||||
Add dm_list_splice() function to join two lists together.
|
Add dm_list_splice() function to join two lists together.
|
||||||
|
@ -217,10 +217,8 @@ static void _update_vg_lock_count(const char *resource, uint32_t flags)
|
|||||||
* Select a locking type
|
* Select a locking type
|
||||||
* type: locking type; if < 0, then read config tree value
|
* type: locking type; if < 0, then read config tree value
|
||||||
*/
|
*/
|
||||||
int init_locking(int type, struct cmd_context *cmd)
|
int init_locking(int type, struct cmd_context *cmd, int suppress_messages)
|
||||||
{
|
{
|
||||||
int suppress_messages = 0;
|
|
||||||
|
|
||||||
if (ignorelockingfailure() && getenv("LVM_SUPPRESS_LOCKING_FAILURE_MESSAGES"))
|
if (ignorelockingfailure() && getenv("LVM_SUPPRESS_LOCKING_FAILURE_MESSAGES"))
|
||||||
suppress_messages = 1;
|
suppress_messages = 1;
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
#include "uuid.h"
|
#include "uuid.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
int init_locking(int type, struct cmd_context *cmd);
|
int init_locking(int type, struct cmd_context *cmd, int suppress_messages);
|
||||||
void fin_locking(void);
|
void fin_locking(void);
|
||||||
void reset_locking(void);
|
void reset_locking(void);
|
||||||
int vg_write_lock_held(void);
|
int vg_write_lock_held(void);
|
||||||
|
@ -50,7 +50,7 @@ lvm_t lvm_init(const char *system_dir)
|
|||||||
|
|
||||||
/* FIXME: locking_type config option needed? */
|
/* FIXME: locking_type config option needed? */
|
||||||
/* initialize locking */
|
/* initialize locking */
|
||||||
if (!init_locking(-1, cmd)) {
|
if (!init_locking(-1, cmd, 0)) {
|
||||||
/* FIXME: use EAGAIN as error code here */
|
/* FIXME: use EAGAIN as error code here */
|
||||||
lvm_quit((lvm_t) cmd);
|
lvm_quit((lvm_t) cmd);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -13,6 +13,7 @@ lvchange \- change attributes of a logical volume
|
|||||||
[\-\-ignoremonitoring]
|
[\-\-ignoremonitoring]
|
||||||
[\-\-monitor {y|n}]
|
[\-\-monitor {y|n}]
|
||||||
[\-\-poll {y|n}]
|
[\-\-poll {y|n}]
|
||||||
|
[\-\-sysinit]
|
||||||
[\-\-noudevsync]
|
[\-\-noudevsync]
|
||||||
[\-M|\-\-persistent y|n] [\-\-minor minor]
|
[\-M|\-\-persistent y|n] [\-\-minor minor]
|
||||||
[\-P|\-\-partial]
|
[\-P|\-\-partial]
|
||||||
@ -71,6 +72,15 @@ process from its last checkpoint. However, it may not be appropriate to
|
|||||||
immediately poll a logical volume when it is activated, use \fB--poll
|
immediately poll a logical volume when it is activated, use \fB--poll
|
||||||
n\fP to defer and then \fB--poll y\fP to restart the process.
|
n\fP to defer and then \fB--poll y\fP to restart the process.
|
||||||
.TP
|
.TP
|
||||||
|
.I \-\-sysinit
|
||||||
|
Indicates that lvchange(8) is being invoked from early system initialisation
|
||||||
|
scripts (e.g. rc.sysinit or an initrd), before writeable filesystems are
|
||||||
|
available. As such, some functionality needs to be disabled and this option
|
||||||
|
acts as a shortcut which selects an appropriate set of options. Currently
|
||||||
|
this is equivalent to using \fB--ignorelockingfailure\fP, \fB--ignoremonitoring\fP,
|
||||||
|
\fB--poll n\fP and setting \fBLVM_SUPPRESS_LOCKING_FAILURE_MESSAGES\fP
|
||||||
|
environment variable.
|
||||||
|
.TP
|
||||||
.I \-\-noudevsync
|
.I \-\-noudevsync
|
||||||
Disable udev synchronisation. The
|
Disable udev synchronisation. The
|
||||||
process will not wait for notification from udev.
|
process will not wait for notification from udev.
|
||||||
|
@ -19,6 +19,7 @@ vgchange \- change attributes of a volume group
|
|||||||
.RB [ \-h | \-\-help]
|
.RB [ \-h | \-\-help]
|
||||||
.RB [ \-\-ignorelockingfailure]
|
.RB [ \-\-ignorelockingfailure]
|
||||||
.RB [ \-\-ignoremonitoring]
|
.RB [ \-\-ignoremonitoring]
|
||||||
|
.RB [ \-\-sysinit]
|
||||||
.RB [ \-\-noudevsync ]
|
.RB [ \-\-noudevsync ]
|
||||||
.RB [ \-l | \-\-logicalvolume
|
.RB [ \-l | \-\-logicalvolume
|
||||||
.IR MaxLogicalVolumes ]
|
.IR MaxLogicalVolumes ]
|
||||||
@ -96,6 +97,15 @@ process from its last checkpoint. However, it may not be appropriate to
|
|||||||
immediately poll a logical volume when it is activated, use \fB--poll
|
immediately poll a logical volume when it is activated, use \fB--poll
|
||||||
n\fP to defer and then \fB--poll y\fP to restart the process.
|
n\fP to defer and then \fB--poll y\fP to restart the process.
|
||||||
.TP
|
.TP
|
||||||
|
.BR \-\-sysinit
|
||||||
|
Indicates that vgchange(8) is being invoked from early system initialisation
|
||||||
|
scripts (e.g. rc.sysinit or an initrd), before writeable filesystems are
|
||||||
|
available. As such, some functionality needs to be disabled and this option
|
||||||
|
acts as a shortcut which selects an appropriate set of options. Currently
|
||||||
|
this is equivalent to using \fB--ignorelockingfailure\fP, \fB--ignoremonitoring\fP,
|
||||||
|
\fB--poll n\fP and setting \fBLVM_SUPPRESS_LOCKING_FAILURE_MESSAGES\fP
|
||||||
|
environment variable.
|
||||||
|
.TP
|
||||||
.BR \-\-noudevsync
|
.BR \-\-noudevsync
|
||||||
Disable udev synchronisation. The
|
Disable udev synchronisation. The
|
||||||
process will not wait for notification from udev.
|
process will not wait for notification from udev.
|
||||||
|
@ -66,6 +66,7 @@ arg(virtualsize_ARG, '\0', "virtualsize", size_mb_arg, 0)
|
|||||||
arg(noudevsync_ARG, '\0', "noudevsync", NULL, 0)
|
arg(noudevsync_ARG, '\0', "noudevsync", NULL, 0)
|
||||||
arg(poll_ARG, '\0', "poll", yes_no_arg, 0)
|
arg(poll_ARG, '\0', "poll", yes_no_arg, 0)
|
||||||
arg(stripes_long_ARG, '\0', "stripes", int_arg, 0)
|
arg(stripes_long_ARG, '\0', "stripes", int_arg, 0)
|
||||||
|
arg(sysinit_ARG, '\0', "sysinit", NULL, 0)
|
||||||
|
|
||||||
/* Allow some variations */
|
/* Allow some variations */
|
||||||
arg(resizable_ARG, '\0', "resizable", yes_no_arg, 0)
|
arg(resizable_ARG, '\0', "resizable", yes_no_arg, 0)
|
||||||
|
@ -80,6 +80,7 @@ xx(lvchange,
|
|||||||
"\t[-r|--readahead ReadAheadSectors|auto|none]\n"
|
"\t[-r|--readahead ReadAheadSectors|auto|none]\n"
|
||||||
"\t[--refresh]\n"
|
"\t[--refresh]\n"
|
||||||
"\t[--resync]\n"
|
"\t[--resync]\n"
|
||||||
|
"\t[--sysinit]\n"
|
||||||
"\t[-t|--test]\n"
|
"\t[-t|--test]\n"
|
||||||
"\t[-v|--verbose]\n"
|
"\t[-v|--verbose]\n"
|
||||||
"\t[-y|--yes]\n"
|
"\t[-y|--yes]\n"
|
||||||
@ -90,7 +91,7 @@ xx(lvchange,
|
|||||||
ignorelockingfailure_ARG, ignoremonitoring_ARG, major_ARG, minor_ARG,
|
ignorelockingfailure_ARG, ignoremonitoring_ARG, major_ARG, minor_ARG,
|
||||||
monitor_ARG, noudevsync_ARG, partial_ARG, permission_ARG, persistent_ARG,
|
monitor_ARG, noudevsync_ARG, partial_ARG, permission_ARG, persistent_ARG,
|
||||||
poll_ARG, readahead_ARG, resync_ARG, refresh_ARG, addtag_ARG, deltag_ARG,
|
poll_ARG, readahead_ARG, resync_ARG, refresh_ARG, addtag_ARG, deltag_ARG,
|
||||||
test_ARG, yes_ARG)
|
sysinit_ARG, test_ARG, yes_ARG)
|
||||||
|
|
||||||
xx(lvconvert,
|
xx(lvconvert,
|
||||||
"Change logical volume layout",
|
"Change logical volume layout",
|
||||||
@ -711,6 +712,7 @@ xx(vgchange,
|
|||||||
"\t[--poll {y|n}]\n"
|
"\t[--poll {y|n}]\n"
|
||||||
"\t[--noudevsync]\n"
|
"\t[--noudevsync]\n"
|
||||||
"\t[--refresh]\n"
|
"\t[--refresh]\n"
|
||||||
|
"\t[--sysinit]\n"
|
||||||
"\t[-t|--test]" "\n"
|
"\t[-t|--test]" "\n"
|
||||||
"\t[-u|--uuid] " "\n"
|
"\t[-u|--uuid] " "\n"
|
||||||
"\t[-v|--verbose] " "\n"
|
"\t[-v|--verbose] " "\n"
|
||||||
@ -729,7 +731,7 @@ xx(vgchange,
|
|||||||
clustered_ARG, deltag_ARG, ignorelockingfailure_ARG, ignoremonitoring_ARG,
|
clustered_ARG, deltag_ARG, ignorelockingfailure_ARG, ignoremonitoring_ARG,
|
||||||
logicalvolume_ARG, maxphysicalvolumes_ARG, monitor_ARG, noudevsync_ARG,
|
logicalvolume_ARG, maxphysicalvolumes_ARG, monitor_ARG, noudevsync_ARG,
|
||||||
partial_ARG, physicalextentsize_ARG, poll_ARG, refresh_ARG, resizeable_ARG,
|
partial_ARG, physicalextentsize_ARG, poll_ARG, refresh_ARG, resizeable_ARG,
|
||||||
resizable_ARG, test_ARG, uuid_ARG)
|
resizable_ARG, sysinit_ARG, test_ARG, uuid_ARG)
|
||||||
|
|
||||||
xx(vgck,
|
xx(vgck,
|
||||||
"Check the consistency of volume group(s)",
|
"Check the consistency of volume group(s)",
|
||||||
|
@ -586,9 +586,12 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
|
|||||||
* should only be started if the LV is not already active. So:
|
* should only be started if the LV is not already active. So:
|
||||||
* 1) change the activation code to say if the LV was actually activated
|
* 1) change the activation code to say if the LV was actually activated
|
||||||
* 2) make polling of an LV tightly coupled with LV activation
|
* 2) make polling of an LV tightly coupled with LV activation
|
||||||
|
*
|
||||||
|
* Do not initiate any polling if --sysinit option is used.
|
||||||
*/
|
*/
|
||||||
init_background_polling(arg_int_value(cmd, poll_ARG,
|
init_background_polling(arg_count(cmd, sysinit_ARG) ? 0 :
|
||||||
DEFAULT_BACKGROUND_POLLING));
|
arg_int_value(cmd, poll_ARG,
|
||||||
|
DEFAULT_BACKGROUND_POLLING));
|
||||||
|
|
||||||
/* access permission change */
|
/* access permission change */
|
||||||
if (arg_count(cmd, permission_ARG)) {
|
if (arg_count(cmd, permission_ARG)) {
|
||||||
@ -730,8 +733,9 @@ int lvchange(struct cmd_context *cmd, int argc, char **argv)
|
|||||||
arg_count(cmd, addtag_ARG) || arg_count(cmd, deltag_ARG) ||
|
arg_count(cmd, addtag_ARG) || arg_count(cmd, deltag_ARG) ||
|
||||||
arg_count(cmd, resync_ARG) || arg_count(cmd, alloc_ARG));
|
arg_count(cmd, resync_ARG) || arg_count(cmd, alloc_ARG));
|
||||||
|
|
||||||
if (arg_count(cmd, ignorelockingfailure_ARG) && !avail_only) {
|
if ((arg_count(cmd, ignorelockingfailure_ARG) ||
|
||||||
log_error("Only -a permitted with --ignorelockingfailure");
|
arg_count(cmd, sysinit_ARG)) && !avail_only) {
|
||||||
|
log_error("Only -a permitted with --ignorelockingfailure and --sysinit");
|
||||||
return EINVALID_CMD_LINE;
|
return EINVALID_CMD_LINE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -759,6 +763,11 @@ int lvchange(struct cmd_context *cmd, int argc, char **argv)
|
|||||||
return EINVALID_CMD_LINE;
|
return EINVALID_CMD_LINE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (arg_count(cmd, poll_ARG) && arg_count(cmd, sysinit_ARG)) {
|
||||||
|
log_error("Only one of --poll and --sysinit permitted");
|
||||||
|
return EINVALID_CMD_LINE;
|
||||||
|
}
|
||||||
|
|
||||||
return process_each_lv(cmd, argc, argv,
|
return process_each_lv(cmd, argc, argv,
|
||||||
avail_only ? 0 : READ_FOR_UPDATE, NULL,
|
avail_only ? 0 : READ_FOR_UPDATE, NULL,
|
||||||
&lvchange_single);
|
&lvchange_single);
|
||||||
|
@ -793,7 +793,7 @@ static int _get_settings(struct cmd_context *cmd)
|
|||||||
"be activated read-only.");
|
"be activated read-only.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arg_count(cmd, ignorelockingfailure_ARG))
|
if (arg_count(cmd, ignorelockingfailure_ARG) || arg_count(cmd, sysinit_ARG))
|
||||||
init_ignorelockingfailure(1);
|
init_ignorelockingfailure(1);
|
||||||
else
|
else
|
||||||
init_ignorelockingfailure(0);
|
init_ignorelockingfailure(0);
|
||||||
@ -1049,7 +1049,7 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
|
|||||||
else
|
else
|
||||||
locking_type = -1;
|
locking_type = -1;
|
||||||
|
|
||||||
if (!init_locking(locking_type, cmd)) {
|
if (!init_locking(locking_type, cmd, arg_count(cmd, sysinit_ARG))) {
|
||||||
ret = ECMD_FAILED;
|
ret = ECMD_FAILED;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -1372,8 +1372,9 @@ int get_activation_monitoring_mode(struct cmd_context *cmd,
|
|||||||
*monitoring_mode = DEFAULT_DMEVENTD_MONITOR;
|
*monitoring_mode = DEFAULT_DMEVENTD_MONITOR;
|
||||||
|
|
||||||
if (arg_count(cmd, monitor_ARG) &&
|
if (arg_count(cmd, monitor_ARG) &&
|
||||||
arg_count(cmd, ignoremonitoring_ARG)) {
|
(arg_count(cmd, ignoremonitoring_ARG) ||
|
||||||
log_error("Conflicting monitor and ignoremonitoring options");
|
arg_count(cmd, sysinit_ARG))) {
|
||||||
|
log_error("--ignoremonitoring or --sysinit option not allowed with --monitor option");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1381,6 +1382,7 @@ int get_activation_monitoring_mode(struct cmd_context *cmd,
|
|||||||
*monitoring_mode = arg_int_value(cmd, monitor_ARG,
|
*monitoring_mode = arg_int_value(cmd, monitor_ARG,
|
||||||
DEFAULT_DMEVENTD_MONITOR);
|
DEFAULT_DMEVENTD_MONITOR);
|
||||||
else if (is_static() || arg_count(cmd, ignoremonitoring_ARG) ||
|
else if (is_static() || arg_count(cmd, ignoremonitoring_ARG) ||
|
||||||
|
arg_count(cmd, sysinit_ARG) ||
|
||||||
!find_config_tree_bool(cmd, "activation/monitoring",
|
!find_config_tree_bool(cmd, "activation/monitoring",
|
||||||
DEFAULT_DMEVENTD_MONITOR))
|
DEFAULT_DMEVENTD_MONITOR))
|
||||||
*monitoring_mode = DMEVENTD_MONITOR_IGNORE;
|
*monitoring_mode = DMEVENTD_MONITOR_IGNORE;
|
||||||
|
@ -540,9 +540,12 @@ static int vgchange_single(struct cmd_context *cmd, const char *vg_name,
|
|||||||
* should only be started if the LV is not already active. So:
|
* should only be started if the LV is not already active. So:
|
||||||
* 1) change the activation code to say if the LV was actually activated
|
* 1) change the activation code to say if the LV was actually activated
|
||||||
* 2) make polling of an LV tightly coupled with LV activation
|
* 2) make polling of an LV tightly coupled with LV activation
|
||||||
|
*
|
||||||
|
* Do not initiate any polling if --sysinit option is used.
|
||||||
*/
|
*/
|
||||||
init_background_polling(arg_int_value(cmd, poll_ARG,
|
init_background_polling(arg_count(cmd, sysinit_ARG) ? 0 :
|
||||||
DEFAULT_BACKGROUND_POLLING));
|
arg_int_value(cmd, poll_ARG,
|
||||||
|
DEFAULT_BACKGROUND_POLLING));
|
||||||
|
|
||||||
if (arg_count(cmd, available_ARG))
|
if (arg_count(cmd, available_ARG))
|
||||||
r = _vgchange_available(cmd, vg);
|
r = _vgchange_available(cmd, vg);
|
||||||
@ -615,9 +618,14 @@ int vgchange(struct cmd_context *cmd, int argc, char **argv)
|
|||||||
return EINVALID_CMD_LINE;
|
return EINVALID_CMD_LINE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arg_count(cmd, ignorelockingfailure_ARG) &&
|
if ((arg_count(cmd, ignorelockingfailure_ARG) ||
|
||||||
!arg_count(cmd, available_ARG)) {
|
arg_count(cmd, sysinit_ARG)) && !arg_count(cmd, available_ARG)) {
|
||||||
log_error("--ignorelockingfailure only available with -a");
|
log_error("Only -a premitted with --ignorelockingfailure and --sysinit");
|
||||||
|
return EINVALID_CMD_LINE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arg_count(cmd, poll_ARG) && arg_count(cmd, sysinit_ARG)) {
|
||||||
|
log_error("Only one of --poll and --sysinit permitted.");
|
||||||
return EINVALID_CMD_LINE;
|
return EINVALID_CMD_LINE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user