[lvm-devel] LVM2 ./WHATS_NEW doc/example.conf.in lib/activ ...
agk at sourceware.org
agk at sourceware.org
Thu Jan 12 01:51:57 UTC 2012
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: agk at sourceware.org 2012-01-12 01:51:56
Modified files:
. : WHATS_NEW
doc : example.conf.in
lib/activate : activate.c activate.h dev_manager.c
dev_manager.h
Log message:
Add activation/read_only_volume_list to override LV permission in metadata.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/WHATS_NEW.diff?cvsroot=lvm2&r1=1.2219&r2=1.2220
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/doc/example.conf.in.diff?cvsroot=lvm2&r1=1.40&r2=1.41
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/activate/activate.c.diff?cvsroot=lvm2&r1=1.226&r2=1.227
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/activate/activate.h.diff?cvsroot=lvm2&r1=1.90&r2=1.91
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/activate/dev_manager.c.diff?cvsroot=lvm2&r1=1.256&r2=1.257
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/activate/dev_manager.h.diff?cvsroot=lvm2&r1=1.41&r2=1.42
--- LVM2/WHATS_NEW 2012/01/11 20:38:42 1.2219
+++ LVM2/WHATS_NEW 2012/01/12 01:51:56 1.2220
@@ -1,5 +1,6 @@
Version 2.02.89 -
==================================
+ Add activation/read_only_volume_list to override LV permission in metadata.
Give priority to emcpower devices with duplicate PVIDs.
Add check for error in _adjust_policy_params() (lvextend --use-policies).
Supports rounding of percentage (%LV, %VG...) for LV resize upward.
--- LVM2/doc/example.conf.in 2011/12/21 13:10:52 1.40
+++ LVM2/doc/example.conf.in 2012/01/12 01:51:56 1.41
@@ -513,6 +513,16 @@
#
# volume_list = [ "vg1", "vg2/lvol1", "@tag1", "@*" ]
+ # If read_only_volume_list is defined, each LV that is to be activated
+ # is checked against the list, and if it matches, it as activated
+ # in read-only mode. (This overrides '--permission rw' stored in the
+ # metadata.)
+ # "vgname" and "vgname/lvname" are matched exactly.
+ # "@tag" matches any tag set in the LV or VG.
+ # "@*" matches if any tag defined on the host is also set in the LV or VG
+ #
+ # read_only_volume_list = [ "vg1", "vg2/lvol1", "@tag1", "@*" ]
+
# Size (in KB) of each copy operation when mirroring
mirror_region_size = 512
--- LVM2/lib/activate/activate.c 2011/12/21 13:10:05 1.226
+++ LVM2/lib/activate/activate.c 2012/01/12 01:51:56 1.227
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
- * Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2004-2012 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
@@ -288,49 +288,29 @@
return _activation;
}
-static int _passes_activation_filter(struct cmd_context *cmd,
- struct logical_volume *lv)
+static int _passes_volumes_filter(struct cmd_context *cmd,
+ struct logical_volume *lv,
+ const struct dm_config_node *cn,
+ const char *config_path)
{
- const struct dm_config_node *cn;
const struct dm_config_value *cv;
const char *str;
static char path[PATH_MAX];
- if (!(cn = find_config_tree_node(cmd, "activation/volume_list"))) {
- log_verbose("activation/volume_list configuration setting "
- "not defined, checking only host tags for %s/%s",
- lv->vg->name, lv->name);
-
- /* If no host tags defined, activate */
- if (dm_list_empty(&cmd->tags))
- return 1;
-
- /* If any host tag matches any LV or VG tag, activate */
- if (str_list_match_list(&cmd->tags, &lv->tags, NULL) ||
- str_list_match_list(&cmd->tags, &lv->vg->tags, NULL))
- return 1;
-
- log_verbose("No host tag matches %s/%s",
- lv->vg->name, lv->name);
-
- /* Don't activate */
- return 0;
- }
- else
- log_verbose("activation/volume_list configuration setting "
- "defined, checking the list to match %s/%s",
- lv->vg->name, lv->name);
+ log_verbose("%s configuration setting defined: "
+ "Checking the list to match %s/%s",
+ config_path, lv->vg->name, lv->name);
for (cv = cn->v; cv; cv = cv->next) {
if (cv->type != DM_CFG_STRING) {
- log_error("Ignoring invalid string in config file "
- "activation/volume_list");
+ log_error("Ignoring invalid string in config file %s",
+ config_path);
continue;
}
str = cv->v.str;
if (!*str) {
- log_error("Ignoring empty string in config file "
- "activation/volume_list");
+ log_error("Ignoring empty string in config file %s",
+ config_path);
continue;
}
@@ -340,7 +320,7 @@
str++;
if (!*str) {
log_error("Ignoring empty tag in config file "
- "activation/volume_list");
+ "%s", config_path);
continue;
}
/* If any host tag matches any LV or VG tag, activate */
@@ -377,12 +357,52 @@
return 1;
}
- log_verbose("No item supplied in activation/volume_list configuration "
- "setting matches %s/%s", lv->vg->name, lv->name);
+ log_verbose("No item supplied in %s configuration setting "
+ "matches %s/%s", config_path, lv->vg->name, lv->name);
return 0;
}
+static int _passes_activation_filter(struct cmd_context *cmd,
+ struct logical_volume *lv)
+{
+ const struct dm_config_node *cn;
+
+ if (!(cn = find_config_tree_node(cmd, "activation/volume_list"))) {
+ log_verbose("activation/volume_list configuration setting "
+ "not defined: Checking only host tags for %s/%s",
+ lv->vg->name, lv->name);
+
+ /* If no host tags defined, activate */
+ if (dm_list_empty(&cmd->tags))
+ return 1;
+
+ /* If any host tag matches any LV or VG tag, activate */
+ if (str_list_match_list(&cmd->tags, &lv->tags, NULL) ||
+ str_list_match_list(&cmd->tags, &lv->vg->tags, NULL))
+ return 1;
+
+ log_verbose("No host tag matches %s/%s",
+ lv->vg->name, lv->name);
+
+ /* Don't activate */
+ return 0;
+ }
+
+ return _passes_volumes_filter(cmd, lv, cn, "activation/volume_list");
+}
+
+static int _passes_readonly_filter(struct cmd_context *cmd,
+ struct logical_volume *lv)
+{
+ struct dm_config_node *cn;
+
+ if (!(cn = find_config_tree_node(cmd, "activation/read_only_volume_list")))
+ return 0;
+
+ return _passes_volumes_filter(cmd, lv, cn, "activation/read_only_volume_list");
+}
+
int library_version(char *version, size_t size)
{
if (!activation())
@@ -755,16 +775,22 @@
static int _lv_preload(struct logical_volume *lv, struct lv_activate_opts *laopts,
int *flush_required)
{
- int r;
+ int r = 0;
struct dev_manager *dm;
+ int old_readonly = laopts->read_only;
+
+ laopts->read_only = _passes_readonly_filter(lv->vg->cmd, lv);
if (!(dm = dev_manager_create(lv->vg->cmd, lv->vg->name, (lv->status & PVMOVE) ? 0 : 1)))
- return_0;
+ goto_out;
if (!(r = dev_manager_preload(dm, lv, laopts, flush_required)))
stack;
dev_manager_destroy(dm);
+
+ laopts->read_only = old_readonly;
+out:
return r;
}
@@ -789,6 +815,8 @@
int r;
struct dev_manager *dm;
+ laopts->read_only = _passes_readonly_filter(lv->vg->cmd, lv);
+
/*
* When we are asked to manipulate (normally suspend/resume) the PVMOVE
* device directly, we don't want to touch the devices that use it.
@@ -1463,6 +1491,8 @@
goto out;
}
+ laopts->read_only = _passes_readonly_filter(cmd, lv);
+
if (!_lv_activate_lv(lv, laopts))
goto_out;
@@ -1652,13 +1682,21 @@
goto out;
}
- log_debug("Activating %s/%s%s.", lv->vg->name, lv->name,
- laopts->exclusive ? " exclusively" : "");
+ if (filter)
+ laopts->read_only = _passes_readonly_filter(cmd, lv);
+
+ log_debug("Activating %s/%s%s%s.", lv->vg->name, lv->name,
+ laopts->exclusive ? " exclusively" : "",
+ laopts->read_only ? " read-only" : "");
if (!lv_info(cmd, lv, 0, &info, 0, 0))
goto_out;
- if (info.exists && !info.suspended && info.live_table) {
+ /*
+ * Nothing to do?
+ */
+ if (info.exists && !info.suspended && info.live_table &&
+ (info.read_only == read_only_lv(lv, laopts))) {
r = 1;
goto out;
}
--- LVM2/lib/activate/activate.h 2011/12/21 13:10:06 1.90
+++ LVM2/lib/activate/activate.h 2012/01/12 01:51:56 1.91
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
- * Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2004-2012 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
@@ -36,6 +36,7 @@
int no_merging;
int real_pool;
unsigned revert;
+ unsigned read_only;
};
/* target attribute flags */
--- LVM2/lib/activate/dev_manager.c 2011/12/21 13:09:33 1.256
+++ LVM2/lib/activate/dev_manager.c 2012/01/12 01:51:56 1.257
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2002-2004 Sistina Software, Inc. All rights reserved.
- * Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2004-2012 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
@@ -61,9 +61,9 @@
static const char thin_layer[] = "tpool";
-static int _read_only_lv(struct logical_volume *lv)
+int read_only_lv(struct logical_volume *lv, struct lv_activate_opts *laopts)
{
- return (!(lv->vg->status & LVM_WRITE) || !(lv->status & LVM_WRITE));
+ return (laopts->read_only || !(lv->vg->status & LVM_WRITE) || !(lv->status & LVM_WRITE));
}
/*
@@ -1724,7 +1724,7 @@
if (!(dnode = dm_tree_add_new_dev_with_udev_flags(dtree, name, dlid,
layer ? UINT32_C(0) : (uint32_t) lv->major,
layer ? UINT32_C(0) : (uint32_t) lv->minor,
- _read_only_lv(lv),
+ read_only_lv(lv, laopts),
((lv->vg->status & PRECOMMITTED) | laopts->revert) ? 1 : 0,
lvlayer,
_get_udev_flags(dm, lv, layer))))
--- LVM2/lib/activate/dev_manager.h 2011/12/21 13:09:34 1.41
+++ LVM2/lib/activate/dev_manager.h 2012/01/12 01:51:56 1.42
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2002-2004 Sistina Software, Inc. All rights reserved.
- * Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2004-2012 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
@@ -26,6 +26,8 @@
struct dm_info;
struct device;
+int read_only_lv(struct logical_volume *lv, struct lv_activate_opts *laopts);
+
/*
* Constructor and destructor.
*/
More information about the lvm-devel
mailing list