[lvm-devel] master - Implement lock-override options without locking type

David Teigland teigland at sourceware.org
Wed Jun 6 21:37:14 UTC 2018


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=f2ff06d6756bb31779d16915c64361393054cfe7
Commit:        f2ff06d6756bb31779d16915c64361393054cfe7
Parent:        55521be2cbe28b0580fafafff6151cf4b6a219ea
Author:        David Teigland <teigland at redhat.com>
AuthorDate:    Wed Jun 6 16:31:59 2018 -0500
Committer:     David Teigland <teigland at redhat.com>
CommitterDate: Wed Jun 6 16:31:59 2018 -0500

Implement lock-override options without locking type

The options: --nolocking, --readonly, --sysinit
override, or make exceptions to, the normal file locking
behavior.  Implement these by just checking for the
options in the file locking path instead of using
special locking types.
---
 lib/locking/file_locking.c  |    2 +-
 lib/locking/locking.c       |   58 +++++++++++++++++++++++++++++++++---------
 lib/locking/locking.h       |    2 +-
 lib/locking/locking_types.h |   18 +------------
 tools/lvmcmdline.c          |   52 +++++++++++++++++++-------------------
 5 files changed, 75 insertions(+), 57 deletions(-)

diff --git a/lib/locking/file_locking.c b/lib/locking/file_locking.c
index a60a3e5..0bded0e 100644
--- a/lib/locking/file_locking.c
+++ b/lib/locking/file_locking.c
@@ -92,7 +92,7 @@ int init_file_locking(struct locking_type *locking, struct cmd_context *cmd,
 	locking->lock_resource = _file_lock_resource;
 	locking->reset_locking = _reset_file_locking;
 	locking->fin_locking = _fin_file_locking;
-	locking->flags = 0;
+	locking->flags = LCK_FLOCK;
 
 	/* Get lockfile directory from config file */
 	locking_dir = find_config_tree_str(cmd, global_locking_dir_CFG, NULL);
diff --git a/lib/locking/locking.c b/lib/locking/locking.c
index 4b7d7eb..4c27a81 100644
--- a/lib/locking/locking.c
+++ b/lib/locking/locking.c
@@ -34,6 +34,8 @@ static struct locking_type _locking;
 static int _vg_lock_count = 0;		/* Number of locks held */
 static int _vg_write_lock_held = 0;	/* VG write lock held? */
 static int _blocking_supported = 0;
+static int _file_locking_readonly = 0;
+static int _file_locking_sysinit = 0;
 
 static void _unblock_signals(void)
 {
@@ -46,6 +48,10 @@ void reset_locking(void)
 {
 	int was_locked = _vg_lock_count;
 
+	/* file locking disabled */
+	if (!_locking.flags)
+		return;
+
 	_vg_lock_count = 0;
 	_vg_write_lock_held = 0;
 
@@ -82,21 +88,19 @@ static void _update_vg_lock_count(const char *resource, uint32_t flags)
  * Select a locking type
  * type: locking type; if < 0, then read config tree value
  */
-int init_locking(int type, struct cmd_context *cmd, int suppress_messages)
+int init_locking(struct cmd_context *cmd, int file_locking_sysinit, int file_locking_readonly)
 {
+	int suppress_messages = 0;
+
 	if (getenv("LVM_SUPPRESS_LOCKING_FAILURE_MESSAGES"))
 		suppress_messages = 1;
 
-	if (type < 0)
-		type = find_config_tree_int(cmd, global_locking_type_CFG, NULL);
+	if (file_locking_sysinit)
+		suppress_messages = 1;
 
 	_blocking_supported = find_config_tree_bool(cmd, global_wait_for_locks_CFG, NULL);
-
-	if (type != 1)
-		log_warn("WARNING: locking_type deprecated, using file locking.");
-
-	if (type == 3)
-		log_warn("WARNING: See lvmlockd(8) for information on using cluster/clvm VGs.");
+	_file_locking_readonly = file_locking_readonly;
+	_file_locking_sysinit = file_locking_sysinit;
 
 	log_very_verbose("%sFile-based locking selected.", _blocking_supported ? "" : "Non-blocking ");
 
@@ -108,6 +112,10 @@ int init_locking(int type, struct cmd_context *cmd, int suppress_messages)
 
 void fin_locking(void)
 {
+	/* file locking disabled */
+	if (!_locking.flags)
+		return;
+
 	_locking.fin_locking();
 }
 
@@ -135,10 +143,30 @@ static int _lock_vol(struct cmd_context *cmd, const char *resource, uint32_t fla
 		goto out;
 	}
 
-	if (cmd->metadata_read_only && lck_type == LCK_WRITE &&
+	if ((lck_type == LCK_WRITE) && (lck_scope == LCK_VG) && !(flags & LCK_CACHE) &&
 	    strcmp(resource, VG_GLOBAL)) {
-		log_error("Operation prohibited while global/metadata_read_only is set.");
-		goto out;
+
+		/* read only locking set in lvm.conf metadata_read_only */
+
+		if (cmd->metadata_read_only) {
+			log_error("Operation prohibited while global/metadata_read_only is set.");
+			goto out;
+		}
+
+		/* read only locking set with option --readonly */
+
+		if (_file_locking_readonly) {
+			log_error("Read-only locking specified. Write locks are prohibited.");
+			goto out;
+		}
+
+		/* read only locking (except activation) set with option --sysinit */
+		/* FIXME: sysinit is intended to allow activation, add that exception here */
+
+		if (_file_locking_sysinit) {
+			log_error("Read-only sysinit locking specified. Write locks are prohibited.");
+			goto out;
+		}
 	}
 
 	if ((ret = _locking.lock_resource(cmd, resource, flags, NULL))) {
@@ -169,6 +197,10 @@ int lock_vol(struct cmd_context *cmd, const char *vol, uint32_t flags, const str
 	char resource[258] __attribute__((aligned(8)));
 	int lck_type = flags & LCK_TYPE_MASK;
 
+	/* file locking disabled */
+	if (!_locking.flags)
+		return 1;
+
 	if (flags == LCK_NONE) {
 		log_debug_locking(INTERNAL_ERROR "%s: LCK_NONE lock requested", vol);
 		return 1;
@@ -240,7 +272,7 @@ int vg_write_lock_held(void)
 
 int locking_is_clustered(void)
 {
-	return (_locking.flags & LCK_CLUSTERED) ? 1 : 0;
+	return 0;
 }
 
 int sync_local_dev_names(struct cmd_context* cmd)
diff --git a/lib/locking/locking.h b/lib/locking/locking.h
index 6d7d8e8..422f1d8 100644
--- a/lib/locking/locking.h
+++ b/lib/locking/locking.h
@@ -21,7 +21,7 @@
 
 struct logical_volume;
 
-int init_locking(int type, struct cmd_context *cmd, int suppress_messages);
+int init_locking(struct cmd_context *cmd, int suppress_messages, int only_read_locks);
 void fin_locking(void);
 void reset_locking(void);
 int vg_write_lock_held(void);
diff --git a/lib/locking/locking_types.h b/lib/locking/locking_types.h
index 99aa964..5bb4fe4 100644
--- a/lib/locking/locking_types.h
+++ b/lib/locking/locking_types.h
@@ -23,12 +23,10 @@ typedef int (*query_resource_fn) (const char *resource, const char *node, int *m
 typedef void (*fin_lock_fn) (void);
 typedef void (*reset_lock_fn) (void);
 
-#define LCK_PRE_MEMLOCK			0x00000001	/* Is memlock() needed before calls? */
-#define LCK_CLUSTERED			0x00000002
-#define LCK_SUPPORTS_REMOTE_QUERIES	0x00000004
+#define LCK_FLOCK			0x00000001
 
 struct locking_type {
-	uint32_t flags;
+	uint32_t flags;   /* 0 means file locking is disabled */
 	lock_resource_fn lock_resource;
 	query_resource_fn query_resource;
 
@@ -36,17 +34,5 @@ struct locking_type {
 	fin_lock_fn fin_locking;
 };
 
-/*
- * Locking types
- */
-void init_no_locking(struct locking_type *locking, struct cmd_context *cmd,
-		     int suppress_messages);
-
-void init_dummy_locking(struct locking_type *locking, struct cmd_context *cmd,
-			int suppress_messages);
-
-int init_readonly_locking(struct locking_type *locking, struct cmd_context *cmd,
-			  int suppress_messages);
-
 int init_file_locking(struct locking_type *locking, struct cmd_context *cmd,
 		      int suppress_messages);
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 4f4e917..788f007 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -2734,6 +2734,9 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
 	const char *reason = NULL;
 	int ret = 0;
 	int locking_type;
+	int file_locking_disable = 0;
+	int file_locking_sysinit = 0;
+	int file_locking_readonly = 0;
 	int monitoring;
 	char *arg_new, *arg;
 	int i;
@@ -2908,34 +2911,31 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
 		goto out;
 	}
 
-	if (_cmd_no_meta_proc(cmd))
-		locking_type = 0;
-	else if (arg_is_set(cmd, readonly_ARG)) {
-		if (find_config_tree_bool(cmd, global_use_lvmlockd_CFG, NULL)) {
-			/*
-			 * FIXME: we could use locking_type 5 here if that didn't
-			 * cause CLUSTERED to be set, which conflicts with using lvmlockd.
-			 */
-			locking_type = 1;
-			cmd->lockd_gl_disable = 1;
-			cmd->lockd_vg_disable = 1;
-			cmd->lockd_lv_disable = 1;
-		} else {
-			locking_type = 5;
-		}
+	if (arg_is_set(cmd, nolocking_ARG) || _cmd_no_meta_proc(cmd))
+		file_locking_disable = 1;
 
-		if (lvmetad_used()) {
-			lvmetad_make_unused(cmd);
-			log_verbose("Not using lvmetad because read-only is set.");
-		}
-	} else if (arg_is_set(cmd, nolocking_ARG))
-		locking_type = 0;
-	else
-		locking_type = -1;
+	else if (arg_is_set(cmd, sysinit_ARG))
+		file_locking_sysinit = 1;
 
-	if (!init_locking(locking_type, cmd, _cmd_no_meta_proc(cmd) || arg_is_set(cmd, sysinit_ARG))) {
-		ret = ECMD_FAILED;
-		goto_out;
+	else if (arg_is_set(cmd, readonly_ARG))
+		file_locking_readonly = 1;
+
+	locking_type = find_config_tree_int(cmd, global_locking_type_CFG, NULL);
+
+	if (locking_type == 3)
+		log_warn("WARNING: See lvmlockd(8) for information on using cluster/clvm VGs.");
+
+	if (locking_type != 1) {
+		log_warn("WARNING: locking_type deprecated, using file locking.");
+		locking_type = 1;
+	}
+
+	if (!file_locking_disable) {
+		/* Set up file locking */
+		if (!init_locking(cmd, file_locking_sysinit, file_locking_readonly)) {
+			ret = ECMD_FAILED;
+			goto_out;
+		}
 	}
 
 	if (!_cmd_no_meta_proc(cmd) && !_init_lvmlockd(cmd)) {




More information about the lvm-devel mailing list