[lvm-devel] master - lvmetad: Init lazily, to avoid socket access on config overrides.

Petr Rockai mornfall at fedoraproject.org
Tue Oct 30 19:40:32 UTC 2012


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=983f0b46f2de85b8de0e2d7f8afbdf53f132a87a
Commit:        983f0b46f2de85b8de0e2d7f8afbdf53f132a87a
Parent:        7c59199d4932d7edcd2919d6d45ec4baac590e2e
Author:        Petr Rockai <prockai at redhat.com>
AuthorDate:    Mon Oct 29 21:39:46 2012 +0100
Committer:     Petr Rockai <prockai at redhat.com>
CommitterDate: Tue Oct 30 09:15:47 2012 +0100

lvmetad: Init lazily, to avoid socket access on config overrides.

---
 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;




More information about the lvm-devel mailing list