diff --git a/lib/locking/locking.c b/lib/locking/locking.c index 032f8ba13..32d54b707 100644 --- a/lib/locking/locking.c +++ b/lib/locking/locking.c @@ -215,8 +215,6 @@ static void _update_vg_lock_count(const char *resource, uint32_t flags) */ int init_locking(int type, struct cmd_context *cmd) { - init_lockingfailed(0); - if (type < 0) type = find_config_tree_int(cmd, "global/locking_type", 1); @@ -279,9 +277,7 @@ int init_locking(int type, struct cmd_context *cmd) /* FIXME Ensure only read ops are permitted */ log_verbose("Locking disabled - only read operations permitted."); - - init_no_locking(&_locking, cmd); - init_lockingfailed(1); + init_readonly_locking(&_locking, cmd); return 1; } diff --git a/lib/locking/locking_types.h b/lib/locking/locking_types.h index 65b39f52e..7fa0acdd4 100644 --- a/lib/locking/locking_types.h +++ b/lib/locking/locking_types.h @@ -40,6 +40,8 @@ struct locking_type { */ int init_no_locking(struct locking_type *locking, struct cmd_context *cmd); +int init_boottime_locking(struct locking_type *locking, struct cmd_context *cmd); + int init_file_locking(struct locking_type *locking, struct cmd_context *cmd); int init_external_locking(struct locking_type *locking, struct cmd_context *cmd); diff --git a/lib/locking/no_locking.c b/lib/locking/no_locking.c index 5eebafa99..0182973c9 100644 --- a/lib/locking/no_locking.c +++ b/lib/locking/no_locking.c @@ -66,6 +66,17 @@ static int _no_lock_resource(struct cmd_context *cmd, const char *resource, return 1; } +static int _readonly_lock_resource(struct cmd_context *cmd, + const char *resource, + uint32_t flags) +{ + if (flags & LCK_TYPE_MASK == LCK_WRITE) { + log_error("Write locks are prohibited with --ignorelockingfailure."); + return 0; + } + return _no_lock_resource(cmd, resource, flags); +} + int init_no_locking(struct locking_type *locking, struct cmd_context *cmd __attribute((unused))) { locking->lock_resource = _no_lock_resource; @@ -75,3 +86,13 @@ int init_no_locking(struct locking_type *locking, struct cmd_context *cmd __attr return 1; } + +int init_readonly_locking(struct locking_type *locking, struct cmd_context *cmd __attribute((unused))) +{ + locking->lock_resource = _readonly_lock_resource; + locking->reset_locking = _no_reset_locking; + locking->fin_locking = _no_fin_locking; + locking->flags = 0; + + return 1; +} diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index 603664308..c8166ad84 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -2772,8 +2772,7 @@ static uint32_t _vg_bad_status_bits(const struct volume_group *vg, uint32_t failure = 0; if ((status & CLUSTERED) && - (vg_is_clustered(vg)) && !locking_is_clustered() && - !lockingfailed()) { + (vg_is_clustered(vg)) && !locking_is_clustered()) { log_error("Skipping clustered volume group %s", vg->name); /* Return because other flags are considered undefined. */ return FAILED_CLUSTERED; @@ -2922,8 +2921,7 @@ static vg_t *_vg_lock_and_read(struct cmd_context *cmd, const char *vg_name, goto_bad; } - if (vg_is_clustered(vg) && !locking_is_clustered() && - !lockingfailed()) { + if (vg_is_clustered(vg) && !locking_is_clustered()) { log_error("Skipping clustered volume group %s", vg->name); failure |= FAILED_CLUSTERED; goto_bad; diff --git a/lib/misc/lvm-globals.c b/lib/misc/lvm-globals.c index 870b2d7c5..a409e684d 100644 --- a/lib/misc/lvm-globals.c +++ b/lib/misc/lvm-globals.c @@ -31,7 +31,6 @@ static int _trust_cache = 0; /* Don't scan when incomplete VGs encountered */ static int _debug_level = 0; static int _log_cmd_name = 0; static int _ignorelockingfailure = 0; -static int _lockingfailed = 0; static int _security_level = SECURITY_LEVEL; static char _cmd_name[30] = ""; static int _mirror_in_sync = 0; @@ -77,11 +76,6 @@ void init_ignorelockingfailure(int level) _ignorelockingfailure = level; } -void init_lockingfailed(int level) -{ - _lockingfailed = level; -} - void init_security_level(int level) { _security_level = level; @@ -161,11 +155,6 @@ int trust_cache() return _trust_cache; } -int lockingfailed() -{ - return _lockingfailed; -} - int ignorelockingfailure() { return _ignorelockingfailure; diff --git a/tools/lvchange.c b/tools/lvchange.c index 263932897..27a50d956 100644 --- a/tools/lvchange.c +++ b/tools/lvchange.c @@ -119,12 +119,6 @@ static int lvchange_availability(struct cmd_context *cmd, if (!deactivate_lv(cmd, lv)) return_0; } else { - if (lockingfailed() && (vg_is_clustered(lv->vg))) { - log_verbose("Locking failed: ignoring clustered " - "logical volume %s", lv->name); - return 0; - } - if (lv_is_origin(lv) || (activate == CHANGE_AE)) { log_verbose("Activating logical volume \"%s\" " "exclusively", lv->name); diff --git a/tools/vgchange.c b/tools/vgchange.c index d8017142f..19c3eb7ef 100644 --- a/tools/vgchange.c +++ b/tools/vgchange.c @@ -144,14 +144,8 @@ static int _vgchange_available(struct cmd_context *cmd, struct volume_group *vg) return ECMD_FAILED; } - if (activate && lockingfailed() && (vg_is_clustered(vg))) { - log_error("Locking inactive: ignoring clustered " - "volume group %s", vg->name); - return ECMD_FAILED; - } - /* FIXME Move into library where clvmd can use it */ - if (activate && !lockingfailed()) + if (activate) check_current_backup(vg); if (activate && (active = lvs_in_vg_activated(vg))) {