Version 2.01.11 -
==============================
+ Move archiver code from tools into library.
vgscan/change/display/vgs automatically create metadata backups if needed.
Fix contiguous allocation policy with linear.
Cope with missing format1 PVs again.
../lib/filters/filter.h
../lib/format1/format1.h
../lib/format_pool/format_pool.h
+../lib/format_text/archiver.h
../lib/format_text/format-text.h
../lib/format_text/text_export.h
../lib/format_text/text_import.h
filters/filter-md.c \
filters/filter.c \
format_text/archive.c \
+ format_text/archiver.c \
format_text/export.c \
format_text/flags.c \
format_text/format-text.c \
#include "segtype.h"
#include "lvmcache.h"
#include "dev-cache.h"
+#include "archiver.h"
#ifdef HAVE_LIBDL
#include "sharedlib.h"
return 1;
}
+static int _init_backup(struct cmd_context *cmd)
+{
+ uint32_t days, min;
+ char default_dir[PATH_MAX];
+ const char *dir;
+
+ if (!cmd->sys_dir) {
+ log_warn("WARNING: Metadata changes will NOT be backed up");
+ backup_init(cmd, "");
+ archive_init(cmd, "", 0, 0);
+ return 1;
+ }
+
+ /* set up archiving */
+ cmd->default_settings.archive =
+ find_config_bool(cmd->cft->root, "backup/archive",
+ DEFAULT_ARCHIVE_ENABLED);
+
+ days = (uint32_t) find_config_int(cmd->cft->root, "backup/retain_days",
+ DEFAULT_ARCHIVE_DAYS);
+
+ min = (uint32_t) find_config_int(cmd->cft->root, "backup/retain_min",
+ DEFAULT_ARCHIVE_NUMBER);
+
+ if (lvm_snprintf
+ (default_dir, sizeof(default_dir), "%s/%s", cmd->sys_dir,
+ DEFAULT_ARCHIVE_SUBDIR) == -1) {
+ log_err("Couldn't create default archive path '%s/%s'.",
+ cmd->sys_dir, DEFAULT_ARCHIVE_SUBDIR);
+ return 0;
+ }
+
+ dir = find_config_str(cmd->cft->root, "backup/archive_dir",
+ default_dir);
+
+ if (!archive_init(cmd, dir, days, min)) {
+ log_debug("backup_init failed.");
+ return 0;
+ }
+
+ /* set up the backup */
+ cmd->default_settings.backup =
+ find_config_bool(cmd->cft->root, "backup/backup",
+ DEFAULT_BACKUP_ENABLED);
+
+ if (lvm_snprintf
+ (default_dir, sizeof(default_dir), "%s/%s", cmd->sys_dir,
+ DEFAULT_BACKUP_SUBDIR) == -1) {
+ log_err("Couldn't create default backup path '%s/%s'.",
+ cmd->sys_dir, DEFAULT_BACKUP_SUBDIR);
+ return 0;
+ }
+
+ dir = find_config_str(cmd->cft->root, "backup/backup_dir", default_dir);
+
+ if (!backup_init(cmd, dir)) {
+ log_debug("backup_init failed.");
+ return 0;
+ }
+
+ return 1;
+}
+
/* Entry point */
struct cmd_context *create_toolcontext(struct arg *the_args)
{
if (!_init_segtypes(cmd))
goto error;
+ if (!_init_backup(cmd))
+ goto error;
+
cmd->current_settings = cmd->default_settings;
cmd->config_valid = 1;
if (cmd->dump_filter)
persistent_filter_dump(cmd->filter);
+ archive_exit(cmd);
+ backup_exit(cmd);
activation_exit();
lvmcache_destroy();
label_exit();
};
struct config_tree;
+struct archive_params;
+struct backup_params;
/* FIXME Split into tool & library contexts */
/* command-instance-related variables needed by library */
struct config_info default_settings;
struct config_info current_settings;
+ struct archive_params *archive_params;
+ struct backup_params *backup_params;
+
/* List of defined tags */
struct list tags;
int hosttags;
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include "tools.h"
+#include "lib.h"
+#include "archiver.h"
+#include "format-text.h"
+#include "lvm-file.h"
+#include "lvm-string.h"
+#include "lvmcache.h"
+#include "toolcontext.h"
-static struct {
+#include <unistd.h>
+
+struct archive_params {
int enabled;
char *dir;
unsigned int keep_days;
unsigned int keep_number;
+};
-} _archive_params;
-
-static struct {
+struct backup_params {
int enabled;
char *dir;
+};
-} _backup_params;
-
-int archive_init(const char *dir, unsigned int keep_days, unsigned int keep_min)
+int archive_init(struct cmd_context *cmd, const char *dir,
+ unsigned int keep_days, unsigned int keep_min)
{
- _archive_params.dir = NULL;
+ if (!(cmd->archive_params = pool_zalloc(cmd->mem, sizeof(*cmd->archive_params)))) {
+ log_error("archive_params alloc failed");
+ return 0;
+ }
+
+ cmd->archive_params->dir = NULL;
if (!*dir)
return 1;
- if (!(_archive_params.dir = dbg_strdup(dir))) {
+ if (!(cmd->archive_params->dir = dbg_strdup(dir))) {
log_error("Couldn't copy archive directory name.");
return 0;
}
- _archive_params.keep_days = keep_days;
- _archive_params.keep_number = keep_min;
- _archive_params.enabled = 1;
+ cmd->archive_params->keep_days = keep_days;
+ cmd->archive_params->keep_number = keep_min;
+ cmd->archive_params->enabled = 1;
+
return 1;
}
-void archive_exit(void)
+void archive_exit(struct cmd_context *cmd)
{
- if (_archive_params.dir)
- dbg_free(_archive_params.dir);
- memset(&_archive_params, 0, sizeof(_archive_params));
+ if (cmd->archive_params->dir)
+ dbg_free(cmd->archive_params->dir);
+ memset(cmd->archive_params, 0, sizeof(*cmd->archive_params));
}
-void archive_enable(int flag)
+void archive_enable(struct cmd_context *cmd, int flag)
{
- _archive_params.enabled = flag;
+ cmd->archive_params->enabled = flag;
}
static char *_build_desc(struct pool *mem, const char *line, int before)
return 0;
}
- return archive_vg(vg, _archive_params.dir, desc,
- _archive_params.keep_days,
- _archive_params.keep_number);
+ return archive_vg(vg, vg->cmd->archive_params->dir, desc,
+ vg->cmd->archive_params->keep_days,
+ vg->cmd->archive_params->keep_number);
}
int archive(struct volume_group *vg)
{
- if (!_archive_params.enabled || !_archive_params.dir)
+ if (!vg->cmd->archive_params->enabled || !vg->cmd->archive_params->dir)
return 1;
if (test_mode()) {
return 1;
}
- if (!create_dir(_archive_params.dir))
+ if (!create_dir(vg->cmd->archive_params->dir))
return 0;
/* Trap a read-only file system */
- if ((access(_archive_params.dir, R_OK | W_OK | X_OK) == -1) &&
+ if ((access(vg->cmd->archive_params->dir, R_OK | W_OK | X_OK) == -1) &&
(errno == EROFS))
return 0;
int r1, r2;
init_partial(1);
- r1 = archive_list(cmd, _archive_params.dir, vg_name);
- r2 = backup_list(cmd, _backup_params.dir, vg_name);
+ r1 = archive_list(cmd, cmd->archive_params->dir, vg_name);
+ r2 = backup_list(cmd, cmd->backup_params->dir, vg_name);
init_partial(0);
return r1 && r2;
}
-int backup_init(const char *dir)
+int backup_init(struct cmd_context *cmd, const char *dir)
{
- _backup_params.dir = NULL;
+ if (!(cmd->backup_params = pool_zalloc(cmd->mem, sizeof(*cmd->archive_params)))) {
+ log_error("archive_params alloc failed");
+ return 0;
+ }
+
+ cmd->backup_params->dir = NULL;
if (!*dir)
return 1;
- if (!(_backup_params.dir = dbg_strdup(dir))) {
+ if (!(cmd->backup_params->dir = dbg_strdup(dir))) {
log_error("Couldn't copy backup directory name.");
return 0;
}
return 1;
}
-void backup_exit(void)
+void backup_exit(struct cmd_context *cmd)
{
- if (_backup_params.dir)
- dbg_free(_backup_params.dir);
- memset(&_backup_params, 0, sizeof(_backup_params));
+ if (cmd->backup_params->dir)
+ dbg_free(cmd->backup_params->dir);
+ memset(cmd->backup_params, 0, sizeof(*cmd->backup_params));
}
-void backup_enable(int flag)
+void backup_enable(struct cmd_context *cmd, int flag)
{
- _backup_params.enabled = flag;
+ cmd->backup_params->enabled = flag;
}
static int __backup(struct volume_group *vg)
}
if (lvm_snprintf(name, sizeof(name), "%s/%s",
- _backup_params.dir, vg->name) < 0) {
+ vg->cmd->backup_params->dir, vg->name) < 0) {
log_error("Failed to generate volume group metadata backup "
"filename.");
return 0;
int backup(struct volume_group *vg)
{
- if (!_backup_params.enabled || !_backup_params.dir) {
+ if (!vg->cmd->backup_params->enabled || !vg->cmd->backup_params->dir) {
log_print("WARNING: This metadata update is NOT backed up");
return 1;
}
return 1;
}
- if (!create_dir(_backup_params.dir))
+ if (!create_dir(vg->cmd->backup_params->dir))
return 0;
/* Trap a read-only file system */
- if ((access(_backup_params.dir, R_OK | W_OK | X_OK) == -1) &&
+ if ((access(vg->cmd->backup_params->dir, R_OK | W_OK | X_OK) == -1) &&
(errno == EROFS))
return 0;
return 1;
}
-int backup_remove(const char *vg_name)
+int backup_remove(struct cmd_context *cmd, const char *vg_name)
{
char path[PATH_MAX];
if (lvm_snprintf(path, sizeof(path), "%s/%s",
- _backup_params.dir, vg_name) < 0) {
+ cmd->backup_params->dir, vg_name) < 0) {
log_err("Failed to generate backup filename (for removal).");
return 0;
}
char path[PATH_MAX];
if (lvm_snprintf(path, sizeof(path), "%s/%s",
- _backup_params.dir, vg_name) < 0) {
+ cmd->backup_params->dir, vg_name) < 0) {
log_err("Failed to generate backup filename (for restore).");
return 0;
}
return;
if (lvm_snprintf(path, sizeof(path), "%s/%s",
- _backup_params.dir, vg->name) < 0) {
+ vg->cmd->backup_params->dir, vg->name) < 0) {
log_debug("Failed to generate backup filename.");
return;
}
#include "metadata.h"
-/*
- * FIXME: This file is going to merge with the archiving code in
- * lib/format_text at some point.
- */
-
/*
* There are two operations that come under the general area of
* backups. 'Archiving' occurs just before a volume group
* Typically backups will be stored in /etc/lvm/backups.
*/
-int archive_init(const char *dir,
+int archive_init(struct cmd_context *cmd, const char *dir,
unsigned int keep_days, unsigned int keep_min);
-void archive_exit(void);
+void archive_exit(struct cmd_context *cmd);
-void archive_enable(int flag);
+void archive_enable(struct cmd_context *cmd, int flag);
int archive(struct volume_group *vg);
int archive_display(struct cmd_context *cmd, const char *vg_name);
-int backup_init(const char *dir);
-void backup_exit(void);
+int backup_init(struct cmd_context *cmd, const char *dir);
+void backup_exit(struct cmd_context *cmd);
-void backup_enable(int flag);
+void backup_enable(struct cmd_context *cmd, int flag);
int backup(struct volume_group *vg);
-int backup_remove(const char *vg_name);
+int backup_remove(struct cmd_context *cmd, const char *vg_name);
struct volume_group *backup_read_vg(struct cmd_context *cmd,
const char *vg_name, const char *file);
endif
SOURCES =\
- archiver.c \
dumpconfig.c \
formats.c \
lvchange.c \
init_msg_prefix(cmd->default_settings.msg_prefix);
init_cmd_name(cmd->default_settings.cmd_name);
- archive_enable(cmd->current_settings.archive);
- backup_enable(cmd->current_settings.backup);
+ archive_enable(cmd, cmd->current_settings.archive);
+ backup_enable(cmd, cmd->current_settings.backup);
set_activation(cmd->current_settings.activation);
srand((unsigned int) time(NULL) + (unsigned int) getpid());
}
-static int _init_backup(struct cmd_context *cmd, struct config_tree *cft)
-{
- uint32_t days, min;
- char default_dir[PATH_MAX];
- const char *dir;
-
- if (!cmd->sys_dir) {
- log_warn("WARNING: Metadata changes will NOT be backed up");
- backup_init("");
- archive_init("", 0, 0);
- return 1;
- }
-
- /* set up archiving */
- cmd->default_settings.archive =
- find_config_bool(cmd->cft->root, "backup/archive",
- DEFAULT_ARCHIVE_ENABLED);
-
- days = (uint32_t) find_config_int(cmd->cft->root, "backup/retain_days",
- DEFAULT_ARCHIVE_DAYS);
-
- min = (uint32_t) find_config_int(cmd->cft->root, "backup/retain_min",
- DEFAULT_ARCHIVE_NUMBER);
-
- if (lvm_snprintf
- (default_dir, sizeof(default_dir), "%s/%s", cmd->sys_dir,
- DEFAULT_ARCHIVE_SUBDIR) == -1) {
- log_err("Couldn't create default archive path '%s/%s'.",
- cmd->sys_dir, DEFAULT_ARCHIVE_SUBDIR);
- return 0;
- }
-
- dir = find_config_str(cmd->cft->root, "backup/archive_dir",
- default_dir);
-
- if (!archive_init(dir, days, min)) {
- log_debug("backup_init failed.");
- return 0;
- }
-
- /* set up the backup */
- cmd->default_settings.backup =
- find_config_bool(cmd->cft->root, "backup/backup",
- DEFAULT_BACKUP_ENABLED);
-
- if (lvm_snprintf
- (default_dir, sizeof(default_dir), "%s/%s", cmd->sys_dir,
- DEFAULT_BACKUP_SUBDIR) == -1) {
- log_err("Couldn't create default backup path '%s/%s'.",
- cmd->sys_dir, DEFAULT_BACKUP_SUBDIR);
- return 0;
- }
-
- dir = find_config_str(cmd->cft->root, "backup/backup_dir", default_dir);
-
- if (!backup_init(dir)) {
- log_debug("backup_init failed.");
- return 0;
- }
-
- return 1;
-}
-
static void _close_stray_fds(void)
{
struct rlimit rlim;
_init_rand();
- if (!_init_backup(cmd, cmd->cft))
- return NULL;
-
_apply_settings(cmd);
return cmd;
static void _fin(struct cmd_context *cmd)
{
- archive_exit();
- backup_exit();
_fin_commands(cmd);
-
destroy_toolcontext(cmd);
}
}
/* just use the normal backup code */
- backup_enable(1); /* force a backup */
+ backup_enable(cmd, 1); /* force a backup */
if (!backup(vg)) {
stack;
return ECMD_FAILED;
}
}
- backup_remove(vg_name);
+ backup_remove(cmd, vg_name);
if (ret == ECMD_PROCESSED)
log_print("Volume group \"%s\" successfully removed", vg_name);