File lvmetad-Init-lazily-to-avoid-socket-access-on-config.patch of Package lvm2.631

From 983f0b46f2de85b8de0e2d7f8afbdf53f132a87a Mon Sep 17 00:00:00 2001
From: Petr Rockai <prockai@redhat.com>
Date: Mon, 29 Oct 2012 21:39:46 +0100
Subject: [PATCH] lvmetad: Init lazily, to avoid socket access on config overrides.
Git-repo: https://git.fedorahosted.org/git/lvm2.git
Git-commit: 983f0b46f2de85b8de0e2d7f8afbdf53f132a87a
References: bnc#862076

---
 lib/cache/lvmetad.c |   28 ++++++++++++++++++++++------
 1 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/lib/cache/lvmetad.c b/lib/cache/lvmetad.c
index 6a374ac..72e07fd 100644
--- a/lib/cache/lvmetad.c
+++ b/lib/cache/lvmetad.c
@@ -33,7 +33,8 @@ static struct cmd_context *_lvmetad_cmd = NULL;
 
 void lvmetad_disconnect(void)
 {
-	daemon_close(_lvmetad);
+	if (_lvmetad_connected)
+		daemon_close(_lvmetad);
 	_lvmetad_connected = 0;
 	_lvmetad_cmd = NULL;
 }
@@ -41,19 +42,25 @@ void lvmetad_disconnect(void)
 void lvmetad_init(struct cmd_context *cmd)
 {
 	if (!_lvmetad_use && !access(LVMETAD_PIDFILE, F_OK))
-		log_warn("WARNING: lvmetad is running but disabled. Restart lvmetad before enabling it!");
+		log_warn("WARNING: lvmetad is running but disabled."
+			 " Restart lvmetad before enabling it!");
+	_lvmetad_cmd = cmd;
+}
+
+static void _lvmetad_connect()
+{
 	if (_lvmetad_use && _lvmetad_socket && !_lvmetad_connected) {
 		assert(_lvmetad_socket);
 		_lvmetad = lvmetad_open(_lvmetad_socket);
-		if (_lvmetad.socket_fd >= 0 && !_lvmetad.error) {
+		if (_lvmetad.socket_fd >= 0 && !_lvmetad.error)
 			_lvmetad_connected = 1;
-			_lvmetad_cmd = cmd;
-		}
 	}
 }
 
 void lvmetad_warning(void)
 {
+	if (!_lvmetad_connected)
+		_lvmetad_connect();
 	if (_lvmetad_use && (_lvmetad.socket_fd < 0 || _lvmetad.error))
 		log_warn("WARNING: Failed to connect to lvmetad: %s. Falling back to internal scanning.",
 			 strerror(_lvmetad.error));
@@ -61,7 +68,11 @@ void lvmetad_warning(void)
 
 int lvmetad_active(void)
 {
-	return _lvmetad_use && _lvmetad_connected;
+	if (!_lvmetad_use)
+		return 0;
+	if (!_lvmetad_connected)
+		_lvmetad_connect();
+	return _lvmetad_connected;
 }
 
 void lvmetad_set_active(int active)
@@ -873,6 +884,11 @@ int lvmetad_pvscan_all_devs(struct cmd_context *cmd, activation_handler handler)
 	char *future_token;
 	int was_silent;
 
+	if (!lvmetad_active()) {
+		log_error("Cannot proceed since lvmetad is not active.");
+		return 0;
+	}
+
 	if (!(iter = dev_iter_create(cmd->lvmetad_filter, 1))) {
 		log_error("dev_iter creation failed");
 		return 0;
-- 
1.7.3.4

openSUSE Build Service is sponsored by