Peter Rajnoha 785220
diff --git a/WHATS_NEW b/WHATS_NEW
Peter Rajnoha 785220
index 5887ec7..d0e0cd4 100644
Peter Rajnoha 785220
--- a/WHATS_NEW
Peter Rajnoha 785220
+++ b/WHATS_NEW
Peter Rajnoha 785220
@@ -1,5 +1,6 @@
Peter Rajnoha 785220
 Version 2.02.99 - 
Peter Rajnoha 785220
 ===================================
Peter Rajnoha 785220
+  Initialize lvmetad lazily to avoid early socket access on config overrides.
Peter Rajnoha 785220
   Hardcode use_lvmetad=0 if cluster locking used and issue a warning msg.
Peter Rajnoha 785220
 
Peter Rajnoha 785220
 Version 2.02.98 - 15th October 2012
Peter Rajnoha 785220
diff --git a/lib/cache/lvmetad.c b/lib/cache/lvmetad.c
Peter Rajnoha 785220
index 6a374ac..72e07fd 100644
Peter Rajnoha 785220
--- a/lib/cache/lvmetad.c
Peter Rajnoha 785220
+++ b/lib/cache/lvmetad.c
Peter Rajnoha 785220
@@ -33,7 +33,8 @@ static struct cmd_context *_lvmetad_cmd = NULL;
Peter Rajnoha 785220
 
Peter Rajnoha 785220
 void lvmetad_disconnect(void)
Peter Rajnoha 785220
 {
Peter Rajnoha 785220
-	daemon_close(_lvmetad);
Peter Rajnoha 785220
+	if (_lvmetad_connected)
Peter Rajnoha 785220
+		daemon_close(_lvmetad);
Peter Rajnoha 785220
 	_lvmetad_connected = 0;
Peter Rajnoha 785220
 	_lvmetad_cmd = NULL;
Peter Rajnoha 785220
 }
Peter Rajnoha 785220
@@ -41,19 +42,25 @@ void lvmetad_disconnect(void)
Peter Rajnoha 785220
 void lvmetad_init(struct cmd_context *cmd)
Peter Rajnoha 785220
 {
Peter Rajnoha 785220
 	if (!_lvmetad_use && !access(LVMETAD_PIDFILE, F_OK))
Peter Rajnoha 785220
-		log_warn("WARNING: lvmetad is running but disabled. Restart lvmetad before enabling it!");
Peter Rajnoha 785220
+		log_warn("WARNING: lvmetad is running but disabled."
Peter Rajnoha 785220
+			 " Restart lvmetad before enabling it!");
Peter Rajnoha 785220
+	_lvmetad_cmd = cmd;
Peter Rajnoha 785220
+}
Peter Rajnoha 785220
+
Peter Rajnoha 785220
+static void _lvmetad_connect()
Peter Rajnoha 785220
+{
Peter Rajnoha 785220
 	if (_lvmetad_use && _lvmetad_socket && !_lvmetad_connected) {
Peter Rajnoha 785220
 		assert(_lvmetad_socket);
Peter Rajnoha 785220
 		_lvmetad = lvmetad_open(_lvmetad_socket);
Peter Rajnoha 785220
-		if (_lvmetad.socket_fd >= 0 && !_lvmetad.error) {
Peter Rajnoha 785220
+		if (_lvmetad.socket_fd >= 0 && !_lvmetad.error)
Peter Rajnoha 785220
 			_lvmetad_connected = 1;
Peter Rajnoha 785220
-			_lvmetad_cmd = cmd;
Peter Rajnoha 785220
-		}
Peter Rajnoha 785220
 	}
Peter Rajnoha 785220
 }
Peter Rajnoha 785220
 
Peter Rajnoha 785220
 void lvmetad_warning(void)
Peter Rajnoha 785220
 {
Peter Rajnoha 785220
+	if (!_lvmetad_connected)
Peter Rajnoha 785220
+		_lvmetad_connect();
Peter Rajnoha 785220
 	if (_lvmetad_use && (_lvmetad.socket_fd < 0 || _lvmetad.error))
Peter Rajnoha 785220
 		log_warn("WARNING: Failed to connect to lvmetad: %s. Falling back to internal scanning.",
Peter Rajnoha 785220
 			 strerror(_lvmetad.error));
Peter Rajnoha 785220
@@ -61,7 +68,11 @@ void lvmetad_warning(void)
Peter Rajnoha 785220
 
Peter Rajnoha 785220
 int lvmetad_active(void)
Peter Rajnoha 785220
 {
Peter Rajnoha 785220
-	return _lvmetad_use && _lvmetad_connected;
Peter Rajnoha 785220
+	if (!_lvmetad_use)
Peter Rajnoha 785220
+		return 0;
Peter Rajnoha 785220
+	if (!_lvmetad_connected)
Peter Rajnoha 785220
+		_lvmetad_connect();
Peter Rajnoha 785220
+	return _lvmetad_connected;
Peter Rajnoha 785220
 }
Peter Rajnoha 785220
 
Peter Rajnoha 785220
 void lvmetad_set_active(int active)
Peter Rajnoha 785220
@@ -873,6 +884,11 @@ int lvmetad_pvscan_all_devs(struct cmd_context *cmd, activation_handler handler)
Peter Rajnoha 785220
 	char *future_token;
Peter Rajnoha 785220
 	int was_silent;
Peter Rajnoha 785220
 
Peter Rajnoha 785220
+	if (!lvmetad_active()) {
Peter Rajnoha 785220
+		log_error("Cannot proceed since lvmetad is not active.");
Peter Rajnoha 785220
+		return 0;
Peter Rajnoha 785220
+	}
Peter Rajnoha 785220
+
Peter Rajnoha 785220
 	if (!(iter = dev_iter_create(cmd->lvmetad_filter, 1))) {
Peter Rajnoha 785220
 		log_error("dev_iter creation failed");
Peter Rajnoha 785220
 		return 0;
Peter Rajnoha 785220
diff --git a/test/shell/lvmetad-override.sh b/test/shell/lvmetad-override.sh
Peter Rajnoha 785220
new file mode 100644
Peter Rajnoha 785220
index 0000000..3fb281a
Peter Rajnoha 785220
--- /dev/null
Peter Rajnoha 785220
+++ b/test/shell/lvmetad-override.sh
Peter Rajnoha 785220
@@ -0,0 +1,25 @@
Peter Rajnoha 785220
+#!/bin/sh
Peter Rajnoha 785220
+# Copyright (C) 2012 Red Hat, Inc. All rights reserved.
Peter Rajnoha 785220
+#
Peter Rajnoha 785220
+# This copyrighted material is made available to anyone wishing to use,
Peter Rajnoha 785220
+# modify, copy, or redistribute it subject to the terms and conditions
Peter Rajnoha 785220
+# of the GNU General Public License v.2.
Peter Rajnoha 785220
+#
Peter Rajnoha 785220
+# You should have received a copy of the GNU General Public License
Peter Rajnoha 785220
+# along with this program; if not, write to the Free Software Foundation,
Peter Rajnoha 785220
+# Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Peter Rajnoha 785220
+
Peter Rajnoha 785220
+. lib/test
Peter Rajnoha 785220
+
Peter Rajnoha 785220
+test -e LOCAL_LVMETAD || skip
Peter Rajnoha 785220
+aux prepare_pvs 2
Peter Rajnoha 785220
+
Peter Rajnoha 785220
+vgcreate $vg1 $dev1 $dev2
Peter Rajnoha 785220
+lvchange -ay $vg1 2>&1 | not grep "Failed to connect"
Peter Rajnoha 785220
+kill $(cat LOCAL_LVMETAD)
Peter Rajnoha 785220
+lvchange -ay $vg1 2>&1 | grep "Failed to connect"
Peter Rajnoha 785220
+lvchange -ay $vg1 --sysinit 2>&1 | not grep "Failed to connect"
Peter Rajnoha 785220
+lvchange -ay $vg1 --config 'global { use_lvmetad = 0 }' 2>&1 | not grep "Failed to connect"
Peter Rajnoha 785220
+aux lvmconf "global/use_lvmetad = 0"
Peter Rajnoha 785220
+lvchange -ay $vg1 --config 'global { use_lvmetad = 1 }' 2>&1 | grep "Failed to connect"
Peter Rajnoha 785220
+