[lvm-devel] [PATCH 2/2] Add error code for all log_err and log_error calls. Replace log_err with log_error.

Thomas Woerner twoerner at redhat.com
Tue Jul 7 20:20:01 UTC 2009


From: twoerner <twoerner at redhat.com>

Fixed all log_error calls using the script.

Signed-off-by: Thomas Woerner <twoerner at redhat.com>
---
 daemons/clvmd/clvmd-cman.c            |    8 +-
 daemons/clvmd/clvmd-command.c         |    2 +-
 daemons/clvmd/clvmd-gulm.c            |    4 +-
 daemons/clvmd/clvmd.c                 |   26 ++--
 daemons/clvmd/lvm-functions.c         |    8 +-
 daemons/dmeventd/libdevmapper-event.c |   50 ++++----
 lib/activate/activate.c               |   26 ++--
 lib/activate/dev_manager.c            |   64 +++++-----
 lib/activate/fs.c                     |   24 ++--
 lib/cache/lvmcache.c                  |   70 +++++-----
 lib/commands/toolcontext.c            |   86 ++++++------
 lib/config/config.c                   |   38 +++---
 lib/device/dev-cache.c                |   50 ++++----
 lib/device/dev-io.c                   |   22 ++--
 lib/device/dev-md.c                   |    8 +-
 lib/device/device.c                   |   12 +-
 lib/display/display.c                 |    4 +-
 lib/error/errseg.c                    |    2 +-
 lib/filters/filter-composite.c        |    4 +-
 lib/filters/filter-md.c               |    2 +-
 lib/filters/filter-persistent.c       |    6 +-
 lib/filters/filter-regex.c            |    4 +-
 lib/filters/filter-sysfs.c            |   10 +-
 lib/filters/filter.c                  |   10 +-
 lib/format1/disk-rep.c                |   30 ++--
 lib/format1/format1.c                 |   22 ++--
 lib/format1/import-export.c           |   22 ++--
 lib/format1/import-extents.c          |   24 ++--
 lib/format1/layout.c                  |   10 +-
 lib/format1/lvm1-label.c              |    4 +-
 lib/format_pool/disk_rep.c            |    4 +-
 lib/format_pool/format_pool.c         |   20 ++--
 lib/format_pool/import_export.c       |   14 +-
 lib/format_pool/pool_label.c          |    4 +-
 lib/format_text/archive.c             |   16 +-
 lib/format_text/archiver.c            |   32 +++---
 lib/format_text/export.c              |   12 +-
 lib/format_text/flags.c               |    8 +-
 lib/format_text/format-text.c         |   96 +++++++-------
 lib/format_text/import.c              |    2 +-
 lib/format_text/import_vsn1.c         |  120 ++++++++--------
 lib/format_text/tags.c                |    2 +-
 lib/format_text/text_label.c          |   16 +-
 lib/label/label.c                     |   14 +-
 lib/locking/cluster_locking.c         |   20 ++--
 lib/locking/external_locking.c        |    4 +-
 lib/locking/file_locking.c            |    6 +-
 lib/locking/locking.c                 |   18 ++--
 lib/locking/no_locking.c              |    2 +-
 lib/metadata/lv_manip.c               |  176 ++++++++++++------------
 lib/metadata/merge.c                  |   46 +++---
 lib/metadata/metadata.c               |  238 ++++++++++++++++----------------
 lib/metadata/mirror.c                 |  156 +++++++++++-----------
 lib/metadata/pv_manip.c               |   32 +++---
 lib/metadata/pv_map.c                 |    4 +-
 lib/metadata/segtype.c                |    2 +-
 lib/metadata/snapshot_manip.c         |    6 +-
 lib/mirror/mirrored.c                 |   34 +++---
 lib/misc/lvm-exec.c                   |    8 +-
 lib/misc/lvm-file.c                   |   16 +-
 lib/misc/lvm-string.c                 |    2 +-
 lib/misc/sharedlib.c                  |    4 +-
 lib/mm/memlock.c                      |    4 +-
 lib/report/report.c                   |   58 ++++----
 lib/snapshot/snapshot.c               |   14 +-
 lib/striped/striped.c                 |    8 +-
 lib/uuid/uuid.c                       |    8 +-
 lib/zero/zero.c                       |    2 +-
 libdm/ioctl/libdm-iface.c             |   94 +++++++-------
 libdm/libdm-common.c                  |   36 +++---
 libdm/libdm-deptree.c                 |  154 +++++++++++-----------
 libdm/libdm-file.c                    |    2 +-
 libdm/libdm-report.c                  |  104 +++++++-------
 libdm/mm/dbg_malloc.c                 |    8 +-
 libdm/mm/pool-debug.c                 |    8 +-
 libdm/mm/pool-fast.c                  |    6 +-
 libdm/mm/pool.c                       |    6 +-
 libdm/regex/matcher.c                 |    4 +-
 libdm/regex/parse_rx.c                |   10 +-
 liblvm/lvm_base.c                     |    2 +-
 old-tests/datastruct/hash_t.c         |    4 +-
 old-tests/dev-mgr/dev_cache_t.c       |    6 +-
 old-tests/device/dev_cache_t.c        |    6 +-
 old-tests/device/random.c             |    4 +-
 old-tests/filters/pfilter_t.c         |    4 +-
 old-tests/filters/rfilter_t.c         |    2 +-
 tools/dmsetup.c                       |   42 +++---
 tools/lvchange.c                      |  100 +++++++-------
 tools/lvconvert.c                     |  112 ++++++++--------
 tools/lvcreate.c                      |  156 +++++++++++-----------
 tools/lvdisplay.c                     |    6 +-
 tools/lvm.c                           |   10 +-
 tools/lvmcmdlib.c                     |    8 +-
 tools/lvmcmdline.c                    |   52 ++++----
 tools/lvmdiskscan.c                   |   10 +-
 tools/lvremove.c                      |    2 +-
 tools/lvrename.c                      |   18 ++--
 tools/lvresize.c                      |   68 +++++-----
 tools/lvscan.c                        |    2 +-
 tools/polldaemon.c                    |   16 +-
 tools/pvchange.c                      |   44 +++---
 tools/pvcreate.c                      |   58 ++++----
 tools/pvdisplay.c                     |   10 +-
 tools/pvmove.c                        |   64 +++++-----
 tools/pvremove.c                      |   20 ++--
 tools/pvresize.c                      |   28 ++--
 tools/pvscan.c                        |    4 +-
 tools/reporter.c                      |   10 +-
 tools/stub.h                          |    8 +-
 tools/toollib.c                       |  116 ++++++++--------
 tools/vgcfgbackup.c                   |    8 +-
 tools/vgcfgrestore.c                  |   10 +-
 tools/vgchange.c                      |   66 +++++-----
 tools/vgconvert.c                     |   38 +++---
 tools/vgcreate.c                      |   14 +-
 tools/vgdisplay.c                     |    8 +-
 tools/vgexport.c                      |    6 +-
 tools/vgextend.c                      |    6 +-
 tools/vgimport.c                      |    8 +-
 tools/vgmerge.c                       |    6 +-
 tools/vgreduce.c                      |   58 ++++----
 tools/vgremove.c                      |    4 +-
 tools/vgrename.c                      |   14 +-
 tools/vgscan.c                        |    4 +-
 tools/vgsplit.c                       |   28 ++--
 125 files changed, 1791 insertions(+), 1791 deletions(-)

diff --git a/daemons/clvmd/clvmd-cman.c b/daemons/clvmd/clvmd-cman.c
index dec6331..b047095 100644
--- a/daemons/clvmd/clvmd-cman.c
+++ b/daemons/clvmd/clvmd-cman.c
@@ -157,7 +157,7 @@ static int _cluster_send_message(const void *buf, int msglen, const char *csid,
 
 	if (cman_send_data(c_handle, buf, msglen, 0, CLUSTER_PORT_CLVMD, nodeid) <= 0)
 	{
-		log_error("%s", errtext);
+		log_error(0, "%s", errtext);
 	}
 	return msglen;
 }
@@ -310,7 +310,7 @@ static void get_members()
 
 	num_nodes = cman_get_node_count(c_handle);
 	if (num_nodes == -1) {
-		log_error("Unable to get node count");
+		log_error(0, "Unable to get node count");
 		return;
 	}
 
@@ -324,14 +324,14 @@ static void get_members()
 		count_nodes = num_nodes + 10; /* Overallocate a little */
 		nodes = malloc(count_nodes * sizeof(struct cman_node));
 		if (!nodes) {
-			log_error("Unable to allocate nodes array\n");
+			log_error(0, "Unable to allocate nodes array\n");
 			exit(5);
 		}
 	}
 
 	status = cman_get_nodes(c_handle, count_nodes, &retnodes, nodes);
 	if (status < 0) {
-		log_error("Unable to get node details");
+		log_error(0, "Unable to get node details");
 		exit(6);
 	}
 
diff --git a/daemons/clvmd/clvmd-command.c b/daemons/clvmd/clvmd-command.c
index 2266a2b..0b8aede 100644
--- a/daemons/clvmd/clvmd-command.c
+++ b/daemons/clvmd/clvmd-command.c
@@ -291,7 +291,7 @@ int do_pre_command(struct local_client *client)
 		break;
 
 	default:
-		log_error("Unknown command %d received\n", header->cmd);
+		log_error(0, "Unknown command %d received\n", header->cmd);
 		status = EINVAL;
 	}
 	return status;
diff --git a/daemons/clvmd/clvmd-gulm.c b/daemons/clvmd/clvmd-gulm.c
index 4bb1b65..3d75733 100644
--- a/daemons/clvmd/clvmd-gulm.c
+++ b/daemons/clvmd/clvmd-gulm.c
@@ -897,7 +897,7 @@ static int get_all_cluster_nodes()
     ctree = ccs_force_connect(NULL, 1);
     if (ctree < 0)
     {
-	log_error("Error connecting to CCS");
+	log_error(0, "Error connecting to CCS");
 	return -1;
     }
 
@@ -950,7 +950,7 @@ static int get_all_cluster_nodes()
 		}
 		else {
 			DEBUGLOG("Cannot resolve host name %s\n", nodename);
-			log_err("Cannot resolve host name %s\n", nodename);
+			log_error(0, "Cannot resolve host name %s\n", nodename);
 		}
 	}
 	free(nodename);
diff --git a/daemons/clvmd/clvmd.c b/daemons/clvmd/clvmd.c
index b6c4034..a07242a 100644
--- a/daemons/clvmd/clvmd.c
+++ b/daemons/clvmd/clvmd.c
@@ -429,7 +429,7 @@ int main(int argc, char *argv[])
 
 	if (!clops) {
 		DEBUGLOG("Can't initialise cluster interface\n");
-		log_error("Can't initialise cluster interface\n");
+		log_error(0, "Can't initialise cluster interface\n");
 		child_init_signal(DFAIL_CLUSTER_IF);
 	}
 	DEBUGLOG("Cluster ready, doing some more initialisation\n");
@@ -915,11 +915,11 @@ static void be_daemon(int timeout)
 	if (dup2(devnull, 0) < 0 || dup2(devnull, 1) < 0
 	    || dup2(devnull, 2) < 0) {
 		perror("Error setting terminal FDs to /dev/null");
-		log_error("Error setting terminal FDs to /dev/null: %m");
+		log_error(0, "Error setting terminal FDs to /dev/null: %m");
 		exit(5);
 	}
 	if (chdir("/")) {
-		log_error("Error setting current directory to /: %m");
+		log_error(0, "Error setting current directory to /: %m");
 		exit(6);
 	}
 
@@ -1280,7 +1280,7 @@ static void process_remote_command(struct clvm_header *msg, int msglen, int fd,
 	if (msg->cmd == CLVMD_CMD_GOAWAY) {
 
 		DEBUGLOG("Told to go away by %s\n", nodename);
-		log_error("Told to go away by %s\n", nodename);
+		log_error(0, "Told to go away by %s\n", nodename);
 		exit(99);
 	}
 
@@ -1482,7 +1482,7 @@ static __attribute__ ((noreturn)) void *pre_and_post_thread(void *arg)
 			if (write_status < 0 &&
 			    (errno == EINTR || errno == EAGAIN))
 				continue;
-			log_error("Error sending to pipe: %m\n");
+			log_error(0, "Error sending to pipe: %m\n");
 			break;
 		} while(1);
 
@@ -1515,7 +1515,7 @@ static __attribute__ ((noreturn)) void *pre_and_post_thread(void *arg)
 			if (write_status < 0 &&
 			    (errno == EINTR || errno == EAGAIN))
 				continue;
-			log_error("Error sending to pipe: %m\n");
+			log_error(0, "Error sending to pipe: %m\n");
 			break;
 		} while(1);
 next_pre:
@@ -1577,7 +1577,7 @@ static int process_reply(const struct clvm_header *msg, int msglen, const char *
 	if (!client) {
 		DEBUGLOG("Got message for unknown client 0x%x\n",
 			 msg->clientid);
-		log_error("Got message for unknown client 0x%x\n",
+		log_error(0, "Got message for unknown client 0x%x\n",
 			  msg->clientid);
 		return -1;
 	}
@@ -1739,7 +1739,7 @@ static int send_message(void *buf, int msglen, const char *csid, int fd,
 			if (retry_cnt > MAX_RETRIES)
 			{
 				errno = saved_errno;
-				log_error("%s", errtext);
+				log_error(0, "%s", errtext);
 				errno = saved_errno;
 				break;
 			}
@@ -1763,7 +1763,7 @@ static int send_message(void *buf, int msglen, const char *csid, int fd,
 
 					continue;
 				}
-				log_error("%s", errtext);
+				log_error(0, "%s", errtext);
 				break;
 			}
 			ptr += len;
@@ -1856,7 +1856,7 @@ static int add_to_lvmqueue(struct local_client *client, struct clvm_header *msg,
 	if (msglen) {
 		cmd->msg = malloc(msglen);
 		if (!cmd->msg) {
-			log_error("Unable to allocate buffer space\n");
+			log_error(0, "Unable to allocate buffer space\n");
 			free(cmd);
 			return -1;
 		}
@@ -1924,7 +1924,7 @@ static int open_local_sock()
 		unlink(CLVMD_SOCKNAME);
 	local_socket = socket(PF_UNIX, SOCK_STREAM, 0);
 	if (local_socket < 0) {
-		log_error("Can't create local socket: %m");
+		log_error(0, "Can't create local socket: %m");
 		return -1;
 	}
 	/* Set Close-on-exec & non-blocking */
@@ -1935,12 +1935,12 @@ static int open_local_sock()
 	memcpy(sockaddr.sun_path, CLVMD_SOCKNAME, sizeof(CLVMD_SOCKNAME));
 	sockaddr.sun_family = AF_UNIX;
 	if (bind(local_socket, (struct sockaddr *) &sockaddr, sizeof(sockaddr))) {
-		log_error("can't bind local socket: %m");
+		log_error(0, "can't bind local socket: %m");
 		close(local_socket);
 		return -1;
 	}
 	if (listen(local_socket, 1) != 0) {
-		log_error("listen local: %m");
+		log_error(0, "listen local: %m");
 		close(local_socket);
 		return -1;
 	}
diff --git a/daemons/clvmd/lvm-functions.c b/daemons/clvmd/lvm-functions.c
index ab90ea6..d29d390 100644
--- a/daemons/clvmd/lvm-functions.c
+++ b/daemons/clvmd/lvm-functions.c
@@ -467,7 +467,7 @@ int do_lock_lv(unsigned char command, unsigned char lock_flags, char *resource)
 	if (!cmd->config_valid || config_files_changed(cmd)) {
 		/* Reinitialise various settings inc. logging, filters */
 		if (do_refresh_cache()) {
-			log_error("Updated config file invalid. Aborting.");
+			log_error(0, "Updated config file invalid. Aborting.");
 			return EINVAL;
 		}
 	}
@@ -755,10 +755,10 @@ static void check_config()
 		if (strstr(libname, "liblvm2clusterlock.so"))
 			return;
 
-		log_error("Incorrect LVM locking library specified in lvm.conf, cluster operations may not work.");
+		log_error(0, "Incorrect LVM locking library specified in lvm.conf, cluster operations may not work.");
 		return;
 	}
-	log_error("locking_type not set correctly in lvm.conf, cluster operations will not work.");
+	log_error(0, "locking_type not set correctly in lvm.conf, cluster operations will not work.");
 }
 
 /* Backups up the LVM metadata if it's changed */
@@ -776,7 +776,7 @@ void lvm_do_backup(const char *vgname)
 	if (vg && consistent)
 		check_current_backup(vg);
 	else
-		log_error("Error backing up metadata, can't find VG for group %s", vgname);
+		log_error(0, "Error backing up metadata, can't find VG for group %s", vgname);
 
 	vg_release(vg);
 	dm_pool_empty(cmd->mem);
diff --git a/daemons/dmeventd/libdevmapper-event.c b/daemons/dmeventd/libdevmapper-event.c
index ce0bb25..578caf7 100644
--- a/daemons/dmeventd/libdevmapper-event.c
+++ b/daemons/dmeventd/libdevmapper-event.c
@@ -190,7 +190,7 @@ static int _check_message_id(struct dm_event_daemon_message *msg)
 
 	if ((sscanf(msg->data, "%d:%d", &pid, &seq_nr) != 2) ||
 	    (pid != getpid()) || (seq_nr != _sequence_nr)) {
-		log_error("Ignoring out-of-sequence reply from dmeventd. "
+		log_error(0, "Ignoring out-of-sequence reply from dmeventd. "
 			  "Expected %d:%d but received %s", getpid(),
 			  _sequence_nr, msg->data);
 		return 0;
@@ -228,12 +228,12 @@ static int _daemon_read(struct dm_event_fifos *fifos,
 			ret = select(fifos->server + 1, &fds, NULL, NULL,
 				     &tval);
 			if (ret < 0 && errno != EINTR) {
-				log_error("Unable to read from event server");
+				log_error(0, "Unable to read from event server");
 				return 0;
 			}
 		}
 		if (ret < 1) {
-			log_error("Unable to read from event server.");
+			log_error(0, "Unable to read from event server.");
 			return 0;
 		}
 
@@ -242,7 +242,7 @@ static int _daemon_read(struct dm_event_fifos *fifos,
 			if ((errno == EINTR) || (errno == EAGAIN))
 				continue;
 			else {
-				log_error("Unable to read from event server.");
+				log_error(0, "Unable to read from event server.");
 				return 0;
 			}
 		}
@@ -291,7 +291,7 @@ static int _daemon_write(struct dm_event_fifos *fifos,
 		tval.tv_usec = 100;
 		ret = select(fifos->server + 1, &fds, NULL, NULL, &tval);
 		if ((ret < 0) && (errno != EINTR)) {
-			log_error("Unable to talk to event daemon");
+			log_error(0, "Unable to talk to event daemon");
 			return 0;
 		}
 		if (ret == 0)
@@ -306,7 +306,7 @@ static int _daemon_write(struct dm_event_fifos *fifos,
 			FD_SET(fifos->client, &fds);
 			ret = select(fifos->client + 1, NULL, &fds, NULL, NULL);
 			if ((ret < 0) && (errno != EINTR)) {
-				log_error("Unable to talk to event daemon");
+				log_error(0, "Unable to talk to event daemon");
 				return 0;
 			}
 		} while (ret < 1);
@@ -317,7 +317,7 @@ static int _daemon_write(struct dm_event_fifos *fifos,
 			if ((errno == EINTR) || (errno == EAGAIN))
 				continue;
 			else {
-				log_error("Unable to talk to event daemon");
+				log_error(0, "Unable to talk to event daemon");
 				return 0;
 			}
 		}
@@ -348,7 +348,7 @@ static int _daemon_talk(struct dm_event_fifos *fifos,
 		fmt = "%d:%d HELLO";
 	if ((msg_size = dm_asprintf(&(msg->data), fmt, getpid(), _sequence_nr,
 				    dso, dev, evmask, timeout)) < 0) {
-		log_error("_daemon_talk: message allocation failed");
+		log_error(0, "_daemon_talk: message allocation failed");
 		return -ENOMEM;
 	}
 	msg->size = msg_size;
@@ -403,7 +403,7 @@ static int _start_daemon(struct dm_event_fifos *fifos)
 		goto start_server;
 
 	if (!S_ISFIFO(statbuf.st_mode)) {
-		log_error("%s is not a fifo.", fifos->client_path);
+		log_error(0, "%s is not a fifo.", fifos->client_path);
 		return 0;
 	}
 
@@ -417,7 +417,7 @@ static int _start_daemon(struct dm_event_fifos *fifos)
 	} else if (errno != ENXIO) {
 		/* problem */
 
-		log_error("%s: Can't open client fifo %s: %s",
+		log_error(0, "%s: Can't open client fifo %s: %s",
 			  __func__, fifos->client_path, strerror(errno));
 		stack;
 		return 0;
@@ -427,24 +427,24 @@ static int _start_daemon(struct dm_event_fifos *fifos)
 	/* server is not running */
 
 	if (!strncmp(DMEVENTD_PATH, "/", 1) && stat(DMEVENTD_PATH, &statbuf)) {
-		log_error("Unable to find dmeventd.");
+		log_error(0, "Unable to find dmeventd.");
 		return_0;
 	}
 
 	pid = fork();
 
 	if (pid < 0)
-		log_error("Unable to fork.");
+		log_error(0, "Unable to fork.");
 
 	else if (!pid) {
 		execvp(DMEVENTD_PATH, NULL);
 		exit(EXIT_FAILURE);
 	} else {
 		if (waitpid(pid, &status, 0) < 0)
-			log_error("Unable to start dmeventd: %s",
+			log_error(0, "Unable to start dmeventd: %s",
 				  strerror(errno));
 		else if (WEXITSTATUS(status))
-			log_error("Unable to start dmeventd.");
+			log_error(0, "Unable to start dmeventd.");
 		else
 			ret = 1;
 	}
@@ -470,7 +470,7 @@ static int _init_client(struct dm_event_fifos *fifos)
 
 	/* Open the fifo used to read from the daemon. */
 	if ((fifos->server = open(fifos->server_path, O_RDWR)) < 0) {
-		log_error("%s: open server fifo %s",
+		log_error(0, "%s: open server fifo %s",
 			  __func__, fifos->server_path);
 		stack;
 		return 0;
@@ -478,14 +478,14 @@ static int _init_client(struct dm_event_fifos *fifos)
 
 	/* Lock out anyone else trying to do communication with the daemon. */
 	if (flock(fifos->server, LOCK_EX) < 0) {
-		log_error("%s: flock %s", __func__, fifos->server_path);
+		log_error(0, "%s: flock %s", __func__, fifos->server_path);
 		close(fifos->server);
 		return 0;
 	}
 
 /*	if ((fifos->client = open(fifos->client_path, O_WRONLY | O_NONBLOCK)) < 0) {*/
 	if ((fifos->client = open(fifos->client_path, O_RDWR | O_NONBLOCK)) < 0) {
-		log_error("%s: Can't open client fifo %s: %s",
+		log_error(0, "%s: Can't open client fifo %s: %s",
 			  __func__, fifos->client_path, strerror(errno));
 		close(fifos->server);
 		stack;
@@ -498,7 +498,7 @@ static int _init_client(struct dm_event_fifos *fifos)
 static void _dtr_client(struct dm_event_fifos *fifos)
 {
 	if (flock(fifos->server, LOCK_UN))
-		log_error("flock unlock %s", fifos->server_path);
+		log_error(0, "flock unlock %s", fifos->server_path);
 
 	close(fifos->client);
 	close(fifos->server);
@@ -511,7 +511,7 @@ static struct dm_task *_get_device_info(const struct dm_event_handler *dmevh)
 	struct dm_info info;
 
 	if (!(dmt = dm_task_create(DM_DEVICE_INFO))) {
-		log_error("_get_device_info: dm_task creation for info failed");
+		log_error(0, "_get_device_info: dm_task creation for info failed");
 		return NULL;
 	}
 
@@ -526,17 +526,17 @@ static struct dm_task *_get_device_info(const struct dm_event_handler *dmevh)
 
 	/* FIXME Add name or uuid or devno to messages */
 	if (!dm_task_run(dmt)) {
-		log_error("_get_device_info: dm_task_run() failed");
+		log_error(0, "_get_device_info: dm_task_run() failed");
 		goto failed;
 	}
 
 	if (!dm_task_get_info(dmt, &info)) {
-		log_error("_get_device_info: failed to get info for device");
+		log_error(0, "_get_device_info: failed to get info for device");
 		goto failed;
 	}
 
 	if (!info.exists) {
-		log_error("_get_device_info: device not found");
+		log_error(0, "_get_device_info: device not found");
 		goto failed;
 	}
 
@@ -592,7 +592,7 @@ int dm_event_register_handler(const struct dm_event_handler *dmevh)
 
 	if ((err = _do_event(DM_EVENT_CMD_REGISTER_FOR_EVENT, &msg,
 			     dmevh->dso, uuid, dmevh->mask, dmevh->timeout)) < 0) {
-		log_error("%s: event registration failed: %s",
+		log_error(0, "%s: event registration failed: %s",
 			  dm_task_get_name(dmt),
 			  msg.data ? msg.data : strerror(-err));
 		ret = 0;
@@ -622,7 +622,7 @@ int dm_event_unregister_handler(const struct dm_event_handler *dmevh)
 
 	if ((err = _do_event(DM_EVENT_CMD_UNREGISTER_FOR_EVENT, &msg,
 			    dmevh->dso, uuid, dmevh->mask, dmevh->timeout)) < 0) {
-		log_error("%s: event deregistration failed: %s",
+		log_error(0, "%s: event deregistration failed: %s",
 			  dm_task_get_name(dmt),
 			  msg.data ? msg.data : strerror(-err));
 		ret = 0;
@@ -802,7 +802,7 @@ int dm_event_get_timeout(const char *device_path, uint32_t *timeout)
 			     0, 0))) {
 		char *p = _skip_string(msg.data, ' ');
 		if (!p) {
-			log_error("malformed reply from dmeventd '%s'\n",
+			log_error(0, "malformed reply from dmeventd '%s'\n",
 				  msg.data);
 			return -EIO;
 		}
diff --git a/lib/activate/activate.c b/lib/activate/activate.c
index aa75e5b..80df249 100644
--- a/lib/activate/activate.c
+++ b/lib/activate/activate.c
@@ -41,7 +41,7 @@ int lvm1_present(struct cmd_context *cmd)
 
 	if (dm_snprintf(path, sizeof(path), "%s/lvm/global", cmd->proc_dir)
 	    < 0) {
-		log_error("LVM1 proc global snprintf failed");
+		log_error(0, "LVM1 proc global snprintf failed");
 		return 0;
 	}
 
@@ -60,7 +60,7 @@ int list_segment_modules(struct dm_pool *mem, const struct lv_segment *seg,
 
 	if (seg->segtype->ops->modules_needed &&
 	    !seg->segtype->ops->modules_needed(mem, seg, modules)) {
-		log_error("module string allocation failed");
+		log_error(0, "module string allocation failed");
 		return 0;
 	}
 
@@ -78,7 +78,7 @@ int list_segment_modules(struct dm_pool *mem, const struct lv_segment *seg,
 		if (snap_seg->segtype->ops->modules_needed &&
 		    !snap_seg->segtype->ops->modules_needed(mem, snap_seg,
 							    modules)) {
-			log_error("snap_seg module string allocation failed");
+			log_error(0, "snap_seg module string allocation failed");
 			return 0;
 		}
 	}
@@ -119,7 +119,7 @@ void set_activation(int act)
 	if (warned || !act)
 		return;
 
-	log_error("Compiled without libdevmapper support. "
+	log_error(0, "Compiled without libdevmapper support. "
 		  "Can't enable activation.");
 
 	warned = 1;
@@ -279,13 +279,13 @@ static int _passes_activation_filter(struct cmd_context *cmd,
 
 	for (cv = cn->v; cv; cv = cv->next) {
 		if (cv->type != CFG_STRING) {
-			log_error("Ignoring invalid string in config file "
+			log_error(0, "Ignoring invalid string in config file "
 				  "activation/volume_list");
 			continue;
 		}
 		str = cv->v.str;
 		if (!*str) {
-			log_error("Ignoring empty string in config file "
+			log_error(0, "Ignoring empty string in config file "
 				  "activation/volume_list");
 			continue;
 		}
@@ -294,7 +294,7 @@ static int _passes_activation_filter(struct cmd_context *cmd,
 		if (*str == '@') {
 			str++;
 			if (!*str) {
-				log_error("Ignoring empty tag in config file "
+				log_error(0, "Ignoring empty tag in config file "
 					  "activation/volume_list");
 				continue;
 			}
@@ -324,7 +324,7 @@ static int _passes_activation_filter(struct cmd_context *cmd,
 		/* vgname/lvname */
 		if (dm_snprintf(path, sizeof(path), "%s/%s", lv->vg->name,
 				 lv->name) < 0) {
-			log_error("dm_snprintf error from %s/%s", lv->vg->name,
+			log_error(0, "dm_snprintf error from %s/%s", lv->vg->name,
 				  lv->name);
 			continue;
 		}
@@ -400,7 +400,7 @@ int module_present(struct cmd_context *cmd, const char *target_name)
 	const char *argv[3];
 
 	if (dm_snprintf(module, sizeof(module), "dm-%s", target_name) < 0) {
-		log_error("module_present module name too long: %s",
+		log_error(0, "module_present module name too long: %s",
 			  target_name);
 		return 0;
 	}
@@ -771,7 +771,7 @@ int monitor_dev_for_events(struct cmd_context *cmd,
 				continue;
 			if (!monitor_dev_for_events(cmd, seg_lv(seg, s),
 						    monitor)) {
-				log_error("Failed to %smonitor %s",
+				log_error(0, "Failed to %smonitor %s",
 					  monitor ? "" : "un",
 					  seg_lv(seg, s)->name);
 				r = 0;
@@ -814,7 +814,7 @@ int monitor_dev_for_events(struct cmd_context *cmd,
 
 		/* FIXME specify events */
 		if (!monitor_fn(seg, 0)) {
-			log_error("%s/%s: %s segment monitoring function failed.",
+			log_error(0, "%s/%s: %s segment monitoring function failed.",
 				  lv->vg->name, lv->name, seg->segtype->name);
 			return 0;
 		}
@@ -1002,7 +1002,7 @@ int lv_deactivate(struct cmd_context *cmd, const char *lvid_s)
 	}
 
 	if (info.open_count && lv_is_visible(lv)) {
-		log_error("LV %s/%s in use: not deactivating", lv->vg->name,
+		log_error(0, "LV %s/%s in use: not deactivating", lv->vg->name,
 			  lv->name);
 		goto out;
 	}
@@ -1073,7 +1073,7 @@ static int _lv_activate(struct cmd_context *cmd, const char *lvid_s,
 	}
 
 	if ((!lv->vg->cmd->partial_activation) && (lv->status & PARTIAL_LV)) {
-		log_error("Refusing activation of partial LV %s. Use --partial to override.",
+		log_error(0, "Refusing activation of partial LV %s. Use --partial to override.",
 			  lv->name);
 		goto_out;
 	}
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index 87a5c69..53252dc 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -70,7 +70,7 @@ static char *_build_dlid(struct dm_pool *mem, const char *lvid, const char *laye
 	len = sizeof(UUID_PREFIX) + sizeof(union lvid) + strlen(layer);
 
 	if (!(dlid = dm_pool_alloc(mem, len))) {
-		log_error("_build_dlid: pool allocation failed for %" PRIsize_t
+		log_error(0, "_build_dlid: pool allocation failed for %" PRIsize_t
 			  " %s %s.", len, lvid, layer);
 		return NULL;
 	}
@@ -132,7 +132,7 @@ static int _info_run(const char *name, const char *dlid, struct dm_info *info,
 
 	if (!with_open_count)
 		if (!dm_task_no_open_count(dmt))
-			log_error("Failed to disable open_count");
+			log_error(0, "Failed to disable open_count");
 
 	if (!dm_task_run(dmt))
 		goto_out;
@@ -165,7 +165,7 @@ int device_is_usable(dev_t dev)
 	int r = 0;
 
 	if (!(dmt = dm_task_create(DM_DEVICE_STATUS))) {
-		log_error("Failed to allocate dm_task struct to check dev status");
+		log_error(0, "Failed to allocate dm_task struct to check dev status");
 		return 0;
 	}
 
@@ -173,7 +173,7 @@ int device_is_usable(dev_t dev)
 		goto_out;
 
 	if (!dm_task_run(dmt)) {
-		log_error("Failed to get state of mapped device");
+		log_error(0, "Failed to get state of mapped device");
 		goto out;
 	}
 
@@ -241,7 +241,7 @@ int dev_manager_info(struct dm_pool *mem, const char *name,
 	const char *dlid;
 
 	if (!(dlid = _build_dlid(mem, lv->lvid.s, NULL))) {
-		log_error("dlid build failed for %s", lv->name);
+		log_error(0, "dlid build failed for %s", lv->name);
 		return 0;
 	}
 
@@ -266,7 +266,7 @@ static int _status_run(const char *name, const char *uuid,
 		return_0;
 
 	if (!dm_task_no_open_count(dmt))
-		log_error("Failed to disable open_count");
+		log_error(0, "Failed to disable open_count");
 
 	if (!dm_task_run(dmt))
 		goto_out;
@@ -353,7 +353,7 @@ static int _percent_run(struct dev_manager *dm, const char *name,
 		return_0;
 
 	if (!dm_task_no_open_count(dmt))
-		log_error("Failed to disable open_count");
+		log_error(0, "Failed to disable open_count");
 
 	if (!dm_task_run(dmt))
 		goto_out;
@@ -369,7 +369,7 @@ static int _percent_run(struct dev_manager *dm, const char *name,
 					  &params);
 		if (lv) {
 			if (!(segh = dm_list_next(&lv->segments, segh))) {
-				log_error("Number of segments in active LV %s "
+				log_error(0, "Number of segments in active LV %s "
 					  "does not match metadata", lv->name);
 				goto out;
 			}
@@ -392,7 +392,7 @@ static int _percent_run(struct dev_manager *dm, const char *name,
 	} while (next);
 
 	if (lv && (segh = dm_list_next(&lv->segments, segh))) {
-		log_error("Number of segments in active LV %s does not "
+		log_error(0, "Number of segments in active LV %s does not "
 			  "match metadata", lv->name);
 		goto out;
 	}
@@ -525,7 +525,7 @@ int dev_manager_mirror_percent(struct dev_manager *dm,
 	/* FIXME dm_pool_free ? */
 
 	if (!(dlid = build_dlid(dm, lv->lvid.s, NULL))) {
-		log_error("dlid build failed for %s", lv->name);
+		log_error(0, "dlid build failed for %s", lv->name);
 		return 0;
 	}
 
@@ -630,7 +630,7 @@ static int _add_dev_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
 
 	log_debug("Getting device info for %s [%s]", name, dlid);
 	if (!_info(name, dlid, 0, 1, 0, &info, NULL)) {
-		log_error("Failed to get info for %s [%s].", name, dlid);
+		log_error(0, "Failed to get info for %s [%s].", name, dlid);
 		return 0;
 	}
 
@@ -643,7 +643,7 @@ static int _add_dev_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
 		 * FIXME compare info.major with lv->major if multiple major support
 		 */
 		if (info.exists && (info.minor != lv->minor)) {
-			log_error("Volume %s (%" PRIu32 ":%" PRIu32")"
+			log_error(0, "Volume %s (%" PRIu32 ":%" PRIu32")"
 				  " differs from already active device "
 				  "(%" PRIu32 ":%" PRIu32")",
 				  lv->name, lv->major, lv->minor, info.major, info.minor);
@@ -651,7 +651,7 @@ static int _add_dev_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
 		}
 		if (!info.exists && _info_by_dev(lv->major, lv->minor, &info2) &&
 		    info2.exists) {
-			log_error("The requested major:minor pair "
+			log_error(0, "The requested major:minor pair "
 				  "(%" PRIu32 ":%" PRIu32") is already used",
 				  lv->major, lv->minor);
 			return 0;
@@ -659,7 +659,7 @@ static int _add_dev_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
 	}
 
 	if (info.exists && !dm_tree_add_dev(dtree, info.major, info.minor)) {
-		log_error("Failed to add device (%" PRIu32 ":%" PRIu32") to dtree",
+		log_error(0, "Failed to add device (%" PRIu32 ":%" PRIu32") to dtree",
 			  info.major, info.minor);
 		return 0;
 	}
@@ -696,7 +696,7 @@ static struct dm_tree *_create_partial_dtree(struct dev_manager *dm, struct logi
 	uint32_t s;
 
 	if (!(dtree = dm_tree_create())) {
-		log_error("Partial dtree creation failed for %s.", lv->name);
+		log_error(0, "Partial dtree creation failed for %s.", lv->name);
 		return NULL;
 	}
 
@@ -740,7 +740,7 @@ static char *_add_error_device(struct dev_manager *dm, struct dm_tree *dtree,
 	}
 
 	if (segno < 0) {
-		log_error("_add_error_device called with bad segment");
+		log_error(0, "_add_error_device called with bad segment");
 		return_NULL;
 	}
 
@@ -815,7 +815,7 @@ int add_areas_line(struct dev_manager *dm, struct lv_segment *seg,
 			dm_tree_node_add_target_area(node, NULL, dlid,
 							extent_size * seg_le(seg, s));
 		} else {
-			log_error("Internal error: Unassigned area found in LV %s.",
+			log_error(0, "Internal error: Unassigned area found in LV %s.",
 				  seg->lv->name);
 			return 0;
 		}
@@ -849,7 +849,7 @@ static int _add_snapshot_target_to_dtree(struct dev_manager *dm,
 	uint64_t size;
 
 	if (!(snap_seg = find_cow(lv))) {
-		log_error("Couldn't find snapshot for '%s'.", lv->name);
+		log_error(0, "Couldn't find snapshot for '%s'.", lv->name);
 		return 0;
 	}
 
@@ -874,7 +874,7 @@ static int _add_target_to_dtree(struct dev_manager *dm,
 	uint64_t extent_size = seg->lv->vg->extent_size;
 
 	if (!seg->segtype->ops->add_target_line) {
-		log_error("_emit_target: Internal error: Can't handle "
+		log_error(0, "_emit_target: Internal error: Can't handle "
 			  "segment type %s", seg->segtype->name);
 		return 0;
 	}
@@ -909,7 +909,7 @@ static int _add_segment_to_dtree(struct dev_manager *dm,
 	if (seg_present->segtype->ops->target_present &&
 	    !seg_present->segtype->ops->target_present(seg_present->lv->vg->cmd,
 						       seg_present, NULL)) {
-		log_error("Can't expand LV %s: %s target support missing "
+		log_error(0, "Can't expand LV %s: %s target support missing "
 			  "from kernel?", seg->lv->name, seg_present->segtype->name);
 		return 0;
 	}
@@ -922,7 +922,7 @@ static int _add_segment_to_dtree(struct dev_manager *dm,
 	/* If this is a snapshot origin, add real LV */
 	if (lv_is_origin(seg->lv) && !layer) {
 		if (vg_is_clustered(seg->lv->vg)) {
-			log_error("Clustered snapshots are not yet supported");
+			log_error(0, "Clustered snapshots are not yet supported");
 			return 0;
 		}
 		if (!_add_new_lv_to_dtree(dm, dtree, seg->lv, "real"))
@@ -980,7 +980,7 @@ static int _add_new_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
 		return 1;
 
 	if (!(lvlayer = dm_pool_alloc(dm->mem, sizeof(*lvlayer)))) {
-		log_error("_add_new_lv_to_dtree: pool alloc failed for %s %s.", lv->name, layer);
+		log_error(0, "_add_new_lv_to_dtree: pool alloc failed for %s %s.", lv->name, layer);
 		return 0;
 	}
 
@@ -1056,11 +1056,11 @@ static int _create_lv_symlinks(struct dev_manager *dm, struct dm_tree_node *root
 
 		if (name && lvlayer->old_name && *lvlayer->old_name && strcmp(name, lvlayer->old_name)) {
 			if (!dm_split_lvm_name(dm->mem, lvlayer->old_name, &old_vgname, &old_lvname, &old_layer)) {
-				log_error("_create_lv_symlinks: Couldn't split up old device name %s", lvlayer->old_name);
+				log_error(0, "_create_lv_symlinks: Couldn't split up old device name %s", lvlayer->old_name);
 				return 0;
 			}
 			if (!dm_split_lvm_name(dm->mem, name, &new_vgname, &new_lvname, &new_layer)) {
-				log_error("_create_lv_symlinks: Couldn't split up new device name %s", name);
+				log_error(0, "_create_lv_symlinks: Couldn't split up new device name %s", name);
 				return 0;
 			}
 			if (!fs_rename_lv(lvlayer->lv, name, old_vgname, old_lvname))
@@ -1123,7 +1123,7 @@ static int _clean_tree(struct dev_manager *dm, struct dm_tree_node *root)
 			continue;
 
 		if (!dm_split_lvm_name(dm->mem, name, &vgname, &lvname, &layer)) {
-			log_error("_clean_tree: Couldn't split up device name %s.", name);
+			log_error(0, "_clean_tree: Couldn't split up device name %s.", name);
 			return 0;
 		}
 
@@ -1149,7 +1149,7 @@ static int _tree_action(struct dev_manager *dm, struct logical_volume *lv, actio
 		return_0;
 
 	if (!(root = dm_tree_find_node(dtree, 0, 0))) {
-		log_error("Lost dependency tree root node");
+		log_error(0, "Lost dependency tree root node");
 		goto out;
 	}
 
@@ -1168,7 +1168,7 @@ static int _tree_action(struct dev_manager *dm, struct logical_volume *lv, actio
 		if (!dm_tree_deactivate_children(root, dlid, ID_LEN + sizeof(UUID_PREFIX) - 1))
 			goto_out;
 		if (!_remove_lv_symlinks(dm, root))
-			log_error("Failed to remove all device symlinks associated with %s.", lv->name);
+			log_error(0, "Failed to remove all device symlinks associated with %s.", lv->name);
 		break;
 	case SUSPEND:
 		dm_tree_skip_lockfs(root);
@@ -1196,12 +1196,12 @@ static int _tree_action(struct dev_manager *dm, struct logical_volume *lv, actio
 			goto_out;
 
 		if (!_create_lv_symlinks(dm, root)) {
-			log_error("Failed to create symlinks for %s.", lv->name);
+			log_error(0, "Failed to create symlinks for %s.", lv->name);
 			goto out;
 		}
 		break;
 	default:
-		log_error("_tree_action: Action %u not supported.", action);
+		log_error(0, "_tree_action: Action %u not supported.", action);
 		goto out;
 	}	
 
@@ -1268,12 +1268,12 @@ int dev_manager_device_uses_vg(struct device *dev,
 	int r = 1;
 
 	if (!(dtree = dm_tree_create())) {
-		log_error("partial dtree creation failed");
+		log_error(0, "partial dtree creation failed");
 		return r;
 	}
 
 	if (!dm_tree_add_dev(dtree, (uint32_t) MAJOR(dev->dev), (uint32_t) MINOR(dev->dev))) {
-		log_error("Failed to add device %s (%" PRIu32 ":%" PRIu32") to dtree",
+		log_error(0, "Failed to add device %s (%" PRIu32 ":%" PRIu32") to dtree",
 			  dev_name(dev), (uint32_t) MAJOR(dev->dev), (uint32_t) MINOR(dev->dev));
 		goto out;
 	}
@@ -1282,7 +1282,7 @@ int dev_manager_device_uses_vg(struct device *dev,
 	memcpy(dlid + sizeof(UUID_PREFIX) - 1, &vg->id.uuid[0], sizeof(vg->id));
 
 	if (!(root = dm_tree_find_node(dtree, 0, 0))) {
-		log_error("Lost dependency tree root node");
+		log_error(0, "Lost dependency tree root node");
 		goto out;
 	}
 
diff --git a/lib/activate/fs.c b/lib/activate/fs.c
index 6b83581..8b65935 100644
--- a/lib/activate/fs.c
+++ b/lib/activate/fs.c
@@ -32,7 +32,7 @@ static int _mk_dir(const char *dev_dir, const char *vg_name)
 
 	if (dm_snprintf(vg_path, sizeof(vg_path), "%s%s",
 			 dev_dir, vg_name) == -1) {
-		log_error("Couldn't construct name of volume "
+		log_error(0, "Couldn't construct name of volume "
 			  "group directory.");
 		return 0;
 	}
@@ -55,7 +55,7 @@ static int _rm_dir(const char *dev_dir, const char *vg_name)
 
 	if (dm_snprintf(vg_path, sizeof(vg_path), "%s%s",
 			 dev_dir, vg_name) == -1) {
-		log_error("Couldn't construct name of volume "
+		log_error(0, "Couldn't construct name of volume "
 			  "group directory.");
 		return 0;
 	}
@@ -88,7 +88,7 @@ static void _rm_blks(const char *dir)
 			continue;
 
 		if (dm_snprintf(path, sizeof(path), "%s/%s", dir, name) == -1) {
-			log_error("Couldn't create path for %s", name);
+			log_error(0, "Couldn't create path for %s", name);
 			continue;
 		}
 
@@ -111,28 +111,28 @@ static int _mk_link(const char *dev_dir, const char *vg_name,
 
 	if (dm_snprintf(vg_path, sizeof(vg_path), "%s%s",
 			 dev_dir, vg_name) == -1) {
-		log_error("Couldn't create path for volume group dir %s",
+		log_error(0, "Couldn't create path for volume group dir %s",
 			  vg_name);
 		return 0;
 	}
 
 	if (dm_snprintf(lv_path, sizeof(lv_path), "%s/%s", vg_path,
 			 lv_name) == -1) {
-		log_error("Couldn't create source pathname for "
+		log_error(0, "Couldn't create source pathname for "
 			  "logical volume link %s", lv_name);
 		return 0;
 	}
 
 	if (dm_snprintf(link_path, sizeof(link_path), "%s/%s",
 			 dm_dir(), dev) == -1) {
-		log_error("Couldn't create destination pathname for "
+		log_error(0, "Couldn't create destination pathname for "
 			  "logical volume link for %s", lv_name);
 		return 0;
 	}
 
 	if (dm_snprintf(lvm1_group_path, sizeof(lvm1_group_path), "%s/group",
 			 vg_path) == -1) {
-		log_error("Couldn't create pathname for LVM1 group file for %s",
+		log_error(0, "Couldn't create pathname for LVM1 group file for %s",
 			  vg_name);
 		return 0;
 	}
@@ -143,7 +143,7 @@ static int _mk_link(const char *dev_dir, const char *vg_name,
 	 * (as well as any existing LVM2 symlink). */
 	if (!lstat(lvm1_group_path, &buf)) {
 		if (!S_ISCHR(buf.st_mode)) {
-			log_error("Non-LVM1 character device found at %s",
+			log_error(0, "Non-LVM1 character device found at %s",
 				  lvm1_group_path);
 		} else {
 			_rm_blks(vg_path);
@@ -156,7 +156,7 @@ static int _mk_link(const char *dev_dir, const char *vg_name,
 
 	if (!lstat(lv_path, &buf)) {
 		if (!S_ISLNK(buf.st_mode) && !S_ISBLK(buf.st_mode)) {
-			log_error("Symbolic link %s not created: file exists",
+			log_error(0, "Symbolic link %s not created: file exists",
 				  link_path);
 			return 0;
 		}
@@ -190,14 +190,14 @@ static int _rm_link(const char *dev_dir, const char *vg_name,
 
 	if (dm_snprintf(lv_path, sizeof(lv_path), "%s%s/%s",
 			 dev_dir, vg_name, lv_name) == -1) {
-		log_error("Couldn't determine link pathname.");
+		log_error(0, "Couldn't determine link pathname.");
 		return 0;
 	}
 
 	if (lstat(lv_path, &buf) || !S_ISLNK(buf.st_mode)) {
 		if (errno == ENOENT)
 			return 1;
-		log_error("%s not symbolic link - not removing", lv_path);
+		log_error(0, "%s not symbolic link - not removing", lv_path);
 		return 0;
 	}
 
@@ -273,7 +273,7 @@ static int _stack_fs_op(fs_op_t type, const char *dev_dir, const char *vg_name,
 	char *pos;
 
 	if (!(fsp = dm_malloc(sizeof(*fsp) + len))) {
-		log_error("No space to stack fs operation");
+		log_error(0, "No space to stack fs operation");
 		return 0;
 	}
 
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index 94954b2..043b77e 100644
--- a/lib/cache/lvmcache.c
+++ b/lib/cache/lvmcache.c
@@ -189,16 +189,16 @@ void lvmcache_drop_metadata(const char *vgname)
 void lvmcache_lock_vgname(const char *vgname, int read_only __attribute((unused)))
 {
 	if (!_lock_hash && !lvmcache_init()) {
-		log_error("Internal cache initialisation failed");
+		log_error(0, "Internal cache initialisation failed");
 		return;
 	}
 
 	if (dm_hash_lookup(_lock_hash, vgname))
-		log_error("Internal error: Nested locking attempted on VG %s.",
+		log_error(0, "Internal error: Nested locking attempted on VG %s.",
 			  vgname);
 		
 	if (!dm_hash_insert(_lock_hash, vgname, (void *) 1))
-		log_error("Cache locking failure for %s", vgname);
+		log_error(0, "Cache locking failure for %s", vgname);
 
 	_update_cache_lock_state(vgname, 1);
 
@@ -217,7 +217,7 @@ int vgname_is_locked(const char *vgname)
 void lvmcache_unlock_vgname(const char *vgname)
 {
 	if (!dm_hash_lookup(_lock_hash, vgname))
-		log_error("Internal error: Attempt to unlock unlocked VG %s.",
+		log_error(0, "Internal error: Attempt to unlock unlocked VG %s.",
 			  vgname);
 
 	_update_cache_lock_state(vgname, 0);
@@ -295,7 +295,7 @@ const struct format_type *fmt_from_vgname(const char *vgname, const char *vgid)
 	dm_list_init(&devs);
 	dm_list_iterate_items(info, &vginfo->infos) {
 		if (!(devl = dm_malloc(sizeof(*devl)))) {
-			log_error("device_list element allocation failed");
+			log_error(0, "device_list element allocation failed");
 			return NULL;
 		}
 		devl->dev = info->dev;
@@ -451,7 +451,7 @@ int lvmcache_label_scan(struct cmd_context *cmd, int full_scan)
 	_scanning_in_progress = 1;
 
 	if (!_vgname_hash && !lvmcache_init()) {
-		log_error("Internal cache initialisation failed");
+		log_error(0, "Internal cache initialisation failed");
 		goto out;
 	}
 
@@ -461,7 +461,7 @@ int lvmcache_label_scan(struct cmd_context *cmd, int full_scan)
 	}
 
 	if (!(iter = dev_iter_create(cmd->filter, (full_scan == 2) ? 1 : 0))) {
-		log_error("dev_iter creation failed");
+		log_error(0, "dev_iter creation failed");
 		goto out;
 	}
 
@@ -540,14 +540,14 @@ struct dm_list *lvmcache_get_vgids(struct cmd_context *cmd, int full_scan)
 	lvmcache_label_scan(cmd, full_scan);
 
 	if (!(vgids = str_list_create(cmd->mem))) {
-		log_error("vgids list allocation failed");
+		log_error(0, "vgids list allocation failed");
 		return NULL;
 	}
 
 	dm_list_iterate_items(vginfo, &_vginfos) {
 		if (!str_list_add(cmd->mem, vgids,
 				  dm_pool_strdup(cmd->mem, vginfo->vgid))) {
-			log_error("strlist allocation failed");
+			log_error(0, "strlist allocation failed");
 			return NULL;
 		}
 	}
@@ -563,14 +563,14 @@ struct dm_list *lvmcache_get_vgnames(struct cmd_context *cmd, int full_scan)
 	lvmcache_label_scan(cmd, full_scan);
 
 	if (!(vgnames = str_list_create(cmd->mem))) {
-		log_error("vgnames list allocation failed");
+		log_error(0, "vgnames list allocation failed");
 		return NULL;
 	}
 
 	dm_list_iterate_items(vginfo, &_vginfos) {
 		if (!str_list_add(cmd->mem, vgnames,
 				  dm_pool_strdup(cmd->mem, vginfo->vgname))) {
-			log_error("strlist allocation failed");
+			log_error(0, "strlist allocation failed");
 			return NULL;
 		}
 	}
@@ -586,7 +586,7 @@ struct dm_list *lvmcache_get_pvids(struct cmd_context *cmd, const char *vgname,
 	struct lvmcache_info *info;
 
 	if (!(pvids = str_list_create(cmd->mem))) {
-		log_error("pvids list allocation failed");
+		log_error(0, "pvids list allocation failed");
 		return NULL;
 	}
 
@@ -596,7 +596,7 @@ struct dm_list *lvmcache_get_pvids(struct cmd_context *cmd, const char *vgname,
 	dm_list_iterate_items(info, &vginfo->infos) {
 		if (!str_list_add(cmd->mem, pvids,
 				  dm_pool_strdup(cmd->mem, info->dev->pvid))) {
-			log_error("strlist allocation failed");
+			log_error(0, "strlist allocation failed");
 			return NULL;
 		}
 	}
@@ -659,7 +659,7 @@ static int _free_vginfo(struct lvmcache_vginfo *vginfo)
 		dm_hash_remove(_vgname_hash, vginfo->vgname);
 		if (vginfo->next && !dm_hash_insert(_vgname_hash, vginfo->vgname,
 						    vginfo->next)) {
-			log_error("_vgname_hash re-insertion for %s failed",
+			log_error(0, "_vgname_hash re-insertion for %s failed",
 				  vginfo->vgname);
 			r = 0;
 		}
@@ -733,7 +733,7 @@ static int _lvmcache_update_pvid(struct lvmcache_info *info, const char *pvid)
 		dm_hash_remove(_pvid_hash, info->dev->pvid);
 	strncpy(info->dev->pvid, pvid, sizeof(info->dev->pvid));
 	if (!dm_hash_insert(_pvid_hash, pvid, info)) {
-		log_error("_lvmcache_update: pvid insertion failed: %s", pvid);
+		log_error(0, "_lvmcache_update: pvid insertion failed: %s", pvid);
 		return 0;
 	}
 
@@ -761,7 +761,7 @@ static int _lvmcache_update_vgid(struct lvmcache_info *info,
 	strncpy(vginfo->vgid, vgid, ID_LEN);
 	vginfo->vgid[ID_LEN] = '\0';
 	if (!dm_hash_insert(_vgid_hash, vginfo->vgid, vginfo)) {
-		log_error("_lvmcache_update: vgid hash insertion failed: %s",
+		log_error(0, "_lvmcache_update: vgid hash insertion failed: %s",
 			  vginfo->vgid);
 		return 0;
 	}
@@ -802,13 +802,13 @@ static int _insert_vginfo(struct lvmcache_vginfo *new_vginfo, const char *vgid,
 		 */
 		if (!(primary_vginfo->status & EXPORTED_VG) &&
 		    (vgstatus & EXPORTED_VG))
-			log_error("WARNING: Duplicate VG name %s: "
+			log_error(0, "WARNING: Duplicate VG name %s: "
 				  "Existing %s takes precedence over "
 				  "exported %s", new_vginfo->vgname,
 				  uuid_primary, uuid_new);
 		else if ((primary_vginfo->status & EXPORTED_VG) &&
 			   !(vgstatus & EXPORTED_VG)) {
-			log_error("WARNING: Duplicate VG name %s: "
+			log_error(0, "WARNING: Duplicate VG name %s: "
 				  "%s takes precedence over exported %s",
 				  new_vginfo->vgname, uuid_new,
 				  uuid_primary);
@@ -816,12 +816,12 @@ static int _insert_vginfo(struct lvmcache_vginfo *new_vginfo, const char *vgid,
 		} else if (primary_vginfo->creation_host &&
 			   !strcmp(primary_vginfo->creation_host,
 				   primary_vginfo->fmt->cmd->hostname))
-			log_error("WARNING: Duplicate VG name %s: "
+			log_error(0, "WARNING: Duplicate VG name %s: "
 				  "Existing %s (created here) takes precedence "
 				  "over %s", new_vginfo->vgname, uuid_primary,
 				  uuid_new);
 		else if (!primary_vginfo->creation_host && creation_host) {
-			log_error("WARNING: Duplicate VG name %s: "
+			log_error(0, "WARNING: Duplicate VG name %s: "
 				  "%s (with creation_host) takes precedence over %s",
 				  new_vginfo->vgname, uuid_new,
 				  uuid_primary);
@@ -829,7 +829,7 @@ static int _insert_vginfo(struct lvmcache_vginfo *new_vginfo, const char *vgid,
 		} else if (creation_host &&
 			   !strcmp(creation_host,
 				   primary_vginfo->fmt->cmd->hostname)) {
-			log_error("WARNING: Duplicate VG name %s: "
+			log_error(0, "WARNING: Duplicate VG name %s: "
 				  "%s (created here) takes precedence over %s",
 				  new_vginfo->vgname, uuid_new,
 				  uuid_primary);
@@ -847,7 +847,7 @@ static int _insert_vginfo(struct lvmcache_vginfo *new_vginfo, const char *vgid,
 	}
 
 	if (!dm_hash_insert(_vgname_hash, new_vginfo->vgname, new_vginfo)) {
-		log_error("cache_update: vg hash insertion failed: %s",
+		log_error(0, "cache_update: vg hash insertion failed: %s",
 		  	new_vginfo->vgname);
 		return 0;
 	}
@@ -886,7 +886,7 @@ static int _lvmcache_update_vgname(struct lvmcache_info *info,
 				dm_hash_remove(_vgname_hash, old_vginfo->vgname);
 				if (old_vginfo->next) {
 					if (!dm_hash_insert(_vgname_hash, old_vginfo->vgname, old_vginfo->next)) {
-						log_error("vg hash re-insertion failed: %s",
+						log_error(0, "vg hash re-insertion failed: %s",
 							  old_vginfo->vgname);
 						return 0;
 					}
@@ -901,26 +901,26 @@ static int _lvmcache_update_vgname(struct lvmcache_info *info,
 
 			dm_free(vginfo->vgname);
 			if (!(vginfo->vgname = dm_strdup(vgname))) {
-				log_error("cache vgname alloc failed for %s", vgname);
+				log_error(0, "cache vgname alloc failed for %s", vgname);
 				return 0;
 			}
 
 			// Rename so can assume new name does not already exist
 			if (!dm_hash_insert(_vgname_hash, vginfo->vgname, vginfo->next)) {
-				log_error("vg hash re-insertion failed: %s",
+				log_error(0, "vg hash re-insertion failed: %s",
 					  vginfo->vgname);
 		      		return 0;
 			}
 		} else {
 ***/
 		if (!(vginfo = dm_malloc(sizeof(*vginfo)))) {
-			log_error("lvmcache_update_vgname: list alloc failed");
+			log_error(0, "lvmcache_update_vgname: list alloc failed");
 			return 0;
 		}
 		memset(vginfo, 0, sizeof(*vginfo));
 		if (!(vginfo->vgname = dm_strdup(vgname))) {
 			dm_free(vginfo);
-			log_error("cache vgname alloc failed for %s", vgname);
+			log_error(0, "cache vgname alloc failed for %s", vgname);
 			return 0;
 		}
 		dm_list_init(&vginfo->infos);
@@ -1013,7 +1013,7 @@ static int _lvmcache_update_vgstatus(struct lvmcache_info *info, uint32_t vgstat
 		dm_free(info->vginfo->creation_host);
 
 	if (!(info->vginfo->creation_host = dm_strdup(creation_host))) {
-		log_error("cache creation host alloc failed for %s",
+		log_error(0, "cache creation host alloc failed for %s",
 			  creation_host);
 		return 0;
 	}
@@ -1027,7 +1027,7 @@ static int _lvmcache_update_vgstatus(struct lvmcache_info *info, uint32_t vgstat
 int lvmcache_add_orphan_vginfo(const char *vgname, struct format_type *fmt)
 {
 	if (!_lock_hash && !lvmcache_init()) {
-		log_error("Internal cache initialisation failed");
+		log_error(0, "Internal cache initialisation failed");
 		return 0;
 	}
 
@@ -1039,7 +1039,7 @@ int lvmcache_update_vgname_and_id(struct lvmcache_info *info,
 				  uint32_t vgstatus, const char *creation_host)
 {
 	if (!vgname && !info->vginfo) {
-		log_error("Internal error: NULL vgname handed to cache");
+		log_error(0, "Internal error: NULL vgname handed to cache");
 		/* FIXME Remove this */
 		vgname = info->fmt->orphan_vg_name;
 		vgid = vgname;
@@ -1098,7 +1098,7 @@ struct lvmcache_info *lvmcache_add(struct labeller *labeller, const char *pvid,
 	char pvid_s[ID_LEN + 1] __attribute((aligned(8)));
 
 	if (!_vgname_hash && !lvmcache_init()) {
-		log_error("Internal cache initialisation failed");
+		log_error(0, "Internal cache initialisation failed");
 		return NULL;
 	}
 
@@ -1110,7 +1110,7 @@ struct lvmcache_info *lvmcache_add(struct labeller *labeller, const char *pvid,
 		if (!(label = label_create(labeller)))
 			return_NULL;
 		if (!(info = dm_malloc(sizeof(*info)))) {
-			log_error("lvmcache_info allocation failed");
+			log_error(0, "lvmcache_info allocation failed");
 			label_destroy(label);
 			return NULL;
 		}
@@ -1154,7 +1154,7 @@ struct lvmcache_info *lvmcache_add(struct labeller *labeller, const char *pvid,
 				 //dm_is_dm_major(MAJOR(dev->dev)))
 				 //
 			else if (!strcmp(pvid_s, existing->dev->pvid)) 
-				log_error("Found duplicate PV %s: using %s not "
+				log_error(0, "Found duplicate PV %s: using %s not "
 					  "%s", pvid, dev_name(dev),
 					  dev_name(existing->dev));
 		}
@@ -1231,7 +1231,7 @@ static void _lvmcache_destroy_lockname(struct dm_hash_node *n)
 	if (!strcmp(vgname, VG_GLOBAL))
 		_vg_global_lock_held = 1;
 	else
-		log_error("Internal error: Volume Group %s was not unlocked",
+		log_error(0, "Internal error: Volume Group %s was not unlocked",
 			  dm_hash_get_key(_lock_hash, n));
 }
 
@@ -1268,7 +1268,7 @@ void lvmcache_destroy(struct cmd_context *cmd, int retain_orphans)
 	}
 
 	if (!dm_list_empty(&_vginfos))
-		log_error("Internal error: _vginfos list should be empty");
+		log_error(0, "Internal error: _vginfos list should be empty");
 	dm_list_init(&_vginfos);
 
 	if (retain_orphans)
diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c
index 12b881b..ad17283 100644
--- a/lib/commands/toolcontext.c
+++ b/lib/commands/toolcontext.c
@@ -66,7 +66,7 @@ static int _get_env_vars(struct cmd_context *cmd)
 	if ((e = getenv("LVM_SYSTEM_DIR"))) {
 		if (dm_snprintf(cmd->system_dir, sizeof(cmd->system_dir),
 				 "%s", e) < 0) {
-			log_error("LVM_SYSTEM_DIR environment variable "
+			log_error(0, "LVM_SYSTEM_DIR environment variable "
 				  "is too long.");
 			return 0;
 		}
@@ -90,7 +90,7 @@ static void _get_sysfs_dir(struct cmd_context *cmd)
 
 	if (dm_snprintf(proc_mounts, sizeof(proc_mounts),
 			 "%s/mounts", cmd->proc_dir) < 0) {
-		log_error("Failed to create /proc/mounts string for sysfs detection");
+		log_error(0, "Failed to create /proc/mounts string for sysfs detection");
 		return;
 	}
 
@@ -111,7 +111,7 @@ static void _get_sysfs_dir(struct cmd_context *cmd)
 		log_sys_error("fclose", proc_mounts);
 
 	if (!sys_mnt) {
-		log_error("Failed to find sysfs mount point");
+		log_error(0, "Failed to find sysfs mount point");
 		return;
 	}
 
@@ -213,7 +213,7 @@ static int _process_config(struct cmd_context *cmd)
 	if (dm_snprintf(cmd->dev_dir, sizeof(cmd->dev_dir), "%s/",
 			 find_config_tree_str(cmd, "devices/dir",
 					 DEFAULT_DEV_DIR)) < 0) {
-		log_error("Device directory given in config file too long");
+		log_error(0, "Device directory given in config file too long");
 		return 0;
 	}
 #ifdef DEVMAPPER_SUPPORT
@@ -224,12 +224,12 @@ static int _process_config(struct cmd_context *cmd)
 	if (dm_snprintf(cmd->proc_dir, sizeof(cmd->proc_dir), "%s",
 			 find_config_tree_str(cmd, "global/proc",
 					 DEFAULT_PROC_DIR)) < 0) {
-		log_error("Device directory given in config file too long");
+		log_error(0, "Device directory given in config file too long");
 		return 0;
 	}
 
 	if (*cmd->proc_dir && !dir_exists(cmd->proc_dir)) {
-		log_error("WARNING: proc dir %s not found - some checks will be bypassed",
+		log_error(0, "WARNING: proc dir %s not found - some checks will be bypassed",
 			  cmd->proc_dir);
 		cmd->proc_dir[0] = '\0';
 	}
@@ -251,7 +251,7 @@ static int _process_config(struct cmd_context *cmd)
 					     "global/units",
 					     DEFAULT_UNITS),
 			     &cmd->default_settings.unit_type))) {
-		log_error("Invalid units specification");
+		log_error(0, "Invalid units specification");
 		return 0;
 	}
 
@@ -261,7 +261,7 @@ static int _process_config(struct cmd_context *cmd)
 	else if (!strcasecmp(read_ahead, "none"))
 		cmd->default_settings.read_ahead = DM_READ_AHEAD_NONE;
 	else {
-		log_error("Invalid readahead specification");
+		log_error(0, "Invalid readahead specification");
 		return 0;
 	}
 
@@ -297,7 +297,7 @@ static int _set_tag(struct cmd_context *cmd, const char *tag)
 	log_very_verbose("Setting host tag: %s", dm_pool_strdup(cmd->libmem, tag));
 
 	if (!str_list_add(cmd->libmem, &cmd->tags, tag)) {
-		log_error("_set_tag: str_list_add %s failed", tag);
+		log_error(0, "_set_tag: str_list_add %s failed", tag);
 		return 0;
 	}
 
@@ -321,7 +321,7 @@ static int _check_host_filters(struct cmd_context *cmd, struct config_node *hn,
 				continue;
 			for (cv = cn->v; cv; cv = cv->next) {
 				if (cv->type != CFG_STRING) {
-					log_error("Invalid hostname string "
+					log_error(0, "Invalid hostname string "
 						  "for tag %s", cn->key);
 					return 0;
 				}
@@ -332,7 +332,7 @@ static int _check_host_filters(struct cmd_context *cmd, struct config_node *hn,
 			}
 		}
 		if (!strcmp(cn->key, "host_filter")) {
-			log_error("host_filter not supported yet");
+			log_error(0, "host_filter not supported yet");
 			return 0;
 		}
 	}
@@ -365,7 +365,7 @@ static int _init_tags(struct cmd_context *cmd, struct config_tree *cft)
 		if (*tag == '@')
 			tag++;
 		if (!validate_name(tag)) {
-			log_error("Invalid tag in config file: %s", cn->key);
+			log_error(0, "Invalid tag in config file: %s", cn->key);
 			return 0;
 		}
 		if (cn->child) {
@@ -394,17 +394,17 @@ static int _load_config_file(struct cmd_context *cmd, const char *tag)
 
 	if (dm_snprintf(config_file, sizeof(config_file), "%s/lvm%s%s.conf",
 			 cmd->system_dir, filler, tag) < 0) {
-		log_error("LVM_SYSTEM_DIR or tag was too long");
+		log_error(0, "LVM_SYSTEM_DIR or tag was too long");
 		return 0;
 	}
 
 	if (!(cfl = dm_pool_alloc(cmd->libmem, sizeof(*cfl)))) {
-		log_error("config_tree_list allocation failed");
+		log_error(0, "config_tree_list allocation failed");
 		return 0;
 	}
 
 	if (!(cfl->cft = create_config_tree(config_file, 0))) {
-		log_error("config_tree allocation failed");
+		log_error(0, "config_tree allocation failed");
 		return 0;
 	}
 
@@ -421,7 +421,7 @@ static int _load_config_file(struct cmd_context *cmd, const char *tag)
 
 	log_very_verbose("Loading config file: %s", config_file);
 	if (!read_config_file(cfl->cft)) {
-		log_error("Failed to load config file %s", config_file);
+		log_error(0, "Failed to load config file %s", config_file);
 		destroy_config_tree(cfl->cft);
 		return 0;
 	}
@@ -444,7 +444,7 @@ static int _init_lvm_conf(struct cmd_context *cmd)
 	/* No config file if LVM_SYSTEM_DIR is empty */
 	if (!*cmd->system_dir) {
 		if (!(cmd->cft = create_config_tree(NULL, 0))) {
-			log_error("Failed to create config tree");
+			log_error(0, "Failed to create config tree");
 			return 0;
 		}
 		return 1;
@@ -477,7 +477,7 @@ static int _merge_config_files(struct cmd_context *cmd)
 	/* Replace temporary duplicate copy of lvm.conf */
 	if (cmd->cft->root) {
 		if (!(cmd->cft = create_config_tree(NULL, 0))) {
-			log_error("Failed to create config tree");
+			log_error(0, "Failed to create config tree");
 			return 0;
 		}
 	}
@@ -540,7 +540,7 @@ static int _init_dev_cache(struct cmd_context *cmd)
 
 	if (!(cn = find_config_tree_node(cmd, "devices/scan"))) {
 		if (!dev_cache_add_dir("/dev")) {
-			log_error("Failed to add /dev to internal "
+			log_error(0, "Failed to add /dev to internal "
 				  "device cache");
 			return 0;
 		}
@@ -551,13 +551,13 @@ static int _init_dev_cache(struct cmd_context *cmd)
 
 	for (cv = cn->v; cv; cv = cv->next) {
 		if (cv->type != CFG_STRING) {
-			log_error("Invalid string in config file: "
+			log_error(0, "Invalid string in config file: "
 				  "devices/scan");
 			return 0;
 		}
 
 		if (!dev_cache_add_dir(cv->v.str)) {
-			log_error("Failed to add %s to internal device cache",
+			log_error(0, "Failed to add %s to internal device cache",
 				  cv->v.str);
 			return 0;
 		}
@@ -568,13 +568,13 @@ static int _init_dev_cache(struct cmd_context *cmd)
 
 	for (cv = cn->v; cv; cv = cv->next) {
 		if (cv->type != CFG_STRING) {
-			log_error("Invalid string in config file: "
+			log_error(0, "Invalid string in config file: "
 				  "devices/loopfiles");
 			return 0;
 		}
 
 		if (!dev_cache_add_loopfile(cv->v.str)) {
-			log_error("Failed to add loopfile %s to internal "
+			log_error(0, "Failed to add loopfile %s to internal "
 				  "device cache", cv->v.str);
 			return 0;
 		}
@@ -617,14 +617,14 @@ static struct dev_filter *_init_filter_components(struct cmd_context *cmd)
 				 "no regex filter installed");
 
 	else if (!(filters[nr_filt++] = regex_filter_create(cn->v))) {
-		log_error("Failed to create regex device filter");
+		log_error(0, "Failed to create regex device filter");
 		return NULL;
 	}
 
 	/* device type filter. Required. */
 	cn = find_config_tree_node(cmd, "devices/types");
 	if (!(filters[nr_filt++] = lvm_type_filter_create(cmd->proc_dir, cn))) {
-		log_error("Failed to create lvm type filter");
+		log_error(0, "Failed to create lvm type filter");
 		return NULL;
 	}
 
@@ -669,7 +669,7 @@ static int _init_filters(struct cmd_context *cmd, unsigned load_persistent_cache
 		    cache_dir ? "" : "/",
 		    cache_dir ? : DEFAULT_CACHE_SUBDIR,
 		    cache_file_prefix ? : DEFAULT_CACHE_FILE_PREFIX) < 0) {
-			log_error("Persistent cache filename too long.");
+			log_error(0, "Persistent cache filename too long.");
 			return 0;
 		}
 	} else if (!(dev_cache = find_config_tree_str(cmd, "devices/cache", NULL)) &&
@@ -677,7 +677,7 @@ static int _init_filters(struct cmd_context *cmd, unsigned load_persistent_cache
 				"%s/%s/%s.cache",
 				cmd->system_dir, DEFAULT_CACHE_SUBDIR,
 				DEFAULT_CACHE_FILE_PREFIX) < 0)) {
-		log_error("Persistent cache filename too long.");
+		log_error(0, "Persistent cache filename too long.");
 		return 0;
 	}
 
@@ -685,7 +685,7 @@ static int _init_filters(struct cmd_context *cmd, unsigned load_persistent_cache
 		dev_cache = cache_file;
 
 	if (!(f4 = persistent_filter_create(f3, dev_cache))) {
-		log_error("Failed to create persistent device filter");
+		log_error(0, "Failed to create persistent device filter");
 		return 0;
 	}
 
@@ -749,7 +749,7 @@ static int _init_formats(struct cmd_context *cmd)
 
 		for (cv = cn->v; cv; cv = cv->next) {
 			if (cv->type != CFG_STRING) {
-				log_error("Invalid string in config file: "
+				log_error(0, "Invalid string in config file: "
 					  "global/format_libraries");
 				return 0;
 			}
@@ -758,7 +758,7 @@ static int _init_formats(struct cmd_context *cmd)
 				return_0;
 
 			if (!(init_format_fn = dlsym(lib, "init_format"))) {
-				log_error("Shared library %s does not contain "
+				log_error(0, "Shared library %s does not contain "
 					  "format functions", cv->v.str);
 				dlclose(lib);
 				return 0;
@@ -791,7 +791,7 @@ static int _init_formats(struct cmd_context *cmd)
 		}
 	}
 
-	log_error("_init_formats: Default format (%s) not found", format);
+	log_error(0, "_init_formats: Default format (%s) not found", format);
 	return 0;
 }
 
@@ -860,7 +860,7 @@ static int _init_segtypes(struct cmd_context *cmd)
 
 		for (cv = cn->v; cv; cv = cv->next) {
 			if (cv->type != CFG_STRING) {
-				log_error("Invalid string in config file: "
+				log_error(0, "Invalid string in config file: "
 					  "global/segment_libraries");
 				return 0;
 			}
@@ -869,7 +869,7 @@ static int _init_segtypes(struct cmd_context *cmd)
 				return_0;
 
 			if (!(init_segtype_fn = dlsym(lib, "init_segtype"))) {
-				log_error("Shared library %s does not contain "
+				log_error(0, "Shared library %s does not contain "
 					  "segment type functions", cv->v.str);
 				dlclose(lib);
 				return 0;
@@ -884,7 +884,7 @@ static int _init_segtypes(struct cmd_context *cmd)
 				if ((segtype == segtype2) ||
 				     strcmp(segtype2->name, segtype->name))
 					continue;
-				log_error("Duplicate segment type %s: "
+				log_error(0, "Duplicate segment type %s: "
 					  "unloading shared library %s",
 					  segtype->name, cv->v.str);
 				dm_list_del(&segtype->list);
@@ -908,12 +908,12 @@ static int _init_hostname(struct cmd_context *cmd)
 	}
 
 	if (!(cmd->hostname = dm_pool_strdup(cmd->libmem, uts.nodename))) {
-		log_error("_init_hostname: dm_pool_strdup failed");
+		log_error(0, "_init_hostname: dm_pool_strdup failed");
 		return 0;
 	}
 
 	if (!(cmd->kernel_vsn = dm_pool_strdup(cmd->libmem, uts.release))) {
-		log_error("_init_hostname: dm_pool_strdup kernel_vsn failed");
+		log_error(0, "_init_hostname: dm_pool_strdup kernel_vsn failed");
 		return 0;
 	}
 
@@ -947,7 +947,7 @@ static int _init_backup(struct cmd_context *cmd)
 	if (dm_snprintf
 	    (default_dir, sizeof(default_dir), "%s/%s", cmd->system_dir,
 	     DEFAULT_ARCHIVE_SUBDIR) == -1) {
-		log_err("Couldn't create default archive path '%s/%s'.",
+		log_error(0, "Couldn't create default archive path '%s/%s'.",
 			cmd->system_dir, DEFAULT_ARCHIVE_SUBDIR);
 		return 0;
 	}
@@ -969,7 +969,7 @@ static int _init_backup(struct cmd_context *cmd)
 	if (dm_snprintf
 	    (default_dir, sizeof(default_dir), "%s/%s", cmd->system_dir,
 	     DEFAULT_BACKUP_SUBDIR) == -1) {
-		log_err("Couldn't create default backup path '%s/%s'.",
+		log_error(0, "Couldn't create default backup path '%s/%s'.",
 			cmd->system_dir, DEFAULT_BACKUP_SUBDIR);
 		return 0;
 	}
@@ -1019,7 +1019,7 @@ struct cmd_context *create_toolcontext(unsigned is_long_lived,
 	init_syslog(DEFAULT_LOG_FACILITY);
 
 	if (!(cmd = dm_malloc(sizeof(*cmd)))) {
-		log_error("Failed to allocate command context");
+		log_error(0, "Failed to allocate command context");
 		return NULL;
 	}
 	memset(cmd, 0, sizeof(*cmd));
@@ -1047,15 +1047,15 @@ struct cmd_context *create_toolcontext(unsigned is_long_lived,
 
 	/* Create system directory if it doesn't already exist */
 	if (*cmd->system_dir && !dm_create_dir(cmd->system_dir)) {
-		log_error("Failed to create LVM2 system dir for metadata backups, config "
+		log_error(0, "Failed to create LVM2 system dir for metadata backups, config "
 			  "files and internal cache.");
-		log_error("Set environment variable LVM_SYSTEM_DIR to alternative location "
+		log_error(0, "Set environment variable LVM_SYSTEM_DIR to alternative location "
 			  "or empty string.");
 		goto error;
 	}
 
 	if (!(cmd->libmem = dm_pool_create("library", 4 * 1024))) {
-		log_error("Library memory pool creation failed");
+		log_error(0, "Library memory pool creation failed");
 		goto error;
 	}
 
@@ -1086,7 +1086,7 @@ struct cmd_context *create_toolcontext(unsigned is_long_lived,
 		goto error;
 
 	if (!(cmd->mem = dm_pool_create("command", 4 * 1024))) {
-		log_error("Command memory pool creation failed");
+		log_error(0, "Command memory pool creation failed");
 		goto error;
 	}
 
diff --git a/lib/config/config.c b/lib/config/config.c
index 224f2ce..fb120eb 100644
--- a/lib/config/config.c
+++ b/lib/config/config.c
@@ -90,7 +90,7 @@ static const int sep = '/';
 
 #define match(t) do {\
    if (!_match_aux(p, (t))) {\
-	log_error("Parse error at byte %" PRIptrdiff_t " (line %d): unexpected token", \
+	log_error(0, "Parse error at byte %" PRIptrdiff_t " (line %d): unexpected token", \
 		  p->tb - p->fb + 1, p->line); \
       return 0;\
    } \
@@ -115,12 +115,12 @@ struct config_tree *create_config_tree(const char *filename, int keep_open)
 	struct dm_pool *mem = dm_pool_create("config", 10 * 1024);
 
 	if (!mem) {
-		log_error("Failed to allocate config pool.");
+		log_error(0, "Failed to allocate config pool.");
 		return 0;
 	}
 
 	if (!(c = dm_pool_zalloc(mem, sizeof(*c)))) {
-		log_error("Failed to allocate config tree.");
+		log_error(0, "Failed to allocate config tree.");
 		dm_pool_destroy(mem);
 		return 0;
 	}
@@ -169,7 +169,7 @@ struct config_tree *create_config_tree_from_string(struct cmd_context *cmd __att
 
 	c = (struct cs *) cft;
 	if (!(p = dm_pool_alloc(c->mem, sizeof(*p)))) {
-		log_error("Failed to allocate config tree parser.");
+		log_error(0, "Failed to allocate config tree parser.");
 		destroy_config_tree(cft);
 		return NULL;
 	}
@@ -228,7 +228,7 @@ int read_config_fd(struct config_tree *cft, struct device *dev,
 	if (checksum_fn && checksum !=
 	    (checksum_fn(checksum_fn(INITIAL_CRC, p->fb, size),
 			 p->fb + size, size2))) {
-		log_error("%s: Checksum error", dev_name(dev));
+		log_error(0, "%s: Checksum error", dev_name(dev));
 		goto out;
 	}
 
@@ -266,7 +266,7 @@ int read_config_file(struct config_tree *cft)
 	}
 
 	if (!S_ISREG(info.st_mode)) {
-		log_error("%s is not a regular file", c->filename);
+		log_error(0, "%s is not a regular file", c->filename);
 		c->exists = 0;
 		return 0;
 	}
@@ -327,12 +327,12 @@ int config_file_changed(struct config_tree *cft)
 			goto reload;
 		}
 		log_sys_error("stat", c->filename);
-		log_error("Failed to reload configuration files");
+		log_error(0, "Failed to reload configuration files");
 		return 0;
 	}
 
 	if (!S_ISREG(info.st_mode)) {
-		log_error("Configuration file %s is not a regular file",
+		log_error(0, "Configuration file %s is not a regular file",
 			  c->filename);
 		goto reload;
 	}
@@ -349,7 +349,7 @@ int config_file_changed(struct config_tree *cft)
 static int _line_start(struct output_line *outline)
 {
 	if (!dm_pool_begin_object(outline->mem, 128)) {
-		log_error("dm_pool_begin_object failed for config line");
+		log_error(0, "dm_pool_begin_object failed for config line");
 		return 0;
 	}
 
@@ -367,13 +367,13 @@ static int _line_append(struct output_line *outline, const char *fmt, ...)
 	va_start(ap, fmt);
 	n = vsnprintf(&buf[0], sizeof buf - 1, fmt, ap);
 	if (n < 0 || n > (int) sizeof buf - 1) {
-		log_error("vsnprintf failed for config line");
+		log_error(0, "vsnprintf failed for config line");
 		return 0;
 	}
 	va_end(ap);
 
 	if (!dm_pool_grow_object(outline->mem, &buf[0], strlen(buf))) {
-		log_error("dm_pool_grow_object failed for config line");
+		log_error(0, "dm_pool_grow_object failed for config line");
 		return 0;
 	}
 
@@ -387,7 +387,7 @@ static int _line_end(struct output_line *outline)
 	const char *line;
 
 	if (!dm_pool_grow_object(outline->mem, "\0", 1)) {
-		log_error("dm_pool_grow_object failed for config line");
+		log_error(0, "dm_pool_grow_object failed for config line");
 		return 0;
 	}
 
@@ -407,7 +407,7 @@ static int _write_value(struct output_line *outline, struct config_value *v)
 	switch (v->type) {
 	case CFG_STRING:
 		if (!(buf = alloca(escaped_len(v->v.str)))) {
-			log_error("temporary stack allocation for a config "
+			log_error(0, "temporary stack allocation for a config "
 				  "string failed");
 			return 0;
 		}
@@ -427,7 +427,7 @@ static int _write_value(struct output_line *outline, struct config_value *v)
 		break;
 
 	default:
-		log_error("_write_value: Unknown value type: %d", v->type);
+		log_error(0, "_write_value: Unknown value type: %d", v->type);
 
 	}
 
@@ -507,17 +507,17 @@ int write_config_file(struct config_tree *cft, const char *file,
 	log_verbose("Dumping configuration to %s", file);
 	if (!argc) {
 		if (!_write_config(cft->root, 0, &outline, 0)) {
-			log_error("Failure while writing to %s", file);
+			log_error(0, "Failure while writing to %s", file);
 			r = 0;
 		}
 	} else while (argc--) {
 		if ((cn = find_config_node(cft->root, *argv))) {
 			if (!_write_config(cn, 1, &outline, 0)) {
-				log_error("Failure while writing to %s", file);
+				log_error(0, "Failure while writing to %s", file);
 				r = 0;
 			}
 		} else {
-			log_error("Configuration node %s not found", *argv);
+			log_error(0, "Configuration node %s not found", *argv);
 			r = 0;
 		}
 		argv++;
@@ -664,7 +664,7 @@ static struct config_value *_type(struct parser *p)
 		break;
 
 	default:
-		log_error("Parse error at byte %" PRIptrdiff_t " (line %d): expected a value",
+		log_error(0, "Parse error at byte %" PRIptrdiff_t " (line %d): expected a value",
 			  p->tb - p->fb + 1, p->line);
 		return 0;
 	}
@@ -876,7 +876,7 @@ static struct config_node *_find_config_node(const struct config_node *cn,
 				if (!cn_found)
 					cn_found = cn;
 				else
-					log_error("WARNING: Ignoring duplicate"
+					log_error(0, "WARNING: Ignoring duplicate"
 						  " config node: %s ("
 						  "seeking %s)", cn->key, path);
 			}
diff --git a/lib/device/dev-cache.c b/lib/device/dev-cache.c
index dd4ce6a..622dbd4 100644
--- a/lib/device/dev-cache.c
+++ b/lib/device/dev-cache.c
@@ -61,16 +61,16 @@ struct device *dev_create_file(const char *filename, struct device *dev,
 	if (allocate) {
 		if (use_malloc) {
 			if (!(dev = dm_malloc(sizeof(*dev)))) {
-				log_error("struct device allocation failed");
+				log_error(0, "struct device allocation failed");
 				return NULL;
 			}
 			if (!(alias = dm_malloc(sizeof(*alias)))) {
-				log_error("struct str_list allocation failed");
+				log_error(0, "struct str_list allocation failed");
 				dm_free(dev);
 				return NULL;
 			}
 			if (!(alias->str = dm_strdup(filename))) {
-				log_error("filename strdup failed");
+				log_error(0, "filename strdup failed");
 				dm_free(dev);
 				dm_free(alias);
 				return NULL;
@@ -78,21 +78,21 @@ struct device *dev_create_file(const char *filename, struct device *dev,
 			dev->flags = DEV_ALLOCED;
 		} else {
 			if (!(dev = _alloc(sizeof(*dev)))) {
-				log_error("struct device allocation failed");
+				log_error(0, "struct device allocation failed");
 				return NULL;
 			}
 			if (!(alias = _alloc(sizeof(*alias)))) {
-				log_error("struct str_list allocation failed");
+				log_error(0, "struct str_list allocation failed");
 				_free(dev);
 				return NULL;
 			}
 			if (!(alias->str = _strdup(filename))) {
-				log_error("filename strdup failed");
+				log_error(0, "filename strdup failed");
 				return NULL;
 			}
 		}
 	} else if (!(alias->str = dm_strdup(filename))) {
-		log_error("filename strdup failed");
+		log_error(0, "filename strdup failed");
 		return NULL;
 	}
 
@@ -116,7 +116,7 @@ static struct device *_dev_create(dev_t d)
 	struct device *dev;
 
 	if (!(dev = _alloc(sizeof(*dev)))) {
-		log_error("struct device allocation failed");
+		log_error(0, "struct device allocation failed");
 		return NULL;
 	}
 	dev->flags = 0;
@@ -298,19 +298,19 @@ static int _insert_dev(const char *path, dev_t d)
 			return_0;
 
 		if (!(btree_insert(_cache.devices, (uint32_t) d, dev))) {
-			log_err("Couldn't insert device into binary tree.");
+			log_error(0, "Couldn't insert device into binary tree.");
 			_free(dev);
 			return 0;
 		}
 	}
 
 	if (!loopfile && !_add_alias(dev, path)) {
-		log_err("Couldn't add alias to dev cache.");
+		log_error(0, "Couldn't add alias to dev cache.");
 		return 0;
 	}
 
 	if (!dm_hash_insert(_cache.names, path, dev)) {
-		log_err("Couldn't add name to hash in dev cache.");
+		log_error(0, "Couldn't add name to hash in dev cache.");
 		return 0;
 	}
 
@@ -488,7 +488,7 @@ static int _init_preferred_names(struct cmd_context *cmd)
 
 	for (v = cn->v; v; v = v->next) {
 		if (v->type != CFG_STRING) {
-			log_error("preferred_names patterns must be enclosed in quotes");
+			log_error(0, "preferred_names patterns must be enclosed in quotes");
 			return 0;
 		}
 
@@ -499,14 +499,14 @@ static int _init_preferred_names(struct cmd_context *cmd)
 		return_0;
 
 	if (!(regex = dm_pool_alloc(scratch, sizeof(*regex) * count))) {
-		log_error("Failed to allocate preferred device name "
+		log_error(0, "Failed to allocate preferred device name "
 			  "pattern list.");
 		goto out;
 	}
 
 	for (v = cn->v, i = count - 1; v; v = v->next, i--) {
 		if (!(regex[i] = dm_pool_strdup(scratch, v->v.str))) {
-			log_error("Failed to allocate a preferred device name "
+			log_error(0, "Failed to allocate a preferred device name "
 				  "pattern.");
 			goto out;
 		}
@@ -514,7 +514,7 @@ static int _init_preferred_names(struct cmd_context *cmd)
 
 	if (!(_cache.preferred_names_matcher =
 		dm_regex_create(_cache.mem,(const char **) regex, count))) {
-		log_error("Preferred device name pattern matcher creation failed.");
+		log_error(0, "Preferred device name pattern matcher creation failed.");
 		goto out;
 	}
 
@@ -541,7 +541,7 @@ int dev_cache_init(struct cmd_context *cmd)
 	}
 
 	if (!(_cache.devices = btree_create(_cache.mem))) {
-		log_err("Couldn't create binary tree for dev-cache.");
+		log_error(0, "Couldn't create binary tree for dev-cache.");
 		goto bad;
 	}
 
@@ -561,7 +561,7 @@ int dev_cache_init(struct cmd_context *cmd)
 static void _check_closed(struct device *dev)
 {
 	if (dev->fd >= 0)
-		log_err("Device '%s' has been left open.", dev_name(dev));
+		log_error(0, "Device '%s' has been left open.", dev_name(dev));
 }
 
 static void _check_for_open_devices(void)
@@ -599,18 +599,18 @@ int dev_cache_add_dir(const char *path)
 	struct stat st;
 
 	if (stat(path, &st)) {
-		log_error("Ignoring %s: %s", path, strerror(errno));
+		log_error(0, "Ignoring %s: %s", path, strerror(errno));
 		/* But don't fail */
 		return 1;
 	}
 
 	if (!S_ISDIR(st.st_mode)) {
-		log_error("Ignoring %s: Not a directory", path);
+		log_error(0, "Ignoring %s: Not a directory", path);
 		return 1;
 	}
 
 	if (!(dl = _alloc(sizeof(*dl) + strlen(path) + 1))) {
-		log_error("dir_list allocation failed");
+		log_error(0, "dir_list allocation failed");
 		return 0;
 	}
 
@@ -625,18 +625,18 @@ int dev_cache_add_loopfile(const char *path)
 	struct stat st;
 
 	if (stat(path, &st)) {
-		log_error("Ignoring %s: %s", path, strerror(errno));
+		log_error(0, "Ignoring %s: %s", path, strerror(errno));
 		/* But don't fail */
 		return 1;
 	}
 
 	if (!S_ISREG(st.st_mode)) {
-		log_error("Ignoring %s: Not a regular file", path);
+		log_error(0, "Ignoring %s: Not a regular file", path);
 		return 1;
 	}
 
 	if (!(dl = _alloc(sizeof(*dl) + strlen(path) + 1))) {
-		log_error("dir_list allocation failed for file");
+		log_error(0, "dir_list allocation failed for file");
 		return 0;
 	}
 
@@ -672,7 +672,7 @@ const char *dev_name_confirmed(struct device *dev, int quiet)
 				  name, (int) MAJOR(dev->dev),
 				  (int) MINOR(dev->dev));
 		else
-			log_error("Path %s no longer valid for device(%d,%d)",
+			log_error(0, "Path %s no longer valid for device(%d,%d)",
 				  name, (int) MAJOR(dev->dev),
 				  (int) MINOR(dev->dev));
 
@@ -730,7 +730,7 @@ struct dev_iter *dev_iter_create(struct dev_filter *f, int dev_scan)
 	struct dev_iter *di = dm_malloc(sizeof(*di));
 
 	if (!di) {
-		log_error("dev_iter allocation failed");
+		log_error(0, "dev_iter allocation failed");
 		return NULL;
 	}
 
diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c
index 06675e2..c5bd56d 100644
--- a/lib/device/dev-io.c
+++ b/lib/device/dev-io.c
@@ -64,7 +64,7 @@ static int _io(struct device_area *where, void *buffer, int should_write)
 	size_t total = 0;
 
 	if (fd < 0) {
-		log_error("Attempt to read an unopened device (%s).",
+		log_error(0, "Attempt to read an unopened device (%s).",
 			  dev_name(where->dev));
 		return 0;
 	}
@@ -76,12 +76,12 @@ static int _io(struct device_area *where, void *buffer, int should_write)
 		return 1;
 
 	if (where->size > SSIZE_MAX) {
-		log_error("Read size too large: %" PRIu64, where->size);
+		log_error(0, "Read size too large: %" PRIu64, where->size);
 		return 0;
 	}
 
 	if (lseek(fd, (off_t) where->start, SEEK_SET) < 0) {
-		log_error("%s: lseek %" PRIu64 " failed: %s",
+		log_error(0, "%s: lseek %" PRIu64 " failed: %s",
 			  dev_name(where->dev), (uint64_t) where->start,
 			  strerror(errno));
 		return 0;
@@ -95,7 +95,7 @@ static int _io(struct device_area *where, void *buffer, int should_write)
 		while ((n < 0) && ((errno == EINTR) || (errno == EAGAIN)));
 
 		if (n < 0)
-			log_error("%s: %s failed after %" PRIu64 " of %" PRIu64
+			log_error(0, "%s: %s failed after %" PRIu64 " of %" PRIu64
 				  " at %" PRIu64 ": %s", dev_name(where->dev),
 				  should_write ? "write" : "read",
 				  (uint64_t) total,
@@ -186,7 +186,7 @@ static int _aligned_io(struct device_area *where, void *buffer,
 
 	/* Allocate a bounce buffer with an extra block */
 	if (!(bounce = alloca((size_t) widened.size + block_size))) {
-		log_error("Bounce buffer alloca failed");
+		log_error(0, "Bounce buffer alloca failed");
 		return 0;
 	}
 
@@ -392,7 +392,7 @@ int dev_open_flags(struct device *dev, int flags, int direct, int quiet)
 	}
 
 	if (memlock())
-		log_error("WARNING: dev_open(%s) called while suspended",
+		log_error(0, "WARNING: dev_open(%s) called while suspended",
 			  dev_name(dev));
 
 	if (dev->flags & DEV_REGULAR)
@@ -406,7 +406,7 @@ int dev_open_flags(struct device *dev, int flags, int direct, int quiet)
 			return 0;
 		}
 		if (buf.st_rdev != dev->dev) {
-			log_error("%s: device changed", name);
+			log_error(0, "%s: device changed", name);
 			return 0;
 		}
 	}
@@ -465,7 +465,7 @@ int dev_open_flags(struct device *dev, int flags, int direct, int quiet)
 
 	if (!(dev->flags & DEV_REGULAR) &&
 	    ((fstat(dev->fd, &buf) < 0) || (buf.st_rdev != dev->dev))) {
-		log_error("%s: fstat failed: Has device name changed?", name);
+		log_error(0, "%s: fstat failed: Has device name changed?", name);
 		dev_close_immediate(dev);
 		return 0;
 	}
@@ -544,7 +544,7 @@ static int _dev_close(struct device *dev, int immediate)
 	struct lvmcache_info *info;
 
 	if (dev->fd < 0) {
-		log_error("Attempt to close device '%s' "
+		log_error(0, "Attempt to close device '%s' "
 			  "which is not open.", dev_name(dev));
 		return 0;
 	}
@@ -617,7 +617,7 @@ int dev_read_circular(struct device *dev, uint64_t offset, size_t len,
 		      uint64_t offset2, size_t len2, void *buf)
 {
 	if (!dev_read(dev, offset, len, buf)) {
-		log_error("Read from %s failed", dev_name(dev));
+		log_error(0, "Read from %s failed", dev_name(dev));
 		return 0;
 	}
 
@@ -629,7 +629,7 @@ int dev_read_circular(struct device *dev, uint64_t offset, size_t len,
 		return 1;
 
 	if (!dev_read(dev, offset2, len2, buf + len)) {
-		log_error("Circular read from %s failed",
+		log_error(0, "Circular read from %s failed",
 			  dev_name(dev));
 		return 0;
 	}
diff --git a/lib/device/dev-md.c b/lib/device/dev-md.c
index 618509d..31a1e5b 100644
--- a/lib/device/dev-md.c
+++ b/lib/device/dev-md.c
@@ -142,7 +142,7 @@ static int _md_sysfs_attribute_snprintf(char *path, size_t size,
 	ret = dm_snprintf(path, size, "%s/dev/block/%d:%d/md/%s",
 	      sysfs_dir, MAJOR(dev->dev), MINOR(dev->dev), attribute);
 	if (ret < 0) {
-		log_error("dm_snprintf md %s failed", attribute);
+		log_error(0, "dm_snprintf md %s failed", attribute);
 		return ret;
 	}
 
@@ -151,7 +151,7 @@ static int _md_sysfs_attribute_snprintf(char *path, size_t size,
 		ret = dm_snprintf(path, size, "%s/block/md%d/md/%s",
 				  sysfs_dir, MINOR(dev->dev), attribute);
 		if (ret < 0) {
-			log_error("dm_snprintf old md %s failed", attribute);
+			log_error(0, "dm_snprintf old md %s failed", attribute);
 			return ret;
 		}
 	}
@@ -184,7 +184,7 @@ static int _md_sysfs_attribute_scanf(const char *sysfs_dir,
 	}
 
 	if ((ret = sscanf(buffer, attribute_fmt, attribute_value)) != 1) {
-		log_error("%s sysfs attr %s not in expected format: %s",
+		log_error(0, "%s sysfs attr %s not in expected format: %s",
 			  dev_name(dev), attribute_name, buffer);
 		goto out;
 	}
@@ -293,7 +293,7 @@ unsigned long dev_md_stripe_width(const char *sysfs_dir, struct device *dev)
 		data_disks = raid_disks - 2;
 		break;
 	default:
-		log_error("Device %s has an unknown md raid level: %d",
+		log_error(0, "Device %s has an unknown md raid level: %d",
 			  dev_name(dev), level);
 		return 0;
 	}
diff --git a/lib/device/device.c b/lib/device/device.c
index 9d3c1cf..8963f10 100644
--- a/lib/device/device.c
+++ b/lib/device/device.c
@@ -155,13 +155,13 @@ int partition_type_is_lvm(struct dev_mgr *dm, struct device *d)
 	}
 
 	if (is_whole_disk(dm, d)) {
-		log_error("%s: looks to possess partition table", d->name);
+		log_error(0, "%s: looks to possess partition table", d->name);
 		return 0;
 	}
 
 	/* check part type */
 	if (pt != LVM_PARTITION && pt != LVM_NEW_PARTITION) {
-		log_error("%s: invalid partition type 0x%x "
+		log_error(0, "%s: invalid partition type 0x%x "
 			  "(must be 0x%x)", d->name, pt, LVM_NEW_PARTITION);
 		return 0;
 	}
@@ -201,13 +201,13 @@ int _get_partition_type(struct dev_mgr *dm, struct device *d)
 	}
 
 	if (!(buffer = dm_malloc(SECTOR_SIZE))) {
-		log_error("Failed to allocate partition table buffer");
+		log_error(0, "Failed to allocate partition table buffer");
 		return 0;
 	}
 
 	/* Get partition table */
 	if ((pv_handle = open(primary->name, O_RDONLY)) < 0) {
-		log_error("%s: open failed: %s", primary->name,
+		log_error(0, "%s: open failed: %s", primary->name,
 			  strerror(errno));
 		return 0;
 	}
@@ -220,7 +220,7 @@ int _get_partition_type(struct dev_mgr *dm, struct device *d)
 		bytes_read = 0;
 
 		if (llseek(pv_handle, offset * SECTOR_SIZE, SEEK_SET) == -1) {
-			log_error("%s: llseek failed: %s",
+			log_error(0, "%s: llseek failed: %s",
 				  primary->name, strerror(errno));
 			return 0;
 		}
@@ -232,7 +232,7 @@ int _get_partition_type(struct dev_mgr *dm, struct device *d)
 			bytes_read += read_ret;
 
 		if (read_ret == -1) {
-			log_error("%s: read failed: %s", primary->name,
+			log_error(0, "%s: read failed: %s", primary->name,
 				  strerror(errno));
 			return 0;
 		}
diff --git a/lib/display/display.c b/lib/display/display.c
index 0de0a8e..a8269ff 100644
--- a/lib/display/display.c
+++ b/lib/display/display.c
@@ -142,7 +142,7 @@ alloc_policy_t get_alloc_from_string(const char *str)
 	if(!strcmp("next free", str))
 		return ALLOC_NORMAL;
 
-	log_error("Unrecognised allocation policy %s", str);
+	log_error(0, "Unrecognised allocation policy %s", str);
 	return ALLOC_INVALID;
 }
 
@@ -170,7 +170,7 @@ static const char *_display_size(const struct cmd_context *cmd,
 	};
 
 	if (!(size_buf = dm_pool_alloc(cmd->mem, SIZE_BUF))) {
-		log_error("no memory for size display buffer");
+		log_error(0, "no memory for size display buffer");
 		return "";
 	}
 
diff --git a/lib/error/errseg.c b/lib/error/errseg.c
index fa90a8e..21a87de 100644
--- a/lib/error/errseg.c
+++ b/lib/error/errseg.c
@@ -74,7 +74,7 @@ static int _errseg_modules_needed(struct dm_pool *mem,
 				  struct dm_list *modules)
 {
 	if (!str_list_add(mem, modules, "error")) {
-		log_error("error module string list allocation failed");
+		log_error(0, "error module string list allocation failed");
 		return 0;
 	}
 
diff --git a/lib/filters/filter-composite.c b/lib/filters/filter-composite.c
index d1606d3..e89317b 100644
--- a/lib/filters/filter-composite.c
+++ b/lib/filters/filter-composite.c
@@ -54,7 +54,7 @@ struct dev_filter *composite_filter_create(int n, struct dev_filter **filters)
 		return_NULL;
 
 	if (!(filters_copy = dm_malloc(sizeof(*filters) * (n + 1)))) {
-		log_error("composite filters allocation failed");
+		log_error(0, "composite filters allocation failed");
 		return NULL;
 	}
 
@@ -62,7 +62,7 @@ struct dev_filter *composite_filter_create(int n, struct dev_filter **filters)
 	filters_copy[n] = NULL;
 
 	if (!(cft = dm_malloc(sizeof(*cft)))) {
-		log_error("compsoite filters allocation failed");
+		log_error(0, "compsoite filters allocation failed");
 		dm_free(filters_copy);
 		return NULL;
 	}
diff --git a/lib/filters/filter-md.c b/lib/filters/filter-md.c
index c1ecff7..f7cf8ab 100644
--- a/lib/filters/filter-md.c
+++ b/lib/filters/filter-md.c
@@ -53,7 +53,7 @@ struct dev_filter *md_filter_create(void)
 	struct dev_filter *f;
 
 	if (!(f = dm_malloc(sizeof(*f)))) {
-		log_error("md filter allocation failed");
+		log_error(0, "md filter allocation failed");
 		return NULL;
 	}
 
diff --git a/lib/filters/filter-persistent.c b/lib/filters/filter-persistent.c
index b545a55..49b846d 100644
--- a/lib/filters/filter-persistent.c
+++ b/lib/filters/filter-persistent.c
@@ -162,7 +162,7 @@ static void _write_array(struct pfilter *pf, FILE *fp, const char *path,
 
 		str = dm_hash_get_key(pf->devices, n);
 		if (!(buf = alloca(escaped_len(str)))) {
-			log_error("persistent filter device path stack "
+			log_error(0, "persistent filter device path stack "
 				  "allocation failed");
 			return;
 		}
@@ -249,7 +249,7 @@ int persistent_filter_dump(struct dev_filter *f)
 		goto_out;
 
 	if (rename(tmp_file, pf->file))
-		log_error("%s: rename to %s failed: %s", tmp_file, pf->file,
+		log_error(0, "%s: rename to %s failed: %s", tmp_file, pf->file,
 			  strerror(errno));
 
 	r = 1;
@@ -310,7 +310,7 @@ struct dev_filter *persistent_filter_create(struct dev_filter *real,
 	pf->real = real;
 
 	if (!(_init_hash(pf))) {
-		log_error("Couldn't create hash table for persistent filter.");
+		log_error(0, "Couldn't create hash table for persistent filter.");
 		goto bad;
 	}
 
diff --git a/lib/filters/filter-regex.c b/lib/filters/filter-regex.c
index 1d415a4..0257211 100644
--- a/lib/filters/filter-regex.c
+++ b/lib/filters/filter-regex.c
@@ -103,7 +103,7 @@ static int _build_matcher(struct rfilter *rf, struct config_value *val)
 	 */
 	for (v = val; v; v = v->next) {
 		if (v->type != CFG_STRING) {
-			log_error("filter patterns must be enclosed in quotes");
+			log_error(0, "filter patterns must be enclosed in quotes");
 			goto out;
 		}
 
@@ -128,7 +128,7 @@ static int _build_matcher(struct rfilter *rf, struct config_value *val)
 	 */
 	for (v = val, i = count - 1; v; v = v->next, i--)
 		if (!_extract_pattern(scratch, v->v.str, regex, rf->accept, i)) {
-			log_error("invalid filter pattern");
+			log_error(0, "invalid filter pattern");
 			goto out;
 		}
 
diff --git a/lib/filters/filter-sysfs.c b/lib/filters/filter-sysfs.c
index 1220b3a..30b85cd 100644
--- a/lib/filters/filter-sysfs.c
+++ b/lib/filters/filter-sysfs.c
@@ -164,7 +164,7 @@ static int _parse_dev(const char *file, FILE *fp, dev_t *result)
 	char buffer[64];
 
 	if (!fgets(buffer, sizeof(buffer), fp)) {
-		log_error("Empty sysfs device file: %s", file);
+		log_error(0, "Empty sysfs device file: %s", file);
 		return 0;
 	}
 
@@ -219,14 +219,14 @@ static int _read_devs(struct dev_set *ds, const char *dir, unsigned sysfs_depth)
 
 		if (dm_snprintf(path, sizeof(path), "%s/%s", dir,
 				 d->d_name) < 0) {
-			log_error("sysfs path name too long: %s in %s",
+			log_error(0, "sysfs path name too long: %s in %s",
 				  d->d_name, dir);
 			continue;
 		}
 
 		/* devices have a "dev" file */
 		if (dm_snprintf(file, sizeof(file), "%s/dev", path) < 0) {
-			log_error("sysfs path name too long: %s in %s",
+			log_error(0, "sysfs path name too long: %s in %s",
 				  d->d_name, dir);
 			continue;
 		}
@@ -302,12 +302,12 @@ struct dev_filter *sysfs_filter_create(const char *sysfs_dir)
 		return NULL;
 
 	if (!(mem = dm_pool_create("sysfs", 256))) {
-		log_error("sysfs pool creation failed");
+		log_error(0, "sysfs pool creation failed");
 		return NULL;
 	}
 
 	if (!(ds = _dev_set_create(mem, sys_block, sysfs_depth))) {
-		log_error("sysfs dev_set creation failed");
+		log_error(0, "sysfs dev_set creation failed");
 		goto bad;
 	}
 
diff --git a/lib/filters/filter.c b/lib/filters/filter.c
index bc07cb6..8bd3f88 100644
--- a/lib/filters/filter.c
+++ b/lib/filters/filter.c
@@ -160,7 +160,7 @@ static int _scan_proc_dev(const char *proc, const struct config_node *cn)
 
 	if (dm_snprintf(proc_devices, sizeof(proc_devices),
 			 "%s/devices", proc) < 0) {
-		log_error("Failed to create /proc/devices string");
+		log_error(0, "Failed to create /proc/devices string");
 		return 0;
 	}
 
@@ -219,7 +219,7 @@ static int _scan_proc_dev(const char *proc, const struct config_node *cn)
 		/* Check devices/types for local variations */
 		for (cv = cn->v; cv; cv = cv->next) {
 			if (cv->type != CFG_STRING) {
-				log_error("Expecting string in devices/types "
+				log_error(0, "Expecting string in devices/types "
 					  "in config file");
 				if (fclose(pd))
 					log_sys_error("fclose", proc_devices);
@@ -229,7 +229,7 @@ static int _scan_proc_dev(const char *proc, const struct config_node *cn)
 			name = cv->v.str;
 			cv = cv->next;
 			if (!cv || cv->type != CFG_INT) {
-				log_error("Max partition count missing for %s "
+				log_error(0, "Max partition count missing for %s "
 					  "in devices/types in config file",
 					  name);
 				if (fclose(pd))
@@ -237,7 +237,7 @@ static int _scan_proc_dev(const char *proc, const struct config_node *cn)
 				return 0;
 			}
 			if (!cv->v.i) {
-				log_error("Zero partition count invalid for "
+				log_error(0, "Zero partition count invalid for "
 					  "%s in devices/types in config file",
 					  name);
 				if (fclose(pd))
@@ -270,7 +270,7 @@ struct dev_filter *lvm_type_filter_create(const char *proc,
 	struct dev_filter *f;
 
 	if (!(f = dm_malloc(sizeof(struct dev_filter)))) {
-		log_error("LVM type filter allocation failed");
+		log_error(0, "LVM type filter allocation failed");
 		return NULL;
 	}
 
diff --git a/lib/format1/disk-rep.c b/lib/format1/disk-rep.c
index 24a1629..8329665 100644
--- a/lib/format1/disk-rep.c
+++ b/lib/format1/disk-rep.c
@@ -369,7 +369,7 @@ static struct disk_list *__read_disk(const struct format_type *fmt,
 	}
 
 	if (!read_vgd(dl->dev, &dl->vgd, &dl->pvd)) {
-		log_error("Failed to read VG data from PV (%s)", name);
+		log_error(0, "Failed to read VG data from PV (%s)", name);
 		__update_lvmcache(fmt, dl, dev, fmt->orphan_vg_name, 0);
 		goto bad;
 	}
@@ -385,17 +385,17 @@ static struct disk_list *__read_disk(const struct format_type *fmt,
 			  dl->vgd.vg_status & VG_EXPORTED);
 
 	if (!_read_uuids(dl)) {
-		log_error("Failed to read PV uuid list from %s", name);
+		log_error(0, "Failed to read PV uuid list from %s", name);
 		goto bad;
 	}
 
 	if (!_read_lvs(dl)) {
-		log_error("Failed to read LV's from %s", name);
+		log_error(0, "Failed to read LV's from %s", name);
 		goto bad;
 	}
 
 	if (!_read_extents(dl)) {
-		log_error("Failed to read extents from %s", name);
+		log_error(0, "Failed to read extents from %s", name);
 		goto bad;
 	}
 
@@ -487,7 +487,7 @@ int read_pvs_in_vg(const struct format_type *fmt, const char *vg_name,
 	}
 
 	if (!(iter = dev_iter_create(filter, 1))) {
-		log_error("read_pvs_in_vg: dev_iter_create failed");
+		log_error(0, "read_pvs_in_vg: dev_iter_create failed");
 		return 0;
 	}
 
@@ -530,7 +530,7 @@ static int _write_uuids(struct disk_list *data)
 
 	dm_list_iterate_items(ul, &data->uuids) {
 		if (pos >= end) {
-			log_error("Too many uuids to fit on %s",
+			log_error(0, "Too many uuids to fit on %s",
 				  dev_name(data->dev));
 			return 0;
 		}
@@ -571,7 +571,7 @@ static int _write_lvs(struct disk_list *data)
 	pos = data->pvd.lv_on_disk.base;
 
 	if (!dev_set(data->dev, pos, data->pvd.lv_on_disk.size, 0)) {
-		log_error("Couldn't zero lv area on device '%s'",
+		log_error(0, "Couldn't zero lv area on device '%s'",
 			  dev_name(data->dev));
 		return 0;
 	}
@@ -579,7 +579,7 @@ static int _write_lvs(struct disk_list *data)
 	dm_list_iterate_items(ll, &data->lvds) {
 		offset = sizeof(struct lv_disk) * ll->lvd.lv_number;
 		if (offset + sizeof(struct lv_disk) > data->pvd.lv_on_disk.size) {
-			log_error("lv_number %d too large", ll->lvd.lv_number);
+			log_error(0, "lv_number %d too large", ll->lvd.lv_number);
 			return 0;
 		}
 
@@ -616,7 +616,7 @@ static int _write_pvd(struct disk_list *data)
 	size_t size = data->pvd.pv_on_disk.size;
 
 	if (size < sizeof(struct pv_disk)) {
-		log_error("Invalid PV structure size.");
+		log_error(0, "Invalid PV structure size.");
 		return 0;
 	}
 
@@ -625,7 +625,7 @@ static int _write_pvd(struct disk_list *data)
 	   happy (idea from AED) */
 	buf = dm_malloc(size);
 	if (!buf) {
-		log_err("Couldn't allocate temporary PV buffer.");
+		log_error(0, "Couldn't allocate temporary PV buffer.");
 		return 0;
 	}
 
@@ -655,7 +655,7 @@ static int __write_all_pvd(const struct format_type *fmt __attribute((unused)),
 	const char *pv_name = dev_name(data->dev);
 
 	if (!_write_pvd(data)) {
-		log_error("Failed to write PV structure onto %s", pv_name);
+		log_error(0, "Failed to write PV structure onto %s", pv_name);
 		return 0;
 	}
 
@@ -674,22 +674,22 @@ static int __write_all_pvd(const struct format_type *fmt __attribute((unused)),
 	   fmt); */
 
 	if (!_write_vgd(data)) {
-		log_error("Failed to write VG data to %s", pv_name);
+		log_error(0, "Failed to write VG data to %s", pv_name);
 		return 0;
 	}
 
 	if (!_write_uuids(data)) {
-		log_error("Failed to write PV uuid list to %s", pv_name);
+		log_error(0, "Failed to write PV uuid list to %s", pv_name);
 		return 0;
 	}
 
 	if (!_write_lvs(data)) {
-		log_error("Failed to write LV's to %s", pv_name);
+		log_error(0, "Failed to write LV's to %s", pv_name);
 		return 0;
 	}
 
 	if (!_write_extents(data)) {
-		log_error("Failed to write extents to %s", pv_name);
+		log_error(0, "Failed to write extents to %s", pv_name);
 		return 0;
 	}
 
diff --git a/lib/format1/format1.c b/lib/format1/format1.c
index c8f9519..b7a181d 100644
--- a/lib/format1/format1.c
+++ b/lib/format1/format1.c
@@ -64,7 +64,7 @@ static int _check_vgs(struct dm_list *pvs)
 			first = dl;
 
 		else if (memcmp(&first->vgd, &dl->vgd, sizeof(first->vgd))) {
-			log_error("VG data differs between PVs %s and %s",
+			log_error(0, "VG data differs between PVs %s and %s",
 				  dev_name(first->dev), dev_name(dl->dev));
 			log_debug("VG data on %s: %s %s %" PRIu32 " %" PRIu32
 				  "  %" PRIu32 " %" PRIu32 " %" PRIu32 " %"
@@ -103,7 +103,7 @@ static int _check_vgs(struct dm_list *pvs)
 
 	/* On entry to fn, list known to be non-empty */
 	if (pv_count != first->vgd.pv_cur) {
-		log_error("%d PV(s) found for VG %s: expected %d",
+		log_error(0, "%d PV(s) found for VG %s: expected %d",
 			  pv_count, first->pvd.vg_name, first->vgd.pv_cur);
 	}
 
@@ -303,7 +303,7 @@ static int _format1_pv_setup(const struct format_type *fmt,
 	if (pv->size > MAX_PV_SIZE)
 		pv->size--;
 	if (pv->size > MAX_PV_SIZE) {
-		log_error("Physical volumes cannot be bigger than %s",
+		log_error(0, "Physical volumes cannot be bigger than %s",
 			  display_size(fmt->cmd, (uint64_t) MAX_PV_SIZE));
 		return 0;
 	}
@@ -321,7 +321,7 @@ static int _format1_pv_setup(const struct format_type *fmt,
 	/* Retain existing extent locations exactly */
 	if (((pe_start || extent_count) && (pe_start != pv->pe_start)) ||
 	    (extent_count && (extent_count != pv->pe_count))) {
-		log_error("Metadata would overwrite physical extents");
+		log_error(0, "Metadata would overwrite physical extents");
 		return 0;
 	}
 
@@ -336,12 +336,12 @@ static int _format1_lv_setup(struct format_instance *fid, struct logical_volume
 		lvid_from_lvnum(&lv->lvid, &lv->vg->id, find_free_lvnum(lv));
 
 	if (lv->le_count > MAX_LE_TOTAL) {
-		log_error("logical volumes cannot contain more than "
+		log_error(0, "logical volumes cannot contain more than "
 			  "%d extents.", MAX_LE_TOTAL);
 		return 0;
 	}
 	if (lv->size > max_size) {
-		log_error("logical volumes cannot be larger than %s",
+		log_error(0, "logical volumes cannot be larger than %s",
 			  display_size(fid->fmt->cmd, max_size));
 		return 0;
 	}
@@ -413,7 +413,7 @@ static int _format1_vg_setup(struct format_instance *fid, struct volume_group *v
 		vg->max_pv = MAX_PV - 1;
 
 	if (vg->extent_size > MAX_PE_SIZE || vg->extent_size < MIN_PE_SIZE) {
-		log_error("Extent size must be between %s and %s",
+		log_error(0, "Extent size must be between %s and %s",
 			  display_size(fid->fmt->cmd, (uint64_t) MIN_PE_SIZE),
 			  display_size(fid->fmt->cmd, (uint64_t) MAX_PE_SIZE));
 
@@ -421,14 +421,14 @@ static int _format1_vg_setup(struct format_instance *fid, struct volume_group *v
 	}
 
 	if (vg->extent_size % MIN_PE_SIZE) {
-		log_error("Extent size must be multiple of %s",
+		log_error(0, "Extent size must be multiple of %s",
 			  display_size(fid->fmt->cmd, (uint64_t) MIN_PE_SIZE));
 		return 0;
 	}
 
 	/* Redundant? */
 	if (vg->extent_size & (vg->extent_size - 1)) {
-		log_error("Extent size must be power of 2");
+		log_error(0, "Extent size must be power of 2");
 		return 0;
 	}
 
@@ -520,12 +520,12 @@ struct format_type *init_format(struct cmd_context *cmd)
 	fmt->private = NULL;
 
 	if (!(fmt->labeller = lvm1_labeller_create(fmt))) {
-		log_error("Couldn't create lvm1 label handler.");
+		log_error(0, "Couldn't create lvm1 label handler.");
 		return NULL;
 	}
 
 	if (!(label_register_handler(FMT_LVM1_NAME, fmt->labeller))) {
-		log_error("Couldn't register lvm1 label handler.");
+		log_error(0, "Couldn't register lvm1 label handler.");
 		return NULL;
 	}
 
diff --git a/lib/format1/import-export.c b/lib/format1/import-export.c
index c0a89c5..79ee87a 100644
--- a/lib/format1/import-export.c
+++ b/lib/format1/import-export.c
@@ -64,7 +64,7 @@ int import_pv(const struct format_type *fmt, struct dm_pool *mem,
 	if (!*pvd->vg_name)
 		pv->vg_name = fmt->orphan_vg_name;
 	else if (!(pv->vg_name = dm_pool_strdup(mem, (char *)pvd->vg_name))) {
-		log_error("Volume Group name allocation failed.");
+		log_error(0, "Volume Group name allocation failed.");
 		return 0;
 	}
 
@@ -100,7 +100,7 @@ int import_pv(const struct format_type *fmt, struct dm_pool *mem,
 	/* Fix up pv size if missing or impossibly large */
 	if (!pv->size || pv->size > (1ULL << 62)) {
 		if (!dev_get_size(dev, &pv->size)) {
-			log_error("%s: Couldn't get size.", pv_dev_name(pv));
+			log_error(0, "%s: Couldn't get size.", pv_dev_name(pv));
 			return 0;
 		}
 		log_verbose("Fixing up missing format1 size (%s) "
@@ -110,7 +110,7 @@ int import_pv(const struct format_type *fmt, struct dm_pool *mem,
 			size = pv->pe_count * (uint64_t) vg->extent_size +
 			       pv->pe_start;
 			if (size > pv->size)
-				log_error("WARNING: Physical Volume %s is too "
+				log_error(0, "WARNING: Physical Volume %s is too "
 					  "large for underlying device",
 					  pv_dev_name(pv));
 		}
@@ -130,7 +130,7 @@ static int _system_id(struct cmd_context *cmd, char *s, const char *prefix)
 
 	if (dm_snprintf(s, NAME_LEN, "%s%s%lu",
 			 prefix, cmd->hostname, time(NULL)) < 0) {
-		log_error("Generated system_id too long");
+		log_error(0, "Generated system_id too long");
 		return 0;
 	}
 
@@ -170,7 +170,7 @@ int export_pv(struct cmd_context *cmd, struct dm_pool *mem __attribute((unused))
 		}
 		if (strlen((char *)pvd->vg_name) + sizeof(EXPORTED_TAG) >
 		    sizeof(pvd->vg_name)) {
-			log_error("Volume group name %s too long to export",
+			log_error(0, "Volume group name %s too long to export",
 				  pvd->vg_name);
 			return 0;
 		}
@@ -402,13 +402,13 @@ int export_extents(struct disk_list *dl, uint32_t lv_num,
 	dm_list_iterate_items(seg, &lv->segments) {
 		for (s = 0; s < seg->area_count; s++) {
 			if (!(seg->segtype->flags & SEG_FORMAT1_SUPPORT)) {
-				log_error("Segment type %s in LV %s: "
+				log_error(0, "Segment type %s in LV %s: "
 					  "unsupported by format1",
 					  seg->segtype->name, lv->name);
 				return 0;
 			}
 			if (seg_type(seg, s) != AREA_PV) {
-				log_error("Non-PV stripe found in LV %s: "
+				log_error(0, "Non-PV stripe found in LV %s: "
 					  "unsupported by format1", lv->name);
 				return 0;
 			}
@@ -579,14 +579,14 @@ int import_snapshots(struct dm_pool *mem __attribute((unused)), struct volume_gr
 			lvnum = lvd->lv_number;
 
 			if (lvnum >= MAX_LV) {
-				log_err("Logical volume number "
+				log_error(0, "Logical volume number "
 					"out of bounds.");
 				return 0;
 			}
 
 			if (!lvs[lvnum] &&
 			    !(lvs[lvnum] = find_lv(vg, (char *)lvd->lv_name))) {
-				log_err("Couldn't find logical volume '%s'.",
+				log_error(0, "Couldn't find logical volume '%s'.",
 					lvd->lv_name);
 				return 0;
 			}
@@ -606,7 +606,7 @@ int import_snapshots(struct dm_pool *mem __attribute((unused)), struct volume_gr
 			lvnum = lvd->lv_number;
 			cow = lvs[lvnum];
 			if (!(org = lvs[lvd->lv_snapshot_minor])) {
-				log_err("Couldn't find origin logical volume "
+				log_error(0, "Couldn't find origin logical volume "
 					"for snapshot '%s'.", lvd->lv_name);
 				return 0;
 			}
@@ -619,7 +619,7 @@ int import_snapshots(struct dm_pool *mem __attribute((unused)), struct volume_gr
 			if (!vg_add_snapshot(org, cow, NULL,
 					     org->le_count,
 					     lvd->lv_chunk_size)) {
-				log_err("Couldn't add snapshot.");
+				log_error(0, "Couldn't add snapshot.");
 				return 0;
 			}
 		}
diff --git a/lib/format1/import-extents.c b/lib/format1/import-extents.c
index ded0a8e..99617af 100644
--- a/lib/format1/import-extents.c
+++ b/lib/format1/import-extents.c
@@ -50,7 +50,7 @@ static struct dm_hash_table *_create_lv_maps(struct dm_pool *mem,
 	struct lv_map *lvm;
 
 	if (!maps) {
-		log_err("Unable to create hash table for holding "
+		log_error(0, "Unable to create hash table for holding "
 			"extent maps.");
 		return NULL;
 	}
@@ -89,7 +89,7 @@ static int _fill_lv_array(struct lv_map **lvs,
 	dm_list_iterate_items(ll, &dl->lvds) {
 		if (!(lvm = dm_hash_lookup(maps, strrchr((char *)ll->lvd.lv_name, '/')
 					+ 1))) {
-			log_err("Physical volume (%s) contains an "
+			log_error(0, "Physical volume (%s) contains an "
 				"unknown logical volume (%s).",
 				dev_name(dl->dev), ll->lvd.lv_name);
 			return 0;
@@ -132,7 +132,7 @@ static int _fill_maps(struct dm_hash_table *maps, struct volume_group *vg,
 				lvm = lvms[lv_num];
 
 				if (!lvm) {
-					log_error("Invalid LV in extent map "
+					log_error(0, "Invalid LV in extent map "
 						  "(PV %s, PE %" PRIu32
 						  ", LV %" PRIu32
 						  ", LE %" PRIu32 ")",
@@ -144,13 +144,13 @@ static int _fill_maps(struct dm_hash_table *maps, struct volume_group *vg,
 				le = e[i].le_num;
 
 				if (le >= lvm->lv->le_count) {
-					log_err("logical extent number "
+					log_error(0, "logical extent number "
 						"out of bounds");
 					return 0;
 				}
 
 				if (lvm->map[le].pv) {
-					log_err("logical extent (%u) "
+					log_error(0, "logical extent (%u) "
 						"already mapped.", le);
 					return 0;
 				}
@@ -170,7 +170,7 @@ static int _check_single_map(struct lv_map *lvm)
 
 	for (i = 0; i < lvm->lv->le_count; i++) {
 		if (!lvm->map[i].pv) {
-			log_err("Logical volume (%s) contains an incomplete "
+			log_error(0, "Logical volume (%s) contains an incomplete "
 				"mapping table.", lvm->lv->name);
 			return 0;
 		}
@@ -220,7 +220,7 @@ static int _read_linear(struct cmd_context *cmd, struct lv_map *lvm)
 
 		if (!(seg = alloc_lv_segment(cmd->mem, segtype, lvm->lv, le,
 					     len, 0, 0, NULL, 1, len, 0, 0, 0))) {
-			log_error("Failed to allocate linear segment.");
+			log_error(0, "Failed to allocate linear segment.");
 			return 0;
 		}
 
@@ -267,7 +267,7 @@ static int _read_stripes(struct cmd_context *cmd, struct lv_map *lvm)
 	 * Work out overall striped length
 	 */
 	if (lvm->lv->le_count % lvm->stripes) {
-		log_error("Number of stripes (%u) incompatible "
+		log_error(0, "Number of stripes (%u) incompatible "
 			  "with logical extent count (%u) for %s",
 			  lvm->stripes, lvm->lv->le_count, lvm->lv->name);
 	}
@@ -294,7 +294,7 @@ static int _read_stripes(struct cmd_context *cmd, struct lv_map *lvm)
 					     0, lvm->stripe_size, NULL,
 					     lvm->stripes,
 					     area_len, 0, 0, 0))) {
-			log_error("Failed to allocate striped segment.");
+			log_error(0, "Failed to allocate striped segment.");
 			return 0;
 		}
 
@@ -346,12 +346,12 @@ int import_extents(struct cmd_context *cmd, struct volume_group *vg,
 		return_0;
 
 	if (!(maps = _create_lv_maps(scratch, vg))) {
-		log_err("Couldn't allocate logical volume maps.");
+		log_error(0, "Couldn't allocate logical volume maps.");
 		goto out;
 	}
 
 	if (!_fill_maps(maps, vg, pvds)) {
-		log_err("Couldn't fill logical volume maps.");
+		log_error(0, "Couldn't fill logical volume maps.");
 		goto out;
 	}
 
@@ -359,7 +359,7 @@ int import_extents(struct cmd_context *cmd, struct volume_group *vg,
 		goto_out;
 
 	if (!_build_all_segments(cmd, maps)) {
-		log_err("Couldn't build extent segments.");
+		log_error(0, "Couldn't build extent segments.");
 		goto out;
 	}
 	r = 1;
diff --git a/lib/format1/layout.c b/lib/format1/layout.c
index de9b206..73c3e39 100644
--- a/lib/format1/layout.c
+++ b/lib/format1/layout.c
@@ -76,14 +76,14 @@ static void _calc_simple_layout(struct pv_disk *pvd)
 static int _check_vg_limits(struct disk_list *dl)
 {
 	if (dl->vgd.lv_max > MAX_LV) {
-		log_error("MaxLogicalVolumes of %d exceeds format limit of %d "
+		log_error(0, "MaxLogicalVolumes of %d exceeds format limit of %d "
 			  "for VG '%s'", dl->vgd.lv_max, MAX_LV - 1,
 			  dl->pvd.vg_name);
 		return 0;
 	}
 
 	if (dl->vgd.pv_max > MAX_PV) {
-		log_error("MaxPhysicalVolumes of %d exceeds format limit of %d "
+		log_error(0, "MaxPhysicalVolumes of %d exceeds format limit of %d "
 			  "for VG '%s'", dl->vgd.pv_max, MAX_PV - 1,
 			  dl->pvd.vg_name);
 		return 0;
@@ -102,7 +102,7 @@ int calculate_layout(struct disk_list *dl)
 
 	_calc_simple_layout(pvd);
 	if (!_adjust_pe_on_disk(pvd)) {
-		log_error("Insufficient space for metadata and PE's.");
+		log_error(0, "Insufficient space for metadata and PE's.");
 		return 0;
 	}
 
@@ -136,7 +136,7 @@ int calculate_extent_count(struct physical_volume *pv, uint32_t extent_size,
 		pvd->pe_total = (pv->size / extent_size);
 
 	if (pvd->pe_total < PE_SIZE_PV_SIZE_REL) {
-		log_error("Too few extents on %s.  Try smaller extent size.",
+		log_error(0, "Too few extents on %s.  Try smaller extent size.",
 			  pv_dev_name(pv));
 		dm_free(pvd);
 		return 0;
@@ -157,7 +157,7 @@ int calculate_extent_count(struct physical_volume *pv, uint32_t extent_size,
 		 > pv->size);
 
 	if (pvd->pe_total > MAX_PE_TOTAL) {
-		log_error("Metadata extent limit (%u) exceeded for %s - "
+		log_error(0, "Metadata extent limit (%u) exceeded for %s - "
 			  "%u required", MAX_PE_TOTAL, pv_dev_name(pv),
 			  pvd->pe_total);
 		dm_free(pvd);
diff --git a/lib/format1/lvm1-label.c b/lib/format1/lvm1-label.c
index 28b0840..d61e446 100644
--- a/lib/format1/lvm1-label.c
+++ b/lib/format1/lvm1-label.c
@@ -26,7 +26,7 @@
 
 static void _not_supported(const char *op)
 {
-	log_err("The '%s' operation is not supported for the lvm1 labeller.",
+	log_error(0, "The '%s' operation is not supported for the lvm1 labeller.",
 		op);
 }
 
@@ -119,7 +119,7 @@ struct labeller *lvm1_labeller_create(struct format_type *fmt)
 	struct labeller *l;
 
 	if (!(l = dm_malloc(sizeof(*l)))) {
-		log_err("Couldn't allocate labeller object.");
+		log_error(0, "Couldn't allocate labeller object.");
 		return NULL;
 	}
 
diff --git a/lib/format_pool/disk_rep.c b/lib/format_pool/disk_rep.c
index 802bf52..c8b6cb5 100644
--- a/lib/format_pool/disk_rep.c
+++ b/lib/format_pool/disk_rep.c
@@ -266,7 +266,7 @@ static int _read_vg_pds(const struct format_type *fmt, struct dm_pool *mem,
 			if (!(sp_devs =
 			      dm_pool_zalloc(tmpmem,
 					  sizeof(uint32_t) * sp_count))) {
-				log_error("Unable to allocate %d 32-bit uints",
+				log_error(0, "Unable to allocate %d 32-bit uints",
 					  sp_count);
 				dm_pool_destroy(tmpmem);
 				return 0;
@@ -353,7 +353,7 @@ struct pool_list *read_pool_disk(const struct format_type *fmt,
 		return_NULL;
 
 	if (!(pl = dm_pool_zalloc(mem, sizeof(*pl)))) {
-		log_error("Unable to allocate pool list structure");
+		log_error(0, "Unable to allocate pool list structure");
 		return 0;
 	}
 
diff --git a/lib/format_pool/format_pool.c b/lib/format_pool/format_pool.c
index 3f31bba..249a8ad 100644
--- a/lib/format_pool/format_pool.c
+++ b/lib/format_pool/format_pool.c
@@ -39,7 +39,7 @@ static struct user_subpool *_build_usp(struct dm_list *pls, struct dm_pool *mem,
 	dm_list_iterate_items(pl, pls) {
 		*sps = pl->pd.pl_subpools;
 		if (!usp && (!(usp = dm_pool_zalloc(mem, sizeof(*usp) * (*sps))))) {
-			log_error("Unable to allocate %d subpool structures",
+			log_error(0, "Unable to allocate %d subpool structures",
 				  *sps);
 			return 0;
 		}
@@ -59,7 +59,7 @@ static struct user_subpool *_build_usp(struct dm_list *pls, struct dm_pool *mem,
 		       dm_pool_zalloc(mem,
 				   sizeof(*usp->devs) * pl->pd.pl_sp_devs)))) {
 
-			log_error("Unable to allocate %d pool_device "
+			log_error(0, "Unable to allocate %d pool_device "
 				  "structures", pl->pd.pl_sp_devs);
 			return 0;
 		}
@@ -82,12 +82,12 @@ static int _check_usp(char *vgname, struct user_subpool *usp, int sp_count)
 
 	for (i = 0; i < sp_count; i++) {
 		if (!usp[i].initialized) {
-			log_error("Missing subpool %d in pool %s", i, vgname);
+			log_error(0, "Missing subpool %d in pool %s", i, vgname);
 			return 0;
 		}
 		for (j = 0; j < usp[i].num_devs; j++) {
 			if (!usp[i].devs[j].initialized) {
-				log_error("Missing device %u for subpool %d"
+				log_error(0, "Missing device %u for subpool %d"
 					  " in pool %s", j, i, vgname);
 				return 0;
 			}
@@ -108,7 +108,7 @@ static struct volume_group *_build_vg_from_pds(struct format_instance
 	int sp_count;
 
 	if (!(vg = dm_pool_zalloc(smem, sizeof(*vg)))) {
-		log_error("Unable to allocate volume group structure");
+		log_error(0, "Unable to allocate volume group structure");
 		return NULL;
 	}
 
@@ -254,7 +254,7 @@ static struct format_instance *_pool_create_instance(const struct format_type *f
 	struct metadata_area *mda;
 
 	if (!(fid = dm_pool_zalloc(fmt->cmd->mem, sizeof(*fid)))) {
-		log_error("Unable to allocate format instance structure for "
+		log_error(0, "Unable to allocate format instance structure for "
 			  "pool format");
 		return NULL;
 	}
@@ -264,7 +264,7 @@ static struct format_instance *_pool_create_instance(const struct format_type *f
 
 	/* Define a NULL metadata area */
 	if (!(mda = dm_pool_zalloc(fmt->cmd->mem, sizeof(*mda)))) {
-		log_error("Unable to allocate metadata area structure "
+		log_error(0, "Unable to allocate metadata area structure "
 			  "for pool format");
 		dm_pool_free(fmt->cmd->mem, fid);
 		return NULL;
@@ -307,7 +307,7 @@ struct format_type *init_format(struct cmd_context *cmd)
 	struct format_type *fmt = dm_malloc(sizeof(*fmt));
 
 	if (!fmt) {
-		log_error("Unable to allocate format type structure for pool "
+		log_error(0, "Unable to allocate format type structure for pool "
 			  "format");
 		return NULL;
 	}
@@ -321,12 +321,12 @@ struct format_type *init_format(struct cmd_context *cmd)
 	fmt->private = NULL;
 
 	if (!(fmt->labeller = pool_labeller_create(fmt))) {
-		log_error("Couldn't create pool label handler.");
+		log_error(0, "Couldn't create pool label handler.");
 		return NULL;
 	}
 
 	if (!(label_register_handler(FMT_POOL_NAME, fmt->labeller))) {
-		log_error("Couldn't register pool label handler.");
+		log_error(0, "Couldn't register pool label handler.");
 		return NULL;
 	}
 
diff --git a/lib/format_pool/import_export.c b/lib/format_pool/import_export.c
index 0ddf881..467cd5c 100644
--- a/lib/format_pool/import_export.c
+++ b/lib/format_pool/import_export.c
@@ -60,7 +60,7 @@ int import_pool_lvs(struct volume_group *vg, struct dm_pool *mem, struct dm_list
 	struct logical_volume *lv;
 
 	if (!(lv = dm_pool_zalloc(mem, sizeof(*lv)))) {
-		log_error("Unable to allocate logical volume structure");
+		log_error(0, "Unable to allocate logical volume structure");
 		return 0;
 	}
 
@@ -118,11 +118,11 @@ int import_pool_pvs(const struct format_type *fmt, struct volume_group *vg,
 
 	dm_list_iterate_items(pl, pls) {
 		if (!(pvl = dm_pool_zalloc(mem, sizeof(*pvl)))) {
-			log_error("Unable to allocate pv list structure");
+			log_error(0, "Unable to allocate pv list structure");
 			return 0;
 		}
 		if (!(pvl->pv = dm_pool_zalloc(mem, sizeof(*pvl->pv)))) {
-			log_error("Unable to allocate pv structure");
+			log_error(0, "Unable to allocate pv structure");
 			return 0;
 		}
 		if (!import_pool_pv(fmt, mem, vg, pvl->pv, pl)) {
@@ -150,7 +150,7 @@ int import_pool_pv(const struct format_type *fmt, struct dm_pool *mem,
 
 	pv->dev = pl->dev;
 	if (!(pv->vg_name = dm_pool_strdup(mem, pd->pl_pool_name))) {
-		log_error("Unable to duplicate vg_name string");
+		log_error(0, "Unable to duplicate vg_name string");
 		return 0;
 	}
 	if (vg != NULL)
@@ -195,7 +195,7 @@ static int _add_stripe_seg(struct dm_pool *mem,
 	uint32_t area_len;
 
 	if (usp->striping & (usp->striping - 1)) {
-		log_error("Stripe size must be a power of 2");
+		log_error(0, "Stripe size must be a power of 2");
 		return 0;
 	}
 
@@ -209,7 +209,7 @@ static int _add_stripe_seg(struct dm_pool *mem,
 				     area_len * usp->num_devs, 0,
 				     usp->striping, NULL, usp->num_devs,
 				     area_len, 0, 0, 0))) {
-		log_error("Unable to allocate striped lv_segment structure");
+		log_error(0, "Unable to allocate striped lv_segment structure");
 		return 0;
 	}
 
@@ -246,7 +246,7 @@ static int _add_linear_seg(struct dm_pool *mem,
 					     area_len, 0, usp->striping,
 					     NULL, 1, area_len,
 					     POOL_PE_SIZE, 0, 0))) {
-			log_error("Unable to allocate linear lv_segment "
+			log_error(0, "Unable to allocate linear lv_segment "
 				  "structure");
 			return 0;
 		}
diff --git a/lib/format_pool/pool_label.c b/lib/format_pool/pool_label.c
index 5b43375..5022edc 100644
--- a/lib/format_pool/pool_label.c
+++ b/lib/format_pool/pool_label.c
@@ -25,7 +25,7 @@
 
 static void _pool_not_supported(const char *op)
 {
-	log_error("The '%s' operation is not supported for the pool labeller.",
+	log_error(0, "The '%s' operation is not supported for the pool labeller.",
 		  op);
 }
 
@@ -96,7 +96,7 @@ struct labeller *pool_labeller_create(struct format_type *fmt)
 	struct labeller *l;
 
 	if (!(l = dm_malloc(sizeof(*l)))) {
-		log_error("Couldn't allocate labeller object.");
+		log_error(0, "Couldn't allocate labeller object.");
 		return NULL;
 	}
 
diff --git a/lib/format_text/archive.c b/lib/format_text/archive.c
index 0077f14..7a43206 100644
--- a/lib/format_text/archive.c
+++ b/lib/format_text/archive.c
@@ -139,7 +139,7 @@ static struct dm_list *_scan_archive(struct dm_pool *mem,
 
 	/* Sort fails beyond 5-digit indexes */
 	if ((count = scandir(dir, &dirent, NULL, alphasort)) < 0) {
-		log_err("Couldn't scan the archive directory (%s).", dir);
+		log_error(0, "Couldn't scan the archive directory (%s).", dir);
 		return 0;
 	}
 
@@ -164,7 +164,7 @@ static struct dm_list *_scan_archive(struct dm_pool *mem,
 		 * Create a new archive_file.
 		 */
 		if (!(af = dm_pool_alloc(mem, sizeof(*af)))) {
-			log_err("Couldn't create new archive file.");
+			log_error(0, "Couldn't create new archive file.");
 			results = NULL;
 			goto out;
 		}
@@ -238,12 +238,12 @@ int archive_vg(struct volume_group *vg,
 	 */
 	if (!create_temp_name(dir, temp_file, sizeof(temp_file), &fd,
 			      &vg->cmd->rand_seed)) {
-		log_err("Couldn't create temporary archive name.");
+		log_error(0, "Couldn't create temporary archive name.");
 		return 0;
 	}
 
 	if (!(fp = fdopen(fd, "w"))) {
-		log_err("Couldn't create FILE object for archive.");
+		log_error(0, "Couldn't create FILE object for archive.");
 		if (close(fd))
 			log_sys_error("close", temp_file);
 		return 0;
@@ -274,7 +274,7 @@ int archive_vg(struct volume_group *vg,
 	for (i = 0; i < 10; i++) {
 		if (dm_snprintf(archive_name, sizeof(archive_name),
 				 "%s/%s_%05u.vg", dir, vg->name, ix) < 0) {
-			log_error("Archive file name too long.");
+			log_error(0, "Archive file name too long.");
 			return 0;
 		}
 
@@ -285,7 +285,7 @@ int archive_vg(struct volume_group *vg,
 	}
 
 	if (!renamed)
-		log_error("Archive rename failed for %s", temp_file);
+		log_error(0, "Archive rename failed for %s", temp_file);
 
 	_remove_expired(archives, dm_list_size(archives) + renamed, retain_days,
 			min_archive);
@@ -307,7 +307,7 @@ static void _display_archive(struct cmd_context *cmd, struct archive_file *af)
 	if (!(context = create_text_context(cmd, af->path, NULL)) ||
 	    !(tf = cmd->fmt_backup->ops->create_instance(cmd->fmt_backup, NULL,
 							 NULL, context))) {
-		log_error("Couldn't create text instance object.");
+		log_error(0, "Couldn't create text instance object.");
 		return;
 	}
 
@@ -356,7 +356,7 @@ int archive_list_file(struct cmd_context *cmd, const char *file)
 	af.path = (char *)file;
 
 	if (!path_exists(af.path)) {
-		log_err("Archive file %s not found.", af.path);
+		log_error(0, "Archive file %s not found.", af.path);
 		return 0;
 	}
 
diff --git a/lib/format_text/archiver.c b/lib/format_text/archiver.c
index d80c0ba..a4d34ce 100644
--- a/lib/format_text/archiver.c
+++ b/lib/format_text/archiver.c
@@ -42,7 +42,7 @@ int archive_init(struct cmd_context *cmd, const char *dir,
 {
 	if (!(cmd->archive_params = dm_pool_zalloc(cmd->libmem,
 						sizeof(*cmd->archive_params)))) {
-		log_error("archive_params alloc failed");
+		log_error(0, "archive_params alloc failed");
 		return 0;
 	}
 
@@ -52,7 +52,7 @@ int archive_init(struct cmd_context *cmd, const char *dir,
 		return 1;
 
 	if (!(cmd->archive_params->dir = dm_strdup(dir))) {
-		log_error("Couldn't copy archive directory name.");
+		log_error(0, "Couldn't copy archive directory name.");
 		return 0;
 	}
 
@@ -124,7 +124,7 @@ int archive(struct volume_group *vg)
 	log_verbose("Archiving volume group \"%s\" metadata (seqno %u).", vg->name,
 		    vg->seqno);
 	if (!__archive(vg)) {
-		log_error("Volume group \"%s\" metadata archive failed.",
+		log_error(0, "Volume group \"%s\" metadata archive failed.",
 			  vg->name);
 		return 0;
 	}
@@ -156,7 +156,7 @@ int backup_init(struct cmd_context *cmd, const char *dir,
 {
 	if (!(cmd->backup_params = dm_pool_zalloc(cmd->libmem,
 					       sizeof(*cmd->backup_params)))) {
-		log_error("backup_params alloc failed");
+		log_error(0, "backup_params alloc failed");
 		return 0;
 	}
 
@@ -165,7 +165,7 @@ int backup_init(struct cmd_context *cmd, const char *dir,
 		return 1;
 
 	if (!(cmd->backup_params->dir = dm_strdup(dir))) {
-		log_error("Couldn't copy backup directory name.");
+		log_error(0, "Couldn't copy backup directory name.");
 		return 0;
 	}
 	backup_enable(cmd, enabled);
@@ -195,7 +195,7 @@ static int __backup(struct volume_group *vg)
 
 	if (dm_snprintf(name, sizeof(name), "%s/%s",
 			 vg->cmd->backup_params->dir, vg->name) < 0) {
-		log_error("Failed to generate volume group metadata backup "
+		log_error(0, "Failed to generate volume group metadata backup "
 			  "filename.");
 		return 0;
 	}
@@ -224,7 +224,7 @@ int backup_locally(struct volume_group *vg)
 		return 0;
 
 	if (!__backup(vg)) {
-		log_error("Backup of volume group %s metadata failed.",
+		log_error(0, "Backup of volume group %s metadata failed.",
 			  vg->name);
 		return 0;
 	}
@@ -246,7 +246,7 @@ int backup_remove(struct cmd_context *cmd, const char *vg_name)
 
 	if (dm_snprintf(path, sizeof(path), "%s/%s",
 			 cmd->backup_params->dir, vg_name) < 0) {
-		log_err("Failed to generate backup filename (for removal).");
+		log_error(0, "Failed to generate backup filename (for removal).");
 		return 0;
 	}
 
@@ -269,7 +269,7 @@ struct volume_group *backup_read_vg(struct cmd_context *cmd,
 					    cmd->cmd_line)) ||
 	    !(tf = cmd->fmt_backup->ops->create_instance(cmd->fmt_backup, NULL,
 							 NULL, context))) {
-		log_error("Couldn't create text format object.");
+		log_error(0, "Couldn't create text format object.");
 		return NULL;
 	}
 
@@ -298,7 +298,7 @@ int backup_restore_vg(struct cmd_context *cmd, struct volume_group *vg)
 	/* Attempt to write out using currently active format */
 	if (!(vg->fid = cmd->fmt->ops->create_instance(cmd->fmt, vg->name,
 						       NULL, NULL))) {
-		log_error("Failed to allocate format instance");
+		log_error(0, "Failed to allocate format instance");
 		return 0;
 	}
 
@@ -306,19 +306,19 @@ int backup_restore_vg(struct cmd_context *cmd, struct volume_group *vg)
 	dm_list_iterate_items(pvl, &vg->pvs) {
 		pv = pvl->pv;
 		if (!(info = info_from_pvid(pv->dev->pvid, 0))) {
-			log_error("PV %s missing from cache",
+			log_error(0, "PV %s missing from cache",
 				  pv_dev_name(pv));
 			return 0;
 		}
 		if (cmd->fmt != info->fmt) {
-			log_error("PV %s is a different format (seqno %s)",
+			log_error(0, "PV %s is a different format (seqno %s)",
 				  pv_dev_name(pv), info->fmt->name);
 			return 0;
 		}
 		if (!vg->fid->fmt->ops->
 		    pv_setup(vg->fid->fmt, UINT64_C(0), 0, 0, 0, 0UL,
 			     UINT64_C(0), &vg->fid->metadata_areas, pv, vg)) {
-			log_error("Format-specific setup for %s failed",
+			log_error(0, "Format-specific setup for %s failed",
 				  pv_dev_name(pv));
 			return 0;
 		}
@@ -347,7 +347,7 @@ int backup_restore_from_file(struct cmd_context *cmd, const char *vg_name,
 	if (missing_pvs == 0)
 		r = backup_restore_vg(cmd, vg);
 	else
-		log_error("Cannot restore Volume Group %s with %i PVs "
+		log_error(0, "Cannot restore Volume Group %s with %i PVs "
 			  "marked as missing.", vg->name, missing_pvs);
 
 	vg_release(vg);
@@ -360,7 +360,7 @@ int backup_restore(struct cmd_context *cmd, const char *vg_name)
 
 	if (dm_snprintf(path, sizeof(path), "%s/%s",
 			 cmd->backup_params->dir, vg_name) < 0) {
-		log_err("Failed to generate backup filename (for restore).");
+		log_error(0, "Failed to generate backup filename (for restore).");
 		return 0;
 	}
 
@@ -382,7 +382,7 @@ int backup_to_file(const char *file, const char *desc, struct volume_group *vg)
 	if (!(context = create_text_context(cmd, file, desc)) ||
 	    !(tf = cmd->fmt_backup->ops->create_instance(cmd->fmt_backup, NULL,
 							 NULL, context))) {
-		log_error("Couldn't create backup object.");
+		log_error(0, "Couldn't create backup object.");
 		return 0;
 	}
 
diff --git a/lib/format_text/export.c b/lib/format_text/export.c
index 482eea9..9746b4a 100644
--- a/lib/format_text/export.c
+++ b/lib/format_text/export.c
@@ -78,7 +78,7 @@ static void _init(void)
 		return;
 
 	if (uname(&_utsname)) {
-		log_error("uname failed: %s", strerror(errno));
+		log_error(0, "uname failed: %s", strerror(errno));
 		memset(&_utsname, 0, sizeof(_utsname));
 	}
 
@@ -99,7 +99,7 @@ static void _inc_indent(struct formatter *f)
 static void _dec_indent(struct formatter *f)
 {
 	if (!f->indent--) {
-		log_error("Internal error tracking indentation");
+		log_error(0, "Internal error tracking indentation");
 		f->indent = 0;
 	}
 }
@@ -122,7 +122,7 @@ static int _extend_buffer(struct formatter *f)
 		  f->data.buf.size * 2);
 	if (!(newbuf = dm_realloc(f->data.buf.start,
 				   f->data.buf.size * 2))) {
-		log_error("Buffer reallocation failed.");
+		log_error(0, "Buffer reallocation failed.");
 		return 0;
 	}
 	f->data.buf.start = newbuf;
@@ -307,7 +307,7 @@ static int _print_header(struct formatter *f,
 	outnl(f);
 
 	if (!(buf = alloca(escaped_len(desc)))) {
-		log_error("temporary stack allocation for description"
+		log_error(0, "temporary stack allocation for description"
 			  "string failed");
 		return 0;
 	}
@@ -420,7 +420,7 @@ static int _print_pvs(struct formatter *f, struct volume_group *vg)
 		outf(f, "id = \"%s\"", buffer);
 
 		if (!(buf = alloca(escaped_len(pv_dev_name(pv))))) {
-			log_error("temporary stack allocation for device name"
+			log_error(0, "temporary stack allocation for device name"
 				  "string failed");
 			return 0;
 		}
@@ -744,7 +744,7 @@ int text_vg_export_raw(struct volume_group *vg, const char *desc, char **buf)
 
 	f->data.buf.size = 65536;	/* Initial metadata limit */
 	if (!(f->data.buf.start = dm_malloc(f->data.buf.size))) {
-		log_error("text_export buffer allocation failed");
+		log_error(0, "text_export buffer allocation failed");
 		goto out;
 	}
 
diff --git a/lib/format_text/flags.c b/lib/format_text/flags.c
index 46bb95d..2e7a714 100644
--- a/lib/format_text/flags.c
+++ b/lib/format_text/flags.c
@@ -82,7 +82,7 @@ static struct flag *_get_flags(int type)
 		return _lv_flags;
 	}
 
-	log_err("Unknown flag set requested.");
+	log_error(0, "Unknown flag set requested.");
 	return NULL;
 }
 
@@ -129,7 +129,7 @@ int print_flags(uint32_t status, int type, char *buffer, size_t size)
 		return 0;
 
 	if (status)
-		log_error("Metadata inconsistency: Not all flags successfully "
+		log_error(0, "Metadata inconsistency: Not all flags successfully "
 			  "exported.");
 
 	return 1;
@@ -149,7 +149,7 @@ int read_flags(uint32_t *status, int type, struct config_value *cv)
 
 	while (cv) {
 		if (cv->type != CFG_STRING) {
-			log_err("Status value is not a string.");
+			log_error(0, "Status value is not a string.");
 			return 0;
 		}
 
@@ -169,7 +169,7 @@ int read_flags(uint32_t *status, int type, struct config_value *cv)
 			 */
 			s |= PARTIAL_VG;
 		} else if (!flags[f].description && (type & STATUS_FLAG)) {
-			log_err("Unknown status flag '%s'.", cv->v.str);
+			log_error(0, "Unknown status flag '%s'.", cv->v.str);
 			return 0;
 		}
 
diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index 4181335..df5eb1e 100644
--- a/lib/format_text/format-text.c
+++ b/lib/format_text/format-text.c
@@ -74,7 +74,7 @@ static int _text_vg_setup(struct format_instance *fid __attribute((unused)),
 			  struct volume_group *vg)
 {
 	if (vg->extent_size & (vg->extent_size - 1)) {
-		log_error("Extent size must be power of 2");
+		log_error(0, "Extent size must be power of 2");
 		return 0;
 	}
 
@@ -263,14 +263,14 @@ static int _text_lv_setup(struct format_instance *fid __attribute((unused)),
 
 	if (lv->size > max_size) {
 		char *dummy = display_size(max_size);
-		log_error("logical volumes cannot be larger than %s", dummy);
+		log_error(0, "logical volumes cannot be larger than %s", dummy);
 		dm_free(dummy);
 		return 0;
 	}
 */
 
 	if (!*lv->lvid.s && !lvid_create(&lv->lvid, &lv->vg->id)) {
-		log_error("Random lvid creation failed for %s/%s.",
+		log_error(0, "Random lvid creation failed for %s/%s.",
 			  lv->vg->name, lv->name);
 		return 0;
 	}
@@ -301,7 +301,7 @@ static struct mda_header *_raw_read_mda_header(const struct format_type *fmt,
 	struct mda_header *mdah;
 
 	if (!(mdah = dm_pool_alloc(fmt->cmd->mem, MDA_HEADER_SIZE))) {
-		log_error("struct mda_header allocation failed");
+		log_error(0, "struct mda_header allocation failed");
 		return NULL;
 	}
 
@@ -311,25 +311,25 @@ static struct mda_header *_raw_read_mda_header(const struct format_type *fmt,
 	if (mdah->checksum_xl != xlate32(calc_crc(INITIAL_CRC, mdah->magic,
 						  MDA_HEADER_SIZE -
 						  sizeof(mdah->checksum_xl)))) {
-		log_error("Incorrect metadata area header checksum");
+		log_error(0, "Incorrect metadata area header checksum");
 		goto bad;
 	}
 
 	_xlate_mdah(mdah);
 
 	if (strncmp((char *)mdah->magic, FMTT_MAGIC, sizeof(mdah->magic))) {
-		log_error("Wrong magic number in metadata area header");
+		log_error(0, "Wrong magic number in metadata area header");
 		goto bad;
 	}
 
 	if (mdah->version != FMTT_VERSION) {
-		log_error("Incompatible metadata area header version: %d",
+		log_error(0, "Incompatible metadata area header version: %d",
 			  mdah->version);
 		goto bad;
 	}
 
 	if (mdah->start != dev_area->start) {
-		log_error("Incorrect start sector in metadata area header: %"
+		log_error(0, "Incorrect start sector in metadata area header: %"
 			  PRIu64, mdah->start);
 		goto bad;
 	}
@@ -466,7 +466,7 @@ static struct volume_group *_vg_read_raw_area(struct format_instance *fid,
 		wrap = (uint32_t) ((rlocn->offset + rlocn->size) - mdah->size);
 
 	if (wrap > rlocn->offset) {
-		log_error("VG %s metadata too large for circular buffer",
+		log_error(0, "VG %s metadata too large for circular buffer",
 			  vg->name);
 		goto out;
 	}
@@ -548,7 +548,7 @@ static int _vg_write_raw(struct format_instance *fid, struct volume_group *vg,
 	if (!fidtc->raw_metadata_buf &&
 	    !(fidtc->raw_metadata_buf_size =
 			text_vg_export_raw(vg, "", &fidtc->raw_metadata_buf))) {
-		log_error("VG %s metadata writing failed", vg->name);
+		log_error(0, "VG %s metadata writing failed", vg->name);
 		goto out;
 	}
 
@@ -566,7 +566,7 @@ static int _vg_write_raw(struct format_instance *fid, struct volume_group *vg,
 	if ((new_wrap && old_wrap) ||
 	    (rlocn && (new_wrap || old_wrap) && (new_end > rlocn->offset)) ||
 	    (mdac->rlocn.size >= mdah->size)) {
-		log_error("VG %s metadata too large for circular buffer",
+		log_error(0, "VG %s metadata too large for circular buffer",
 			  vg->name);
 		goto out;
 	}
@@ -685,7 +685,7 @@ static int _vg_commit_raw_rlocn(struct format_instance *fid,
 	if (!_raw_write_mda_header(fid->fmt, mdac->area.dev, mdac->area.start,
 				   mdah)) {
 		dm_pool_free(fid->fmt->cmd->mem, mdah);
-		log_error("Failed to write metadata area header");
+		log_error(0, "Failed to write metadata area header");
 		goto out;
 	}
 
@@ -768,7 +768,7 @@ static int _vg_remove_raw(struct format_instance *fid, struct volume_group *vg,
 	if (!_raw_write_mda_header(fid->fmt, mdac->area.dev, mdac->area.start,
 				   mdah)) {
 		dm_pool_free(fid->fmt->cmd->mem, mdah);
-		log_error("Failed to write metadata area header");
+		log_error(0, "Failed to write metadata area header");
 		goto out;
 	}
 
@@ -799,7 +799,7 @@ static struct volume_group *_vg_read_file_name(struct format_instance *fid,
 	 */
 	if (vgname && strcmp(vgname, vg->name)) {
 		dm_pool_free(fid->fmt->cmd->mem, vg);
-		log_err("'%s' does not contain volume group '%s'.",
+		log_error(0, "'%s' does not contain volume group '%s'.",
 			read_path, vgname);
 		return NULL;
 	} else
@@ -852,13 +852,13 @@ static int _vg_write_file(struct format_instance *fid __attribute((unused)),
 		temp_dir[slash - tc->path_edit] = '\0';
 
 	} else {
-		log_error("Text format failed to determine directory.");
+		log_error(0, "Text format failed to determine directory.");
 		return 0;
 	}
 
 	if (!create_temp_name(temp_dir, temp_file, sizeof(temp_file), &fd,
 			      &vg->cmd->rand_seed)) {
-		log_err("Couldn't create temporary text file name.");
+		log_error(0, "Couldn't create temporary text file name.");
 		return 0;
 	}
 
@@ -872,7 +872,7 @@ static int _vg_write_file(struct format_instance *fid __attribute((unused)),
 	log_debug("Writing %s metadata to %s", vg->name, temp_file);
 
 	if (!text_vg_export_file(vg, tc->desc, fp)) {
-		log_error("Failed to write metadata to %s.", temp_file);
+		log_error(0, "Failed to write metadata to %s.", temp_file);
 		if (fclose(fp))
 			log_sys_error("fclose", temp_file);
 		return 0;
@@ -890,7 +890,7 @@ static int _vg_write_file(struct format_instance *fid __attribute((unused)),
 
 	if (rename(temp_file, tc->path_edit)) {
 		log_debug("Renaming %s to %s", temp_file, tc->path_edit);
-		log_error("%s: rename to %s failed: %s", temp_file,
+		log_error(0, "%s: rename to %s failed: %s", temp_file,
 			  tc->path_edit, strerror(errno));
 		return 0;
 	}
@@ -916,7 +916,7 @@ static int _vg_commit_file_backup(struct format_instance *fid __attribute((unuse
 		log_debug("Committing %s metadata (%u)", vg->name, vg->seqno);
 		log_debug("Renaming %s to %s", tc->path_edit, tc->path_live);
 		if (rename(tc->path_edit, tc->path_live)) {
-			log_error("%s: rename to %s failed: %s", tc->path_edit,
+			log_error(0, "%s: rename to %s failed: %s", tc->path_edit,
 				  tc->path_live, strerror(errno));
 			return 0;
 		}
@@ -953,7 +953,7 @@ static int _vg_commit_file(struct format_instance *fid, struct volume_group *vg,
 			log_verbose("Test mode: Skipping rename");
 		else {
 			if (rename(tc->path_live, new_name)) {
-				log_error("%s: rename to %s failed: %s",
+				log_error(0, "%s: rename to %s failed: %s",
 					  tc->path_live, new_name,
 					  strerror(errno));
 				sync_dir(new_name);
@@ -1014,7 +1014,7 @@ static int _scan_file(const struct format_type *fmt)
 				vgname = dirent->d_name;
 				if (dm_snprintf(path, PATH_MAX, "%s/%s",
 						 dl->dir, vgname) < 0) {
-					log_error("Name too long %s/%s",
+					log_error(0, "Name too long %s/%s",
 						  dl->dir, vgname);
 					break;
 				}
@@ -1087,7 +1087,7 @@ const char *vgname_from_mda(const struct format_type *fmt,
 		wrap = (uint32_t) ((rlocn->offset + rlocn->size) - mdah->size);
 
 	if (wrap > rlocn->offset) {
-		log_error("%s: metadata too large for circular buffer",
+		log_error(0, "%s: metadata too large for circular buffer",
 			  dev_name(dev_area->dev));
 		goto out;
 	}
@@ -1195,7 +1195,7 @@ static int _mda_setup(const struct format_type *fmt,
 	pe_end <<= SECTOR_SHIFT;
 
 	if (pe_end > disk_size) {
-		log_error("Physical extents end beyond end of device %s!",
+		log_error(0, "Physical extents end beyond end of device %s!",
 			  pv_dev_name(pv));
 		return 0;
 	}
@@ -1247,7 +1247,7 @@ static int _mda_setup(const struct format_type *fmt,
 		if (!dev_set((struct device *) pv->dev, start1,
 			     (size_t) (mda_size1 >
 				       wipe_size ? : mda_size1), 0)) {
-			log_error("Failed to wipe new metadata area");
+			log_error(0, "Failed to wipe new metadata area");
 			return 0;
 		}
 
@@ -1292,7 +1292,7 @@ static int _mda_setup(const struct format_type *fmt,
 		if (!dev_set(pv->dev, start2,
 			     (size_t) (mda_size1 >
 				       wipe_size ? : mda_size1), 0)) {
-			log_error("Failed to wipe new metadata area");
+			log_error(0, "Failed to wipe new metadata area");
 			return 0;
 		}
 	} else
@@ -1427,7 +1427,7 @@ static int _add_raw(struct dm_list *raw_list, struct device_area *dev_area)
 	}
 
 	if (!(rl = dm_malloc(sizeof(struct raw_list)))) {
-		log_error("_add_raw allocation failed");
+		log_error(0, "_add_raw allocation failed");
 		return 0;
 	}
 	memcpy(&rl->dev_area, dev_area, sizeof(*dev_area));
@@ -1475,7 +1475,7 @@ static int _populate_pv_fields(struct lvmcache_info *info,
 
 	/* Currently only support exactly one data area */
 	if (dm_list_size(&info->das) != 1) {
-		log_error("Must be exactly one data area (found %d) on PV %s",
+		log_error(0, "Must be exactly one data area (found %d) on PV %s",
 			  dm_list_size(&info->das), dev_name(info->dev));
 		return 0;
 	}
@@ -1513,11 +1513,11 @@ static int _text_pv_read(const struct format_type *fmt, const char *pv_name,
 	dm_list_iterate_items(mda, &info->mdas) {
 		mdac = (struct mda_context *) mda->metadata_locn;
 		if (!(mda_new = dm_pool_alloc(fmt->cmd->mem, sizeof(*mda_new)))) {
-			log_error("metadata_area allocation failed");
+			log_error(0, "metadata_area allocation failed");
 			return 0;
 		}
 		if (!(mdac_new = dm_pool_alloc(fmt->cmd->mem, sizeof(*mdac_new)))) {
-			log_error("metadata_area allocation failed");
+			log_error(0, "metadata_area allocation failed");
 			return 0;
 		}
 		memcpy(mda_new, mda, sizeof(*mda));
@@ -1676,7 +1676,7 @@ static int _text_pv_setup(const struct format_type *fmt,
 			pe_count = (pv->size - pv->pe_start - mda_size2) /
 				   vg->extent_size;
 			if (pe_count > UINT32_MAX) {
-				log_error("PV %s too large for extent size %s.",
+				log_error(0, "PV %s too large for extent size %s.",
 					  pv_dev_name(pv),
 					  display_size(vg->cmd, (uint64_t) vg->extent_size));
 				return 0;
@@ -1733,13 +1733,13 @@ static struct format_instance *_text_create_text_instance(const struct format_ty
 	struct lvmcache_info *info;
 
 	if (!(fid = dm_pool_alloc(fmt->cmd->mem, sizeof(*fid)))) {
-		log_error("Couldn't allocate format instance object.");
+		log_error(0, "Couldn't allocate format instance object.");
 		return NULL;
 	}
 
 	if (!(fidtc = (struct text_fid_context *)
 			dm_pool_zalloc(fmt->cmd->mem,sizeof(*fidtc)))) {
-		log_error("Couldn't allocate text_fid_context.");
+		log_error(0, "Couldn't allocate text_fid_context.");
 		return NULL;
 	}
 
@@ -1761,7 +1761,7 @@ static struct format_instance *_text_create_text_instance(const struct format_ty
 		dm_list_iterate_items(dl, dir_list) {
 			if (dm_snprintf(path, PATH_MAX, "%s/%s",
 					 dl->dir, vgname) < 0) {
-				log_error("Name too long %s/%s", dl->dir,
+				log_error(0, "Name too long %s/%s", dl->dir,
 					  vgname);
 				return NULL;
 			}
@@ -1833,7 +1833,7 @@ void *create_text_context(struct cmd_context *cmd, const char *path,
 	char *tmp;
 
 	if ((tmp = strstr(path, ".tmp")) && (tmp == path + strlen(path) - 4)) {
-		log_error("%s: Volume group filename may not end in .tmp",
+		log_error(0, "%s: Volume group filename may not end in .tmp",
 			  path);
 		return NULL;
 	}
@@ -1860,7 +1860,7 @@ void *create_text_context(struct cmd_context *cmd, const char *path,
       bad:
 	dm_pool_free(cmd->mem, tc);
 
-	log_err("Couldn't allocate text format context object.");
+	log_error(0, "Couldn't allocate text format context object.");
 	return NULL;
 }
 
@@ -1882,7 +1882,7 @@ static int _add_dir(const char *dir, struct dm_list *dir_list)
 
 	if (dm_create_dir(dir)) {
 		if (!(dl = dm_malloc(sizeof(struct dm_list) + strlen(dir) + 1))) {
-			log_error("_add_dir allocation failed");
+			log_error(0, "_add_dir allocation failed");
 			return 0;
 		}
 		log_very_verbose("Adding text format metadata dir: %s", dir);
@@ -1902,32 +1902,32 @@ static int _get_config_disk_area(struct cmd_context *cmd,
 	struct id id;
 
 	if (!(cn = cn->child)) {
-		log_error("Empty metadata disk_area section of config file");
+		log_error(0, "Empty metadata disk_area section of config file");
 		return 0;
 	}
 
 	if (!get_config_uint64(cn, "start_sector", &dev_area.start)) {
-		log_error("Missing start_sector in metadata disk_area section "
+		log_error(0, "Missing start_sector in metadata disk_area section "
 			  "of config file");
 		return 0;
 	}
 	dev_area.start <<= SECTOR_SHIFT;
 
 	if (!get_config_uint64(cn, "size", &dev_area.size)) {
-		log_error("Missing size in metadata disk_area section "
+		log_error(0, "Missing size in metadata disk_area section "
 			  "of config file");
 		return 0;
 	}
 	dev_area.size <<= SECTOR_SHIFT;
 
 	if (!get_config_str(cn, "id", &id_str)) {
-		log_error("Missing uuid in metadata disk_area section "
+		log_error(0, "Missing uuid in metadata disk_area section "
 			  "of config file");
 		return 0;
 	}
 
 	if (!id_read_format(&id, id_str)) {
-		log_error("Invalid uuid in metadata disk_area section "
+		log_error(0, "Invalid uuid in metadata disk_area section "
 			  "of config file: %s", id_str);
 		return 0;
 	}
@@ -1936,9 +1936,9 @@ static int _get_config_disk_area(struct cmd_context *cmd,
 		char buffer[64] __attribute((aligned(8)));
 
 		if (!id_write_format(&id, buffer, sizeof(buffer)))
-			log_err("Couldn't find device.");
+			log_error(0, "Couldn't find device.");
 		else
-			log_err("Couldn't find device with uuid '%s'.", buffer);
+			log_error(0, "Couldn't find device with uuid '%s'.", buffer);
 
 		return 0;
 	}
@@ -1966,7 +1966,7 @@ struct format_type *create_text_format(struct cmd_context *cmd)
 			FMT_UNLIMITED_STRIPESIZE;
 
 	if (!(mda_lists = dm_malloc(sizeof(struct mda_lists)))) {
-		log_error("Failed to allocate dir_list");
+		log_error(0, "Failed to allocate dir_list");
 		dm_free(fmt);
 		return NULL;
 	}
@@ -1978,13 +1978,13 @@ struct format_type *create_text_format(struct cmd_context *cmd)
 	fmt->private = (void *) mda_lists;
 
 	if (!(fmt->labeller = text_labeller_create(fmt))) {
-		log_error("Couldn't create text label handler.");
+		log_error(0, "Couldn't create text label handler.");
 		dm_free(fmt);
 		return NULL;
 	}
 
 	if (!(label_register_handler(FMT_TEXT_NAME, fmt->labeller))) {
-		log_error("Couldn't register text label handler.");
+		log_error(0, "Couldn't register text label handler.");
 		dm_free(fmt);
 		return NULL;
 	}
@@ -1992,13 +1992,13 @@ struct format_type *create_text_format(struct cmd_context *cmd)
 	if ((cn = find_config_tree_node(cmd, "metadata/dirs"))) {
 		for (cv = cn->v; cv; cv = cv->next) {
 			if (cv->type != CFG_STRING) {
-				log_error("Invalid string in config file: "
+				log_error(0, "Invalid string in config file: "
 					  "metadata/dirs");
 				goto err;
 			}
 
 			if (!_add_dir(cv->v.str, &mda_lists->dirs)) {
-				log_error("Failed to add %s to text format "
+				log_error(0, "Failed to add %s to text format "
 					  "metadata directory list ", cv->v.str);
 				goto err;
 			}
diff --git a/lib/format_text/import.c b/lib/format_text/import.c
index 3bd6828..4ed4ea0 100644
--- a/lib/format_text/import.c
+++ b/lib/format_text/import.c
@@ -100,7 +100,7 @@ struct volume_group *text_vg_import_fd(struct format_instance *fid,
 	if ((!dev && !read_config_file(cft)) ||
 	    (dev && !read_config_fd(cft, dev, offset, size,
 				    offset2, size2, checksum_fn, checksum))) {
-		log_error("Couldn't read volume group metadata.");
+		log_error(0, "Couldn't read volume group metadata.");
 		goto out;
 	}
 
diff --git a/lib/format_text/import_vsn1.c b/lib/format_text/import_vsn1.c
index d8d8fcb..13b9a60 100644
--- a/lib/format_text/import_vsn1.c
+++ b/lib/format_text/import_vsn1.c
@@ -43,7 +43,7 @@ typedef int (*section_fn) (struct format_instance * fid, struct dm_pool * mem,
  */
 static void _invalid_format(const char *str)
 {
-	log_error("Can't process text format file - %s.", str);
+	log_error(0, "Can't process text format file - %s.", str);
 }
 
 /*
@@ -107,18 +107,18 @@ static int _read_id(struct id *id, struct config_node *cn, const char *path)
 	struct config_value *cv;
 
 	if (!(cn = find_config_node(cn, path))) {
-		log_error("Couldn't find uuid.");
+		log_error(0, "Couldn't find uuid.");
 		return 0;
 	}
 
 	cv = cn->v;
 	if (!cv || !cv->v.str) {
-		log_error("uuid must be a string.");
+		log_error(0, "uuid must be a string.");
 		return 0;
 	}
 
 	if (!id_read_format(id, cv->v.str)) {
-		log_error("Invalid uuid.");
+		log_error(0, "Invalid uuid.");
 		return 0;
 	}
 
@@ -131,18 +131,18 @@ static int _read_flag_config(struct config_node *n, uint32_t *status, int type)
 	*status = 0;
 
 	if (!(cn = find_config_node(n, "status"))) {
-		log_error("Could not find status flags.");
+		log_error(0, "Could not find status flags.");
 		return 0;
 	}
 
 	if (!(read_flags(status, type | STATUS_FLAG, cn->v))) {
-		log_error("Could not read status flags.");
+		log_error(0, "Could not read status flags.");
 		return 0;
 	}
 
 	if ((cn = find_config_node(n, "flags"))) {
 		if (!(read_flags(status, type, cn->v))) {
-			log_error("Could not read flags.");
+			log_error(0, "Could not read flags.");
 			return 0;
 		}
 	}
@@ -174,12 +174,12 @@ static int _read_pv(struct format_instance *fid, struct dm_pool *mem,
 		return_0;
 
 	if (!(pvn = pvn->child)) {
-		log_error("Empty pv section.");
+		log_error(0, "Empty pv section.");
 		return 0;
 	}
 
 	if (!_read_id(&pv->id, pvn, "id")) {
-		log_error("Couldn't read uuid for physical volume.");
+		log_error(0, "Couldn't read uuid for physical volume.");
 		return 0;
 	}
 
@@ -190,9 +190,9 @@ static int _read_pv(struct format_instance *fid, struct dm_pool *mem,
 		char buffer[64] __attribute((aligned(8)));
 
 		if (!id_write_format(&pv->id, buffer, sizeof(buffer)))
-			log_error("Couldn't find device.");
+			log_error(0, "Couldn't find device.");
 		else
-			log_error("Couldn't find device with uuid '%s'.",
+			log_error(0, "Couldn't find device with uuid '%s'.",
 				  buffer);
 	}
 
@@ -202,7 +202,7 @@ static int _read_pv(struct format_instance *fid, struct dm_pool *mem,
 	memcpy(&pv->vgid, &vg->id, sizeof(vg->id));
 
 	if (!_read_flag_config(pvn, &pv->status, PV_FLAGS)) {
-		log_error("Couldn't read status flags for physical volume.");
+		log_error(0, "Couldn't read status flags for physical volume.");
 		return 0;
 	}
 
@@ -213,12 +213,12 @@ static int _read_pv(struct format_instance *fid, struct dm_pool *mem,
 	_read_int64(pvn, "dev_size", &pv->size);
 
 	if (!_read_int64(pvn, "pe_start", &pv->pe_start)) {
-		log_error("Couldn't read extent size for physical volume.");
+		log_error(0, "Couldn't read extent size for physical volume.");
 		return 0;
 	}
 
 	if (!_read_int32(pvn, "pe_count", &pv->pe_count)) {
-		log_error("Couldn't find extent count (pe_count) for "
+		log_error(0, "Couldn't find extent count (pe_count) for "
 			  "physical volume.");
 		return 0;
 	}
@@ -229,7 +229,7 @@ static int _read_pv(struct format_instance *fid, struct dm_pool *mem,
 	/* Optional tags */
 	if ((cn = find_config_node(pvn, "tags")) &&
 	    !(read_tags(mem, &pv->tags, cn->v))) {
-		log_error("Couldn't read tags for physical volume %s in %s.",
+		log_error(0, "Couldn't read tags for physical volume %s in %s.",
 			  pv_dev_name(pv), vg->name);
 		return 0;
 	}
@@ -247,7 +247,7 @@ static int _read_pv(struct format_instance *fid, struct dm_pool *mem,
 	/* Fix up pv size if missing or impossibly large */
 	if ((!pv->size || pv->size > (1ULL << 62)) && pv->dev) {
 		if (!dev_get_size(pv->dev, &pv->size)) {
-			log_error("%s: Couldn't get size.", pv_dev_name(pv));
+			log_error(0, "%s: Couldn't get size.", pv_dev_name(pv));
 			return 0;
 		}
 		log_verbose("Fixing up missing size (%s) "
@@ -257,7 +257,7 @@ static int _read_pv(struct format_instance *fid, struct dm_pool *mem,
 			size = pv->pe_count * (uint64_t) vg->extent_size +
 			       pv->pe_start;
 			if (size > pv->size)
-				log_error("WARNING: Physical Volume %s is too "
+				log_error(0, "WARNING: Physical Volume %s is too "
 					  "large for underlying device",
 					  pv_dev_name(pv));
 		}
@@ -300,18 +300,18 @@ static int _read_segment(struct dm_pool *mem, struct volume_group *vg,
 	const char *segtype_str;
 
 	if (!(sn = sn->child)) {
-		log_error("Empty segment section.");
+		log_error(0, "Empty segment section.");
 		return 0;
 	}
 
 	if (!_read_int32(sn, "start_extent", &start_extent)) {
-		log_error("Couldn't read 'start_extent' for segment '%s'.",
+		log_error(0, "Couldn't read 'start_extent' for segment '%s'.",
 			  sn->key);
 		return 0;
 	}
 
 	if (!_read_int32(sn, "extent_count", &extent_count)) {
-		log_error("Couldn't read 'extent_count' for segment '%s'.",
+		log_error(0, "Couldn't read 'extent_count' for segment '%s'.",
 			  sn->key);
 		return 0;
 	}
@@ -321,7 +321,7 @@ static int _read_segment(struct dm_pool *mem, struct volume_group *vg,
 	if ((cn = find_config_node(sn, "type"))) {
 		cv = cn->v;
 		if (!cv || !cv->v.str) {
-			log_error("Segment type must be a string.");
+			log_error(0, "Segment type must be a string.");
 			return 0;
 		}
 		segtype_str = cv->v.str;
@@ -337,7 +337,7 @@ static int _read_segment(struct dm_pool *mem, struct volume_group *vg,
 	if (!(seg = alloc_lv_segment(mem, segtype, lv, start_extent,
 				     extent_count, 0, 0, NULL, area_count,
 				     extent_count, 0, 0, 0))) {
-		log_error("Segment allocation failed");
+		log_error(0, "Segment allocation failed");
 		return 0;
 	}
 
@@ -348,7 +348,7 @@ static int _read_segment(struct dm_pool *mem, struct volume_group *vg,
 	/* Optional tags */
 	if ((cn = find_config_node(sn, "tags")) &&
 	    !(read_tags(mem, &seg->tags, cn->v))) {
-		log_error("Couldn't read tags for a segment of %s/%s.",
+		log_error(0, "Couldn't read tags for a segment of %s/%s.",
 			  vg->name, lv->name);
 		return 0;
 	}
@@ -380,7 +380,7 @@ int text_import_areas(struct lv_segment *seg, const struct config_node *sn,
 	const char *seg_name = sn->key;
 
 	if (!seg->area_count) {
-		log_error("Zero areas not allowed for segment '%s'", sn->key);
+		log_error(0, "Zero areas not allowed for segment '%s'", sn->key);
 		return 0;
 	}
 
@@ -392,17 +392,17 @@ int text_import_areas(struct lv_segment *seg, const struct config_node *sn,
 		struct physical_volume *pv;
 
 		if (cv->type != CFG_STRING) {
-			log_error(bad, sn->key);
+			log_error(0, bad, sn->key);
 			return 0;
 		}
 
 		if (!cv->next) {
-			log_error(bad, sn->key);
+			log_error(0, bad, sn->key);
 			return 0;
 		}
 
 		if (cv->next->type != CFG_INT) {
-			log_error(bad, sn->key);
+			log_error(0, bad, sn->key);
 			return 0;
 		}
 
@@ -416,7 +416,7 @@ int text_import_areas(struct lv_segment *seg, const struct config_node *sn,
 						    flags))
 				return_0;
 		} else {
-			log_error("Couldn't find volume '%s' "
+			log_error(0, "Couldn't find volume '%s' "
 				  "for segment '%s'.",
 				  cv->v.str ? : "NULL", seg_name);
 			return 0;
@@ -429,7 +429,7 @@ int text_import_areas(struct lv_segment *seg, const struct config_node *sn,
 	 * Check we read the correct number of stripes.
 	 */
 	if (cv || (s < seg->area_count)) {
-		log_error("Incorrect number of areas in area array "
+		log_error(0, "Incorrect number of areas in area array "
 			  "for segment '%s'.", seg_name);
 		return 0;
 	}
@@ -457,18 +457,18 @@ static int _read_segments(struct dm_pool *mem, struct volume_group *vg,
 		}
 		/* FIXME Remove this restriction */
 		if ((lv->status & SNAPSHOT) && count > 1) {
-			log_error("Only one segment permitted for snapshot");
+			log_error(0, "Only one segment permitted for snapshot");
 			return 0;
 		}
 	}
 
 	if (!_read_int32(lvn, "segment_count", &seg_count)) {
-		log_error("Couldn't read segment count for logical volume.");
+		log_error(0, "Couldn't read segment count for logical volume.");
 		return 0;
 	}
 
 	if (seg_count != count) {
-		log_error("segment_count and actual number of segments "
+		log_error(0, "segment_count and actual number of segments "
 			  "disagree.");
 		return 0;
 	}
@@ -504,12 +504,12 @@ static int _read_lvnames(struct format_instance *fid __attribute((unused)),
 		return_0;
 
 	if (!(lvn = lvn->child)) {
-		log_error("Empty logical volume section.");
+		log_error(0, "Empty logical volume section.");
 		return 0;
 	}
 
 	if (!_read_flag_config(lvn, &lv->status, LV_FLAGS)) {
-		log_error("Couldn't read status flags for logical volume %s.",
+		log_error(0, "Couldn't read status flags for logical volume %s.",
 			  lv->name);
 		return 0;
 	}
@@ -518,7 +518,7 @@ static int _read_lvnames(struct format_instance *fid __attribute((unused)),
 	if ((cn = find_config_node(lvn, "allocation_policy"))) {
 		struct config_value *cv = cn->v;
 		if (!cv || !cv->v.str) {
-			log_error("allocation_policy must be a string.");
+			log_error(0, "allocation_policy must be a string.");
 			return 0;
 		}
 
@@ -552,7 +552,7 @@ static int _read_lvnames(struct format_instance *fid __attribute((unused)),
 	/* Optional tags */
 	if ((cn = find_config_node(lvn, "tags")) &&
 	    !(read_tags(mem, &lv->tags, cn->v))) {
-		log_error("Couldn't read tags for logical volume %s/%s.",
+		log_error(0, "Couldn't read tags for logical volume %s/%s.",
 			  vg->name, lv->name);
 		return 0;
 	}
@@ -570,20 +570,20 @@ static int _read_lvsegs(struct format_instance *fid __attribute((unused)),
 	struct lv_list *lvl;
 
 	if (!(lvl = find_lv_in_vg(vg, lvn->key))) {
-		log_error("Lost logical volume reference %s", lvn->key);
+		log_error(0, "Lost logical volume reference %s", lvn->key);
 		return 0;
 	}
 
 	lv = lvl->lv;
 
 	if (!(lvn = lvn->child)) {
-		log_error("Empty logical volume section.");
+		log_error(0, "Empty logical volume section.");
 		return 0;
 	}
 
 	/* FIXME: read full lvid */
 	if (!_read_id(&lv->lvid.id[1], lvn, "id")) {
-		log_error("Couldn't read uuid for logical volume %s.",
+		log_error(0, "Couldn't read uuid for logical volume %s.",
 			  lv->name);
 		return 0;
 	}
@@ -598,7 +598,7 @@ static int _read_lvsegs(struct format_instance *fid __attribute((unused)),
 	lv->minor = -1;
 	if ((lv->status & FIXED_MINOR) &&
 	    !_read_int32(lvn, "minor", &lv->minor)) {
-		log_error("Couldn't read minor number for logical "
+		log_error(0, "Couldn't read minor number for logical "
 			  "volume %s.", lv->name);
 		return 0;
 	}
@@ -606,7 +606,7 @@ static int _read_lvsegs(struct format_instance *fid __attribute((unused)),
 	lv->major = -1;
 	if ((lv->status & FIXED_MINOR) &&
 	    !_read_int32(lvn, "major", &lv->major)) {
-		log_error("Couldn't read major number for logical "
+		log_error(0, "Couldn't read major number for logical "
 			  "volume %s.", lv->name);
 	}
 
@@ -623,7 +623,7 @@ static int _read_sections(struct format_instance *fid,
 
 	if (!(n = find_config_node(vgn, section))) {
 		if (!optional) {
-			log_error("Couldn't find section '%s'.", section);
+			log_error(0, "Couldn't find section '%s'.", section);
 			return 0;
 		}
 
@@ -653,7 +653,7 @@ static struct volume_group *_read_vg(struct format_instance *fid,
 	for (vgn = cft->root; (vgn && vgn->v); vgn = vgn->sib) ;
 
 	if (!vgn) {
-		log_error("Couldn't find volume group in file.");
+		log_error(0, "Couldn't find volume group in file.");
 		goto bad;
 	}
 
@@ -677,31 +677,31 @@ static struct volume_group *_read_vg(struct format_instance *fid,
 
 	if ((cn = find_config_node(vgn, "system_id")) && cn->v) {
 		if (!cn->v->v.str) {
-			log_error("system_id must be a string");
+			log_error(0, "system_id must be a string");
 			goto bad;
 		}
 		strncpy(vg->system_id, cn->v->v.str, NAME_LEN);
 	}
 
 	if (!_read_id(&vg->id, vgn, "id")) {
-		log_error("Couldn't read uuid for volume group %s.", vg->name);
+		log_error(0, "Couldn't read uuid for volume group %s.", vg->name);
 		goto bad;
 	}
 
 	if (!_read_int32(vgn, "seqno", &vg->seqno)) {
-		log_error("Couldn't read 'seqno' for volume group %s.",
+		log_error(0, "Couldn't read 'seqno' for volume group %s.",
 			  vg->name);
 		goto bad;
 	}
 
 	if (!_read_flag_config(vgn, &vg->status, VG_FLAGS)) {
-		log_error("Error reading flags of volume group %s.",
+		log_error(0, "Error reading flags of volume group %s.",
 			  vg->name);
 		goto bad;
 	}
 
 	if (!_read_int32(vgn, "extent_size", &vg->extent_size)) {
-		log_error("Couldn't read extent size for volume group %s.",
+		log_error(0, "Couldn't read extent size for volume group %s.",
 			  vg->name);
 		goto bad;
 	}
@@ -712,13 +712,13 @@ static struct volume_group *_read_vg(struct format_instance *fid,
 	 */
 
 	if (!_read_int32(vgn, "max_lv", &vg->max_lv)) {
-		log_error("Couldn't read 'max_lv' for volume group %s.",
+		log_error(0, "Couldn't read 'max_lv' for volume group %s.",
 			  vg->name);
 		goto bad;
 	}
 
 	if (!_read_int32(vgn, "max_pv", &vg->max_pv)) {
-		log_error("Couldn't read 'max_pv' for volume group %s.",
+		log_error(0, "Couldn't read 'max_pv' for volume group %s.",
 			  vg->name);
 		goto bad;
 	}
@@ -727,7 +727,7 @@ static struct volume_group *_read_vg(struct format_instance *fid,
 	if ((cn = find_config_node(vgn, "allocation_policy"))) {
 		struct config_value *cv = cn->v;
 		if (!cv || !cv->v.str) {
-			log_error("allocation_policy must be a string.");
+			log_error(0, "allocation_policy must be a string.");
 			return 0;
 		}
 
@@ -741,14 +741,14 @@ static struct volume_group *_read_vg(struct format_instance *fid,
 	 * structures.
 	 */
 	if (!(pv_hash = dm_hash_create(32))) {
-		log_error("Couldn't create hash table.");
+		log_error(0, "Couldn't create hash table.");
 		goto bad;
 	}
 
 	dm_list_init(&vg->pvs);
 	if (!_read_sections(fid, "physical_volumes", _read_pv, mem, vg,
 			    vgn, pv_hash, 0)) {
-		log_error("Couldn't find all physical volumes for volume "
+		log_error(0, "Couldn't find all physical volumes for volume "
 			  "group %s.", vg->name);
 		goto bad;
 	}
@@ -759,26 +759,26 @@ static struct volume_group *_read_vg(struct format_instance *fid,
 	/* Optional tags */
 	if ((cn = find_config_node(vgn, "tags")) &&
 	    !(read_tags(mem, &vg->tags, cn->v))) {
-		log_error("Couldn't read tags for volume group %s.", vg->name);
+		log_error(0, "Couldn't read tags for volume group %s.", vg->name);
 		goto bad;
 	}
 
 	if (!_read_sections(fid, "logical_volumes", _read_lvnames, mem, vg,
 			    vgn, pv_hash, 1)) {
-		log_error("Couldn't read all logical volume names for volume "
+		log_error(0, "Couldn't read all logical volume names for volume "
 			  "group %s.", vg->name);
 		goto bad;
 	}
 
 	if (!_read_sections(fid, "logical_volumes", _read_lvsegs, mem, vg,
 			    vgn, pv_hash, 1)) {
-		log_error("Couldn't read all logical volumes for "
+		log_error(0, "Couldn't read all logical volumes for "
 			  "volume group %s.", vg->name);
 		goto bad;
 	}
 
 	if (!fixup_imported_mirrors(vg)) {
-		log_error("Failed to fixup mirror pointers after import for "
+		log_error(0, "Failed to fixup mirror pointers after import for "
 			  "volume group %s.", vg->name);
 		goto bad;
 	}
@@ -833,7 +833,7 @@ static const char *_read_vgname(const struct format_type *fmt,
 	for (vgn = cft->root; (vgn && vgn->v); vgn = vgn->sib) ;
 
 	if (!vgn) {
-		log_error("Couldn't find volume group in file.");
+		log_error(0, "Couldn't find volume group in file.");
 		return 0;
 	}
 
@@ -843,12 +843,12 @@ static const char *_read_vgname(const struct format_type *fmt,
 	vgn = vgn->child;
 
 	if (!_read_id(vgid, vgn, "id")) {
-		log_error("Couldn't read uuid for volume group %s.", vgname);
+		log_error(0, "Couldn't read uuid for volume group %s.", vgname);
 		return 0;
 	}
 
 	if (!_read_flag_config(vgn, vgstatus, VG_FLAGS)) {
-		log_error("Couldn't find status flags for volume group %s.",
+		log_error(0, "Couldn't find status flags for volume group %s.",
 			  vgname);
 		return 0;
 	}
diff --git a/lib/format_text/tags.c b/lib/format_text/tags.c
index eeb0af7..debebc4 100644
--- a/lib/format_text/tags.c
+++ b/lib/format_text/tags.c
@@ -51,7 +51,7 @@ int read_tags(struct dm_pool *mem, struct dm_list *tags, struct config_value *cv
 
 	while (cv) {
 		if (cv->type != CFG_STRING) {
-			log_error("Found a tag that is not a string");
+			log_error(0, "Found a tag that is not a string");
 			return 0;
 		}
 
diff --git a/lib/format_text/text_label.c b/lib/format_text/text_label.c
index 110bc1d..e9344b0 100644
--- a/lib/format_text/text_label.c
+++ b/lib/format_text/text_label.c
@@ -137,7 +137,7 @@ static int _text_write(struct label *label, void *buf)
 		  mda2 ? "s)" : "");
 
 	if (da1 < 0) {
-		log_error("Internal error: %s label header currently requires "
+		log_error(0, "Internal error: %s label header currently requires "
 			  "a data area.", dev_name(info->dev));
 		return 0;
 	}
@@ -152,12 +152,12 @@ int add_da(struct dm_pool *mem, struct dm_list *das,
 
 	if (!mem) {
 		if (!(dal = dm_malloc(sizeof(*dal)))) {
-			log_error("struct data_area_list allocation failed");
+			log_error(0, "struct data_area_list allocation failed");
 			return 0;
 		}
 	} else {
 		if (!(dal = dm_pool_alloc(mem, sizeof(*dal)))) {
-			log_error("struct data_area_list allocation failed");
+			log_error(0, "struct data_area_list allocation failed");
 			return 0;
 		}
 	}
@@ -192,23 +192,23 @@ int add_mda(const struct format_type *fmt, struct dm_pool *mem, struct dm_list *
 
 	if (!mem) {
 		if (!(mdal = dm_malloc(sizeof(struct metadata_area)))) {
-			log_error("struct mda_list allocation failed");
+			log_error(0, "struct mda_list allocation failed");
 			return 0;
 		}
 
 		if (!(mdac = dm_malloc(sizeof(struct mda_context)))) {
-			log_error("struct mda_context allocation failed");
+			log_error(0, "struct mda_context allocation failed");
 			dm_free(mdal);
 			return 0;
 		}
 	} else {
 		if (!(mdal = dm_pool_alloc(mem, sizeof(struct metadata_area)))) {
-			log_error("struct mda_list allocation failed");
+			log_error(0, "struct mda_list allocation failed");
 			return 0;
 		}
 
 		if (!(mdac = dm_pool_alloc(mem, sizeof(struct mda_context)))) {
-			log_error("struct mda_context allocation failed");
+			log_error(0, "struct mda_context allocation failed");
 			return 0;
 		}
 	}
@@ -343,7 +343,7 @@ struct labeller *text_labeller_create(const struct format_type *fmt)
 	struct labeller *l;
 
 	if (!(l = dm_malloc(sizeof(*l)))) {
-		log_err("Couldn't allocate labeller object.");
+		log_error(0, "Couldn't allocate labeller object.");
 		return NULL;
 	}
 
diff --git a/lib/label/label.c b/lib/label/label.c
index 8924735..df6c60d 100644
--- a/lib/label/label.c
+++ b/lib/label/label.c
@@ -46,7 +46,7 @@ static struct labeller_i *_alloc_li(const char *name, struct labeller *l)
 	len = sizeof(*li) + strlen(name) + 1;
 
 	if (!(li = dm_malloc(len))) {
-		log_error("Couldn't allocate memory for labeller list object.");
+		log_error(0, "Couldn't allocate memory for labeller list object.");
 		return NULL;
 	}
 
@@ -130,7 +130,7 @@ static struct labeller *_find_labeller(struct device *dev, char *buf,
 
 		if (!strncmp((char *)lh->id, LABEL_ID, sizeof(lh->id))) {
 			if (found) {
-				log_error("Ignoring additional label on %s at "
+				log_error(0, "Ignoring additional label on %s at "
 					  "sector %" PRIu64, dev_name(dev),
 					  sector + scan_sector);
 			}
@@ -159,7 +159,7 @@ static struct labeller *_find_labeller(struct device *dev, char *buf,
 				log_very_verbose("%s: %s label detected",
 						 dev_name(dev), li->name);
 				if (found) {
-					log_error("Ignoring additional label "
+					log_error(0, "Ignoring additional label "
 						  "on %s at sector %" PRIu64,
 						  dev_name(dev),
 						  sector + scan_sector);
@@ -242,7 +242,7 @@ int label_remove(struct device *dev)
 				 dev_name(dev), sector);
 			if (!dev_write(dev, sector << SECTOR_SHIFT, LABEL_SIZE,
 				       buf)) {
-				log_error("Failed to remove label from %s at "
+				log_error(0, "Failed to remove label from %s at "
 					  "sector %" PRIu64, dev_name(dev),
 					  sector);
 				r = 0;
@@ -304,12 +304,12 @@ int label_write(struct device *dev, struct label *label)
 	int r = 1;
 
 	if (!label->labeller->ops->write) {
-		log_err("Label handler does not support label writes");
+		log_error(0, "Label handler does not support label writes");
 		return 0;
 	}
 
 	if ((LABEL_SIZE + (label->sector << SECTOR_SHIFT)) > LABEL_SCAN_SIZE) {
-		log_error("Label sector %" PRIu64 " beyond range (%ld)",
+		log_error(0, "Label sector %" PRIu64 " beyond range (%ld)",
 			  label->sector, LABEL_SCAN_SECTORS);
 		return 0;
 	}
@@ -384,7 +384,7 @@ struct label *label_create(struct labeller *labeller)
 	struct label *label;
 
 	if (!(label = dm_malloc(sizeof(*label)))) {
-		log_error("label allocaction failed");
+		log_error(0, "label allocaction failed");
 		return NULL;
 	}
 	memset(label, 0, sizeof(*label));
diff --git a/lib/locking/cluster_locking.c b/lib/locking/cluster_locking.c
index eb09241..f2beb94 100644
--- a/lib/locking/cluster_locking.c
+++ b/lib/locking/cluster_locking.c
@@ -69,7 +69,7 @@ static int _open_local_sock(void)
 
 	/* Open local socket */
 	if ((local_socket = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
-		log_error("Local socket creation failed: %s", strerror(errno));
+		log_error(0, "Local socket creation failed: %s", strerror(errno));
 		return -1;
 	}
 
@@ -82,7 +82,7 @@ static int _open_local_sock(void)
 		    sizeof(sockaddr))) {
 		int saved_errno = errno;
 
-		log_error("connect() failed on local socket: %s",
+		log_error(0, "connect() failed on local socket: %s",
 			  strerror(errno));
 		if (close(local_socket))
 			stack;
@@ -109,7 +109,7 @@ static int _send_request(char *inbuf, int inlen, char **retbuf)
 	if ( (err = write(_clvmd_sock, inbuf, inlen)) != inlen) {
 		if (err == -1 && errno == EINTR)
 			goto rewrite;
-		log_error("Error writing data to clvmd: %s", strerror(errno));
+		log_error(0, "Error writing data to clvmd: %s", strerror(errno));
 		return 0;
 	}
 
@@ -118,12 +118,12 @@ static int _send_request(char *inbuf, int inlen, char **retbuf)
 	if ((len = read(_clvmd_sock, outbuf, sizeof(struct clvm_header))) < 0) {
 		if (errno == EINTR)
 			goto reread;
-		log_error("Error reading data from clvmd: %s", strerror(errno));
+		log_error(0, "Error reading data from clvmd: %s", strerror(errno));
 		return 0;
 	}
 
 	if (len == 0) {
-		log_error("EOF reading CLVMD");
+		log_error(0, "EOF reading CLVMD");
 		errno = ENOTCONN;
 		return 0;
 	}
@@ -156,7 +156,7 @@ static int _send_request(char *inbuf, int inlen, char **retbuf)
 		/* Only return an error here if there are no node-specific
 		   errors present in the message that might have more detail */
 		if (!(outheader->flags & CLVMD_FLAG_NODEERRS)) {
-			log_error("cluster request failed: %s", strerror(errno));
+			log_error(0, "cluster request failed: %s", strerror(errno));
 			return 0;
 		}
 
@@ -351,12 +351,12 @@ static int _lock_for_cluster(struct cmd_context *cmd, unsigned char clvmd_cmd,
 	/* If any nodes were down then display them and return an error */
 	for (i = 0; i < num_responses; i++) {
 		if (response[i].status == EHOSTDOWN) {
-			log_error("clvmd not running on node %s",
+			log_error(0, "clvmd not running on node %s",
 				  response[i].node);
 			status = 0;
 			errno = response[i].status;
 		} else if (response[i].status) {
-			log_error("Error locking on node %s: %s",
+			log_error(0, "Error locking on node %s: %s",
 				  response[i].node,
 				  response[i].response[0] ?
 				  	response[i].response :
@@ -419,7 +419,7 @@ int lock_resource(struct cmd_context *cmd, const char *resource, uint32_t flags)
 		break;
 
 	default:
-		log_error("Unrecognised lock scope: %d",
+		log_error(0, "Unrecognised lock scope: %d",
 			  flags & LCK_SCOPE_MASK);
 		return 0;
 	}
@@ -444,7 +444,7 @@ int lock_resource(struct cmd_context *cmd, const char *resource, uint32_t flags)
 		lock_type = "EX";
 		break;
 	default:
-		log_error("Unrecognised lock type: %u",
+		log_error(0, "Unrecognised lock type: %u",
 			  flags & LCK_TYPE_MASK);
 		return 0;
 	}
diff --git a/lib/locking/external_locking.c b/lib/locking/external_locking.c
index 949d065..3958c5e 100644
--- a/lib/locking/external_locking.c
+++ b/lib/locking/external_locking.c
@@ -62,7 +62,7 @@ int init_external_locking(struct locking_type *locking, struct cmd_context *cmd)
 	const char *libname;
 
 	if (_locking_lib) {
-		log_error("External locking already initialised");
+		log_error(0, "External locking already initialised");
 		return 1;
 	}
 
@@ -82,7 +82,7 @@ int init_external_locking(struct locking_type *locking, struct cmd_context *cmd)
 	    !(_lock_fn = dlsym(_locking_lib, "lock_resource")) ||
 	    !(_reset_fn = dlsym(_locking_lib, "reset_locking")) ||
 	    !(_end_fn = dlsym(_locking_lib, "locking_end"))) {
-		log_error("Shared library %s does not contain locking "
+		log_error(0, "Shared library %s does not contain locking "
 			  "functions", libname);
 		dlclose(_locking_lib);
 		_locking_lib = NULL;
diff --git a/lib/locking/file_locking.c b/lib/locking/file_locking.c
index e205577..2e24c68 100644
--- a/lib/locking/file_locking.c
+++ b/lib/locking/file_locking.c
@@ -108,7 +108,7 @@ static void _remove_ctrl_c_handler(void)
 static void _trap_ctrl_c(int sig __attribute((unused)))
 {
 	_remove_ctrl_c_handler();
-	log_error("CTRL-c detected: giving up waiting for lock");
+	log_error(0, "CTRL-c detected: giving up waiting for lock");
 }
 
 static void _install_ctrl_c_handler()
@@ -146,7 +146,7 @@ static int _lock_file(const char *file, uint32_t flags)
 	case LCK_UNLOCK:
 		return _release_lock(file, 1);
 	default:
-		log_error("Unrecognised lock type: %d", flags & LCK_TYPE_MASK);
+		log_error(0, "Unrecognised lock type: %d", flags & LCK_TYPE_MASK);
 		return 0;
 	}
 
@@ -263,7 +263,7 @@ static int _file_lock_resource(struct cmd_context *cmd, const char *resource,
 		}
 		break;
 	default:
-		log_error("Unrecognised lock scope: %d",
+		log_error(0, "Unrecognised lock scope: %d",
 			  flags & LCK_SCOPE_MASK);
 		return 0;
 	}
diff --git a/lib/locking/locking.c b/lib/locking/locking.c
index 5c04b4f..93807fb 100644
--- a/lib/locking/locking.c
+++ b/lib/locking/locking.c
@@ -257,7 +257,7 @@ int init_locking(int type, struct cmd_context *cmd)
 #endif
 
 	default:
-		log_error("Unknown locking type requested.");
+		log_error(0, "Unknown locking type requested.");
 		return 0;
 	}
 
@@ -307,12 +307,12 @@ int check_lvm1_vg_inactive(struct cmd_context *cmd, const char *vgname)
 
 	if (dm_snprintf(path, sizeof(path), "%s/lvm/VGs/%s", cmd->proc_dir,
 			 vgname) < 0) {
-		log_error("LVM1 proc VG pathname too long for %s", vgname);
+		log_error(0, "LVM1 proc VG pathname too long for %s", vgname);
 		return 0;
 	}
 
 	if (stat(path, &info) == 0) {
-		log_error("%s exists: Is the original LVM driver using "
+		log_error(0, "%s exists: Is the original LVM driver using "
 			  "this volume group?", path);
 		return 0;
 	} else if (errno != ENOENT && errno != ENOTDIR) {
@@ -337,12 +337,12 @@ static int _lock_vol(struct cmd_context *cmd, const char *resource, uint32_t fla
 	assert(resource);
 
 	if (!*resource) {
-		log_error("Internal error: Use of P_orphans is deprecated.");
+		log_error(0, "Internal error: Use of P_orphans is deprecated.");
 		return 0;
 	}
 
 	if (*resource == '#' && (flags & LCK_CACHE)) {
-		log_error("Internal error: P_%s referenced", resource);
+		log_error(0, "Internal error: P_%s referenced", resource);
 		return 0;
 	}
 
@@ -393,7 +393,7 @@ int lock_vol(struct cmd_context *cmd, const char *vol, uint32_t flags)
 		strncpy(resource, vol, sizeof(resource));
 		break;
 	default:
-		log_error("Unrecognised lock scope: %d",
+		log_error(0, "Unrecognised lock scope: %d",
 			  flags & LCK_SCOPE_MASK);
 		return 0;
 	}
@@ -434,7 +434,7 @@ int suspend_lvs(struct cmd_context *cmd, struct dm_list *lvs)
 
 	dm_list_iterate_items(lvl, lvs) {
 		if (!suspend_lv(cmd, lvl->lv)) {
-			log_error("Failed to suspend %s", lvl->lv->name);
+			log_error(0, "Failed to suspend %s", lvl->lv->name);
 			dm_list_uniterate(lvh, lvs, &lvl->list) {
 				lvl = dm_list_item(lvh, struct lv_list);
 				resume_lv(cmd, lvl->lv);
@@ -456,11 +456,11 @@ int activate_lvs(struct cmd_context *cmd, struct dm_list *lvs, unsigned exclusiv
 	dm_list_iterate_items(lvl, lvs) {
 		if (!exclusive) {
 			if (!activate_lv(cmd, lvl->lv)) {
-				log_error("Failed to activate %s", lvl->lv->name);
+				log_error(0, "Failed to activate %s", lvl->lv->name);
 				return 0;
 			}
 		} else if (!activate_lv_excl(cmd, lvl->lv)) {
-			log_error("Failed to activate %s", lvl->lv->name);
+			log_error(0, "Failed to activate %s", lvl->lv->name);
 			dm_list_uniterate(lvh, lvs, &lvl->list) {
 				lvl = dm_list_item(lvh, struct lv_list);
 				activate_lv(cmd, lvl->lv);
diff --git a/lib/locking/no_locking.c b/lib/locking/no_locking.c
index 5eebafa..828cee8 100644
--- a/lib/locking/no_locking.c
+++ b/lib/locking/no_locking.c
@@ -58,7 +58,7 @@ static int _no_lock_resource(struct cmd_context *cmd, const char *resource,
 		}
 		break;
 	default:
-		log_error("Unrecognised lock scope: %d",
+		log_error(0, "Unrecognised lock scope: %d",
 			  flags & LCK_SCOPE_MASK);
 		return 0;
 	}
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index cd741cb..507c1f3 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -47,7 +47,7 @@ int add_seg_to_segs_using_this_lv(struct logical_volume *lv,
 			 seg->lv->name, seg->le, lv->name);
 
 	if (!(sl = dm_pool_zalloc(lv->vg->cmd->mem, sizeof(*sl)))) {
-		log_error("Failed to allocate segment list");
+		log_error(0, "Failed to allocate segment list");
 		return 0;
 	}
 
@@ -92,7 +92,7 @@ struct lv_segment *get_only_segment_using_this_lv(struct logical_volume *lv)
 	struct seg_list *sl;
 
 	if (dm_list_size(&lv->segs_using_this_lv) != 1) {
-		log_error("%s is expected to have only one segment using it, "
+		log_error(0, "%s is expected to have only one segment using it, "
 			  "while it has %d", lv->name,
 			  dm_list_size(&lv->segs_using_this_lv));
 		return NULL;
@@ -101,7 +101,7 @@ struct lv_segment *get_only_segment_using_this_lv(struct logical_volume *lv)
 	sl = dm_list_item(dm_list_first(&lv->segs_using_this_lv), struct seg_list);
 
 	if (sl->count != 1) {
-		log_error("%s is expected to have only one segment using it, "
+		log_error(0, "%s is expected to have only one segment using it, "
 			  "while %s:%" PRIu32 " uses it %d times",
 			  lv->name, sl->seg->lv->name, sl->seg->le, sl->count);
 		return NULL;
@@ -187,7 +187,7 @@ struct lv_segment *alloc_lv_segment(struct dm_pool *mem,
 	}
 
 	if (!segtype) {
-		log_error("alloc_lv_segment: Missing segtype.");
+		log_error(0, "alloc_lv_segment: Missing segtype.");
 		return NULL;
 	}
 
@@ -219,7 +219,7 @@ struct lv_segment *alloc_snapshot_seg(struct logical_volume *lv,
 
 	segtype = get_segtype_from_string(lv->vg->cmd, "snapshot");
 	if (!segtype) {
-		log_error("Failed to find snapshot segtype");
+		log_error(0, "Failed to find snapshot segtype");
 		return NULL;
 	}
 
@@ -227,7 +227,7 @@ struct lv_segment *alloc_snapshot_seg(struct logical_volume *lv,
 				     lv->le_count - old_le_count, status, 0,
 				     NULL, 0, lv->le_count - old_le_count,
 				     0, 0, 0))) {
-		log_error("Couldn't allocate new snapshot segment.");
+		log_error(0, "Couldn't allocate new snapshot segment.");
 		return NULL;
 	}
 
@@ -379,7 +379,7 @@ static int _lv_segment_reduce(struct lv_segment *seg, uint32_t reduction)
 	/* Caller must ensure exact divisibility */
 	if (seg_is_striped(seg)) {
 		if (reduction % seg->area_count) {
-			log_error("Segment extent reduction %" PRIu32
+			log_error(0, "Segment extent reduction %" PRIu32
 				  "not divisible by #stripes %" PRIu32,
 				  reduction, seg->area_count);
 			return 0;
@@ -544,12 +544,12 @@ static struct alloc_handle *_alloc_init(struct cmd_context *cmd,
 	uint32_t s, area_count;
 
 	if (stripes > 1 && mirrors > 1) {
-		log_error("Striped mirrors are not supported yet");
+		log_error(0, "Striped mirrors are not supported yet");
 		return NULL;
 	}
 
 	if (log_count && stripes > 1) {
-		log_error("Can't mix striping with a mirror log yet.");
+		log_error(0, "Can't mix striping with a mirror log yet.");
 		return NULL;
 	}
 
@@ -561,7 +561,7 @@ static struct alloc_handle *_alloc_init(struct cmd_context *cmd,
 		area_count = stripes;
 
 	if (!(ah = dm_pool_zalloc(mem, sizeof(*ah) + sizeof(ah->alloced_areas[0]) * area_count))) {
-		log_error("allocation handle allocation failed");
+		log_error(0, "allocation handle allocation failed");
 		return NULL;
 	}
 
@@ -571,7 +571,7 @@ static struct alloc_handle *_alloc_init(struct cmd_context *cmd,
 	ah->cmd = cmd;
 
 	if (!(ah->mem = dm_pool_create("allocation", 1024))) {
-		log_error("allocation pool creation failed");
+		log_error(0, "allocation pool creation failed");
 		return NULL;
 	}
 
@@ -606,25 +606,25 @@ static int _log_parallel_areas(struct dm_pool *mem, struct dm_list *parallel_are
 
 	dm_list_iterate_items(spvs, parallel_areas) {
 		if (!dm_pool_begin_object(mem, 256)) {
-			log_error("dm_pool_begin_object failed");
+			log_error(0, "dm_pool_begin_object failed");
 			return 0;
 		}
 
 		dm_list_iterate_items(pvl, &spvs->pvs) {
 			if (!dm_pool_grow_object(mem, pv_dev_name(pvl->pv), strlen(pv_dev_name(pvl->pv)))) {
-				log_error("dm_pool_grow_object failed");
+				log_error(0, "dm_pool_grow_object failed");
 				dm_pool_abandon_object(mem);
 				return 0;
 			}
 			if (!dm_pool_grow_object(mem, " ", 1)) {
-				log_error("dm_pool_grow_object failed");
+				log_error(0, "dm_pool_grow_object failed");
 				dm_pool_abandon_object(mem);
 				return 0;
 			}
 		}
 
 		if (!dm_pool_grow_object(mem, "\0", 1)) {
-			log_error("dm_pool_grow_object failed");
+			log_error(0, "dm_pool_grow_object failed");
 			dm_pool_abandon_object(mem);
 			return 0;
 		}
@@ -658,7 +658,7 @@ static int _setup_alloced_segment(struct logical_volume *lv, uint32_t status,
 				     status, stripe_size, NULL,
 				     area_count,
 				     aa[0].len, 0u, region_size, 0u))) {
-		log_error("Couldn't allocate new LV segment.");
+		log_error(0, "Couldn't allocate new LV segment.");
 		return 0;
 	}
 
@@ -745,7 +745,7 @@ static int _alloc_parallel_area(struct alloc_handle *ah, uint32_t needed,
 
 	if (!(aa = dm_pool_alloc(ah->mem, sizeof(*aa) *
 			      (ah->area_count + (log_area ? 1 : 0))))) {
-		log_error("alloced_area allocation failed");
+		log_error(0, "alloced_area allocation failed");
 		return 0;
 	}
 
@@ -796,7 +796,7 @@ static int _for_each_pv(struct cmd_context *cmd, struct logical_volume *lv,
 	int r = 1;
 
 	if (!(seg = find_seg_by_le(lv, le))) {
-		log_error("Failed to find segment for %s extent %" PRIu32,
+		log_error(0, "Failed to find segment for %s extent %" PRIu32,
 			  lv->name, le);
 		return 0;
 	}
@@ -1002,7 +1002,7 @@ static int _find_parallel_space(struct alloc_handle *ah, alloc_policy_t alloc,
 	/* Is there enough total space? */
 	free_pes = pv_maps_size(pvms);
 	if (needed - *allocated > free_pes) {
-		log_error("Insufficient free space: %" PRIu32 " extents needed,"
+		log_error(0, "Insufficient free space: %" PRIu32 " extents needed,"
 			  " but only %" PRIu32 " available",
 			  needed - *allocated, free_pes);
 		return 0;
@@ -1200,7 +1200,7 @@ static int _allocate(struct alloc_handle *ah,
 	alloc_policy_t alloc;
 
 	if (allocated >= new_extents && !ah->log_count) {
-		log_error("_allocate called with no work to do!");
+		log_error(0, "_allocate called with no work to do!");
 		return 1;
 	}
 
@@ -1222,9 +1222,9 @@ static int _allocate(struct alloc_handle *ah,
 	areas_size = dm_list_size(pvms);
 	if (areas_size && areas_size < (ah->area_count + ah->log_count)) {
 		if (ah->alloc != ALLOC_ANYWHERE) {
-			log_error("Not enough PVs with free space available "
+			log_error(0, "Not enough PVs with free space available "
 				  "for parallel allocation.");
-			log_error("Consider --alloc anywhere if desperate.");
+			log_error(0, "Consider --alloc anywhere if desperate.");
 			return 0;
 		}
 		areas_size = ah->area_count + ah->log_count;
@@ -1237,7 +1237,7 @@ static int _allocate(struct alloc_handle *ah,
 
 	/* Allocate an array of pv_areas to hold the largest space on each PV */
 	if (!(areas = dm_malloc(sizeof(*areas) * areas_size))) {
-		log_err("Couldn't allocate areas array.");
+		log_error(0, "Couldn't allocate areas array.");
 		return 0;
 	}
 
@@ -1254,7 +1254,7 @@ static int _allocate(struct alloc_handle *ah,
 	}
 
 	if (allocated != new_extents) {
-		log_error("Insufficient suitable %sallocatable extents "
+		log_error(0, "Insufficient suitable %sallocatable extents "
 			  "for logical volume %s: %u more required",
 			  can_split ? "" : "contiguous ",
 			  lv ? lv->name : "",
@@ -1264,7 +1264,7 @@ static int _allocate(struct alloc_handle *ah,
 	}
 
 	if (ah->log_count && !ah->log_area.len) {
-		log_error("Insufficient extents for log allocation "
+		log_error(0, "Insufficient extents for log allocation "
 			  "for logical volume %s.",
 			  lv ? lv->name : "");
 		goto out;
@@ -1285,7 +1285,7 @@ int lv_add_virtual_segment(struct logical_volume *lv, uint32_t status,
 	if (!(seg = alloc_lv_segment(lv->vg->cmd->mem, segtype, lv,
 				     lv->le_count, extents, status, 0,
 				     NULL, 0, extents, 0, 0, 0))) {
-		log_error("Couldn't allocate new zero segment.");
+		log_error(0, "Couldn't allocate new zero segment.");
 		return 0;
 	}
 
@@ -1315,16 +1315,16 @@ struct alloc_handle *allocate_extents(struct volume_group *vg,
 	struct alloc_handle *ah;
 
 	if (segtype_is_virtual(segtype)) {
-		log_error("allocate_extents does not handle virtual segments");
+		log_error(0, "allocate_extents does not handle virtual segments");
 		return NULL;
 	}
 
 	if (vg->fid->fmt->ops->segtype_supported &&
 	    !vg->fid->fmt->ops->segtype_supported(vg->fid, segtype)) {
-		log_error("Metadata format (%s) does not support required "
+		log_error(0, "Metadata format (%s) does not support required "
 			  "LV segment type (%s).", vg->fid->fmt->name,
 			  segtype->name);
-		log_error("Consider changing the metadata format by running "
+		log_error(0, "Consider changing the metadata format by running "
 			  "vgconvert.");
 		return NULL;
 	}
@@ -1359,12 +1359,12 @@ int lv_add_segment(struct alloc_handle *ah,
 		   struct logical_volume *log_lv)
 {
 	if (!segtype) {
-		log_error("Missing segtype in lv_add_segment().");
+		log_error(0, "Missing segtype in lv_add_segment().");
 		return 0;
 	}
 
 	if (segtype_is_virtual(segtype)) {
-		log_error("lv_add_segment cannot handle virtual segments");
+		log_error(0, "lv_add_segment cannot handle virtual segments");
 		return 0;
 	}
 
@@ -1375,7 +1375,7 @@ int lv_add_segment(struct alloc_handle *ah,
 		return_0;
 
 	if ((segtype->flags & SEG_CAN_SPLIT) && !lv_merge_segments(lv)) {
-		log_err("Couldn't merge segments after extending "
+		log_error(0, "Couldn't merge segments after extending "
 			"logical volume.");
 		return 0;
 	}
@@ -1400,12 +1400,12 @@ static struct lv_segment *_convert_seg_to_mirror(struct lv_segment *seg,
 	uint32_t s;
 
 	if (!seg_is_striped(seg)) {
-		log_error("Can't convert non-striped segment to mirrored.");
+		log_error(0, "Can't convert non-striped segment to mirrored.");
 		return NULL;
 	}
 
 	if (seg->area_count > 1) {
-		log_error("Can't convert striped segment with multiple areas "
+		log_error(0, "Can't convert striped segment with multiple areas "
 			  "to mirrored.");
 		return NULL;
 	}
@@ -1418,7 +1418,7 @@ static struct lv_segment *_convert_seg_to_mirror(struct lv_segment *seg,
 					seg->area_count, seg->area_len,
 					seg->chunk_size, region_size,
 					seg->extents_copied))) {
-		log_error("Couldn't allocate converted LV segment");
+		log_error(0, "Couldn't allocate converted LV segment");
 		return NULL;
 	}
 
@@ -1446,7 +1446,7 @@ int lv_add_mirror_areas(struct alloc_handle *ah,
 
 	dm_list_iterate_items(aa, &ah->alloced_areas[0]) {
 		if (!(seg = find_seg_by_le(lv, current_le))) {
-			log_error("Failed to find segment for %s extent %"
+			log_error(0, "Failed to find segment for %s extent %"
 				  PRIu32, lv->name, current_le);
 			return 0;
 		}
@@ -1454,7 +1454,7 @@ int lv_add_mirror_areas(struct alloc_handle *ah,
 		/* Allocator assures aa[0].len <= seg->area_len */
 		if (aa[0].len < seg->area_len) {
 			if (!lv_split_segment(lv, seg->le + aa[0].len)) {
-				log_error("Failed to split segment at %s "
+				log_error(0, "Failed to split segment at %s "
 					  "extent %" PRIu32, lv->name, le);
 				return 0;
 			}
@@ -1504,7 +1504,7 @@ int lv_add_mirror_lvs(struct logical_volume *lv,
 	seg = first_seg(lv);
 
 	if (dm_list_size(&lv->segments) != 1 || seg_type(seg, 0) != AREA_LV) {
-		log_error("Mirror layer must be inserted before adding mirrors");
+		log_error(0, "Mirror layer must be inserted before adding mirrors");
 		return_0;
 	}
 
@@ -1514,7 +1514,7 @@ int lv_add_mirror_lvs(struct logical_volume *lv,
 			return_0;
 
 	if (region_size && region_size != seg->region_size) {
-		log_error("Conflicting region_size");
+		log_error(0, "Conflicting region_size");
 		return 0;
 	}
 
@@ -1522,7 +1522,7 @@ int lv_add_mirror_lvs(struct logical_volume *lv,
 	new_area_count = old_area_count + num_extra_areas;
 
 	if (!_lv_segment_add_areas(lv, seg, new_area_count)) {
-		log_error("Failed to allocate widened LV segment for %s.",
+		log_error(0, "Failed to allocate widened LV segment for %s.",
 			  lv->name);
 		return 0;
 	}
@@ -1550,7 +1550,7 @@ int lv_add_log_segment(struct alloc_handle *ah, struct logical_volume *log_lv)
 	struct lv_segment *seg;
 
 	if (dm_list_size(&log_lv->segments)) {
-		log_error("Log segments can only be added to an empty LV");
+		log_error(0, "Log segments can only be added to an empty LV");
 		return 0;
 	}
 
@@ -1559,7 +1559,7 @@ int lv_add_log_segment(struct alloc_handle *ah, struct logical_volume *log_lv)
 							     "striped"),
 				     log_lv, 0, ah->log_area.len, MIRROR_LOG,
 				     0, NULL, 1, ah->log_area.len, 0, 0, 0))) {
-		log_error("Couldn't allocate new mirror log segment.");
+		log_error(0, "Couldn't allocate new mirror log segment.");
 		return 0;
 	}
 
@@ -1597,7 +1597,7 @@ static int _lv_extend_mirror(struct alloc_handle *ah,
 				    get_segtype_from_string(lv->vg->cmd,
 							    "striped"),
 				    0, 0, 0, NULL)) {
-			log_error("Aborting. Failed to extend %s.",
+			log_error(0, "Aborting. Failed to extend %s.",
 				  seg_lv(seg, s)->name);
 			return 0;
 		}
@@ -1652,13 +1652,13 @@ static int _rename_single_lv(struct logical_volume *lv, char *new_name)
 	struct volume_group *vg = lv->vg;
 
 	if (find_lv_in_vg(vg, new_name)) {
-		log_error("Logical volume \"%s\" already exists in "
+		log_error(0, "Logical volume \"%s\" already exists in "
 			  "volume group \"%s\"", new_name, vg->name);
 		return 0;
 	}
 
 	if (lv->status & LOCKED) {
-		log_error("Cannot rename locked LV %s", lv->name);
+		log_error(0, "Cannot rename locked LV %s", lv->name);
 		return 0;
 	}
 
@@ -1684,7 +1684,7 @@ static int _rename_sub_lv(struct cmd_context *cmd,
 	 */
 	len = strlen(lv_name_old);
 	if (strncmp(lv->name, lv_name_old, len) || lv->name[len] != '_') {
-		log_error("Cannot rename \"%s\": name format not recognized "
+		log_error(0, "Cannot rename \"%s\": name format not recognized "
 			  "for internal LV \"%s\"",
 			  lv_name_old, lv->name);
 		return 0;
@@ -1700,11 +1700,11 @@ static int _rename_sub_lv(struct cmd_context *cmd,
 	len = strlen(lv_name_new) + strlen(suffix) + 1;
 	new_name = dm_pool_alloc(cmd->mem, len);
 	if (!new_name) {
-		log_error("Failed to allocate space for new name");
+		log_error(0, "Failed to allocate space for new name");
 		return 0;
 	}
 	if (!dm_snprintf(new_name, len, "%s%s", lv_name_new, suffix)) {
-		log_error("Failed to create new name");
+		log_error(0, "Failed to create new name");
 		return 0;
 	}
 
@@ -1771,18 +1771,18 @@ int lv_rename(struct cmd_context *cmd, struct logical_volume *lv,
 
 	/* rename is not allowed on sub LVs */
 	if (!lv_is_visible(lv)) {
-		log_error("Cannot rename internal LV \"%s\".", lv->name);
+		log_error(0, "Cannot rename internal LV \"%s\".", lv->name);
 		return 0;
 	}
 
 	if (find_lv_in_vg(vg, new_name)) {
-		log_error("Logical volume \"%s\" already exists in "
+		log_error(0, "Logical volume \"%s\" already exists in "
 			  "volume group \"%s\"", new_name, vg->name);
 		return 0;
 	}
 
 	if (lv->status & LOCKED) {
-		log_error("Cannot rename locked LV %s", lv->name);
+		log_error(0, "Cannot rename locked LV %s", lv->name);
 		return 0;
 	}
 
@@ -1797,7 +1797,7 @@ int lv_rename(struct cmd_context *cmd, struct logical_volume *lv,
 
 	/* rename main LV */
 	if (!(lv->name = dm_pool_strdup(cmd->mem, new_name))) {
-		log_error("Failed to allocate space for new name");
+		log_error(0, "Failed to allocate space for new name");
 		return 0;
 	}
 
@@ -1879,11 +1879,11 @@ struct logical_volume *lv_create_empty(const char *name,
 
 	if (strstr(name, "%d") &&
 	    !(name = generate_lv_name(vg, name, dname, sizeof(dname)))) {
-		log_error("Failed to generate unique name for the new "
+		log_error(0, "Failed to generate unique name for the new "
 			  "logical volume");
 		return NULL;
 	} else if (find_lv_in_vg(vg, name)) {
-		log_error("Unable to create LV %s in Volume Group %s: "
+		log_error(0, "Unable to create LV %s in Volume Group %s: "
 			  "name already in use.", name, vg->name);
 		return NULL;
 	}
@@ -1935,7 +1935,7 @@ static int _add_pvs(struct cmd_context *cmd, struct pv_segment *peg,
 			return 1;
 
 	if (!(pvl = dm_pool_alloc(cmd->mem, sizeof(*pvl)))) {
-		log_error("pv_list allocation failed");
+		log_error(0, "pv_list allocation failed");
 		return 0;
 	}
 
@@ -1957,7 +1957,7 @@ struct dm_list *build_parallel_areas_from_lv(struct cmd_context *cmd,
 	uint32_t current_le = 0;
 
 	if (!(parallel_areas = dm_pool_alloc(cmd->mem, sizeof(*parallel_areas)))) {
-		log_error("parallel_areas allocation failed");
+		log_error(0, "parallel_areas allocation failed");
 		return NULL;
 	}
 
@@ -1965,7 +1965,7 @@ struct dm_list *build_parallel_areas_from_lv(struct cmd_context *cmd,
 
 	do {
 		if (!(spvs = dm_pool_zalloc(cmd->mem, sizeof(*spvs)))) {
-			log_error("allocation failed");
+			log_error(0, "allocation failed");
 			return NULL;
 		}
 
@@ -2052,25 +2052,25 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv,
 		return 0;
 
 	if (lv_is_origin(lv)) {
-		log_error("Can't remove logical volume \"%s\" under snapshot",
+		log_error(0, "Can't remove logical volume \"%s\" under snapshot",
 			  lv->name);
 		return 0;
 	}
 
 	if (lv->status & MIRROR_IMAGE) {
-		log_error("Can't remove logical volume %s used by a mirror",
+		log_error(0, "Can't remove logical volume %s used by a mirror",
 			  lv->name);
 		return 0;
 	}
 
 	if (lv->status & MIRROR_LOG) {
-		log_error("Can't remove logical volume %s used as mirror log",
+		log_error(0, "Can't remove logical volume %s used as mirror log",
 			  lv->name);
 		return 0;
 	}
 
 	if (lv->status & LOCKED) {
-		log_error("Can't remove locked LV %s", lv->name);
+		log_error(0, "Can't remove locked LV %s", lv->name);
 		return 0;
 	}
 
@@ -2078,7 +2078,7 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv,
 
 	if (lv_info(cmd, lv, &info, 1, 0)) {
 		if (info.open_count) {
-			log_error("Can't remove open logical volume \"%s\"",
+			log_error(0, "Can't remove open logical volume \"%s\"",
 				  lv->name);
 			return 0;
 		}
@@ -2099,7 +2099,7 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv,
 
 	/* FIXME Snapshot commit out of sequence if it fails after here? */
 	if (!deactivate_lv(cmd, lv)) {
-		log_error("Unable to deactivate logical volume \"%s\"",
+		log_error(0, "Unable to deactivate logical volume \"%s\"",
 			  lv->name);
 		return 0;
 	}
@@ -2113,7 +2113,7 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv,
 
 	log_verbose("Releasing logical volume \"%s\"", lv->name);
 	if (!lv_remove(lv)) {
-		log_error("Error releasing logical volume \"%s\"", lv->name);
+		log_error(0, "Error releasing logical volume \"%s\"", lv->name);
 		return 0;
 	}
 
@@ -2126,9 +2126,9 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv,
 	/* If no snapshots left, reload without -real. */
 	if (origin && !lv_is_origin(origin)) {
 		if (!suspend_lv(cmd, origin))
-			log_error("Failed to refresh %s without snapshot.", origin->name);
+			log_error(0, "Failed to refresh %s without snapshot.", origin->name);
 		else if (!resume_lv(cmd, origin))
-			log_error("Failed to resume %s.", origin->name);
+			log_error(0, "Failed to resume %s.", origin->name);
 	}
 
 	if (lv_is_visible(lv))
@@ -2185,13 +2185,13 @@ static int _split_parent_area(struct lv_segment *seg, uint32_t s,
 	while (parent_area_len > 0) {
 		/* Find the layer segment pointed at */
 		if (!(spvs = _find_seg_pvs_by_le(layer_seg_pvs, layer_le))) {
-			log_error("layer segment for %s:%" PRIu32 " not found",
+			log_error(0, "layer segment for %s:%" PRIu32 " not found",
 				  seg->lv->name, parent_le);
 			return 0;
 		}
 
 		if (spvs->le != layer_le) {
-			log_error("Incompatible layer boundary: "
+			log_error(0, "Incompatible layer boundary: "
 				  "%s:%" PRIu32 "[%" PRIu32 "] on %s:%" PRIu32,
 				  seg->lv->name, parent_le, s,
 				  seg_lv(seg, s)->name, layer_le);
@@ -2271,19 +2271,19 @@ int remove_layers_for_segments(struct cmd_context *cmd,
 
 			/* Find the layer segment pointed at */
 			if (!(lseg = find_seg_by_le(layer_lv, seg_le(seg, s)))) {
-				log_error("Layer segment found: %s:%" PRIu32,
+				log_error(0, "Layer segment found: %s:%" PRIu32,
 					  layer_lv->name, seg_le(seg, s));
 				return 0;
 			}
 
 			/* Check the segment params are compatible */
 			if (!seg_is_striped(lseg) || lseg->area_count != 1) {
-				log_error("Layer is not linear: %s:%" PRIu32,
+				log_error(0, "Layer is not linear: %s:%" PRIu32,
 					  layer_lv->name, lseg->le);
 				return 0;
 			}
 			if ((lseg->status & status_mask) != status_mask) {
-				log_error("Layer status does not match: "
+				log_error(0, "Layer status does not match: "
 					  "%s:%" PRIu32 " status: 0x%x/0x%x",
 					  layer_lv->name, lseg->le,
 					  lseg->status, status_mask);
@@ -2291,7 +2291,7 @@ int remove_layers_for_segments(struct cmd_context *cmd,
 			}
 			if (lseg->le != seg_le(seg, s) ||
 			    lseg->area_len != seg->area_len) {
-				log_error("Layer boundary mismatch: "
+				log_error(0, "Layer boundary mismatch: "
 					  "%s:%" PRIu32 "-%" PRIu32 " on "
 					  "%s:%" PRIu32 " / "
 					  "%" PRIu32 "-%" PRIu32 " / ",
@@ -2307,7 +2307,7 @@ int remove_layers_for_segments(struct cmd_context *cmd,
 			/* Replace mirror with error segment */
 			if (!(lseg->segtype =
 			      get_segtype_from_string(lv->vg->cmd, "error"))) {
-				log_error("Missing error segtype");
+				log_error(0, "Missing error segtype");
 				return 0;
 			}
 			lseg->area_count = 0;
@@ -2315,7 +2315,7 @@ int remove_layers_for_segments(struct cmd_context *cmd,
 			/* First time, add LV to list of LVs affected */
 			if (!lv_changed && lvs_changed) {
 				if (!(lvl = dm_pool_alloc(cmd->mem, sizeof(*lvl)))) {
-					log_error("lv_list alloc failed");
+					log_error(0, "lv_list alloc failed");
 					return 0;
 				}
 				lvl->lv = lv;
@@ -2364,7 +2364,7 @@ static int _move_lv_segments(struct logical_volume *lv_to,
 
 	dm_list_iterate_items(seg, &lv_to->segments) {
 		if (seg->origin) {
-			log_error("Can't move snapshot segment");
+			log_error(0, "Can't move snapshot segment");
 			return 0;
 		}
 	}
@@ -2401,7 +2401,7 @@ int remove_layer_from_lv(struct logical_volume *lv,
 	log_very_verbose("Removing layer %s for %s", layer_lv->name, lv->name);
 
 	if (!(parent_seg = get_only_segment_using_this_lv(layer_lv))) {
-		log_error("Failed to find layer %s in %s",
+		log_error(0, "Failed to find layer %s in %s",
 		layer_lv->name, lv->name);
 		return 0;
 	}
@@ -2452,20 +2452,20 @@ struct logical_volume *insert_layer_for_lv(struct cmd_context *cmd,
 	/* create an empty layer LV */
 	len = strlen(lv_where->name) + 32;
 	if (!(name = alloca(len))) {
-		log_error("layer name allocation failed. "
+		log_error(0, "layer name allocation failed. "
 			  "Remove new LV and retry.");
 		return NULL;
 	}
 
 	if (dm_snprintf(name, len, "%s%s", lv_where->name, layer_suffix) < 0) {
-		log_error("layer name allocation failed. "
+		log_error(0, "layer name allocation failed. "
 			  "Remove new LV and retry.");
 		return NULL;
 	}
 
 	if (!(layer_lv = lv_create_empty(name, NULL, LVM_READ | LVM_WRITE,
 					 ALLOC_INHERIT, lv_where->vg))) {
-		log_error("Creation of layer LV failed");
+		log_error(0, "Creation of layer LV failed");
 		return NULL;
 	}
 
@@ -2475,23 +2475,23 @@ struct logical_volume *insert_layer_for_lv(struct cmd_context *cmd,
 		segtype = get_segtype_from_string(cmd, "error");
 
 		if (!lv_add_virtual_segment(layer_lv, 0, lv_where->le_count, segtype)) {
-			log_error("Creation of transient LV %s for mirror conversion in VG %s failed.", name, lv_where->vg->name);
+			log_error(0, "Creation of transient LV %s for mirror conversion in VG %s failed.", name, lv_where->vg->name);
 			return NULL;
 		}
 
 		if (!vg_write(lv_where->vg)) {
-			log_error("Failed to write intermediate VG %s metadata for mirror conversion.", lv_where->vg->name);
+			log_error(0, "Failed to write intermediate VG %s metadata for mirror conversion.", lv_where->vg->name);
 			return NULL;
 		}
 
 		if (!vg_commit(lv_where->vg)) {
-			log_error("Failed to commit intermediate VG %s metadata for mirror conversion.", lv_where->vg->name);
+			log_error(0, "Failed to commit intermediate VG %s metadata for mirror conversion.", lv_where->vg->name);
 			vg_revert(lv_where->vg);
 			return NULL;
 		}
 
 		if (!activate_lv(cmd, layer_lv)) {
-			log_error("Failed to resume transient error LV %s for mirror conversion in VG %s.", name, lv_where->vg->name);
+			log_error(0, "Failed to resume transient error LV %s for mirror conversion in VG %s.", name, lv_where->vg->name);
 			return NULL;
 		}
 	}
@@ -2701,7 +2701,7 @@ int insert_layer_for_segments_on_pv(struct cmd_context *cmd,
 			/* First time, add LV to list of LVs affected */
 			if (!lv_used && lvs_changed) {
 				if (!(lvl = dm_pool_alloc(cmd->mem, sizeof(*lvl)))) {
-					log_error("lv_list alloc failed");
+					log_error(0, "lv_list alloc failed");
 					return 0;
 				}
 				lvl->lv = lv_where;
@@ -2711,7 +2711,7 @@ int insert_layer_for_segments_on_pv(struct cmd_context *cmd,
 
 			if (!_extend_layer_lv_for_segment(layer_lv, seg, s,
 							  status)) {
-				log_error("Failed to insert segment in layer "
+				log_error(0, "Failed to insert segment in layer "
 					  "LV %s under %s:%" PRIu32 "-%" PRIu32,
 					  layer_lv->name, lv_where->name,
 					  seg->le, seg->le + seg->len);
@@ -2740,20 +2740,20 @@ int set_lv(struct cmd_context *cmd, struct logical_volume *lv,
 	 *	   (I know the device is at least 4k, but not 32k)
 	 */
 	if (!(name = dm_pool_alloc(cmd->mem, PATH_MAX))) {
-		log_error("Name allocation failed - device not cleared");
+		log_error(0, "Name allocation failed - device not cleared");
 		return 0;
 	}
 
 	if (dm_snprintf(name, PATH_MAX, "%s%s/%s", cmd->dev_dir,
 			lv->vg->name, lv->name) < 0) {
-		log_error("Name too long - device not cleared (%s)", lv->name);
+		log_error(0, "Name too long - device not cleared (%s)", lv->name);
 		return 0;
 	}
 
 	log_verbose("Clearing start of logical volume \"%s\"", lv->name);
 
 	if (!(dev = dev_cache_get(name, NULL))) {
-		log_error("%s: not found: device not cleared", name);
+		log_error(0, "%s: not found: device not cleared", name);
 		return 0;
 	}
 
diff --git a/lib/metadata/merge.c b/lib/metadata/merge.c
index 66e9ce0..57f1354 100644
--- a/lib/metadata/merge.c
+++ b/lib/metadata/merge.c
@@ -70,7 +70,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
 	dm_list_iterate_items(seg, &lv->segments) {
 		seg_count++;
 		if (seg->le != le) {
-			log_error("LV %s invalid: segment %u should begin at "
+			log_error(0, "LV %s invalid: segment %u should begin at "
 				  "LE %" PRIu32 " (found %" PRIu32 ").",
 				  lv->name, seg_count, le, seg->le);
 			r = 0;
@@ -80,7 +80,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
 					seg->area_count : 1;
 
 		if (seg->area_len * area_multiplier != seg->len) {
-			log_error("LV %s: segment %u has inconsistent "
+			log_error(0, "LV %s: segment %u has inconsistent "
 				  "area_len %u",
 				  lv->name, seg_count, seg->area_len);
 			r = 0;
@@ -88,14 +88,14 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
 
 		if (complete_vg && seg->log_lv) {
 			if (!seg_is_mirrored(seg)) {
-				log_error("LV %s: segment %u has log LV but "
+				log_error(0, "LV %s: segment %u has log LV but "
 					  "is not mirrored",
 					  lv->name, seg_count);
 				r = 0;
 			}
 
 			if (!(seg->log_lv->status & MIRROR_LOG)) {
-				log_error("LV %s: segment %u log LV %s is not "
+				log_error(0, "LV %s: segment %u log LV %s is not "
 					  "a mirror log",
 					   lv->name, seg_count, seg->log_lv->name);
 				r = 0;
@@ -103,7 +103,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
 
 			if (!(seg2 = first_seg(seg->log_lv)) ||
 			    find_mirror_seg(seg2) != seg) {
-				log_error("LV %s: segment %u log LV does not "
+				log_error(0, "LV %s: segment %u log LV does not "
 					  "point back to mirror segment",
 					   lv->name, seg_count);
 				r = 0;
@@ -113,7 +113,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
 		if (complete_vg && seg->status & MIRROR_IMAGE) {
 			if (!find_mirror_seg(seg) ||
 			    !seg_is_mirrored(find_mirror_seg(seg))) {
-				log_error("LV %s: segment %u mirror image "
+				log_error(0, "LV %s: segment %u mirror image "
 					  "is not mirrored",
 					  lv->name, seg_count);
 				r = 0;
@@ -122,7 +122,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
 
 		if (seg_is_snapshot(seg)) {
 			if (seg->cow && seg->cow == seg->origin) {
-				log_error("LV %s: segment %u has same LV %s for "
+				log_error(0, "LV %s: segment %u has same LV %s for "
 					  "both origin and snapshot",
 					  lv->name, seg_count, seg->cow->name);
 				r = 0;
@@ -131,7 +131,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
 
 		for (s = 0; s < seg->area_count; s++) {
 			if (seg_type(seg, s) == AREA_UNASSIGNED) {
-				log_error("LV %s: segment %u has unassigned "
+				log_error(0, "LV %s: segment %u has unassigned "
 					  "area %u.",
 					  lv->name, seg_count, s);
 				r = 0;
@@ -139,7 +139,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
 				if (!seg_pvseg(seg, s) ||
 				    seg_pvseg(seg, s)->lvseg != seg ||
 				    seg_pvseg(seg, s)->lv_area != s) {
-					log_error("LV %s: segment %u has "
+					log_error(0, "LV %s: segment %u has "
 						  "inconsistent PV area %u",
 						  lv->name, seg_count, s);
 					r = 0;
@@ -148,7 +148,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
 				if (!seg_lv(seg, s) ||
 				    seg_lv(seg, s)->vg != lv->vg ||
 				    seg_lv(seg, s) == lv) {
-					log_error("LV %s: segment %u has "
+					log_error(0, "LV %s: segment %u has "
 						  "inconsistent LV area %u",
 						  lv->name, seg_count, s);
 					r = 0;
@@ -159,7 +159,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
 				    (!(seg2 = find_seg_by_le(seg_lv(seg, s),
 							    seg_le(seg, s))) ||
 				     find_mirror_seg(seg2) != seg)) {
-					log_error("LV %s: segment %u mirror "
+					log_error(0, "LV %s: segment %u mirror "
 						  "image %u missing mirror ptr",
 						  lv->name, seg_count, s);
 					r = 0;
@@ -167,7 +167,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
 
 /* FIXME I don't think this ever holds?
 				if (seg_le(seg, s) != le) {
-					log_error("LV %s: segment %u has "
+					log_error(0, "LV %s: segment %u has "
 						  "inconsistent LV area %u "
 						  "size",
 						  lv->name, seg_count, s);
@@ -179,14 +179,14 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
 					if (sl->seg == seg)
 						seg_found++;
 				if (!seg_found) {
-					log_error("LV %s segment %d uses LV %s,"
+					log_error(0, "LV %s segment %d uses LV %s,"
 						  " but missing ptr from %s to %s",
 						  lv->name, seg_count,
 						  seg_lv(seg, s)->name,
 						  seg_lv(seg, s)->name, lv->name);
 					r = 0;
 				} else if (seg_found > 1) {
-					log_error("LV %s has duplicated links "
+					log_error(0, "LV %s has duplicated links "
 						  "to LV %s segment %d",
 						  seg_lv(seg, s)->name,
 						  lv->name, seg_count);
@@ -210,14 +210,14 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
 		if (seg->log_lv == lv)
 			seg_found++;
 		if (!seg_found) {
-			log_error("LV %s is used by LV %s:%" PRIu32 "-%" PRIu32
+			log_error(0, "LV %s is used by LV %s:%" PRIu32 "-%" PRIu32
 				  ", but missing ptr from %s to %s",
 				  lv->name, seg->lv->name, seg->le,
 				  seg->le + seg->len - 1,
 				  seg->lv->name, lv->name);
 			r = 0;
 		} else if (seg_found != sl->count) {
-			log_error("Reference count mismatch: LV %s has %d "
+			log_error(0, "Reference count mismatch: LV %s has %d "
 				  "links to LV %s:%" PRIu32 "-%" PRIu32
 				  ", which has %d links",
 				  lv->name, sl->count, seg->lv->name, seg->le,
@@ -232,7 +232,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
 				break;
 			}
 		if (!seg_found) {
-			log_error("LV segment %s:%" PRIu32 "-%" PRIu32
+			log_error(0, "LV segment %s:%" PRIu32 "-%" PRIu32
 				  "is incorrectly listed as being used by LV %s",
 				  seg->lv->name, seg->le, seg->le + seg->len - 1,
 				  lv->name);
@@ -241,7 +241,7 @@ int check_lv_segments(struct logical_volume *lv, int complete_vg)
 	}
 
 	if (le != lv->le_count) {
-		log_error("LV %s: inconsistent LE count %u != %u",
+		log_error(0, "LV %s: inconsistent LE count %u != %u",
 			  lv->name, le, lv->le_count);
 		r = 0;
 	}
@@ -262,7 +262,7 @@ static int _lv_split_segment(struct logical_volume *lv, struct lv_segment *seg,
 	uint32_t area_offset;
 
 	if (!seg_can_split(seg)) {
-		log_error("Unable to split the %s segment at LE %" PRIu32
+		log_error(0, "Unable to split the %s segment at LE %" PRIu32
 			  " in LV %s", seg->segtype->name, le, lv->name);
 		return 0;
 	}
@@ -275,12 +275,12 @@ static int _lv_split_segment(struct logical_volume *lv, struct lv_segment *seg,
 					   seg->area_count, seg->area_len,
 					   seg->chunk_size, seg->region_size,
 					   seg->extents_copied))) {
-		log_error("Couldn't allocate cloned LV segment.");
+		log_error(0, "Couldn't allocate cloned LV segment.");
 		return 0;
 	}
 
 	if (!str_list_dup(lv->vg->cmd->mem, &split_seg->tags, &seg->tags)) {
-		log_error("LV segment tags duplication failed");
+		log_error(0, "LV segment tags duplication failed");
 		return 0;
 	}
 
@@ -328,7 +328,7 @@ static int _lv_split_segment(struct logical_volume *lv, struct lv_segment *seg,
 			break;
 
 		case AREA_UNASSIGNED:
-			log_error("Unassigned area %u found in segment", s);
+			log_error(0, "Unassigned area %u found in segment", s);
 			return 0;
 		}
 	}
@@ -347,7 +347,7 @@ int lv_split_segment(struct logical_volume *lv, uint32_t le)
 	struct lv_segment *seg;
 
 	if (!(seg = find_seg_by_le(lv, le))) {
-		log_error("Segment with extent %" PRIu32 " in LV %s not found",
+		log_error(0, "Segment with extent %" PRIu32 " in LV %s not found",
 			  le, lv->name);
 		return 0;
 	}
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index fda07be..6caf9dc 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -118,31 +118,31 @@ int add_pv_to_vg(struct volume_group *vg, const char *pv_name,
 		    pv_name, vg->name);
 
 	if (!(pvl = dm_pool_zalloc(mem, sizeof(*pvl)))) {
-		log_error("pv_list allocation for '%s' failed", pv_name);
+		log_error(0, "pv_list allocation for '%s' failed", pv_name);
 		return 0;
 	}
 
 	if (!is_orphan_vg(pv->vg_name)) {
-		log_error("Physical volume '%s' is already in volume group "
+		log_error(0, "Physical volume '%s' is already in volume group "
 			  "'%s'", pv_name, pv->vg_name);
 		return 0;
 	}
 
 	if (pv->fmt != fid->fmt) {
-		log_error("Physical volume %s is of different format type (%s)",
+		log_error(0, "Physical volume %s is of different format type (%s)",
 			  pv_name, pv->fmt->name);
 		return 0;
 	}
 
 	/* Ensure PV doesn't depend on another PV already in the VG */
 	if (pv_uses_vg(pv, vg)) {
-		log_error("Physical volume %s might be constructed from same "
+		log_error(0, "Physical volume %s might be constructed from same "
 			  "volume group %s", pv_name, vg->name);
 		return 0;
 	}
 
 	if (!(pv->vg_name = dm_pool_strdup(mem, vg->name))) {
-		log_error("vg->name allocation failed for '%s'", pv_name);
+		log_error(0, "vg->name allocation failed for '%s'", pv_name);
 		return 0;
 	}
 
@@ -159,19 +159,19 @@ int add_pv_to_vg(struct volume_group *vg, const char *pv_name,
 	if (!fid->fmt->ops->pv_setup(fid->fmt, UINT64_C(0), 0,
 				     vg->extent_size, 0, 0UL, UINT64_C(0),
 				     &fid->metadata_areas, pv, vg)) {
-		log_error("Format-specific setup of physical volume '%s' "
+		log_error(0, "Format-specific setup of physical volume '%s' "
 			  "failed.", pv_name);
 		return 0;
 	}
 
 	if (_find_pv_in_vg(vg, pv_name)) {
-		log_error("Physical volume '%s' listed more than once.",
+		log_error(0, "Physical volume '%s' listed more than once.",
 			  pv_name);
 		return 0;
 	}
 
 	if (vg->pv_count && (vg->pv_count == vg->max_pv)) {
-		log_error("No space for '%s' - volume group '%s' "
+		log_error(0, "No space for '%s' - volume group '%s' "
 			  "holds max %d physical volume(s).", pv_name,
 			  vg->name, vg->max_pv);
 		return 0;
@@ -184,7 +184,7 @@ int add_pv_to_vg(struct volume_group *vg, const char *pv_name,
 	dm_list_add(&vg->pvs, &pvl->list);
 
 	if ((uint64_t) vg->extent_count + pv->pe_count > UINT32_MAX) {
-		log_error("Unable to add %s to %s: new extent count (%"
+		log_error(0, "Unable to add %s to %s: new extent count (%"
 			  PRIu64 ") exceeds limit (%" PRIu32 ").",
 			  pv_name, vg->name,
 			  (uint64_t) vg->extent_count + pv->pe_count,
@@ -245,7 +245,7 @@ int get_pv_from_vg_by_id(const struct format_type *fmt, const char *vg_name,
 	int r = 0, consistent = 0;
 
 	if (!(vg = vg_read_internal(fmt->cmd, vg_name, vgid, &consistent))) {
-		log_error("get_pv_from_vg_by_id: vg_read_internal failed to read VG %s",
+		log_error(0, "get_pv_from_vg_by_id: vg_read_internal failed to read VG %s",
 			  vg_name);
 		return 0;
 	}
@@ -257,7 +257,7 @@ int get_pv_from_vg_by_id(const struct format_type *fmt, const char *vg_name,
 	dm_list_iterate_items(pvl, &vg->pvs) {
 		if (id_equal(&pvl->pv->id, (const struct id *) pvid)) {
 			if (!_copy_pv(fmt->cmd->mem, pv, pvl->pv)) {
-				log_error("internal PV duplication failed");
+				log_error(0, "internal PV duplication failed");
 				r = 0;
 				goto out;
 			}
@@ -279,7 +279,7 @@ static int validate_new_vg_name(struct cmd_context *cmd, const char *vg_name)
 
 	snprintf(vg_path, PATH_MAX, "%s%s", cmd->dev_dir, vg_name);
 	if (path_exists(vg_path)) {
-		log_error("%s: already exists in filesystem", vg_path);
+		log_error(0, "%s: already exists in filesystem", vg_path);
 		return 0;
 	}
 
@@ -298,19 +298,19 @@ int validate_vg_rename_params(struct cmd_context *cmd,
 
 	/* Check sanity of new name */
 	if (strlen(vg_name_new) > NAME_LEN - length - 2) {
-		log_error("New volume group path exceeds maximum length "
+		log_error(0, "New volume group path exceeds maximum length "
 			  "of %d!", NAME_LEN - length - 2);
 		return 0;
 	}
 
 	if (!validate_new_vg_name(cmd, vg_name_new)) {
-		log_error("New volume group name \"%s\" is invalid",
+		log_error(0, "New volume group name \"%s\" is invalid",
 			  vg_name_new);
 		return 0;
 	}
 
 	if (!strcmp(vg_name_old, vg_name_new)) {
-		log_error("Old and new volume group names must differ");
+		log_error(0, "Old and new volume group names must differ");
 		return 0;
 	}
 
@@ -324,13 +324,13 @@ int vg_rename(struct cmd_context *cmd, struct volume_group *vg,
 	struct pv_list *pvl;
 
 	if (!(vg->name = dm_pool_strdup(mem, new_name))) {
-		log_error("vg->name allocation failed for '%s'", new_name);
+		log_error(0, "vg->name allocation failed for '%s'", new_name);
 		return 0;
 	}
 
 	dm_list_iterate_items(pvl, &vg->pvs) {
 		if (!(pvl->pv->vg_name = dm_pool_strdup(mem, new_name))) {
-			log_error("pv->vg_name allocation failed for '%s'",
+			log_error(0, "pv->vg_name allocation failed for '%s'",
 				  pv_dev_name(pvl->pv));
 			return 0;
 		}
@@ -366,9 +366,9 @@ int vg_remove_single(struct cmd_context *cmd, const char *vg_name,
 	int ret = 1;
 
 	if (vg_read_error(vg) || vg_missing_pv_count(vg)) {
-		log_error("Volume group \"%s\" not found, is inconsistent "
+		log_error(0, "Volume group \"%s\" not found, is inconsistent "
 			  "or has PVs missing.", vg_name);
-		log_error("Consider vgreduce --removemissing if metadata "
+		log_error(0, "Consider vgreduce --removemissing if metadata "
 			  "is inconsistent.");
 		return 0;
 	}
@@ -394,7 +394,7 @@ int vg_remove_single(struct cmd_context *cmd, const char *vg_name,
 	lv_count = vg_visible_lvs(vg);
 
 	if (lv_count) {
-		log_error("Volume group \"%s\" still contains %u "
+		log_error(0, "Volume group \"%s\" still contains %u "
 			  "logical volume(s)", vg_name, lv_count);
 		return 0;
 	}
@@ -403,7 +403,7 @@ int vg_remove_single(struct cmd_context *cmd, const char *vg_name,
 		return 0;
 
 	if (!vg_remove(vg)) {
-		log_error("vg_remove %s failed", vg_name);
+		log_error(0, "vg_remove %s failed", vg_name);
 		return 0;
 	}
 
@@ -416,14 +416,14 @@ int vg_remove_single(struct cmd_context *cmd, const char *vg_name,
 		pv->status = ALLOCATABLE_PV;
 
 		if (!dev_get_size(pv_dev(pv), &pv->size)) {
-			log_error("%s: Couldn't get size.", pv_dev_name(pv));
+			log_error(0, "%s: Couldn't get size.", pv_dev_name(pv));
 			ret = 0;
 			continue;
 		}
 
 		/* FIXME Write to same sector label was read from */
 		if (!pv_write(cmd, pv, NULL, INT64_C(-1))) {
-			log_error("Failed to remove physical volume \"%s\""
+			log_error(0, "Failed to remove physical volume \"%s\""
 				  " from volume group \"%s\"",
 				  pv_dev_name(pv), vg_name);
 			ret = 0;
@@ -435,7 +435,7 @@ int vg_remove_single(struct cmd_context *cmd, const char *vg_name,
 	if (ret)
 		log_print("Volume group \"%s\" successfully removed", vg_name);
 	else
-		log_error("Volume group \"%s\" not properly removed", vg_name);
+		log_error(0, "Volume group \"%s\" not properly removed", vg_name);
 
 	return ret;
 }
@@ -448,7 +448,7 @@ int vg_extend(struct volume_group *vg, int pv_count, char **pv_names)
 	/* attach each pv */
 	for (i = 0; i < pv_count; i++) {
 		if (!(pv = pv_by_path(vg->fid->fmt->cmd, pv_names[i]))) {
-			log_error("%s not identified as an existing "
+			log_error(0, "%s not identified as an existing "
 				  "physical volume", pv_names[i]);
 			goto bad;
 		}
@@ -462,7 +462,7 @@ int vg_extend(struct volume_group *vg, int pv_count, char **pv_names)
 	return 1;
 	
       bad:
-	log_error("Unable to add physical volume '%s' to "
+	log_error(0, "Unable to add physical volume '%s' to "
 		  "volume group '%s'.", pv_names[i], vg->name);
 	return 0;
 }
@@ -485,19 +485,19 @@ int validate_vg_create_params(struct cmd_context *cmd,
 			      struct vgcreate_params *vp)
 {
 	if (!validate_new_vg_name(cmd, vp->vg_name)) {
-		log_error("New volume group name \"%s\" is invalid",
+		log_error(0, "New volume group name \"%s\" is invalid",
 			  vp->vg_name);
 		return 1;
 	}
 
 	if (vp->alloc == ALLOC_INHERIT) {
-		log_error("Volume Group allocation policy cannot inherit "
+		log_error(0, "Volume Group allocation policy cannot inherit "
 			  "from anything");
 		return 1;
 	}
 
 	if (!vp->extent_size) {
-		log_error("Physical extent size may not be zero");
+		log_error(0, "Physical extent size may not be zero");
 		return 1;
 	}
 
@@ -507,7 +507,7 @@ int validate_vg_create_params(struct cmd_context *cmd,
 		if (!vp->max_pv)
 			vp->max_pv = 255;
 		if (vp->max_lv > 255 || vp->max_pv > 255) {
-			log_error("Number of volumes may not exceed 255");
+			log_error(0, "Number of volumes may not exceed 255");
 			return 1;
 		}
 	}
@@ -526,7 +526,7 @@ struct volume_group *vg_create(struct cmd_context *cmd, const char *vg_name,
 
 	/* is this vg name already in use ? */
 	if ((vg = vg_read_internal(cmd, vg_name, NULL, &consistent))) {
-		log_err("A volume group called '%s' already exists.", vg_name);
+		log_error(0, "A volume group called '%s' already exists.", vg_name);
 		vg_release(vg);
 		return NULL;
 	}
@@ -538,7 +538,7 @@ struct volume_group *vg_create(struct cmd_context *cmd, const char *vg_name,
 		goto_bad;
 
 	if (!id_create(&vg->id)) {
-		log_err("Couldn't create uuid for volume group '%s'.", vg_name);
+		log_error(0, "Couldn't create uuid for volume group '%s'.", vg_name);
 		goto bad;
 	}
 
@@ -577,13 +577,13 @@ struct volume_group *vg_create(struct cmd_context *cmd, const char *vg_name,
 
 	if (!(vg->fid = cmd->fmt->ops->create_instance(cmd->fmt, vg_name,
 						       NULL, NULL))) {
-		log_error("Failed to create format instance");
+		log_error(0, "Failed to create format instance");
 		goto bad;
 	}
 
 	if (vg->fid->fmt->ops->vg_setup &&
 	    !vg->fid->fmt->ops->vg_setup(vg->fid, vg)) {
-		log_error("Format specific setup of volume group '%s' failed.",
+		log_error(0, "Format specific setup of volume group '%s' failed.",
 			  vg_name);
 		goto bad;
 	}
@@ -606,7 +606,7 @@ static int _recalc_extents(uint32_t *extents, const char *desc1,
 	uint64_t size = (uint64_t) old_size * (*extents);
 
 	if (size % new_size) {
-		log_error("New size %" PRIu64 " for %s%s not an exact number "
+		log_error(0, "New size %" PRIu64 " for %s%s not an exact number "
 			  "of new extents.", size, desc1, desc2);
 		return 0;
 	}
@@ -614,7 +614,7 @@ static int _recalc_extents(uint32_t *extents, const char *desc1,
 	size /= new_size;
 
 	if (size > UINT32_MAX) {
-		log_error("New extent count %" PRIu64 " for %s%s exceeds "
+		log_error(0, "New extent count %" PRIu64 " for %s%s exceeds "
 			  "32 bits.", size, desc1, desc2);
 		return 0;
 	}
@@ -733,7 +733,7 @@ int vg_change_pesize(struct cmd_context *cmd __attribute((unused)),
 						return_0;
 					break;
 				case AREA_UNASSIGNED:
-					log_error("Unassigned area %u found in "
+					log_error(0, "Unassigned area %u found in "
 						  "segment", s);
 					return 0;
 				}
@@ -871,13 +871,13 @@ static struct physical_volume *_pv_create(const struct format_type *fmt,
 	if (id)
 		memcpy(&pv->id, id, sizeof(*id));
 	else if (!id_create(&pv->id)) {
-		log_error("Failed to create random uuid for %s.",
+		log_error(0, "Failed to create random uuid for %s.",
 			  dev_name(dev));
 		goto bad;
 	}
 
 	if (!dev_get_size(pv->dev, &pv->size)) {
-		log_error("%s: Couldn't get size.", pv_dev_name(pv));
+		log_error(0, "%s: Couldn't get size.", pv_dev_name(pv));
 		goto bad;
 	}
 
@@ -891,13 +891,13 @@ static struct physical_volume *_pv_create(const struct format_type *fmt,
 	}
 
 	if (pv->size < PV_MIN_SIZE) {
-		log_error("%s: Size must exceed minimum of %ld sectors.",
+		log_error(0, "%s: Size must exceed minimum of %ld sectors.",
 			  pv_dev_name(pv), PV_MIN_SIZE);
 		goto bad;
 	}
 
 	if (pv->size < data_alignment) {
-		log_error("%s: Data alignment must not exceed device size.",
+		log_error(0, "%s: Data alignment must not exceed device size.",
 			  pv_dev_name(pv));
 		goto bad;
 	}
@@ -909,7 +909,7 @@ static struct physical_volume *_pv_create(const struct format_type *fmt,
 				existing_extent_size, data_alignment,
 				pvmetadatacopies, pvmetadatasize, mdas,
 				pv, NULL)) {
-		log_error("%s: Format-specific setup of physical volume "
+		log_error(0, "%s: Format-specific setup of physical volume "
 			  "failed.", pv_dev_name(pv));
 		goto bad;
 	}
@@ -1069,7 +1069,7 @@ static struct physical_volume *_find_pv_by_name(struct cmd_context *cmd,
 	struct physical_volume *pv;
 
 	if (!(pv = _pv_read(cmd, cmd->mem, pv_name, NULL, NULL, 1, 0))) {
-		log_error("Physical volume %s not found", pv_name);
+		log_error(0, "Physical volume %s not found", pv_name);
 		return NULL;
 	}
 
@@ -1078,13 +1078,13 @@ static struct physical_volume *_find_pv_by_name(struct cmd_context *cmd,
 		if (!scan_vgs_for_pvs(cmd))
 			return_NULL;
 		if (!(pv = _pv_read(cmd, cmd->mem, pv_name, NULL, NULL, 1, 0))) {
-			log_error("Physical volume %s not found", pv_name);
+			log_error(0, "Physical volume %s not found", pv_name);
 			return NULL;
 		}
 	}
 
 	if (is_orphan_vg(pv->vg_name)) {
-		log_error("Physical volume %s not in a volume group", pv_name);
+		log_error(0, "Physical volume %s not in a volume group", pv_name);
 		return NULL;
 	}
 
@@ -1177,14 +1177,14 @@ int vgs_are_compatible(struct cmd_context *cmd __attribute((unused)),
 	char *name1, *name2;
 
 	if (lvs_in_vg_activated(vg_from)) {
-		log_error("Logical volumes in \"%s\" must be inactive",
+		log_error(0, "Logical volumes in \"%s\" must be inactive",
 			  vg_from->name);
 		return 0;
 	}
 
 	/* Check compatibility */
 	if (vg_to->extent_size != vg_from->extent_size) {
-		log_error("Extent sizes differ: %d (%s) and %d (%s)",
+		log_error(0, "Extent sizes differ: %d (%s) and %d (%s)",
 			  vg_to->extent_size, vg_to->name,
 			  vg_from->extent_size, vg_from->name);
 		return 0;
@@ -1192,7 +1192,7 @@ int vgs_are_compatible(struct cmd_context *cmd __attribute((unused)),
 
 	if (vg_to->max_pv &&
 	    (vg_to->max_pv < vg_to->pv_count + vg_from->pv_count)) {
-		log_error("Maximum number of physical volumes (%d) exceeded "
+		log_error(0, "Maximum number of physical volumes (%d) exceeded "
 			  " for \"%s\" and \"%s\"", vg_to->max_pv, vg_to->name,
 			  vg_from->name);
 		return 0;
@@ -1200,7 +1200,7 @@ int vgs_are_compatible(struct cmd_context *cmd __attribute((unused)),
 
 	if (vg_to->max_lv &&
 	    (vg_to->max_lv < vg_visible_lvs(vg_to) + vg_visible_lvs(vg_from))) {
-		log_error("Maximum number of logical volumes (%d) exceeded "
+		log_error(0, "Maximum number of logical volumes (%d) exceeded "
 			  " for \"%s\" and \"%s\"", vg_to->max_lv, vg_to->name,
 			  vg_from->name);
 		return 0;
@@ -1208,14 +1208,14 @@ int vgs_are_compatible(struct cmd_context *cmd __attribute((unused)),
 
 	/* Metadata types must be the same */
 	if (vg_to->fid->fmt != vg_from->fid->fmt) {
-		log_error("Metadata types differ for \"%s\" and \"%s\"",
+		log_error(0, "Metadata types differ for \"%s\" and \"%s\"",
 			  vg_to->name, vg_from->name);
 		return 0;
 	}
 
 	/* Clustering attribute must be the same */
 	if (vg_is_clustered(vg_to) != vg_is_clustered(vg_from)) {
-		log_error("Clustered attribute differs for \"%s\" and \"%s\"",
+		log_error(0, "Clustered attribute differs for \"%s\" and \"%s\"",
 			  vg_to->name, vg_from->name);
 		return 0;
 	}
@@ -1228,7 +1228,7 @@ int vgs_are_compatible(struct cmd_context *cmd __attribute((unused)),
 			name2 = lvl2->lv->name;
 
 			if (!strcmp(name1, name2)) {
-				log_error("Duplicate logical volume "
+				log_error(0, "Duplicate logical volume "
 					  "name \"%s\" "
 					  "in \"%s\" and \"%s\"",
 					  name1, vg_to->name, vg_from->name);
@@ -1240,7 +1240,7 @@ int vgs_are_compatible(struct cmd_context *cmd __attribute((unused)),
 	/* Check no PVs are constructed from either VG */
 	dm_list_iterate_items(pvl, &vg_to->pvs) {
 		if (pv_uses_vg(pvl->pv, vg_from)) {
-			log_error("Physical volume %s might be constructed "
+			log_error(0, "Physical volume %s might be constructed "
 				  "from same volume group %s.",
 				  pv_dev_name(pvl->pv), vg_from->name);
 			return 0;
@@ -1249,7 +1249,7 @@ int vgs_are_compatible(struct cmd_context *cmd __attribute((unused)),
 
 	dm_list_iterate_items(pvl, &vg_from->pvs) {
 		if (pv_uses_vg(pvl->pv, vg_to)) {
-			log_error("Physical volume %s might be constructed "
+			log_error(0, "Physical volume %s might be constructed "
 				  "from same volume group %s.",
 				  pv_dev_name(pvl->pv), vg_to->name);
 			return 0;
@@ -1468,7 +1468,7 @@ int vg_validate(struct volume_group *vg)
 				if (!id_write_format(&pvl->pv->id, uuid,
 						     sizeof(uuid)))
 					 stack;
-				log_error("Internal error: Duplicate PV id "
+				log_error(0, "Internal error: Duplicate PV id "
 					  "%s detected for %s in %s.",
 					  uuid, pv_dev_name(pvl->pv),
 					  vg->name);
@@ -1477,14 +1477,14 @@ int vg_validate(struct volume_group *vg)
 		}
 
 		if (strcmp(pvl->pv->vg_name, vg->name)) {
-			log_error("Internal error: VG name for PV %s is corrupted",
+			log_error(0, "Internal error: VG name for PV %s is corrupted",
 				  pv_dev_name(pvl->pv));
 			r = 0;
 		}
 	}
 
 	if (!check_pv_segments(vg)) {
-		log_error("Internal error: PV segments corrupted in %s.",
+		log_error(0, "Internal error: PV segments corrupted in %s.",
 			  vg->name);
 		r = 0;
 	}
@@ -1520,7 +1520,7 @@ int vg_validate(struct volume_group *vg)
 	 */
 	if (((uint32_t) dm_list_size(&vg->lvs)) !=
 	    vg_visible_lvs(vg) + snapshot_count(vg) + hidden_lv_count) {
-		log_error("Internal error: #internal LVs (%u) != #LVs (%"
+		log_error(0, "Internal error: #internal LVs (%u) != #LVs (%"
 			  PRIu32 ") + #snapshots (%" PRIu32 ") + #internal LVs %u in VG %s",
 			  dm_list_size(&vg->lvs), vg_visible_lvs(vg),
 			  snapshot_count(vg), hidden_lv_count, vg->name);
@@ -1532,7 +1532,7 @@ int vg_validate(struct volume_group *vg)
 			if (lvl == lvl2)
 				break;
 			if (!strcmp(lvl->lv->name, lvl2->lv->name)) {
-				log_error("Internal error: Duplicate LV name "
+				log_error(0, "Internal error: Duplicate LV name "
 					  "%s detected in %s.", lvl->lv->name,
 					  vg->name);
 				r = 0;
@@ -1542,7 +1542,7 @@ int vg_validate(struct volume_group *vg)
 				if (!id_write_format(&lvl->lv->lvid.id[1], uuid,
 						     sizeof(uuid)))
 					 stack;
-				log_error("Internal error: Duplicate LV id "
+				log_error(0, "Internal error: Duplicate LV id "
 					  "%s detected for %s and %s in %s.",
 					  uuid, lvl->lv->name, lvl2->lv->name,
 					  vg->name);
@@ -1553,7 +1553,7 @@ int vg_validate(struct volume_group *vg)
 
 	dm_list_iterate_items(lvl, &vg->lvs) {
 		if (!check_lv_segments(lvl->lv, 1)) {
-			log_error("Internal error: LV segments corrupted in %s.",
+			log_error(0, "Internal error: LV segments corrupted in %s.",
 				  lvl->lv->name);
 			r = 0;
 		}
@@ -1561,7 +1561,7 @@ int vg_validate(struct volume_group *vg)
 
 	if (!(vg->fid->fmt->features & FMT_UNLIMITED_VOLS) &&
 	    (!vg->max_lv || !vg->max_pv)) {
-		log_error("Internal error: Volume group %s has limited PV/LV count"
+		log_error(0, "Internal error: Volume group %s has limited PV/LV count"
 			  " but limit is not set.", vg->name);
 		r = 0;
 	}
@@ -1585,23 +1585,23 @@ int vg_write(struct volume_group *vg)
 		return_0;
 
 	if (vg->status & PARTIAL_VG) {
-		log_error("Cannot update partial volume group %s.", vg->name);
+		log_error(0, "Cannot update partial volume group %s.", vg->name);
 		return 0;
 	}
 
 	if (vg_missing_pv_count(vg) && !vg->cmd->handles_missing_pvs) {
-		log_error("Cannot update volume group %s while physical "
+		log_error(0, "Cannot update volume group %s while physical "
 			  "volumes are missing.", vg->name);
 		return 0;
 	}
 
 	if (dm_list_empty(&vg->fid->metadata_areas)) {
-		log_error("Aborting vg_write: No metadata areas to write to!");
+		log_error(0, "Aborting vg_write: No metadata areas to write to!");
 		return 0;
 	}
 
 	if (!drop_cached_metadata(vg)) {
-		log_error("Unable to drop cached metadata for VG %s.", vg->name);
+		log_error(0, "Unable to drop cached metadata for VG %s.", vg->name);
 		return 0;
 	}
 
@@ -1610,7 +1610,7 @@ int vg_write(struct volume_group *vg)
 	/* Write to each copy of the metadata area */
 	dm_list_iterate_items(mda, &vg->fid->metadata_areas) {
 		if (!mda->ops->vg_write) {
-			log_error("Format does not support writing volume"
+			log_error(0, "Format does not support writing volume"
 				  "group metadata areas");
 			/* Revert */
 			dm_list_uniterate(mdah, &vg->fid->metadata_areas, &mda->list) {
@@ -1665,7 +1665,7 @@ int vg_commit(struct volume_group *vg)
 	int failed = 0;
 
 	if (!vgname_is_locked(vg->name)) {
-		log_error("Internal error: Attempt to write new VG metadata "
+		log_error(0, "Internal error: Attempt to write new VG metadata "
 			  "without locking %s", vg->name);
 		return cache_updated;
 	}
@@ -1687,7 +1687,7 @@ int vg_commit(struct volume_group *vg)
 
 	/* If update failed, remove any cached precommitted metadata. */
 	if (!cache_updated && !drop_cached_metadata(vg))
-		log_error("Attempt to drop cached metadata failed "
+		log_error(0, "Attempt to drop cached metadata failed "
 			  "after commit for VG %s.", vg->name);
 
 	/* If at least one mda commit succeeded, it was committed */
@@ -1707,7 +1707,7 @@ int vg_revert(struct volume_group *vg)
 	}
 
 	if (!drop_cached_metadata(vg))
-		log_error("Attempt to drop cached metadata failed "
+		log_error(0, "Attempt to drop cached metadata failed "
 			  "after reverted update for VG %s.", vg->name);
 
 	return 1;
@@ -1733,7 +1733,7 @@ static struct volume_group *_vg_read_orphans(struct cmd_context *cmd,
 		return_NULL;
 
 	if (!(vg = dm_pool_zalloc(mem, sizeof(*vg)))) {
-		log_error("vg allocation failed");
+		log_error(0, "vg allocation failed");
 		return NULL;
 	}
 	dm_list_init(&vg->pvs);
@@ -1742,7 +1742,7 @@ static struct volume_group *_vg_read_orphans(struct cmd_context *cmd,
 	vg->vgmem = mem;
 	vg->cmd = cmd;
 	if (!(vg->name = dm_pool_strdup(mem, orphan_vgname))) {
-		log_error("vg name allocation failed");
+		log_error(0, "vg name allocation failed");
 		goto bad;
 	}
 
@@ -1750,7 +1750,7 @@ static struct volume_group *_vg_read_orphans(struct cmd_context *cmd,
 	if (!(vg->fid = vginfo->fmt->ops->create_instance(vginfo->fmt,
 							  orphan_vgname, NULL,
 							  NULL))) {
-		log_error("Failed to create format instance");
+		log_error(0, "Failed to create format instance");
 		goto bad;
 	}
 
@@ -1759,7 +1759,7 @@ static struct volume_group *_vg_read_orphans(struct cmd_context *cmd,
 			continue;
 		}
 		if (!(pvl = dm_pool_zalloc(mem, sizeof(*pvl)))) {
-			log_error("pv_list allocation failed");
+			log_error(0, "pv_list allocation failed");
 			goto bad;
 		}
 		pvl->pv = pv;
@@ -1787,7 +1787,7 @@ static int _update_pv_list(struct dm_pool *pvmem, struct dm_list *all_pvs, struc
 		 * PV is not on list so add it.
 		 */
 		if (!(pvl2 = _copy_pvl(pvmem, pvl))) {
-			log_error("pv_list allocation for '%s' failed",
+			log_error(0, "pv_list allocation for '%s' failed",
 				  pv_dev_name(pvl->pv));
 			return 0;
 		}
@@ -1843,7 +1843,7 @@ static struct volume_group *_vg_read(struct cmd_context *cmd,
 
 	if (is_orphan_vg(vgname)) {
 		if (use_precommitted) {
-			log_error("Internal error: vg_read_internal requires vgname "
+			log_error(0, "Internal error: vg_read_internal requires vgname "
 				  "with pre-commit.");
 			return NULL;
 		}
@@ -1883,7 +1883,7 @@ static struct volume_group *_vg_read(struct cmd_context *cmd,
 
 	/* create format instance with appropriate metadata area */
 	if (!(fid = fmt->ops->create_instance(fmt, vgname, vgid, NULL))) {
-		log_error("Failed to create format instance");
+		log_error(0, "Failed to create format instance");
 		return NULL;
 	}
 
@@ -2000,7 +2000,7 @@ static struct volume_group *_vg_read(struct cmd_context *cmd,
 
 		/* create format instance with appropriate metadata area */
 		if (!(fid = fmt->ops->create_instance(fmt, vgname, vgid, NULL))) {
-			log_error("Failed to create format instance");
+			log_error(0, "Failed to create format instance");
 			return NULL;
 		}
 
@@ -2057,7 +2057,7 @@ static struct volume_group *_vg_read(struct cmd_context *cmd,
 	if (inconsistent) {
 		/* FIXME Test should be if we're *using* precommitted metadata not if we were searching for it */
 		if (use_precommitted) {
-			log_error("Inconsistent pre-commit metadata copies "
+			log_error(0, "Inconsistent pre-commit metadata copies "
 				  "for volume group %s", vgname);
 			vg_release(correct_vg);
 			return NULL;
@@ -2068,7 +2068,7 @@ static struct volume_group *_vg_read(struct cmd_context *cmd,
 
 		/* Don't touch if vgids didn't match */
 		if (inconsistent_vgid) {
-			log_error("Inconsistent metadata UUIDs found for "
+			log_error(0, "Inconsistent metadata UUIDs found for "
 				  "volume group %s", vgname);
 			*consistent = 0;
 			return correct_vg;
@@ -2079,7 +2079,7 @@ static struct volume_group *_vg_read(struct cmd_context *cmd,
 
 		cmd->handles_missing_pvs = 1;
 		if (!vg_write(correct_vg)) {
-			log_error("Automatic metadata correction failed");
+			log_error(0, "Automatic metadata correction failed");
 			vg_release(correct_vg);
 			cmd->handles_missing_pvs = saved_handles_missing_pvs;
 			return NULL;
@@ -2087,7 +2087,7 @@ static struct volume_group *_vg_read(struct cmd_context *cmd,
 		cmd->handles_missing_pvs = saved_handles_missing_pvs;
 
 		if (!vg_commit(correct_vg)) {
-			log_error("Automatic metadata correction commit "
+			log_error(0, "Automatic metadata correction commit "
 				  "failed");
 			vg_release(correct_vg);
 			return NULL;
@@ -2102,7 +2102,7 @@ static struct volume_group *_vg_read(struct cmd_context *cmd,
 				vg_release(correct_vg);
 				return_NULL;
 			}
-			log_error("Removing PV %s (%s) that no longer belongs to VG %s",
+			log_error(0, "Removing PV %s (%s) that no longer belongs to VG %s",
 				  pv_dev_name(pvl->pv), uuid, correct_vg->name);
 			if (!pv_write_orphan(cmd, pvl->pv)) {
 				vg_release(correct_vg);
@@ -2120,9 +2120,9 @@ static struct volume_group *_vg_read(struct cmd_context *cmd,
 	}
 
 	if ((correct_vg->status & PVMOVE) && !pvmove_mode()) {
-		log_error("WARNING: Interrupted pvmove detected in "
+		log_error(0, "WARNING: Interrupted pvmove detected in "
 			  "volume group %s", correct_vg->name);
-		log_error("Please restore the metadata by running "
+		log_error(0, "Please restore the metadata by running "
 			  "vgcfgrestore.");
 		vg_release(correct_vg);
 		return NULL;
@@ -2142,7 +2142,7 @@ struct volume_group *vg_read_internal(struct cmd_context *cmd, const char *vgnam
 		return NULL;
 
 	if (!check_pv_segments(vg)) {
-		log_error("Internal error: PV segments corrupted in %s.",
+		log_error(0, "Internal error: PV segments corrupted in %s.",
 			  vg->name);
 		vg_release(vg);
 		return NULL;
@@ -2150,7 +2150,7 @@ struct volume_group *vg_read_internal(struct cmd_context *cmd, const char *vgnam
 
 	dm_list_iterate_items(lvl, &vg->lvs) {
 		if (!check_lv_segments(lvl->lv, 1)) {
-			log_error("Internal error: LV segments corrupted in %s.",
+			log_error(0, "Internal error: LV segments corrupted in %s.",
 				  lvl->lv->name);
 			vg_release(vg);
 			return NULL;
@@ -2166,7 +2166,7 @@ void vg_release(struct volume_group *vg)
 		return;
 
 	if (vg->cmd && vg->vgmem == vg->cmd->mem)
-		log_error("Internal error: global memory pool used for VG %s",
+		log_error(0, "Internal error: global memory pool used for VG %s",
 			  vg->name);
 
 	dm_pool_destroy(vg->vgmem);
@@ -2195,7 +2195,7 @@ static struct volume_group *_vg_read_by_vgid(struct cmd_context *cmd,
 		    !strncmp((char *)vg->id.uuid, vgid, ID_LEN)) {
 
 			if (!consistent) {
-				log_error("Volume group %s metadata is "
+				log_error(0, "Volume group %s metadata is "
 					  "inconsistent", vg->name);
 			}
 			return vg;
@@ -2213,7 +2213,7 @@ static struct volume_group *_vg_read_by_vgid(struct cmd_context *cmd,
 
 	// The slow way - full scan required to cope with vgrename
 	if (!(vgnames = get_vgnames(cmd, 2))) {
-		log_error("vg_read_by_vgid: get_vgnames failed");
+		log_error(0, "vg_read_by_vgid: get_vgnames failed");
 		goto out;
 	}
 
@@ -2227,7 +2227,7 @@ static struct volume_group *_vg_read_by_vgid(struct cmd_context *cmd,
 		    !strncmp((char *)vg->id.uuid, vgid, ID_LEN)) {
 
 			if (!consistent) {
-				log_error("Volume group %s metadata is "
+				log_error(0, "Volume group %s metadata is "
 					  "inconsistent", vgname);
 				goto out;
 			}
@@ -2252,13 +2252,13 @@ struct logical_volume *lv_from_lvid(struct cmd_context *cmd, const char *lvid_s,
 
 	log_very_verbose("Finding volume group for uuid %s", lvid_s);
 	if (!(vg = _vg_read_by_vgid(cmd, (char *)lvid->id[0].uuid, precommitted))) {
-		log_error("Volume group for uuid not found: %s", lvid_s);
+		log_error(0, "Volume group for uuid not found: %s", lvid_s);
 		return NULL;
 	}
 
 	log_verbose("Found volume group \"%s\"", vg->name);
 	if (vg->status & EXPORTED_VG) {
-		log_error("Volume group \"%s\" is exported", vg->name);
+		log_error(0, "Volume group \"%s\" is exported", vg->name);
 		goto out;
 	}
 	if (!(lvl = find_lv_in_vg_by_lvid(vg, lvid))) {
@@ -2312,7 +2312,7 @@ static struct physical_volume *_pv_read(struct cmd_context *cmd,
 
 	if (!(label_read(dev, &label, UINT64_C(0)))) {
 		if (warnings)
-			log_error("No physical volume label read from %s",
+			log_error(0, "No physical volume label read from %s",
 				  pv_name);
 		return NULL;
 	}
@@ -2322,7 +2322,7 @@ static struct physical_volume *_pv_read(struct cmd_context *cmd,
 		*label_sector = label->sector;
 
 	if (!(pv = dm_pool_zalloc(pvmem, sizeof(*pv)))) {
-		log_error("pv allocation for '%s' failed", pv_name);
+		log_error(0, "pv allocation for '%s' failed", pv_name);
 		return NULL;
 	}
 
@@ -2332,7 +2332,7 @@ static struct physical_volume *_pv_read(struct cmd_context *cmd,
 	/* FIXME Move more common code up here */
 	if (!(info->fmt->ops->pv_read(info->fmt, pv_name, pv, mdas,
 	      scan_label_only))) {
-		log_error("Failed to read existing physical volume '%s'",
+		log_error(0, "Failed to read existing physical volume '%s'",
 			  pv_name);
 		return NULL;
 	}
@@ -2372,7 +2372,7 @@ static int _get_pvs(struct cmd_context *cmd, struct dm_list **pvslist)
 
 	if (pvslist) {
 		if (!(results = dm_pool_alloc(cmd->mem, sizeof(*results)))) {
-			log_error("PV list allocation failed");
+			log_error(0, "PV list allocation failed");
 			return 0;
 		}
 
@@ -2381,7 +2381,7 @@ static int _get_pvs(struct cmd_context *cmd, struct dm_list **pvslist)
 
 	/* Get list of VGs */
 	if (!(vgids = get_vgids(cmd, 0))) {
-		log_error("get_pvs: get_vgids failed");
+		log_error(0, "get_pvs: get_vgids failed");
 		return 0;
 	}
 
@@ -2410,7 +2410,7 @@ static int _get_pvs(struct cmd_context *cmd, struct dm_list **pvslist)
 		if (pvslist)
 			dm_list_iterate_items(pvl, &vg->pvs) {
 				if (!(pvl_copy = _copy_pvl(cmd->mem, pvl))) {
-					log_error("PV list allocation failed");
+					log_error(0, "PV list allocation failed");
 					vg_release(vg);
 					return 0;
 				}
@@ -2456,12 +2456,12 @@ static int _pv_write(struct cmd_context *cmd __attribute((unused)),
 	     	     struct dm_list *mdas, int64_t label_sector)
 {
 	if (!pv->fmt->ops->pv_write) {
-		log_error("Format does not support writing physical volumes");
+		log_error(0, "Format does not support writing physical volumes");
 		return 0;
 	}
 
 	if (!is_orphan_vg(pv->vg_name) || pv->pe_alloc_count) {
-		log_error("Assertion failed: can't _pv_write non-orphan PV "
+		log_error(0, "Assertion failed: can't _pv_write non-orphan PV "
 			  "(in VG %s)", pv->vg_name);
 		return 0;
 	}
@@ -2481,12 +2481,12 @@ int pv_write_orphan(struct cmd_context *cmd, struct physical_volume *pv)
 	pv->pe_alloc_count = 0;
 
 	if (!dev_get_size(pv->dev, &pv->size)) {
-		log_error("%s: Couldn't get size.", pv_dev_name(pv));
+		log_error(0, "%s: Couldn't get size.", pv_dev_name(pv));
 		return 0;
 	}
 
 	if (!_pv_write(cmd, pv, NULL, INT64_C(-1))) {
-		log_error("Failed to clear metadata from physical "
+		log_error(0, "Failed to clear metadata from physical "
 			  "volume \"%s\" after removal from \"%s\"",
 			  pv_dev_name(pv), old_vg_name);
 		return 0;
@@ -2537,7 +2537,7 @@ int pv_analyze(struct cmd_context *cmd, const char *pv_name,
 
 	dev = dev_cache_get(pv_name, cmd->filter);
 	if (!dev) {
-		log_error("Device %s not found (or ignored by filtering).",
+		log_error(0, "Device %s not found (or ignored by filtering).",
 			  pv_name);
 		return 0;
 	}
@@ -2546,7 +2546,7 @@ int pv_analyze(struct cmd_context *cmd, const char *pv_name,
 	 * First, scan for LVM labels.
 	 */
 	if (!label_read(dev, &label, label_sector)) {
-		log_error("Could not find LVM label on %s",
+		log_error(0, "Could not find LVM label on %s",
 			  pv_name);
 		return 0;
 	}
@@ -2578,26 +2578,26 @@ static uint32_t _vg_bad_status_bits(const struct volume_group *vg,
 	if ((status & CLUSTERED) &&
 	    (vg_is_clustered(vg)) && !locking_is_clustered() &&
 	    !lockingfailed()) {
-		log_error("Skipping clustered volume group %s", vg->name);
+		log_error(0, "Skipping clustered volume group %s", vg->name);
 		/* Return because other flags are considered undefined. */
 		return FAILED_CLUSTERED;
 	}
 
 	if ((status & EXPORTED_VG) &&
 	    (vg->status & EXPORTED_VG)) {
-		log_error("Volume group %s is exported", vg->name);
+		log_error(0, "Volume group %s is exported", vg->name);
 		failure |= FAILED_EXPORTED;
 	}
 
 	if ((status & LVM_WRITE) &&
 	    !(vg->status & LVM_WRITE)) {
-		log_error("Volume group %s is read-only", vg->name);
+		log_error(0, "Volume group %s is read-only", vg->name);
 		failure |= FAILED_READ_ONLY;
 	}
 
 	if ((status & RESIZEABLE_VG) &&
 	    !(vg->status & RESIZEABLE_VG)) {
-		log_error("Volume group %s is not resizeable.", vg->name);
+		log_error(0, "Volume group %s is not resizeable.", vg->name);
 		failure |= FAILED_RESIZEABLE;
 	}
 
@@ -2633,19 +2633,19 @@ vg_t *vg_lock_and_read(struct cmd_context *cmd, const char *vg_name,
 		consistent = 0;
 
 	if (!validate_name(vg_name)) {
-		log_error("Volume group name %s has invalid characters",
+		log_error(0, "Volume group name %s has invalid characters",
 			  vg_name);
 		return NULL;
 	}
 
 	if (!lock_vol(cmd, vg_name, lock_flags)) {
-		log_error("Can't get lock for %s", vg_name);
+		log_error(0, "Can't get lock for %s", vg_name);
 		return NULL;
 	}
 
 	if (!(vg = vg_read_internal(cmd, vg_name, vgid, &consistent)) ||
 	    ((misc_flags & FAIL_INCONSISTENT) && !consistent)) {
-		log_error("Volume group \"%s\" not found", vg_name);
+		log_error(0, "Volume group \"%s\" not found", vg_name);
 		unlock_and_release_vg(cmd, vg, vg_name);
 		return NULL;
 	}
@@ -2671,7 +2671,7 @@ static vg_t *_vg_make_handle(struct cmd_context *cmd,
 	if (!vg) {
 		if (!(vgmem = dm_pool_create("lvm2 vg_handle", VG_MEMPOOL_CHUNK)) ||
 		    !(vg = dm_pool_zalloc(vgmem, sizeof(*vg)))) {
-			log_error("Error allocating vg handle.");
+			log_error(0, "Error allocating vg handle.");
 			if (vgmem)
 				dm_pool_destroy(vgmem);
 			return_NULL;
@@ -2738,7 +2738,7 @@ static vg_t *_vg_lock_and_read(struct cmd_context *cmd, const char *vg_name,
 		consistent = 0;
 
 	if (!validate_name(vg_name) && !is_orphan_vg(vg_name)) {
-		log_error("Volume group name %s has invalid characters",
+		log_error(0, "Volume group name %s has invalid characters",
 			  vg_name);
 		return NULL;
 	}
@@ -2747,7 +2747,7 @@ static vg_t *_vg_lock_and_read(struct cmd_context *cmd, const char *vg_name,
 	already_locked = vgname_is_locked(lock_name);
 
 	if (!already_locked && !lock_vol(cmd, lock_name, lock_flags)) {
-		log_error("Can't get lock for %s", vg_name);
+		log_error(0, "Can't get lock for %s", vg_name);
 		return _vg_make_handle(cmd, vg, FAILED_LOCKING);
 	}
 
@@ -2762,13 +2762,13 @@ static vg_t *_vg_lock_and_read(struct cmd_context *cmd, const char *vg_name,
 	/* If consistent == 1, we get NULL here if correction fails. */
 	if (!(vg = vg_read_internal(cmd, vg_name, vgid, &consistent))) {
 		if (consistent_in && !consistent) {
-			log_error("Volume group \"%s\" inconsistent.", vg_name);
+			log_error(0, "Volume group \"%s\" inconsistent.", vg_name);
 			failure |= FAILED_INCONSISTENT;
 			goto_bad;
 		}
 
 		if (!(misc_flags & READ_CHECK_EXISTENCE))
-			log_error("Volume group \"%s\" not found", vg_name);
+			log_error(0, "Volume group \"%s\" not found", vg_name);
 		else
 			failure |= READ_CHECK_EXISTENCE;
 
@@ -2778,7 +2778,7 @@ static vg_t *_vg_lock_and_read(struct cmd_context *cmd, const char *vg_name,
 
 	if (vg_is_clustered(vg) && !locking_is_clustered() &&
 	    !lockingfailed()) {
-		log_error("Skipping clustered volume group %s", vg->name);
+		log_error(0, "Skipping clustered volume group %s", vg->name);
 		failure |= FAILED_CLUSTERED;
 		goto_bad;
 	}
@@ -2787,7 +2787,7 @@ static vg_t *_vg_lock_and_read(struct cmd_context *cmd, const char *vg_name,
 	if (!consistent && !failure) {
 		vg_release(vg);
 		if (!(vg = _recover_vg(cmd, lock_name, vg_name, vgid, lock_flags))) {
-			log_error("Recovery of volume group \"%s\" failed.",
+			log_error(0, "Recovery of volume group \"%s\" failed.",
 				  vg_name);
 			failure |= FAILED_INCONSISTENT;
 			goto_bad;
diff --git a/lib/metadata/mirror.c b/lib/metadata/mirror.c
index 5a52cfb..ee8261e 100644
--- a/lib/metadata/mirror.c
+++ b/lib/metadata/mirror.c
@@ -102,12 +102,12 @@ struct lv_segment *find_mirror_seg(struct lv_segment *seg)
 	mirror_seg = get_only_segment_using_this_lv(seg->lv);
 
 	if (!mirror_seg) {
-		log_error("Failed to find mirror_seg for %s", seg->lv->name);
+		log_error(0, "Failed to find mirror_seg for %s", seg->lv->name);
 		return NULL;
 	}
 
 	if (!seg_is_mirrored(mirror_seg)) {
-		log_error("%s on %s is not a mirror segments",
+		log_error(0, "%s on %s is not a mirror segments",
 			  mirror_seg->lv->name, seg->lv->name);
 		return NULL;
 	}
@@ -165,7 +165,7 @@ int shift_mirror_images(struct lv_segment *mirrored_seg, unsigned mimage)
 	struct lv_segment_area area;
 
 	if (mimage >= mirrored_seg->area_count) {
-		log_error("Invalid index (%u) of mirror image supplied "
+		log_error(0, "Invalid index (%u) of mirror image supplied "
 			  "to shift_mirror_images()", mimage);
 		return 0;
 	}
@@ -202,21 +202,21 @@ static int _write_log_header(struct cmd_context *cmd, struct logical_volume *lv)
 	log_header.nr_regions = xlate64((uint64_t)-1);
 
 	if (!(name = dm_pool_alloc(cmd->mem, PATH_MAX))) {
-		log_error("Name allocation failed - log header not written (%s)",
+		log_error(0, "Name allocation failed - log header not written (%s)",
 			lv->name);
 		return 0;
 	}
 
 	if (dm_snprintf(name, PATH_MAX, "%s%s/%s", cmd->dev_dir,
 			 lv->vg->name, lv->name) < 0) {
-		log_error("Name too long - log header not written (%s)", lv->name);
+		log_error(0, "Name too long - log header not written (%s)", lv->name);
 		return 0;
 	}
 
 	log_verbose("Writing log header to device, %s", lv->name);
 
 	if (!(dev = dev_cache_get(name, NULL))) {
-		log_error("%s: not found: log header not written", name);
+		log_error(0, "%s: not found: log header not written", name);
 		return 0;
 	}
 
@@ -224,7 +224,7 @@ static int _write_log_header(struct cmd_context *cmd, struct logical_volume *lv)
 		return 0;
 
 	if (!dev_write(dev, UINT64_C(0), sizeof(log_header), &log_header)) {
-		log_error("Failed to write log header to %s", name);
+		log_error(0, "Failed to write log header to %s", name);
 		dev_close_immediate(dev);
 		return 0;
 	}
@@ -247,7 +247,7 @@ static int _init_mirror_log(struct cmd_context *cmd,
 	int was_active = 0;
 
 	if (!activation() && in_sync) {
-		log_error("Aborting. Unable to create in-sync mirror log "
+		log_error(0, "Aborting. Unable to create in-sync mirror log "
 			  "while activation is disabled.");
 		return 0;
 	}
@@ -265,7 +265,7 @@ static int _init_mirror_log(struct cmd_context *cmd,
 	/* Temporary tag mirror log for activation */
 	dm_list_iterate_items(sl, tags)
 		if (!str_list_add(cmd->mem, &log_lv->tags, sl->str)) {
-			log_error("Aborting. Unable to tag mirror log.");
+			log_error(0, "Aborting. Unable to tag mirror log.");
 			goto activate_lv;
 		}
 
@@ -276,29 +276,29 @@ static int _init_mirror_log(struct cmd_context *cmd,
 	backup(log_lv->vg);
 
 	if (!activate_lv(cmd, log_lv)) {
-		log_error("Aborting. Failed to activate mirror log.");
+		log_error(0, "Aborting. Failed to activate mirror log.");
 		goto revert_new_lv;
 	}
 
 	/* Remove the temporary tags */
 	dm_list_iterate_items(sl, tags)
 		if (!str_list_del(&log_lv->tags, sl->str))
-			log_error("Failed to remove tag %s from mirror log.",
+			log_error(0, "Failed to remove tag %s from mirror log.",
 				  sl->str);
 
 	if (activation() && !set_lv(cmd, log_lv, log_lv->size,
 				    in_sync ? -1 : 0)) {
-		log_error("Aborting. Failed to wipe mirror log.");
+		log_error(0, "Aborting. Failed to wipe mirror log.");
 		goto deactivate_and_revert_new_lv;
 	}
 
 	if (activation() && !_write_log_header(cmd, log_lv)) {
-		log_error("Aborting. Failed to write mirror log header.");
+		log_error(0, "Aborting. Failed to write mirror log header.");
 		goto deactivate_and_revert_new_lv;
 	}
 
 	if (!deactivate_lv(cmd, log_lv)) {
-		log_error("Aborting. Failed to deactivate mirror log. "
+		log_error(0, "Aborting. Failed to deactivate mirror log. "
 			  "Manual intervention required.");
 		return 0;
 	}
@@ -312,7 +312,7 @@ static int _init_mirror_log(struct cmd_context *cmd,
 
 deactivate_and_revert_new_lv:
 	if (!deactivate_lv(cmd, log_lv)) {
-		log_error("Unable to deactivate mirror log LV. "
+		log_error(0, "Unable to deactivate mirror log LV. "
 			  "Manual intervention required.");
 		return 0;
 	}
@@ -322,17 +322,17 @@ revert_new_lv:
 
 	dm_list_iterate_items(sl, tags)
 		if (!str_list_del(&log_lv->tags, sl->str))
-			log_error("Failed to remove tag %s from mirror log.",
+			log_error(0, "Failed to remove tag %s from mirror log.",
 				  sl->str);
 
 	if (remove_on_failure && !lv_remove(log_lv)) {
-		log_error("Manual intervention may be required to remove "
+		log_error(0, "Manual intervention may be required to remove "
 			  "abandoned log LV before retrying.");
 		return 0;
 	}
 
 	if (!vg_write(log_lv->vg) || !vg_commit(log_lv->vg))
-		log_error("Manual intervention may be required to "
+		log_error(0, "Manual intervention may be required to "
 			  "remove/restore abandoned log LV before retrying.");
 	else
 		backup(log_lv->vg);
@@ -356,13 +356,13 @@ static int _delete_lv(struct logical_volume *mirror_lv, struct logical_volume *l
 	if (!str_list_match_list(&mirror_lv->tags, &lv->tags)) {
 		dm_list_iterate_items(sl, &mirror_lv->tags)
 			if (!str_list_add(cmd->mem, &lv->tags, sl->str)) {
-				log_error("Aborting. Unable to tag.");
+				log_error(0, "Aborting. Unable to tag.");
 				return 0;
 			}
 
 		if (!vg_write(mirror_lv->vg) ||
 		    !vg_commit(mirror_lv->vg)) {
-			log_error("Intermediate VG commit for orphan volume failed.");
+			log_error(0, "Intermediate VG commit for orphan volume failed.");
 			return 0;
 		}
 	}
@@ -510,7 +510,7 @@ static int _remove_mirror_images(struct logical_volume *lv,
 
 	if (collapse &&
 	    (removable_pvs || (old_area_count - num_removed != 1))) {
-		log_error("Incompatible parameters to _remove_mirror_images");
+		log_error(0, "Incompatible parameters to _remove_mirror_images");
 		return 0;
 	}
 
@@ -538,7 +538,7 @@ static int _remove_mirror_images(struct logical_volume *lv,
 		seg_lv(mirrored_seg, m)->status &= ~MIRROR_IMAGE;
 		lv_set_visible(seg_lv(mirrored_seg, m));
 		if (!(lvl = dm_pool_alloc(lv->vg->cmd->mem, sizeof(*lvl)))) {
-			log_error("lv_list alloc failed");
+			log_error(0, "lv_list alloc failed");
 			return 0;
 		}
 		lvl->lv = seg_lv(mirrored_seg, m);
@@ -561,7 +561,7 @@ static int _remove_mirror_images(struct logical_volume *lv,
 		lv->status &= ~MIRRORED;
 		lv->status &= ~MIRROR_NOTSYNCED;
 		if (collapse && !_merge_mirror_images(lv, &tmp_orphan_lvs)) {
-			log_error("Failed to add mirror images");
+			log_error(0, "Failed to add mirror images");
 			return 0;
 		}
 	} else if (new_area_count == 0) {
@@ -584,12 +584,12 @@ static int _remove_mirror_images(struct logical_volume *lv,
 	 */
 
 	if (!vg_write(mirrored_seg->lv->vg)) {
-		log_error("intermediate VG write failed.");
+		log_error(0, "intermediate VG write failed.");
 		return 0;
 	}
 
 	if (!suspend_lv(mirrored_seg->lv->vg->cmd, mirrored_seg->lv)) {
-		log_error("Failed to lock %s", mirrored_seg->lv->name);
+		log_error(0, "Failed to lock %s", mirrored_seg->lv->name);
 		vg_revert(mirrored_seg->lv->vg);
 		return 0;
 	}
@@ -608,12 +608,12 @@ static int _remove_mirror_images(struct logical_volume *lv,
 	 * explicitly.
 	 */
 	if (lv1 && !resume_lv(lv1->vg->cmd, lv1)) {
-		log_error("Problem resuming temporary LV, %s", lv1->name);
+		log_error(0, "Problem resuming temporary LV, %s", lv1->name);
 		return 0;
 	}
 
 	if (!resume_lv(mirrored_seg->lv->vg->cmd, mirrored_seg->lv)) {
-		log_error("Problem reactivating %s", mirrored_seg->lv->name);
+		log_error(0, "Problem reactivating %s", mirrored_seg->lv->name);
 		return 0;
 	}
 
@@ -637,7 +637,7 @@ static int _remove_mirror_images(struct logical_volume *lv,
 				      1, &lv->tags, 0)) {
 			/* As a result, unnecessary sync may run after
 			 * collapsing. But safe.*/
-			log_error("Failed to initialize log device");
+			log_error(0, "Failed to initialize log device");
 			return_0;
 		}
 	}
@@ -686,9 +686,9 @@ int remove_mirror_images(struct logical_volume *lv, uint32_t num_mirrors,
 
 	if (num_removed) {
 		if (num_removed == existing_mirrors - num_mirrors)
-			log_error("No mirror images found using specified PVs.");
+			log_error(0, "No mirror images found using specified PVs.");
 		else {
-			log_error("%u images are removed out of requested %u.",
+			log_error(0, "%u images are removed out of requested %u.",
 				  existing_mirrors - lv_mirror_count(lv),
 				  existing_mirrors - num_mirrors);
 		}
@@ -703,7 +703,7 @@ static int _mirrored_lv_in_sync(struct logical_volume *lv)
 	float sync_percent;
 
 	if (!lv_mirror_percent(lv->vg->cmd, lv, 0, &sync_percent, NULL)) {
-		log_error("Unable to determine mirror sync status of %s/%s.",
+		log_error(0, "Unable to determine mirror sync status of %s/%s.",
 			  lv->vg->name, lv->name);
 		return 0;
 	}
@@ -733,7 +733,7 @@ int collapse_mirrored_lv(struct logical_volume *lv)
 	while ((tmp_lv = find_temporary_mirror(lv))) {
 		mirror_seg = find_mirror_seg(first_seg(tmp_lv));
 		if (!mirror_seg) {
-			log_error("Failed to find mirrored LV for %s",
+			log_error(0, "Failed to find mirrored LV for %s",
 				  tmp_lv->name);
 			return 0;
 		}
@@ -747,7 +747,7 @@ int collapse_mirrored_lv(struct logical_volume *lv)
 		if (!_remove_mirror_images(mirror_seg->lv,
 					   mirror_seg->area_count - 1,
 					   NULL, 1, 1, NULL)) {
-			log_error("Failed to release mirror images");
+			log_error(0, "Failed to release mirror images");
 			return 0;
 		}
 	}
@@ -775,9 +775,9 @@ static int get_mirror_fault_policy(struct cmd_context *cmd __attribute((unused))
 		return MIRROR_ALLOCATE_ANYWHERE;
 
 	if (log_policy)
-		log_error("Bad activation/mirror_log_fault_policy");
+		log_error(0, "Bad activation/mirror_log_fault_policy");
 	else
-		log_error("Bad activation/mirror_device_fault_policy");
+		log_error(0, "Bad activation/mirror_device_fault_policy");
 
 	return MIRROR_REMOVE;
 }
@@ -815,14 +815,14 @@ static int replace_mirror_images(struct lv_segment *mirrored_seg,
 	/* FIXME: Use lvconvert rather than duplicating its code */
 
 	if (mirrored_seg->area_count < num_mirrors) {
-		log_error("WARNING: Failed to replace mirror device in %s/%s",
+		log_error(0, "WARNING: Failed to replace mirror device in %s/%s",
 			  mirrored_seg->lv->vg->name, mirrored_seg->lv->name);
 
 		if ((mirrored_seg->area_count > 1) && !mirrored_seg->log_lv)
-			log_error("WARNING: Use 'lvconvert -m %d %s/%s --corelog' to replace failed devices",
+			log_error(0, "WARNING: Use 'lvconvert -m %d %s/%s --corelog' to replace failed devices",
 				  num_mirrors - 1, lv->vg->name, lv->name);
 		else
-			log_error("WARNING: Use 'lvconvert -m %d %s/%s' to replace failed devices",
+			log_error(0, "WARNING: Use 'lvconvert -m %d %s/%s' to replace failed devices",
 				  num_mirrors - 1, lv->vg->name, lv->name);
 		r = 0;
 
@@ -836,10 +836,10 @@ static int replace_mirror_images(struct lv_segment *mirrored_seg,
 	 */
 	if ((mirrored_seg->area_count > 1) && !mirrored_seg->log_lv &&
 	    (log_policy != MIRROR_REMOVE)) {
-		log_error("WARNING: Failed to replace mirror log device in %s/%s",
+		log_error(0, "WARNING: Failed to replace mirror log device in %s/%s",
 			  lv->vg->name, lv->name);
 
-		log_error("WARNING: Use 'lvconvert -m %d %s/%s' to replace failed devices",
+		log_error(0, "WARNING: Use 'lvconvert -m %d %s/%s' to replace failed devices",
 			  mirrored_seg->area_count - 1 , lv->vg->name, lv->name);
 		r = 0;
 	}
@@ -885,7 +885,7 @@ int reconfigure_mirror_images(struct lv_segment *mirrored_seg, uint32_t num_mirr
 
 	if (!r)
 		/* Failed to replace device(s) */
-		log_error("WARNING: Unable to find substitute device for mirror volume, %s/%s",
+		log_error(0, "WARNING: Unable to find substitute device for mirror volume, %s/%s",
 			  mirrored_seg->lv->vg->name, mirrored_seg->lv->name);
 	else if (r > 0)
 		/* Success in replacing device(s) */
@@ -918,13 +918,13 @@ static int _create_mimage_lvs(struct alloc_handle *ah,
 	
 	len = strlen(lv->name) + 32;
 	if (!(img_name = alloca(len))) {
-		log_error("img_name allocation failed. "
+		log_error(0, "img_name allocation failed. "
 			  "Remove new LV and retry.");
 		return 0;
 	}
 
 	if (dm_snprintf(img_name, len, "%s_mimage_%%d", lv->name) < 0) {
-		log_error("img_name allocation failed. "
+		log_error(0, "img_name allocation failed. "
 			  "Remove new LV and retry.");
 		return 0;
 	}
@@ -933,7 +933,7 @@ static int _create_mimage_lvs(struct alloc_handle *ah,
 		if (!(img_lvs[m] = lv_create_empty(img_name,
 					     NULL, LVM_READ | LVM_WRITE,
 					     ALLOC_INHERIT, lv->vg))) {
-			log_error("Aborting. Failed to create mirror image LV. "
+			log_error(0, "Aborting. Failed to create mirror image LV. "
 				  "Remove new LV and retry.");
 			return 0;
 		}
@@ -942,7 +942,7 @@ static int _create_mimage_lvs(struct alloc_handle *ah,
 				    get_segtype_from_string(lv->vg->cmd,
 							    "striped"),
 				    0, 0, 0, NULL)) {
-			log_error("Aborting. Failed to add mirror image segment "
+			log_error(0, "Aborting. Failed to add mirror image segment "
 				  "to %s. Remove new LV and retry.",
 				  img_lvs[m]->name);
 			return 0;
@@ -967,11 +967,11 @@ int remove_mirrors_from_segments(struct logical_volume *lv,
 	/* Check the segment params are compatible */
 	dm_list_iterate_items(seg, &lv->segments) {
 		if (!seg_is_mirrored(seg)) {
-			log_error("Segment is not mirrored: %s:%" PRIu32,
+			log_error(0, "Segment is not mirrored: %s:%" PRIu32,
 				  lv->name, seg->le);
 			return 0;
 		} if ((seg->status & status_mask) != status_mask) {
-			log_error("Segment status does not match: %s:%" PRIu32
+			log_error(0, "Segment status does not match: %s:%" PRIu32
 				  " status:0x%x/0x%x", lv->name, seg->le,
 				  seg->status, status_mask);
 			return 0;
@@ -1081,7 +1081,7 @@ struct dm_list *lvs_using_lv(struct cmd_context *cmd, struct volume_group *vg,
 	uint32_t s;
 
 	if (!(lvs = dm_pool_alloc(cmd->mem, sizeof(*lvs)))) {
-		log_error("lvs list alloc failed");
+		log_error(0, "lvs list alloc failed");
 		return NULL;
 	}
 
@@ -1100,7 +1100,7 @@ struct dm_list *lvs_using_lv(struct cmd_context *cmd, struct volume_group *vg,
 				    seg_lv(seg, s) != lv)
 					continue;
 				if (!(lvl = dm_pool_alloc(cmd->mem, sizeof(*lvl)))) {
-					log_error("lv_list alloc failed");
+					log_error(0, "lv_list alloc failed");
 					return NULL;
 				}
 				lvl->lv = lv1;
@@ -1180,12 +1180,12 @@ int add_mirrors_to_segments(struct cmd_context *cmd, struct logical_volume *lv,
 	if (!(ah = allocate_extents(lv->vg, NULL, segtype, 1, mirrors, 0, 0,
 				    lv->le_count, allocatable_pvs, alloc,
 				    parallel_areas))) {
-		log_error("Unable to allocate mirror extents for %s.", lv->name);
+		log_error(0, "Unable to allocate mirror extents for %s.", lv->name);
 		return 0;
 	}
 
 	if (!lv_add_mirror_areas(ah, lv, 0, adjusted_region_size)) {
-		log_error("Failed to add mirror areas to %s", lv->name);
+		log_error(0, "Failed to add mirror areas to %s", lv->name);
 		r = 0;
 	}
 
@@ -1208,18 +1208,18 @@ int remove_mirror_log(struct cmd_context *cmd,
 
 	/* Unimplemented features */
 	if (dm_list_size(&lv->segments) != 1) {
-		log_error("Multiple-segment mirror is not supported");
+		log_error(0, "Multiple-segment mirror is not supported");
 		return 0;
 	}
 
 	/* Had disk log, switch to core. */
 	if (lv_info(cmd, lv, &info, 0, 0) && info.exists) {
 		if (!lv_mirror_percent(cmd, lv, 0, &sync_percent, NULL)) {
-			log_error("Unable to determine mirror sync status.");
+			log_error(0, "Unable to determine mirror sync status.");
 			return 0;
 		}
 	} else if (vg_is_clustered(vg)) {
-		log_error("Unable to convert the log of inactive "
+		log_error(0, "Unable to convert the log of inactive "
 			  "cluster mirror %s", lv->name);
 		return 0;
 	} else if (yes_no_prompt("Full resync required to convert "
@@ -1256,12 +1256,12 @@ static struct logical_volume *_create_mirror_log(struct logical_volume *lv,
 
 	len = strlen(lv_name) + 32;
 	if (!(log_name = alloca(len))) {
-		log_error("log_name allocation failed.");
+		log_error(0, "log_name allocation failed.");
 		return NULL;
 	}
 
 	if (dm_snprintf(log_name, len, "%s%s", lv_name, suffix) < 0) {
-		log_error("log_name allocation failed.");
+		log_error(0, "log_name allocation failed.");
 		return NULL;
 	}
 
@@ -1293,7 +1293,7 @@ static struct logical_volume *_set_up_mirror_log(struct cmd_context *cmd,
 	init_mirror_in_sync(in_sync);
 
 	if (log_count != 1) {
-		log_error("log_count != 1 is not supported.");
+		log_error(0, "log_count != 1 is not supported.");
 		return NULL;
 	}
 
@@ -1314,7 +1314,7 @@ static struct logical_volume *_set_up_mirror_log(struct cmd_context *cmd,
 		len = c - lv->name + 1;
 		if (!(lv_name = alloca(len)) ||
 		    !dm_snprintf(lv_name, len, "%s", lv->name)) {
-			log_error("mirror log name allocation failed");
+			log_error(0, "mirror log name allocation failed");
 			return 0;
 		}
 		suffix = "_mlog";
@@ -1325,12 +1325,12 @@ static struct logical_volume *_set_up_mirror_log(struct cmd_context *cmd,
 
 	if (!(log_lv = _create_mirror_log(lv, ah, alloc,
 					  (const char *) lv_name, suffix))) {
-		log_error("Failed to create mirror log.");
+		log_error(0, "Failed to create mirror log.");
 		return NULL;
 	}
 
 	if (!_init_mirror_log(cmd, log_lv, in_sync, &lv->tags, 1)) {
-		log_error("Failed to create mirror log.");
+		log_error(0, "Failed to create mirror log.");
 		return NULL;
 	}
 
@@ -1360,12 +1360,12 @@ int add_mirror_log(struct cmd_context *cmd, struct logical_volume *lv,
 
 	/* Unimplemented features */
 	if (log_count > 1) {
-		log_error("log_count > 1 is not supported");
+		log_error(0, "log_count > 1 is not supported");
 		return 0;
 	}
 
 	if (dm_list_size(&lv->segments) != 1) {
-		log_error("Multiple-segment mirror is not supported");
+		log_error(0, "Multiple-segment mirror is not supported");
 		return 0;
 	}
 
@@ -1376,7 +1376,7 @@ int add_mirror_log(struct cmd_context *cmd, struct logical_volume *lv,
 	 */
 	if (vg_is_clustered(lv->vg) &&
 	    !(lv_info(cmd, lv, &info, 0, 0) && info.exists)) {
-		log_error("Unable to convert the log of inactive "
+		log_error(0, "Unable to convert the log of inactive "
 			  "cluster mirror %s", lv->name);
 		return 0;
 	}
@@ -1389,7 +1389,7 @@ int add_mirror_log(struct cmd_context *cmd, struct logical_volume *lv,
 
 	if (activation() && segtype->ops->target_present &&
 	    !segtype->ops->target_present(cmd, NULL, NULL)) {
-		log_error("%s: Required device-mapper target(s) not "
+		log_error(0, "%s: Required device-mapper target(s) not "
 			  "detected in your kernel", segtype->name);
 		return 0;
 	}
@@ -1399,7 +1399,7 @@ int add_mirror_log(struct cmd_context *cmd, struct logical_volume *lv,
 			      0, 0, log_count, region_size, 0,
 			      allocatable_pvs, alloc, parallel_areas);
 	if (!ah) {
-		log_error("Unable to allocate extents for mirror log.");
+		log_error(0, "Unable to allocate extents for mirror log.");
 		return 0;
 	}
 
@@ -1438,7 +1438,7 @@ int add_mirror_images(struct cmd_context *cmd, struct logical_volume *lv,
 	struct logical_volume *log_lv = NULL;
 
 	if (stripes > 1) {
-		log_error("stripes > 1 is not supported");
+		log_error(0, "stripes > 1 is not supported");
 		return 0;
 	}
 
@@ -1456,7 +1456,7 @@ int add_mirror_images(struct cmd_context *cmd, struct logical_volume *lv,
 			      stripes, mirrors, log_count, region_size, lv->le_count,
 			      allocatable_pvs, alloc, parallel_areas);
 	if (!ah) {
-		log_error("Unable to allocate extents for mirror(s).");
+		log_error(0, "Unable to allocate extents for mirror(s).");
 		return 0;
 	}
 
@@ -1486,7 +1486,7 @@ int add_mirror_images(struct cmd_context *cmd, struct logical_volume *lv,
 	 * create mirror image LVs
 	 */
 	if (!(img_lvs = alloca(sizeof(*img_lvs) * mirrors))) {
-		log_error("img_lvs allocation failed. "
+		log_error(0, "img_lvs allocation failed. "
 			  "Remove new LV and retry.");
 		goto out_remove_log;
 	}
@@ -1497,7 +1497,7 @@ int add_mirror_images(struct cmd_context *cmd, struct logical_volume *lv,
 	if (!lv_add_mirror_lvs(lv, img_lvs, mirrors,
 			       MIRROR_IMAGE | (lv->status & LOCKED),
 			       region_size)) {
-		log_error("Aborting. Failed to add mirror segment. "
+		log_error(0, "Aborting. Failed to add mirror segment. "
 			  "Remove new LV and retry.");
 		goto out_remove_images;
 	}
@@ -1513,7 +1513,7 @@ int add_mirror_images(struct cmd_context *cmd, struct logical_volume *lv,
 		if (!lv_remove(log_lv) ||
 		    !vg_write(log_lv->vg) ||
 		    !vg_commit(log_lv->vg))
-			log_error("Manual intervention may be required to remove "
+			log_error(0, "Manual intervention may be required to remove "
 				  "abandoned log LV before retrying.");
 		else
 			backup(log_lv->vg);
@@ -1534,7 +1534,7 @@ int lv_add_mirrors(struct cmd_context *cmd, struct logical_volume *lv,
 		   struct dm_list *pvs, alloc_policy_t alloc, uint32_t flags)
 {
 	if (!mirrors && !log_count) {
-		log_error("No conversion is requested");
+		log_error(0, "No conversion is requested");
 		return 0;
 	}
 
@@ -1550,12 +1550,12 @@ int lv_add_mirrors(struct cmd_context *cmd, struct logical_volume *lv,
 
 	if (flags & MIRROR_BY_SEG) {
 		if (log_count) {
-			log_error("Persistent log is not supported on "
+			log_error(0, "Persistent log is not supported on "
 				  "segment-by-segment mirroring");
 			return 0;
 		}
 		if (stripes > 1) {
-			log_error("Striped-mirroring is not supported on "
+			log_error(0, "Striped-mirroring is not supported on "
 				  "segment-by-segment mirroring");
 			return 0;
 		}
@@ -1571,7 +1571,7 @@ int lv_add_mirrors(struct cmd_context *cmd, struct logical_volume *lv,
 					 pvs, alloc, log_count);
 	}
 
-	log_error("Unsupported mirror conversion type");
+	log_error(0, "Unsupported mirror conversion type");
 	return 0;
 }
 
@@ -1589,18 +1589,18 @@ int lv_remove_mirrors(struct cmd_context *cmd __attribute((unused)),
 	struct lv_segment *seg;
 
 	if (!mirrors && !log_count) {
-		log_error("No conversion is requested");
+		log_error(0, "No conversion is requested");
 		return 0;
 	}
 
 	seg = first_seg(lv);
 	if (!seg_is_mirrored(seg)) {
-		log_error("Not a mirror segment");
+		log_error(0, "Not a mirror segment");
 		return 0;
 	}
 
 	if (lv_mirror_count(lv) <= mirrors) {
-		log_error("Removing more than existing: %d <= %d",
+		log_error(0, "Removing more than existing: %d <= %d",
 			  seg->area_count, mirrors);
 		return 0;
 	}
@@ -1614,7 +1614,7 @@ int lv_remove_mirrors(struct cmd_context *cmd __attribute((unused)),
 
 	/* MIRROR_BY_SEG */
 	if (log_count) {
-		log_error("Persistent log is not supported on "
+		log_error(0, "Persistent log is not supported on "
 			  "segment-by-segment mirroring");
 		return 0;
 	}
diff --git a/lib/metadata/pv_manip.c b/lib/metadata/pv_manip.c
index 1b0a457..64aa9c7 100644
--- a/lib/metadata/pv_manip.c
+++ b/lib/metadata/pv_manip.c
@@ -30,7 +30,7 @@ static struct pv_segment *_alloc_pv_segment(struct dm_pool *mem,
 	struct pv_segment *peg;
 
 	if (!(peg = dm_pool_zalloc(mem, sizeof(*peg)))) {
-		log_error("pv_segment allocation failed");
+		log_error(0, "pv_segment allocation failed");
 		return NULL;
 	}
 
@@ -115,7 +115,7 @@ int pv_split_segment(struct physical_volume *pv, uint32_t pe)
 		return 1;
 
 	if (!(peg = find_peg_by_pe(pv, pe))) {
-		log_error("Segment with extent %" PRIu32 " in PV %s not found",
+		log_error(0, "Segment with extent %" PRIu32 " in PV %s not found",
 			  pe, pv_dev_name(pv));
 		return 0;
 	}
@@ -151,7 +151,7 @@ struct pv_segment *assign_peg_to_lvseg(struct physical_volume *pv,
 		return_NULL;
 
 	if (!(peg = find_peg_by_pe(pv, pe))) {
-		log_error("Missing PV segment on %s at %u.",
+		log_error(0, "Missing PV segment on %s at %u.",
 			  pv_dev_name(pv), pe);
 		return NULL;
 	}
@@ -168,7 +168,7 @@ struct pv_segment *assign_peg_to_lvseg(struct physical_volume *pv,
 int release_pv_segment(struct pv_segment *peg, uint32_t area_reduction)
 {
 	if (!peg->lvseg) {
-		log_error("release_pv_segment with unallocated segment: "
+		log_error(0, "release_pv_segment with unallocated segment: "
 			  "%s PE %" PRIu32, pv_dev_name(peg->pv), peg->pe);
 		return 0;
 	}
@@ -272,21 +272,21 @@ int check_pv_segments(struct volume_group *vg)
 				  peg->lvseg ? peg->lvseg->le : 0, s);
 			/* FIXME Add details here on failure instead */
 			if (start_pe != peg->pe) {
-				log_error("Gap in pvsegs: %u, %u",
+				log_error(0, "Gap in pvsegs: %u, %u",
 					  start_pe, peg->pe);
 				ret = 0;
 			}
 			if (peg->lvseg) {
 				if (seg_type(peg->lvseg, s) != AREA_PV) {
-					log_error("Wrong lvseg area type");
+					log_error(0, "Wrong lvseg area type");
 					ret = 0;
 				}
 				if (seg_pvseg(peg->lvseg, s) != peg) {
-					log_error("Inconsistent pvseg pointers");
+					log_error(0, "Inconsistent pvseg pointers");
 					ret = 0;
 				}
 				if (peg->lvseg->area_len != peg->len) {
-					log_error("Inconsistent length: %u %u",
+					log_error(0, "Inconsistent length: %u %u",
 						  peg->len,
 						  peg->lvseg->area_len);
 					ret = 0;
@@ -297,13 +297,13 @@ int check_pv_segments(struct volume_group *vg)
 		}
 
 		if (start_pe != pv->pe_count) {
-			log_error("PV segment pe_count mismatch: %u != %u",
+			log_error(0, "PV segment pe_count mismatch: %u != %u",
 				  start_pe, pv->pe_count);
 			ret = 0;
 		}
 
 		if (alloced != pv->pe_alloc_count) {
-			log_error("PV segment pe_alloc_count mismatch: "
+			log_error(0, "PV segment pe_alloc_count mismatch: "
 				  "%u != %u", alloced, pv->pe_alloc_count);
 			ret = 0;
 		}
@@ -313,19 +313,19 @@ int check_pv_segments(struct volume_group *vg)
 	}
 
 	if (pv_count != vg->pv_count) {
-		log_error("PV segment VG pv_count mismatch: %u != %u",
+		log_error(0, "PV segment VG pv_count mismatch: %u != %u",
 			  pv_count, vg->pv_count);
 		ret = 0;
 	}
 
 	if (free_count != vg->free_count) {
-		log_error("PV segment VG free_count mismatch: %u != %u",
+		log_error(0, "PV segment VG free_count mismatch: %u != %u",
 			  free_count, vg->free_count);
 		ret = 0;
 	}
 
 	if (extent_count != vg->extent_count) {
-		log_error("PV segment VG extent_count mismatch: %u != %u",
+		log_error(0, "PV segment VG extent_count mismatch: %u != %u",
 			  extent_count, vg->extent_count);
 		ret = 0;
 	}
@@ -339,7 +339,7 @@ static int _reduce_pv(struct physical_volume *pv, struct volume_group *vg, uint3
 	uint32_t old_pe_count = pv->pe_count;
 
 	if (new_pe_count < pv->pe_alloc_count) {
-		log_error("%s: cannot resize to %" PRIu32 " extents "
+		log_error(0, "%s: cannot resize to %" PRIu32 " extents "
 			  "as %" PRIu32 " are allocated.",
 			  pv_dev_name(pv), new_pe_count,
 			  pv->pe_alloc_count);
@@ -352,7 +352,7 @@ static int _reduce_pv(struct physical_volume *pv, struct volume_group *vg, uint3
 			continue;
 
 		if (peg->lvseg) {
-			log_error("%s: cannot resize to %" PRIu32 " extents as "
+			log_error(0, "%s: cannot resize to %" PRIu32 " extents as "
 				  "later ones are allocated.",
 				  pv_dev_name(pv), new_pe_count);
 			return 0;
@@ -382,7 +382,7 @@ static int _extend_pv(struct physical_volume *pv, struct volume_group *vg,
 	uint32_t old_pe_count = pv->pe_count;
 
 	if ((uint64_t) new_pe_count * pv->pe_size > pv->size ) {
-		log_error("%s: cannot resize to %" PRIu32 " extents as there "
+		log_error(0, "%s: cannot resize to %" PRIu32 " extents as there "
 			  "is only room for %" PRIu64 ".", pv_dev_name(pv),
 			  new_pe_count, pv->size / pv->pe_size);
 		return 0;
diff --git a/lib/metadata/pv_map.c b/lib/metadata/pv_map.c
index 642629b..ad94096 100644
--- a/lib/metadata/pv_map.c
+++ b/lib/metadata/pv_map.c
@@ -166,14 +166,14 @@ struct dm_list *create_pv_maps(struct dm_pool *mem, struct volume_group *vg,
 	struct dm_list *pvms;
 
 	if (!(pvms = dm_pool_zalloc(mem, sizeof(*pvms)))) {
-		log_error("create_pv_maps alloc failed");
+		log_error(0, "create_pv_maps alloc failed");
 		return NULL;
 	}
 
 	dm_list_init(pvms);
 
 	if (!_create_maps(mem, allocatable_pvs, pvms)) {
-		log_error("Couldn't create physical volume maps in %s",
+		log_error(0, "Couldn't create physical volume maps in %s",
 			  vg->name);
 		dm_pool_free(mem, pvms);
 		return NULL;
diff --git a/lib/metadata/segtype.c b/lib/metadata/segtype.c
index b2d4ebf..378b6c7 100644
--- a/lib/metadata/segtype.c
+++ b/lib/metadata/segtype.c
@@ -27,6 +27,6 @@ struct segment_type *get_segtype_from_string(struct cmd_context *cmd,
 			return segtype;
 	}
 
-	log_error("Unrecognised segment type %s", str);
+	log_error(0, "Unrecognised segment type %s", str);
 	return NULL;
 }
diff --git a/lib/metadata/snapshot_manip.c b/lib/metadata/snapshot_manip.c
index 83bc385..1ca8c7b 100644
--- a/lib/metadata/snapshot_manip.c
+++ b/lib/metadata/snapshot_manip.c
@@ -94,12 +94,12 @@ int vg_add_snapshot(struct logical_volume *origin,
 	 * Is the cow device already being used ?
 	 */
 	if (lv_is_cow(cow)) {
-		log_err("'%s' is already in use as a snapshot.", cow->name);
+		log_error(0, "'%s' is already in use as a snapshot.", cow->name);
 		return 0;
 	}
 
 	if (cow == origin) {
-		log_error("Snapshot and origin LVs must differ.");
+		log_error(0, "Snapshot and origin LVs must differ.");
 		return 0;
 	}
 
@@ -124,7 +124,7 @@ int vg_remove_snapshot(struct logical_volume *cow)
 	cow->snapshot->origin->origin_count--;
 
 	if (!lv_remove(cow->snapshot->lv)) {
-		log_error("Failed to remove internal snapshot LV %s",
+		log_error(0, "Failed to remove internal snapshot LV %s",
 			  cow->snapshot->lv->name);
 		return 0;
 	}
diff --git a/lib/mirror/mirrored.c b/lib/mirror/mirrored.c
index b243ebb..89e6b04 100644
--- a/lib/mirror/mirrored.c
+++ b/lib/mirror/mirrored.c
@@ -77,7 +77,7 @@ static void _mirrored_display(const struct lv_segment *seg)
 static int _mirrored_text_import_area_count(struct config_node *sn, uint32_t *area_count)
 {
 	if (!get_config_uint32(sn, "mirror_count", area_count)) {
-		log_error("Couldn't read 'mirror_count' for "
+		log_error(0, "Couldn't read 'mirror_count' for "
 			  "segment '%s'.", sn->key);
 		return 0;
 	}
@@ -96,7 +96,7 @@ static int _mirrored_text_import(struct lv_segment *seg, const struct config_nod
 				      &seg->extents_copied))
 			seg->status |= PVMOVE;
 		else {
-			log_error("Couldn't read 'extents_moved' for "
+			log_error(0, "Couldn't read 'extents_moved' for "
 				  "segment '%s'.", sn->key);
 			return 0;
 		}
@@ -105,7 +105,7 @@ static int _mirrored_text_import(struct lv_segment *seg, const struct config_nod
 	if (find_config_node(sn, "region_size")) {
 		if (!get_config_uint32(sn, "region_size",
 				      &seg->region_size)) {
-			log_error("Couldn't read 'region_size' for "
+			log_error(0, "Couldn't read 'region_size' for "
 				  "segment '%s'.", sn->key);
 			return 0;
 		}
@@ -113,12 +113,12 @@ static int _mirrored_text_import(struct lv_segment *seg, const struct config_nod
 
 	if ((cn = find_config_node(sn, "mirror_log"))) {
 		if (!cn->v || !cn->v->v.str) {
-			log_error("Mirror log type must be a string.");
+			log_error(0, "Mirror log type must be a string.");
 			return 0;
 		}
 		logname = cn->v->v.str;
 		if (!(seg->log_lv = find_lv(seg->lv->vg, logname))) {
-			log_error("Unrecognised mirror log in segment %s.",
+			log_error(0, "Unrecognised mirror log in segment %s.",
 				  sn->key);
 			return 0;
 		}
@@ -126,13 +126,13 @@ static int _mirrored_text_import(struct lv_segment *seg, const struct config_nod
 	}
 
 	if (logname && !seg->region_size) {
-		log_error("Missing region size for mirror log for segment "
+		log_error(0, "Missing region size for mirror log for segment "
 			  "'%s'.", sn->key);
 		return 0;
 	}
 
 	if (!(cn = find_config_node(sn, "mirrors"))) {
-		log_error("Couldn't find mirrors array for segment "
+		log_error(0, "Couldn't find mirrors array for segment "
 			  "'%s'.", sn->key);
 		return 0;
 	}
@@ -161,7 +161,7 @@ static struct mirror_state *_mirrored_init_target(struct dm_pool *mem,
 	struct mirror_state *mirr_state;
 
 	if (!(mirr_state = dm_pool_alloc(mem, sizeof(*mirr_state)))) {
-		log_error("struct mirr_state allocation failed");
+		log_error(0, "struct mirr_state allocation failed");
 		return NULL;
 	}
 
@@ -193,7 +193,7 @@ static int _mirrored_target_percent(void **target_state, struct dm_pool *mem,
 	log_debug("Mirror status: %s", params);
 
 	if (sscanf(pos, "%u %n", &mirror_count, &used) != 1) {
-		log_error("Failure parsing mirror status mirror count: %s",
+		log_error(0, "Failure parsing mirror status mirror count: %s",
 			  params);
 		return 0;
 	}
@@ -201,7 +201,7 @@ static int _mirrored_target_percent(void **target_state, struct dm_pool *mem,
 
 	for (m = 0; m < mirror_count; m++) {
 		if (sscanf(pos, "%*x:%*x %n", &used) != 0) {
-			log_error("Failure parsing mirror status devices: %s",
+			log_error(0, "Failure parsing mirror status devices: %s",
 				  params);
 			return 0;
 		}
@@ -210,7 +210,7 @@ static int _mirrored_target_percent(void **target_state, struct dm_pool *mem,
 
 	if (sscanf(pos, "%" PRIu64 "/%" PRIu64 "%n", &numerator, &denominator,
 		   &used) != 2) {
-		log_error("Failure parsing mirror status fraction: %s", params);
+		log_error(0, "Failure parsing mirror status fraction: %s", params);
 		return 0;
 	}
 	pos += used;
@@ -242,14 +242,14 @@ static int _add_log(struct dev_manager *dm, struct lv_segment *seg,
 	if (seg->log_lv) {
 		/* If disk log, use its UUID */
 		if (!(log_dlid = build_dlid(dm, seg->log_lv->lvid.s, NULL))) {
-			log_error("Failed to build uuid for log LV %s.",
+			log_error(0, "Failed to build uuid for log LV %s.",
 				  seg->log_lv->name);
 			return 0;
 		}
 	} else {
 		/* If core log, use mirror's UUID and set DM_CORELOG flag */
 		if (!(log_dlid = build_dlid(dm, seg->lv->lvid.s, NULL))) {
-			log_error("Failed to build uuid for mirror LV %s.",
+			log_error(0, "Failed to build uuid for mirror LV %s.",
 				  seg->lv->name);
 			return 0;
 		}
@@ -314,7 +314,7 @@ static int _mirrored_add_target_line(struct dev_manager *dm, struct dm_pool *mem
 
 	if (!(seg->status & PVMOVE)) {
 		if (!seg->region_size) {
-			log_error("Missing region size for mirror segment.");
+			log_error(0, "Missing region size for mirror segment.");
 			return 0;
 		}
 		region_size = seg->region_size;
@@ -392,7 +392,7 @@ static int _get_mirror_dso_path(struct cmd_context *cmd, char **dso)
 	const char *libpath;
 
 	if (!(path = dm_pool_alloc(cmd->mem, PATH_MAX))) {
-		log_error("Failed to allocate dmeventd library path.");
+		log_error(0, "Failed to allocate dmeventd library path.");
 		return 0;
 	}
 
@@ -521,12 +521,12 @@ static int _mirrored_modules_needed(struct dm_pool *mem,
 
 	if (vg_is_clustered(seg->lv->vg) &&
 	    !str_list_add(mem, modules, "clog")) {
-		log_error("cluster log string list allocation failed");
+		log_error(0, "cluster log string list allocation failed");
 		return 0;
 	}
 
 	if (!str_list_add(mem, modules, "mirror")) {
-		log_error("mirror string list allocation failed");
+		log_error(0, "mirror string list allocation failed");
 		return 0;
 	}
 
diff --git a/lib/misc/lvm-exec.c b/lib/misc/lvm-exec.c
index fffdc37..f0ed28e 100644
--- a/lib/misc/lvm-exec.c
+++ b/lib/misc/lvm-exec.c
@@ -55,7 +55,7 @@ int exec_cmd(struct cmd_context *cmd, const char *const argv[])
 	log_verbose("Executing: %s", _verbose_args(argv, buf, sizeof(buf)));
 
 	if ((pid = fork()) == -1) {
-		log_error("fork failed: %s", strerror(errno));
+		log_error(0, "fork failed: %s", strerror(errno));
 		return 0;
 	}
 
@@ -73,18 +73,18 @@ int exec_cmd(struct cmd_context *cmd, const char *const argv[])
 
 	/* Parent */
 	if (wait4(pid, &status, 0, NULL) != pid) {
-		log_error("wait4 child process %u failed: %s", pid,
+		log_error(0, "wait4 child process %u failed: %s", pid,
 			  strerror(errno));
 		return 0;
 	}
 
 	if (!WIFEXITED(status)) {
-		log_error("Child %u exited abnormally", pid);
+		log_error(0, "Child %u exited abnormally", pid);
 		return 0;
 	}
 
 	if (WEXITSTATUS(status)) {
-		log_error("%s failed: %u", argv[0], WEXITSTATUS(status));
+		log_error(0, "%s failed: %u", argv[0], WEXITSTATUS(status));
 		return 0;
 	}
 
diff --git a/lib/misc/lvm-file.c b/lib/misc/lvm-file.c
index a5a5f2b..a68c80e 100644
--- a/lib/misc/lvm-file.c
+++ b/lib/misc/lvm-file.c
@@ -53,7 +53,7 @@ int create_temp_name(const char *dir, char *buffer, size_t len, int *fd,
 
 		if (dm_snprintf(buffer, len, "%s/.lvm_%s_%d_%d",
 				 dir, hostname, pid, num) == -1) {
-			log_err("Not enough space to build temporary file "
+			log_error(0, "Not enough space to build temporary file "
 				"string.");
 			return 0;
 		}
@@ -89,7 +89,7 @@ int lvm_rename(const char *old, const char *new)
 	struct stat buf;
 
 	if (link(old, new)) {
-		log_error("%s: rename to %s failed: %s", old, new,
+		log_error(0, "%s: rename to %s failed: %s", old, new,
 			  strerror(errno));
 		return 0;
 	}
@@ -100,7 +100,7 @@ int lvm_rename(const char *old, const char *new)
 	}
 
 	if (buf.st_nlink != 2) {
-		log_error("%s: rename to %s failed", old, new);
+		log_error(0, "%s: rename to %s failed", old, new);
 		return 0;
 	}
 
@@ -168,7 +168,7 @@ void sync_dir(const char *file)
 	char *dir, *c;
 
 	if (!(dir = dm_strdup(file))) {
-		log_error("sync_dir failed in strdup");
+		log_error(0, "sync_dir failed in strdup");
 		return;
 	}
 
@@ -217,7 +217,7 @@ int fcntl_lock_file(const char *file, short lock_type, int warn_if_read_only)
 	};
 
 	if (!(dir = dm_strdup(file))) {
-		log_error("fcntl_lock_file failed in strdup.");
+		log_error(0, "fcntl_lock_file failed in strdup.");
 		return -1;
 	}
 
@@ -265,11 +265,11 @@ void fcntl_unlock_file(int lockfd)
 	log_very_verbose("Unlocking fd %d", lockfd);
 
 	if (fcntl(lockfd, F_SETLK, &lock) == -1)
-		log_error("fcntl unlock failed on fd %d: %s", lockfd,
+		log_error(0, "fcntl unlock failed on fd %d: %s", lockfd,
 			  strerror(errno));
 
 	if (close(lockfd))
-		log_error("lock file close failed on fd %d: %s", lockfd,
+		log_error(0, "lock file close failed on fd %d: %s", lockfd,
 			  strerror(errno));
 }
 
@@ -278,7 +278,7 @@ int lvm_fclose(FILE *fp, const char *filename)
 	if (!dm_fclose(fp))
 		return 0;
 	if (errno == 0)
-		log_error("%s: write error", filename);
+		log_error(0, "%s: write error", filename);
 	else
 		log_sys_error("write error", filename);
 	return EOF;
diff --git a/lib/misc/lvm-string.c b/lib/misc/lvm-string.c
index c75a9a7..b961595 100644
--- a/lib/misc/lvm-string.c
+++ b/lib/misc/lvm-string.c
@@ -149,7 +149,7 @@ char *build_dm_name(struct dm_pool *mem, const char *vgname,
 	len += hyphens;
 
 	if (!(r = dm_pool_alloc(mem, len))) {
-		log_error("build_dm_name: Allocation failed for %" PRIsize_t
+		log_error(0, "build_dm_name: Allocation failed for %" PRIsize_t
 			  " for %s %s %s.", len, vgname, lvname, layer);
 		return NULL;
 	}
diff --git a/lib/misc/sharedlib.c b/lib/misc/sharedlib.c
index cab2909..c2a6268 100644
--- a/lib/misc/sharedlib.c
+++ b/lib/misc/sharedlib.c
@@ -45,7 +45,7 @@ void *load_shared_library(struct cmd_context *cmd, const char *libname,
 	void *library;
 
 	if (is_static()) {
-		log_error("Not loading shared %s library %s in static mode.",
+		log_error(0, "Not loading shared %s library %s in static mode.",
 			  desc, libname);
 		return NULL;
 	}
@@ -59,7 +59,7 @@ void *load_shared_library(struct cmd_context *cmd, const char *libname,
 			log_verbose("Unable to open external %s library %s: %s",
 				    desc, path, dlerror());
 		else
-			log_error("Unable to open external %s library %s: %s",
+			log_error(0, "Unable to open external %s library %s: %s",
 				  desc, path, dlerror());
 	}
 
diff --git a/lib/mm/memlock.c b/lib/mm/memlock.c
index 1386683..7b363d7 100644
--- a/lib/mm/memlock.c
+++ b/lib/mm/memlock.c
@@ -105,7 +105,7 @@ static void _lock_mem(void)
 		log_sys_error("getpriority", "");
 	else
 		if (setpriority(PRIO_PROCESS, 0, _default_priority))
-			log_error("setpriority %d failed: %s",
+			log_error(0, "setpriority %d failed: %s",
 				  _default_priority, strerror(errno));
 }
 
@@ -119,7 +119,7 @@ static void _unlock_mem(void)
 #endif
 	_release_memory();
 	if (setpriority(PRIO_PROCESS, 0, _priority))
-		log_error("setpriority %u failed: %s", _priority,
+		log_error(0, "setpriority %u failed: %s", _priority,
 			  strerror(errno));
 }
 
diff --git a/lib/report/report.c b/lib/report/report.c
index 3de63ce..d778eae 100644
--- a/lib/report/report.c
+++ b/lib/report/report.c
@@ -90,7 +90,7 @@ static int _format_pvsegs(struct dm_pool *mem, struct dm_report_field *field,
 	char extent_str[32];
 
 	if (!dm_pool_begin_object(mem, 256)) {
-		log_error("dm_pool_begin_object failed");
+		log_error(0, "dm_pool_begin_object failed");
 		return 0;
 	}
 
@@ -110,7 +110,7 @@ static int _format_pvsegs(struct dm_pool *mem, struct dm_report_field *field,
 		}
 
 		if (!dm_pool_grow_object(mem, name, strlen(name))) {
-			log_error("dm_pool_grow_object failed");
+			log_error(0, "dm_pool_grow_object failed");
 			return 0;
 		}
 
@@ -118,35 +118,35 @@ static int _format_pvsegs(struct dm_pool *mem, struct dm_report_field *field,
 				"%s%" PRIu32 "%s",
 				range_format ? ":" : "(", extent,
 				range_format ? "-"  : ")") < 0) {
-			log_error("Extent number dm_snprintf failed");
+			log_error(0, "Extent number dm_snprintf failed");
 			return 0;
 		}
 		if (!dm_pool_grow_object(mem, extent_str, strlen(extent_str))) {
-			log_error("dm_pool_grow_object failed");
+			log_error(0, "dm_pool_grow_object failed");
 			return 0;
 		}
 
 		if (range_format) {
 			if (dm_snprintf(extent_str, sizeof(extent_str),
 					"%" PRIu32, extent + seg->area_len - 1) < 0) {
-				log_error("Extent number dm_snprintf failed");
+				log_error(0, "Extent number dm_snprintf failed");
 				return 0;
 			}
 			if (!dm_pool_grow_object(mem, extent_str, strlen(extent_str))) {
-				log_error("dm_pool_grow_object failed");
+				log_error(0, "dm_pool_grow_object failed");
 				return 0;
 			}
 		}
 
 		if ((s != seg->area_count - 1) &&
 		    !dm_pool_grow_object(mem, range_format ? " " : ",", 1)) {
-			log_error("dm_pool_grow_object failed");
+			log_error(0, "dm_pool_grow_object failed");
 			return 0;
 		}
 	}
 
 	if (!dm_pool_grow_object(mem, "\0", 1)) {
-		log_error("dm_pool_grow_object failed");
+		log_error(0, "dm_pool_grow_object failed");
 		return 0;
 	}
 
@@ -177,20 +177,20 @@ static int _tags_disp(struct dm_report *rh __attribute((unused)), struct dm_pool
 	struct str_list *sl;
 
 	if (!dm_pool_begin_object(mem, 256)) {
-		log_error("dm_pool_begin_object failed");
+		log_error(0, "dm_pool_begin_object failed");
 		return 0;
 	}
 
 	dm_list_iterate_items(sl, tags) {
 		if (!dm_pool_grow_object(mem, sl->str, strlen(sl->str)) ||
 		    (sl->list.n != tags && !dm_pool_grow_object(mem, ",", 1))) {
-			log_error("dm_pool_grow_object failed");
+			log_error(0, "dm_pool_grow_object failed");
 			return 0;
 		}
 	}
 
 	if (!dm_pool_grow_object(mem, "\0", 1)) {
-		log_error("dm_pool_grow_object failed");
+		log_error(0, "dm_pool_grow_object failed");
 		return 0;
 	}
 
@@ -207,7 +207,7 @@ static int _modules_disp(struct dm_report *rh, struct dm_pool *mem,
 	struct dm_list *modules;
 
 	if (!(modules = str_list_create(mem))) {
-		log_error("modules str_list allocation failed");
+		log_error(0, "modules str_list allocation failed");
 		return 0;
 	}
 
@@ -299,7 +299,7 @@ static int _lvstatus_disp(struct dm_report *rh __attribute((unused)), struct dm_
 	float snap_percent;
 
 	if (!(repstr = dm_pool_zalloc(mem, 7))) {
-		log_error("dm_pool_alloc failed");
+		log_error(0, "dm_pool_alloc failed");
 		return 0;
 	}
 
@@ -394,7 +394,7 @@ static int _pvstatus_disp(struct dm_report *rh __attribute((unused)), struct dm_
 	char *repstr;
 
 	if (!(repstr = dm_pool_zalloc(mem, 3))) {
-		log_error("dm_pool_alloc failed");
+		log_error(0, "dm_pool_alloc failed");
 		return 0;
 	}
 
@@ -420,7 +420,7 @@ static int _vgstatus_disp(struct dm_report *rh __attribute((unused)), struct dm_
 	char *repstr;
 
 	if (!(repstr = dm_pool_zalloc(mem, 7))) {
-		log_error("dm_pool_alloc failed");
+		log_error(0, "dm_pool_alloc failed");
 		return 0;
 	}
 
@@ -504,17 +504,17 @@ static int _lvname_disp(struct dm_report *rh, struct dm_pool *mem,
 
 	len = strlen(lv->name) + 3;
 	if (!(repstr = dm_pool_zalloc(mem, len))) {
-		log_error("dm_pool_alloc failed");
+		log_error(0, "dm_pool_alloc failed");
 		return 0;
 	}
 
 	if (dm_snprintf(repstr, len, "[%s]", lv->name) < 0) {
-		log_error("lvname snprintf failed");
+		log_error(0, "lvname snprintf failed");
 		return 0;
 	}
 
 	if (!(lvname = dm_pool_strdup(mem, lv->name))) {
-		log_error("dm_pool_strdup failed");
+		log_error(0, "dm_pool_strdup failed");
 		return 0;
 	}
 
@@ -593,12 +593,12 @@ static int _size32_disp(struct dm_report *rh __attribute((unused)), struct dm_po
 		return_0;
 
 	if (!(repstr = dm_pool_strdup(mem, disp))) {
-		log_error("dm_pool_strdup failed");
+		log_error(0, "dm_pool_strdup failed");
 		return 0;
 	}
 
 	if (!(sortval = dm_pool_alloc(mem, sizeof(uint64_t)))) {
-		log_error("dm_pool_alloc failed");
+		log_error(0, "dm_pool_alloc failed");
 		return 0;
 	}
 
@@ -622,12 +622,12 @@ static int _size64_disp(struct dm_report *rh __attribute((unused)),
 		return_0;
 
 	if (!(repstr = dm_pool_strdup(mem, disp))) {
-		log_error("dm_pool_strdup failed");
+		log_error(0, "dm_pool_strdup failed");
 		return 0;
 	}
 
 	if (!(sortval = dm_pool_alloc(mem, sizeof(uint64_t)))) {
-		log_error("dm_pool_alloc failed");
+		log_error(0, "dm_pool_alloc failed");
 		return 0;
 	}
 
@@ -824,7 +824,7 @@ static int _uuid_disp(struct dm_report *rh __attribute((unused)), struct dm_pool
 	char *repstr = NULL;
 
 	if (!(repstr = dm_pool_alloc(mem, 40))) {
-		log_error("dm_pool_alloc failed");
+		log_error(0, "dm_pool_alloc failed");
 		return 0;
 	}
 
@@ -1020,7 +1020,7 @@ static int _snpercent_disp(struct dm_report *rh __attribute((unused)), struct dm
 	}
 
 	if (!(sortval = dm_pool_alloc(mem, sizeof(uint64_t)))) {
-		log_error("dm_pool_alloc failed");
+		log_error(0, "dm_pool_alloc failed");
 		return 0;
 	}
 
@@ -1038,12 +1038,12 @@ static int _snpercent_disp(struct dm_report *rh __attribute((unused)), struct dm
 	}
 
 	if (!(repstr = dm_pool_zalloc(mem, 8))) {
-		log_error("dm_pool_alloc failed");
+		log_error(0, "dm_pool_alloc failed");
 		return 0;
 	}
 
 	if (dm_snprintf(repstr, 7, "%.2f", snap_percent) < 0) {
-		log_error("snapshot percentage too large");
+		log_error(0, "snapshot percentage too large");
 		return 0;
 	}
 
@@ -1063,7 +1063,7 @@ static int _copypercent_disp(struct dm_report *rh __attribute((unused)), struct
 	char *repstr;
 
 	if (!(sortval = dm_pool_alloc(mem, sizeof(uint64_t)))) {
-		log_error("dm_pool_alloc failed");
+		log_error(0, "dm_pool_alloc failed");
 		return 0;
 	}
 
@@ -1077,12 +1077,12 @@ static int _copypercent_disp(struct dm_report *rh __attribute((unused)), struct
 	percent = copy_percent(lv);
 
 	if (!(repstr = dm_pool_zalloc(mem, 8))) {
-		log_error("dm_pool_alloc failed");
+		log_error(0, "dm_pool_alloc failed");
 		return 0;
 	}
 
 	if (dm_snprintf(repstr, 7, "%.2f", percent) < 0) {
-		log_error("copy percentage too large");
+		log_error(0, "copy percentage too large");
 		return 0;
 	}
 
diff --git a/lib/snapshot/snapshot.c b/lib/snapshot/snapshot.c
index d704ff9..d8138e7 100644
--- a/lib/snapshot/snapshot.c
+++ b/lib/snapshot/snapshot.c
@@ -40,7 +40,7 @@ static int _snap_text_import(struct lv_segment *seg, const struct config_node *s
 	int old_suppress;
 
 	if (!get_config_uint32(sn, "chunk_size", &chunk_size)) {
-		log_error("Couldn't read chunk size for snapshot.");
+		log_error(0, "Couldn't read chunk size for snapshot.");
 		return 0;
 	}
 
@@ -48,26 +48,26 @@ static int _snap_text_import(struct lv_segment *seg, const struct config_node *s
 
 	if (!(cow_name = find_config_str(sn, "cow_store", NULL))) {
 		log_suppress(old_suppress);
-		log_error("Snapshot cow storage not specified.");
+		log_error(0, "Snapshot cow storage not specified.");
 		return 0;
 	}
 
 	if (!(org_name = find_config_str(sn, "origin", NULL))) {
 		log_suppress(old_suppress);
-		log_error("Snapshot origin not specified.");
+		log_error(0, "Snapshot origin not specified.");
 		return 0;
 	}
 
 	log_suppress(old_suppress);
 
 	if (!(cow = find_lv(seg->lv->vg, cow_name))) {
-		log_error("Unknown logical volume specified for "
+		log_error(0, "Unknown logical volume specified for "
 			  "snapshot cow store.");
 		return 0;
 	}
 
 	if (!(org = find_lv(seg->lv->vg, org_name))) {
-		log_error("Unknown logical volume specified for "
+		log_error(0, "Unknown logical volume specified for "
 			  "snapshot origin.");
 		return 0;
 	}
@@ -128,7 +128,7 @@ static int _get_snapshot_dso_path(struct cmd_context *cmd, char **dso)
 	const char *libpath;
 
 	if (!(path = dm_pool_alloc(cmd->mem, PATH_MAX))) {
-		log_error("Failed to allocate dmeventd library path.");
+		log_error(0, "Failed to allocate dmeventd library path.");
 		return 0;
 	}
 
@@ -255,7 +255,7 @@ static int _snap_modules_needed(struct dm_pool *mem,
 				struct dm_list *modules)
 {
 	if (!str_list_add(mem, modules, "snapshot")) {
-		log_error("snapshot string list allocation failed");
+		log_error(0, "snapshot string list allocation failed");
 		return 0;
 	}
 
diff --git a/lib/striped/striped.c b/lib/striped/striped.c
index 78129af..18fccd1 100644
--- a/lib/striped/striped.c
+++ b/lib/striped/striped.c
@@ -53,7 +53,7 @@ static void _striped_display(const struct lv_segment *seg)
 static int _striped_text_import_area_count(struct config_node *sn, uint32_t *area_count)
 {
 	if (!get_config_uint32(sn, "stripe_count", area_count)) {
-		log_error("Couldn't read 'stripe_count' for "
+		log_error(0, "Couldn't read 'stripe_count' for "
 			  "segment '%s'.", sn->key);
 		return 0;
 	}
@@ -68,13 +68,13 @@ static int _striped_text_import(struct lv_segment *seg, const struct config_node
 
 	if ((seg->area_count != 1) &&
 	    !get_config_uint32(sn, "stripe_size", &seg->stripe_size)) {
-		log_error("Couldn't read stripe_size for segment '%s'.",
+		log_error(0, "Couldn't read stripe_size for segment '%s'.",
 			  sn->key);
 		return 0;
 	}
 
 	if (!(cn = find_config_node(sn, "stripes"))) {
-		log_error("Couldn't find stripes array for segment "
+		log_error(0, "Couldn't find stripes array for segment "
 			  "'%s'.", sn->key);
 		return 0;
 	}
@@ -161,7 +161,7 @@ static int _striped_add_target_line(struct dev_manager *dm,
 				uint32_t *pvmove_mirror_count __attribute((unused)))
 {
 	if (!seg->area_count) {
-		log_error("Internal error: striped add_target_line called "
+		log_error(0, "Internal error: striped add_target_line called "
 			  "with no areas for %s.", seg->lv->name);
 		return 0;
 	}
diff --git a/lib/uuid/uuid.c b/lib/uuid/uuid.c
index 1ded223..f85650d 100644
--- a/lib/uuid/uuid.c
+++ b/lib/uuid/uuid.c
@@ -139,7 +139,7 @@ int id_valid(struct id *id)
 
 	for (i = 0; i < ID_LEN; i++)
 		if (!_inverse_c[id->uuid[i]]) {
-			log_err("UUID contains invalid character");
+			log_error(0, "UUID contains invalid character");
 			return 0;
 		}
 
@@ -163,7 +163,7 @@ int id_write_format(const struct id *id, char *buffer, size_t size)
 
 	/* split into groups separated by dashes */
 	if (size < (32 + 6 + 1)) {
-		log_err("Couldn't write uuid, buffer too small.");
+		log_error(0, "Couldn't write uuid, buffer too small.");
 		return 0;
 	}
 
@@ -191,7 +191,7 @@ int id_read_format(struct id *id, const char *buffer)
 		}
 
 		if (out >= ID_LEN) {
-			log_err("Too many characters to be uuid.");
+			log_error(0, "Too many characters to be uuid.");
 			return 0;
 		}
 
@@ -199,7 +199,7 @@ int id_read_format(struct id *id, const char *buffer)
 	}
 
 	if (out != ID_LEN) {
-		log_err("Couldn't read uuid, incorrect number of characters.");
+		log_error(0, "Couldn't read uuid, incorrect number of characters.");
 		return 0;
 	}
 
diff --git a/lib/zero/zero.c b/lib/zero/zero.c
index 7b3e62e..0583e0d 100644
--- a/lib/zero/zero.c
+++ b/lib/zero/zero.c
@@ -71,7 +71,7 @@ static int _zero_modules_needed(struct dm_pool *mem,
 				struct dm_list *modules)
 {
 	if (!str_list_add(mem, modules, "zero")) {
-		log_error("zero module string list allocation failed");
+		log_error(0, "zero module string list allocation failed");
 		return 0;
 	}
 
diff --git a/libdm/ioctl/libdm-iface.c b/libdm/ioctl/libdm-iface.c
index 2f8a930..217789f 100644
--- a/libdm/ioctl/libdm-iface.c
+++ b/libdm/ioctl/libdm-iface.c
@@ -173,7 +173,7 @@ static int _get_proc_number(const char *file, const char *name,
 		log_sys_error("fclose", file);
 
 	if (number) {
-		log_error("%s: No entry for %s found", file, name);
+		log_error(0, "%s: No entry for %s found", file, name);
 		return 0;
 	}
 
@@ -327,7 +327,7 @@ static int _open_control(void)
 	snprintf(control, sizeof(control), "%s/control", dm_dir());
 
 	if (!_control_device_number(&major, &minor))
-		log_error("Is device-mapper driver missing from kernel?");
+		log_error(0, "Is device-mapper driver missing from kernel?");
 
 	if (!_control_exists(control, major, minor) &&
 	    !_create_control(control, major, minor))
@@ -339,14 +339,14 @@ static int _open_control(void)
 	}
 
 	if (!_create_dm_bitset()) {
-		log_error("Failed to set up list of device-mapper major numbers");
+		log_error(0, "Failed to set up list of device-mapper major numbers");
 		return 0;
 	}
 
 	return 1;
 
 error:
-	log_error("Failure to communicate with kernel device-mapper driver.");
+	log_error(0, "Failure to communicate with kernel device-mapper driver.");
 	return 0;
 #else
 	return 1;
@@ -478,7 +478,7 @@ static const char *_dm_task_get_uuid_v1(const struct dm_task *dmt)
 
 static struct dm_deps *_dm_task_get_deps_v1(struct dm_task *dmt)
 {
-	log_error("deps version 1 no longer supported by libdevmapper");
+	log_error(0, "deps version 1 no longer supported by libdevmapper");
 	return NULL;
 }
 
@@ -498,7 +498,7 @@ static void *_add_target_v1(struct target *t, void *out, void *end)
 
 	out += sp_size;
 	if (out >= end) {
-		log_error(no_space);
+		log_error(0, no_space);
 		return NULL;
 	}
 
@@ -510,9 +510,9 @@ static void *_add_target_v1(struct target *t, void *out, void *end)
 	len = strlen(t->params);
 
 	if ((out + len + 1) >= end) {
-		log_error(no_space);
+		log_error(0, no_space);
 
-		log_error("t->params= '%s'", t->params);
+		log_error(0, "t->params= '%s'", t->params);
 		return NULL;
 	}
 	strcpy((char *) out, t->params);
@@ -546,7 +546,7 @@ static struct dm_ioctl_v1 *_flatten_v1(struct dm_task *dmt)
 	}
 
 	if (count && dmt->newname) {
-		log_error("targets and newname are incompatible");
+		log_error(0, "targets and newname are incompatible");
 		return NULL;
 	}
 
@@ -584,7 +584,7 @@ static struct dm_ioctl_v1 *_flatten_v1(struct dm_task *dmt)
 
 	if (dmt->minor >= 0) {
 		if (dmt->major <= 0) {
-			log_error("Missing major number for persistent device");
+			log_error(0, "Missing major number for persistent device");
 			return NULL;
 		}
 		dmi->flags |= DM_PERSISTENT_DEV_FLAG;
@@ -658,7 +658,7 @@ static int _dm_names_v1(struct dm_ioctl_v1 *dmi)
 		names->next = 0;
 		len = strlen(name);
 		if (((void *) (names + 1) + len + 1) >= end) {
-			log_error("Insufficient buffer space for device list");
+			log_error(0, "Insufficient buffer space for device list");
 			r = 0;
 			break;
 		}
@@ -682,7 +682,7 @@ static int _dm_task_run_v1(struct dm_task *dmt)
 
 	dmi = _flatten_v1(dmt);
 	if (!dmi) {
-		log_error("Couldn't create ioctl argument.");
+		log_error(0, "Couldn't create ioctl argument.");
 		return 0;
 	}
 
@@ -691,7 +691,7 @@ static int _dm_task_run_v1(struct dm_task *dmt)
 
 	if ((unsigned) dmt->type >=
 	    (sizeof(_cmd_data_v1) / sizeof(*_cmd_data_v1))) {
-		log_error("Internal error: unknown device-mapper task %d",
+		log_error(0, "Internal error: unknown device-mapper task %d",
 			  dmt->type);
 		goto bad;
 	}
@@ -716,7 +716,7 @@ static int _dm_task_run_v1(struct dm_task *dmt)
 				    _cmd_data_v1[dmt->type].name,
 				    strerror(errno));
 		else
-			log_error("device-mapper: %s ioctl failed: %s",
+			log_error(0, "device-mapper: %s ioctl failed: %s",
 				  _cmd_data_v1[dmt->type].name,
 				  strerror(errno));
 		goto bad;
@@ -726,7 +726,7 @@ static int _dm_task_run_v1(struct dm_task *dmt)
 
 	if (dmi->flags & DM_BUFFER_FULL_FLAG)
 		/* FIXME Increase buffer size and retry operation (if query) */
-		log_error("WARNING: libdevmapper buffer too small for data");
+		log_error(0, "WARNING: libdevmapper buffer too small for data");
 
 	switch (dmt->type) {
 	case DM_DEVICE_CREATE:
@@ -808,7 +808,7 @@ static int _check_version(char *version, size_t size, int log_suppress)
 	int r;
 
 	if (!(task = dm_task_create(DM_DEVICE_VERSION))) {
-		log_error("Failed to get device-mapper version");
+		log_error(0, "Failed to get device-mapper version");
 		version[0] = '\0';
 		return 0;
 	}
@@ -856,7 +856,7 @@ int dm_check_version(void)
 
 	dm_get_library_version(libversion, sizeof(libversion));
 
-	log_error("Incompatible libdevmapper %s%s and kernel driver %s",
+	log_error(0, "Incompatible libdevmapper %s%s and kernel driver %s",
 		  libversion, compat, dmversion);
 
       bad:
@@ -977,7 +977,7 @@ uint32_t dm_task_get_read_ahead(const struct dm_task *dmt, uint32_t *read_ahead)
 	else if (dmt->dev_name)
 		dev_name = dmt->dev_name;
 	else {
-		log_error("Get read ahead request failed: device name unrecorded.");
+		log_error(0, "Get read ahead request failed: device name unrecorded.");
 		return 0;
 	}
 
@@ -1056,17 +1056,17 @@ int dm_task_suppress_identical_reload(struct dm_task *dmt)
 int dm_task_set_newname(struct dm_task *dmt, const char *newname)
 {
 	if (strchr(newname, '/')) {
-		log_error("Name \"%s\" invalid. It contains \"/\".", newname);
+		log_error(0, "Name \"%s\" invalid. It contains \"/\".", newname);
 		return 0;
 	}
 
 	if (strlen(newname) >= DM_NAME_LEN) {
-		log_error("Name \"%s\" too long", newname);
+		log_error(0, "Name \"%s\" too long", newname);
 		return 0;
 	}
 
 	if (!(dmt->newname = dm_strdup(newname))) {
-		log_error("dm_task_set_newname: strdup(%s) failed", newname);
+		log_error(0, "dm_task_set_newname: strdup(%s) failed", newname);
 		return 0;
 	}
 
@@ -1076,7 +1076,7 @@ int dm_task_set_newname(struct dm_task *dmt, const char *newname)
 int dm_task_set_message(struct dm_task *dmt, const char *message)
 {
 	if (!(dmt->message = dm_strdup(message))) {
-		log_error("dm_task_set_message: strdup(%s) failed", message);
+		log_error(0, "dm_task_set_message: strdup(%s) failed", message);
 		return 0;
 	}
 
@@ -1095,12 +1095,12 @@ int dm_task_set_geometry(struct dm_task *dmt, const char *cylinders, const char
 	size_t len = strlen(cylinders) + 1 + strlen(heads) + 1 + strlen(sectors) + 1 + strlen(start) + 1;
 
 	if (!(dmt->geometry = dm_malloc(len))) {
-		log_error("dm_task_set_geometry: dm_malloc failed");
+		log_error(0, "dm_task_set_geometry: dm_malloc failed");
 		return 0;
 	}
 
 	if (sprintf(dmt->geometry, "%s %s %s %s", cylinders, heads, sectors, start) < 0) {
-		log_error("dm_task_set_geometry: sprintf failed");
+		log_error(0, "dm_task_set_geometry: sprintf failed");
 		return 0;
 	}
 
@@ -1141,7 +1141,7 @@ struct target *create_target(uint64_t start, uint64_t len, const char *type,
 	struct target *t = dm_malloc(sizeof(*t));
 
 	if (!t) {
-		log_error("create_target: malloc(%" PRIsize_t ") failed",
+		log_error(0, "create_target: malloc(%" PRIsize_t ") failed",
 			  sizeof(*t));
 		return NULL;
 	}
@@ -1149,12 +1149,12 @@ struct target *create_target(uint64_t start, uint64_t len, const char *type,
 	memset(t, 0, sizeof(*t));
 
 	if (!(t->params = dm_strdup(params))) {
-		log_error("create_target: strdup(params) failed");
+		log_error(0, "create_target: strdup(params) failed");
 		goto bad;
 	}
 
 	if (!(t->type = dm_strdup(type))) {
-		log_error("create_target: strdup(type) failed");
+		log_error(0, "create_target: strdup(type) failed");
 		goto bad;
 	}
 
@@ -1179,7 +1179,7 @@ static void *_add_target(struct target *t, void *out, void *end)
 
 	out += sp_size;
 	if (out >= end) {
-		log_error(no_space);
+		log_error(0, no_space);
 		return NULL;
 	}
 
@@ -1191,9 +1191,9 @@ static void *_add_target(struct target *t, void *out, void *end)
 	len = strlen(t->params);
 
 	if ((out + len + 1) >= end) {
-		log_error(no_space);
+		log_error(0, no_space);
 
-		log_error("t->params= '%s'", t->params);
+		log_error(0, "t->params= '%s'", t->params);
 		return NULL;
 	}
 	strcpy((char *) out, t->params);
@@ -1261,37 +1261,37 @@ static struct dm_ioctl *_flatten(struct dm_task *dmt, unsigned repeat_count)
 	}
 
 	if (count && (dmt->sector || dmt->message)) {
-		log_error("targets and message are incompatible");
+		log_error(0, "targets and message are incompatible");
 		return NULL;
 	}
 
 	if (count && dmt->newname) {
-		log_error("targets and newname are incompatible");
+		log_error(0, "targets and newname are incompatible");
 		return NULL;
 	}
 
 	if (count && dmt->geometry) {
-		log_error("targets and geometry are incompatible");
+		log_error(0, "targets and geometry are incompatible");
 		return NULL;
 	}
 
 	if (dmt->newname && (dmt->sector || dmt->message)) {
-		log_error("message and newname are incompatible");
+		log_error(0, "message and newname are incompatible");
 		return NULL;
 	}
 
 	if (dmt->newname && dmt->geometry) {
-		log_error("geometry and newname are incompatible");
+		log_error(0, "geometry and newname are incompatible");
 		return NULL;
 	}
 
 	if (dmt->geometry && (dmt->sector || dmt->message)) {
-		log_error("geometry and message are incompatible");
+		log_error(0, "geometry and message are incompatible");
 		return NULL;
 	}
 
 	if (dmt->sector && !dmt->message) {
-		log_error("message is required with sector");
+		log_error(0, "message is required with sector");
 		return NULL;
 	}
 
@@ -1331,7 +1331,7 @@ static struct dm_ioctl *_flatten(struct dm_task *dmt, unsigned repeat_count)
 
 	if (dmt->minor >= 0) {
 		if (dmt->major <= 0) {
-			log_error("Missing major number for persistent device.");
+			log_error(0, "Missing major number for persistent device.");
 			goto bad;
 		}
 
@@ -1350,7 +1350,7 @@ static struct dm_ioctl *_flatten(struct dm_task *dmt, unsigned repeat_count)
 	/* Does driver support device number referencing? */
 	if (_dm_version_minor < 3 && !dmt->dev_name && !dmt->uuid && dmi->dev) {
 		if (!_lookup_dev_name(dmi->dev, dmi->name, sizeof(dmi->name))) {
-			log_error("Unable to find name for device (%" PRIu32
+			log_error(0, "Unable to find name for device (%" PRIu32
 				  ":%" PRIu32 ")", dmt->major, dmt->minor);
 			goto bad;
 		}
@@ -1486,7 +1486,7 @@ static int _create_and_load_v4(struct dm_task *dmt)
 
 	/* Use new task struct to create the device */
 	if (!(task = dm_task_create(DM_DEVICE_CREATE))) {
-		log_error("Failed to create device-mapper task struct");
+		log_error(0, "Failed to create device-mapper task struct");
 		return 0;
 	}
 
@@ -1514,7 +1514,7 @@ static int _create_and_load_v4(struct dm_task *dmt)
 
 	/* Next load the table */
 	if (!(task = dm_task_create(DM_DEVICE_RELOAD))) {
-		log_error("Failed to create device-mapper task struct");
+		log_error(0, "Failed to create device-mapper task struct");
 		return 0;
 	}
 
@@ -1552,7 +1552,7 @@ static int _create_and_load_v4(struct dm_task *dmt)
 	dmt->uuid = NULL;
 
 	if (!dm_task_run(dmt))
-		log_error("Failed to revert device creation.");
+		log_error(0, "Failed to revert device creation.");
 
 	return r;
 }
@@ -1570,7 +1570,7 @@ static int _reload_with_suppression_v4(struct dm_task *dmt)
 
 	/* New task to get existing table information */
 	if (!(task = dm_task_create(DM_DEVICE_TABLE))) {
-		log_error("Failed to create device-mapper task struct");
+		log_error(0, "Failed to create device-mapper task struct");
 		return 0;
 	}
 
@@ -1643,7 +1643,7 @@ static struct dm_ioctl *_do_dm_ioctl(struct dm_task *dmt, unsigned command,
 
 	dmi = _flatten(dmt, repeat_count);
 	if (!dmi) {
-		log_error("Couldn't create ioctl argument.");
+		log_error(0, "Couldn't create ioctl argument.");
 		return NULL;
 	}
 
@@ -1684,7 +1684,7 @@ static struct dm_ioctl *_do_dm_ioctl(struct dm_task *dmt, unsigned command,
 				    	    _cmd_data_v4[dmt->type].name,
 					    strerror(errno));
 			else
-				log_error("device-mapper: %s ioctl "
+				log_error(0, "device-mapper: %s ioctl "
 					  "failed: %s",
 				    	   _cmd_data_v4[dmt->type].name,
 					  strerror(errno));
@@ -1714,7 +1714,7 @@ int dm_task_run(struct dm_task *dmt)
 
 	if ((unsigned) dmt->type >=
 	    (sizeof(_cmd_data_v4) / sizeof(*_cmd_data_v4))) {
-		log_error("Internal error: unknown device-mapper task %d",
+		log_error(0, "Internal error: unknown device-mapper task %d",
 			  dmt->type);
 		return 0;
 	}
@@ -1751,7 +1751,7 @@ repeat_ioctl:
 			dm_free(dmi);
 			goto repeat_ioctl;
 		default:
-			log_error("WARNING: libdevmapper buffer too small for data");
+			log_error(0, "WARNING: libdevmapper buffer too small for data");
 		}
 	}
 
diff --git a/libdm/libdm-common.c b/libdm/libdm-common.c
index 291a1b5..2fd8c43 100644
--- a/libdm/libdm-common.c
+++ b/libdm/libdm-common.c
@@ -104,7 +104,7 @@ struct dm_task *dm_task_create(int type)
 	struct dm_task *dmt = dm_malloc(sizeof(*dmt));
 
 	if (!dmt) {
-		log_error("dm_task_create: malloc(%" PRIsize_t ") failed",
+		log_error(0, "dm_task_create: malloc(%" PRIsize_t ") failed",
 			  sizeof(*dmt));
 		return NULL;
 	}
@@ -146,7 +146,7 @@ int dm_task_set_name(struct dm_task *dmt, const char *name)
 	 */
 	if ((pos = strrchr(name, '/'))) {
 		if (dmt->type == DM_DEVICE_CREATE) {
-			log_error("Name \"%s\" invalid. It contains \"/\".", name);
+			log_error(0, "Name \"%s\" invalid. It contains \"/\".", name);
 			return 0;
 		}
 
@@ -154,7 +154,7 @@ int dm_task_set_name(struct dm_task *dmt, const char *name)
 
 		if (stat(name, &st1) || stat(path, &st2) ||
 		    !(st1.st_dev == st2.st_dev)) {
-			log_error("Device %s not found", name);
+			log_error(0, "Device %s not found", name);
 			return 0;
 		}
 
@@ -162,12 +162,12 @@ int dm_task_set_name(struct dm_task *dmt, const char *name)
 	}
 
 	if (strlen(name) >= DM_NAME_LEN) {
-		log_error("Name \"%s\" too long", name);
+		log_error(0, "Name \"%s\" too long", name);
 		return 0;
 	}
 
 	if (!(dmt->dev_name = dm_strdup(name))) {
-		log_error("dm_task_set_name: strdup(%s) failed", name);
+		log_error(0, "dm_task_set_name: strdup(%s) failed", name);
 		return 0;
 	}
 
@@ -182,7 +182,7 @@ int dm_task_set_uuid(struct dm_task *dmt, const char *uuid)
 	}
 
 	if (!(dmt->uuid = dm_strdup(uuid))) {
-		log_error("dm_task_set_uuid: strdup(%s) failed", uuid);
+		log_error(0, "dm_task_set_uuid: strdup(%s) failed", uuid);
 		return 0;
 	}
 
@@ -262,7 +262,7 @@ int dm_set_selinux_context(const char *path, mode_t mode)
 		return 1;
 
 	if (matchpathcon(path, mode, &scontext) < 0) {
-		log_error("%s: matchpathcon %07o failed: %s", path, mode,
+		log_error(0, "%s: matchpathcon %07o failed: %s", path, mode,
 			  strerror(errno));
 		return 0;
 	}
@@ -292,7 +292,7 @@ static int _add_dev_node(const char *dev_name, uint32_t major, uint32_t minor,
 
 	if (stat(path, &info) >= 0) {
 		if (!S_ISBLK(info.st_mode)) {
-			log_error("A non-block device file at '%s' "
+			log_error(0, "A non-block device file at '%s' "
 				  "is already present", path);
 			return 0;
 		}
@@ -302,7 +302,7 @@ static int _add_dev_node(const char *dev_name, uint32_t major, uint32_t minor,
 			return 1;
 
 		if (unlink(path) < 0) {
-			log_error("Unable to unlink device node for '%s'",
+			log_error(0, "Unable to unlink device node for '%s'",
 				  dev_name);
 			return 0;
 		}
@@ -310,7 +310,7 @@ static int _add_dev_node(const char *dev_name, uint32_t major, uint32_t minor,
 
 	old_mask = umask(0);
 	if (mknod(path, S_IFBLK | mode, dev) < 0) {
-		log_error("Unable to make device node for '%s'", dev_name);
+		log_error(0, "Unable to make device node for '%s'", dev_name);
 		return 0;
 	}
 	umask(old_mask);
@@ -341,7 +341,7 @@ static int _rename_dev_node(const char *old_name, const char *new_name)
 
 	if (stat(newpath, &info) == 0) {
 		if (!S_ISBLK(info.st_mode)) {
-			log_error("A non-block device file at '%s' "
+			log_error(0, "A non-block device file at '%s' "
 				  "is already present", newpath);
 			return 0;
 		}
@@ -351,14 +351,14 @@ static int _rename_dev_node(const char *old_name, const char *new_name)
 				/* devfs, entry has already been renamed */
 				return 1;
 			}
-			log_error("Unable to unlink device node for '%s'",
+			log_error(0, "Unable to unlink device node for '%s'",
 				  new_name);
 			return 0;
 		}
 	}
 
 	if (rename(oldpath, newpath) < 0) {
-		log_error("Unable to rename device node from '%s' to '%s'",
+		log_error(0, "Unable to rename device node from '%s' to '%s'",
 			  old_name, new_name);
 		return 0;
 	}
@@ -379,7 +379,7 @@ static int _rm_dev_node(const char *dev_name)
 		return 1;
 
 	if (unlink(path) < 0) {
-		log_error("Unable to unlink device node for '%s'", dev_name);
+		log_error(0, "Unable to unlink device node for '%s'", dev_name);
 		return 0;
 	}
 
@@ -409,7 +409,7 @@ int get_dev_node_read_ahead(const char *dev_name, uint32_t *read_ahead)
 	long read_ahead_long;
 
 	if (!*dev_name) {
-		log_error("Empty device name passed to BLKRAGET");
+		log_error(0, "Empty device name passed to BLKRAGET");
 		return 0;
 	}
 
@@ -438,7 +438,7 @@ static int _set_read_ahead(const char *dev_name, uint32_t read_ahead)
 	long read_ahead_long = (long) read_ahead;
 
 	if (!*dev_name) {
-		log_error("Empty device name passed to BLKRAGET");
+		log_error(0, "Empty device name passed to BLKRAGET");
 		return 0;
 	}
 
@@ -575,7 +575,7 @@ static int _stack_node_op(node_op_t type, const char *dev_name, uint32_t major,
 	}
 
 	if (!(nop = dm_malloc(sizeof(*nop) + len))) {
-		log_error("Insufficient memory to stack mknod operation");
+		log_error(0, "Insufficient memory to stack mknod operation");
 		return 0;
 	}
 
@@ -712,7 +712,7 @@ int dm_driver_version(char *version, size_t size)
 		return 0;
 
 	if (!dm_task_run(dmt))
-		log_error("Failed to get driver version");
+		log_error(0, "Failed to get driver version");
 
 	if (!dm_task_get_driver_version(dmt, version, size))
 		goto out;
diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index 5c5ea97..2155002 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -148,7 +148,7 @@ struct dm_tree *dm_tree_create(void)
 	struct dm_tree *dtree;
 
 	if (!(dtree = dm_malloc(sizeof(*dtree)))) {
-		log_error("dm_tree_create malloc failed");
+		log_error(0, "dm_tree_create malloc failed");
 		return NULL;
 	}
 
@@ -160,20 +160,20 @@ struct dm_tree *dm_tree_create(void)
 	dtree->no_flush = 0;
 
 	if (!(dtree->mem = dm_pool_create("dtree", 1024))) {
-		log_error("dtree pool creation failed");
+		log_error(0, "dtree pool creation failed");
 		dm_free(dtree);
 		return NULL;
 	}
 
 	if (!(dtree->devs = dm_hash_create(8))) {
-		log_error("dtree hash creation failed");
+		log_error(0, "dtree hash creation failed");
 		dm_pool_destroy(dtree->mem);
 		dm_free(dtree);
 		return NULL;
 	}
 
 	if (!(dtree->uuids = dm_hash_create(32))) {
-		log_error("dtree uuid hash creation failed");
+		log_error(0, "dtree uuid hash creation failed");
 		dm_hash_destroy(dtree->devs);
 		dm_pool_destroy(dtree->mem);
 		dm_free(dtree);
@@ -211,7 +211,7 @@ static int _link(struct dm_list *list, struct dm_tree_node *node)
 	struct dm_tree_link *dlink;
 
 	if (!(dlink = dm_pool_alloc(node->dtree->mem, sizeof(*dlink)))) {
-		log_error("dtree link allocation failed");
+		log_error(0, "dtree link allocation failed");
 		return 0;
 	}
 
@@ -305,7 +305,7 @@ static struct dm_tree_node *_create_dm_tree_node(struct dm_tree *dtree,
 	uint64_t dev;
 
 	if (!(node = dm_pool_zalloc(dtree->mem, sizeof(*node)))) {
-		log_error("_create_dm_tree_node alloc failed");
+		log_error(0, "_create_dm_tree_node alloc failed");
 		return NULL;
 	}
 
@@ -325,14 +325,14 @@ static struct dm_tree_node *_create_dm_tree_node(struct dm_tree *dtree,
 
 	if (!dm_hash_insert_binary(dtree->devs, (const char *) &dev,
 				sizeof(dev), node)) {
-		log_error("dtree node hash insertion failed");
+		log_error(0, "dtree node hash insertion failed");
 		dm_pool_free(dtree->mem, node);
 		return NULL;
 	}
 
 	if (uuid && *uuid &&
 	    !dm_hash_insert(dtree->uuids, uuid, node)) {
-		log_error("dtree uuid hash insertion failed");
+		log_error(0, "dtree uuid hash insertion failed");
 		dm_hash_remove_binary(dtree->devs, (const char *) &dev,
 				      sizeof(dev));
 		dm_pool_free(dtree->mem, node);
@@ -385,30 +385,30 @@ static int _deps(struct dm_task **dmt, struct dm_pool *mem, uint32_t major, uint
 	}
 
 	if (!(*dmt = dm_task_create(DM_DEVICE_DEPS))) {
-		log_error("deps dm_task creation failed");
+		log_error(0, "deps dm_task creation failed");
 		return 0;
 	}
 
 	if (!dm_task_set_major(*dmt, major)) {
-		log_error("_deps: failed to set major for (%" PRIu32 ":%" PRIu32 ")",
+		log_error(0, "_deps: failed to set major for (%" PRIu32 ":%" PRIu32 ")",
 			  major, minor);
 		goto failed;
 	}
 
 	if (!dm_task_set_minor(*dmt, minor)) {
-		log_error("_deps: failed to set minor for (%" PRIu32 ":%" PRIu32 ")",
+		log_error(0, "_deps: failed to set minor for (%" PRIu32 ":%" PRIu32 ")",
 			  major, minor);
 		goto failed;
 	}
 
 	if (!dm_task_run(*dmt)) {
-		log_error("_deps: task run failed for (%" PRIu32 ":%" PRIu32 ")",
+		log_error(0, "_deps: task run failed for (%" PRIu32 ":%" PRIu32 ")",
 			  major, minor);
 		goto failed;
 	}
 
 	if (!dm_task_get_info(*dmt, info)) {
-		log_error("_deps: failed to get info for (%" PRIu32 ":%" PRIu32 ")",
+		log_error(0, "_deps: failed to get info for (%" PRIu32 ":%" PRIu32 ")",
 			  major, minor);
 		goto failed;
 	}
@@ -419,21 +419,21 @@ static int _deps(struct dm_task **dmt, struct dm_pool *mem, uint32_t major, uint
 		*deps = NULL;
 	} else {
 		if (info->major != major) {
-			log_error("Inconsistent dtree major number: %u != %u",
+			log_error(0, "Inconsistent dtree major number: %u != %u",
 				  major, info->major);
 			goto failed;
 		}
 		if (info->minor != minor) {
-			log_error("Inconsistent dtree minor number: %u != %u",
+			log_error(0, "Inconsistent dtree minor number: %u != %u",
 				  minor, info->minor);
 			goto failed;
 		}
 		if (!(*name = dm_pool_strdup(mem, dm_task_get_name(*dmt)))) {
-			log_error("name pool_strdup failed");
+			log_error(0, "name pool_strdup failed");
 			goto failed;
 		}
 		if (!(*uuid = dm_pool_strdup(mem, dm_task_get_uuid(*dmt)))) {
-			log_error("uuid pool_strdup failed");
+			log_error(0, "uuid pool_strdup failed");
 			goto failed;
 		}
 		*deps = dm_task_get_deps(*dmt);
@@ -511,12 +511,12 @@ static int _node_clear_table(struct dm_tree_node *dnode)
 	int r;
 
 	if (!(info = &dnode->info)) {
-		log_error("_node_clear_table failed: missing info");
+		log_error(0, "_node_clear_table failed: missing info");
 		return 0;
 	}
 
 	if (!(name = dm_tree_node_get_name(dnode))) {
-		log_error("_node_clear_table failed: missing name");
+		log_error(0, "_node_clear_table failed: missing name");
 		return 0;
 	}
 
@@ -529,13 +529,13 @@ static int _node_clear_table(struct dm_tree_node *dnode)
 
 	if (!(dmt = dm_task_create(DM_DEVICE_CLEAR))) {
 		dm_task_destroy(dmt);
-		log_error("Table clear dm_task creation failed for %s", name);
+		log_error(0, "Table clear dm_task creation failed for %s", name);
 		return 0;
 	}
 
 	if (!dm_task_set_major(dmt, info->major) ||
 	    !dm_task_set_minor(dmt, info->minor)) {
-		log_error("Failed to set device number for %s table clear", name);
+		log_error(0, "Failed to set device number for %s table clear", name);
 		dm_task_destroy(dmt);
 		return 0;
 	}
@@ -543,7 +543,7 @@ static int _node_clear_table(struct dm_tree_node *dnode)
 	r = dm_task_run(dmt);
 
 	if (!dm_task_get_info(dmt, info)) {
-		log_error("_node_clear_table failed: info missing after running task for %s", name);
+		log_error(0, "_node_clear_table failed: info missing after running task for %s", name);
 		r = 0;
 	}
 
@@ -568,11 +568,11 @@ struct dm_tree_node *dm_tree_add_new_dev(struct dm_tree *dtree,
 	/* Do we need to add node to tree? */
 	if (!(dnode = dm_tree_find_node_by_uuid(dtree, uuid))) {
 		if (!(name2 = dm_pool_strdup(dtree->mem, name))) {
-			log_error("name pool_strdup failed");
+			log_error(0, "name pool_strdup failed");
 			return NULL;
 		}
 		if (!(uuid2 = dm_pool_strdup(dtree->mem, uuid))) {
-			log_error("uuid pool_strdup failed");
+			log_error(0, "uuid pool_strdup failed");
 			return NULL;
 		}
 
@@ -598,7 +598,7 @@ struct dm_tree_node *dm_tree_add_new_dev(struct dm_tree *dtree,
 	} else if (strcmp(name, dnode->name)) {
 		/* Do we need to rename node? */
 		if (!(dnode->props.new_name = dm_pool_strdup(dtree->mem, name))) {
-			log_error("name pool_strdup failed");
+			log_error(0, "name pool_strdup failed");
 			return 0;
 		}
 	}
@@ -798,18 +798,18 @@ static int _info_by_dev(uint32_t major, uint32_t minor, int with_open_count,
 	int r;
 
 	if (!(dmt = dm_task_create(DM_DEVICE_INFO))) {
-		log_error("_info_by_dev: dm_task creation failed");
+		log_error(0, "_info_by_dev: dm_task creation failed");
 		return 0;
 	}
 
 	if (!dm_task_set_major(dmt, major) || !dm_task_set_minor(dmt, minor)) {
-		log_error("_info_by_dev: Failed to set device number");
+		log_error(0, "_info_by_dev: Failed to set device number");
 		dm_task_destroy(dmt);
 		return 0;
 	}
 
 	if (!with_open_count && !dm_task_no_open_count(dmt))
-		log_error("Failed to disable open_count");
+		log_error(0, "Failed to disable open_count");
 
 	if ((r = dm_task_run(dmt)))
 		r = dm_task_get_info(dmt, info);
@@ -827,18 +827,18 @@ static int _deactivate_node(const char *name, uint32_t major, uint32_t minor)
 	log_verbose("Removing %s (%" PRIu32 ":%" PRIu32 ")", name, major, minor);
 
 	if (!(dmt = dm_task_create(DM_DEVICE_REMOVE))) {
-		log_error("Deactivation dm_task creation failed for %s", name);
+		log_error(0, "Deactivation dm_task creation failed for %s", name);
 		return 0;
 	}
 
 	if (!dm_task_set_major(dmt, major) || !dm_task_set_minor(dmt, minor)) {
-		log_error("Failed to set device number for %s deactivation", name);
+		log_error(0, "Failed to set device number for %s deactivation", name);
 		dm_task_destroy(dmt);
 		return 0;
 	}
 
 	if (!dm_task_no_open_count(dmt))
-		log_error("Failed to disable open_count");
+		log_error(0, "Failed to disable open_count");
 
 	r = dm_task_run(dmt);
 
@@ -860,12 +860,12 @@ static int _rename_node(const char *old_name, const char *new_name, uint32_t maj
 	log_verbose("Renaming %s (%" PRIu32 ":%" PRIu32 ") to %s", old_name, major, minor, new_name);
 
 	if (!(dmt = dm_task_create(DM_DEVICE_RENAME))) {
-		log_error("Rename dm_task creation failed for %s", old_name);
+		log_error(0, "Rename dm_task creation failed for %s", old_name);
 		return 0;
 	}
 
 	if (!dm_task_set_name(dmt, old_name)) {
-		log_error("Failed to set name for %s rename.", old_name);
+		log_error(0, "Failed to set name for %s rename.", old_name);
 		goto out;
 	}
 
@@ -873,7 +873,7 @@ static int _rename_node(const char *old_name, const char *new_name, uint32_t maj
                 goto_out;
 
 	if (!dm_task_no_open_count(dmt))
-		log_error("Failed to disable open_count");
+		log_error(0, "Failed to disable open_count");
 
 	r = dm_task_run(dmt);
 
@@ -894,28 +894,28 @@ static int _resume_node(const char *name, uint32_t major, uint32_t minor,
 	log_verbose("Resuming %s (%" PRIu32 ":%" PRIu32 ")", name, major, minor);
 
 	if (!(dmt = dm_task_create(DM_DEVICE_RESUME))) {
-		log_error("Suspend dm_task creation failed for %s", name);
+		log_error(0, "Suspend dm_task creation failed for %s", name);
 		return 0;
 	}
 
 	/* FIXME Kernel should fill in name on return instead */
 	if (!dm_task_set_name(dmt, name)) {
-		log_error("Failed to set readahead device name for %s", name);
+		log_error(0, "Failed to set readahead device name for %s", name);
 		dm_task_destroy(dmt);
 		return 0;
 	}
 
 	if (!dm_task_set_major(dmt, major) || !dm_task_set_minor(dmt, minor)) {
-		log_error("Failed to set device number for %s resumption.", name);
+		log_error(0, "Failed to set device number for %s resumption.", name);
 		dm_task_destroy(dmt);
 		return 0;
 	}
 
 	if (!dm_task_no_open_count(dmt))
-		log_error("Failed to disable open_count");
+		log_error(0, "Failed to disable open_count");
 
 	if (!dm_task_set_read_ahead(dmt, read_ahead, read_ahead_flags))
-		log_error("Failed to set read ahead");
+		log_error(0, "Failed to set read ahead");
 
 	if ((r = dm_task_run(dmt)))
 		r = dm_task_get_info(dmt, newinfo);
@@ -937,24 +937,24 @@ static int _suspend_node(const char *name, uint32_t major, uint32_t minor,
 		    no_flush ? "" : " with device flush");
 
 	if (!(dmt = dm_task_create(DM_DEVICE_SUSPEND))) {
-		log_error("Suspend dm_task creation failed for %s", name);
+		log_error(0, "Suspend dm_task creation failed for %s", name);
 		return 0;
 	}
 
 	if (!dm_task_set_major(dmt, major) || !dm_task_set_minor(dmt, minor)) {
-		log_error("Failed to set device number for %s suspension.", name);
+		log_error(0, "Failed to set device number for %s suspension.", name);
 		dm_task_destroy(dmt);
 		return 0;
 	}
 
 	if (!dm_task_no_open_count(dmt))
-		log_error("Failed to disable open_count");
+		log_error(0, "Failed to disable open_count");
 
 	if (skip_lockfs && !dm_task_skip_lockfs(dmt))
-		log_error("Failed to set skip_lockfs flag.");
+		log_error(0, "Failed to set skip_lockfs flag.");
 
 	if (no_flush && !dm_task_no_flush(dmt))
-		log_error("Failed to set no_flush flag.");
+		log_error(0, "Failed to set no_flush flag.");
 
 	if ((r = dm_task_run(dmt)))
 		r = dm_task_get_info(dmt, newinfo);
@@ -1001,7 +1001,7 @@ int dm_tree_deactivate_children(struct dm_tree_node *dnode,
 			continue;
 
 		if (!_deactivate_node(name, info.major, info.minor)) {
-			log_error("Unable to deactivate %s (%" PRIu32
+			log_error(0, "Unable to deactivate %s (%" PRIu32
 				  ":%" PRIu32 ")", name, info.major,
 				  info.minor);
 			continue;
@@ -1067,7 +1067,7 @@ int dm_tree_suspend_children(struct dm_tree_node *dnode,
 		if (!_suspend_node(name, info.major, info.minor,
 				   child->dtree->skip_lockfs,
 				   child->dtree->no_flush, &newinfo)) {
-			log_error("Unable to suspend %s (%" PRIu32
+			log_error(0, "Unable to suspend %s (%" PRIu32
 				  ":%" PRIu32 ")", name, info.major,
 				  info.minor);
 			continue;
@@ -1145,7 +1145,7 @@ int dm_tree_activate_children(struct dm_tree_node *dnode,
 			/* Rename? */
 			if (child->props.new_name) {
 				if (!_rename_node(name, child->props.new_name, child->info.major, child->info.minor)) {
-					log_error("Failed to rename %s (%" PRIu32
+					log_error(0, "Failed to rename %s (%" PRIu32
 						  ":%" PRIu32 ") to %s", name, child->info.major,
 						  child->info.minor, child->props.new_name);
 					return 0;
@@ -1160,7 +1160,7 @@ int dm_tree_activate_children(struct dm_tree_node *dnode,
 			if (!_resume_node(child->name, child->info.major, child->info.minor,
 					  child->props.read_ahead,
 					  child->props.read_ahead_flags, &newinfo)) {
-				log_error("Unable to resume %s (%" PRIu32
+				log_error(0, "Unable to resume %s (%" PRIu32
 					  ":%" PRIu32 ")", child->name, child->info.major,
 					  child->info.minor);
 				continue;
@@ -1184,34 +1184,34 @@ static int _create_node(struct dm_tree_node *dnode)
 	log_verbose("Creating %s", dnode->name);
 
 	if (!(dmt = dm_task_create(DM_DEVICE_CREATE))) {
-		log_error("Create dm_task creation failed for %s", dnode->name);
+		log_error(0, "Create dm_task creation failed for %s", dnode->name);
 		return 0;
 	}
 
 	if (!dm_task_set_name(dmt, dnode->name)) {
-		log_error("Failed to set device name for %s", dnode->name);
+		log_error(0, "Failed to set device name for %s", dnode->name);
 		goto out;
 	}
 
 	if (!dm_task_set_uuid(dmt, dnode->uuid)) {
-		log_error("Failed to set uuid for %s", dnode->name);
+		log_error(0, "Failed to set uuid for %s", dnode->name);
 		goto out;
 	}
 
 	if (dnode->props.major &&
 	    (!dm_task_set_major(dmt, dnode->props.major) ||
 	     !dm_task_set_minor(dmt, dnode->props.minor))) {
-		log_error("Failed to set device number for %s creation.", dnode->name);
+		log_error(0, "Failed to set device number for %s creation.", dnode->name);
 		goto out;
 	}
 
 	if (dnode->props.read_only && !dm_task_set_ro(dmt)) {
-		log_error("Failed to set read only flag for %s", dnode->name);
+		log_error(0, "Failed to set read only flag for %s", dnode->name);
 		goto out;
 	}
 
 	if (!dm_task_no_open_count(dmt))
-		log_error("Failed to disable open_count");
+		log_error(0, "Failed to disable open_count");
 
 	if ((r = dm_task_run(dmt)))
 		r = dm_task_get_info(dmt, &dnode->info);
@@ -1226,7 +1226,7 @@ out:
 static int _build_dev_string(char *devbuf, size_t bufsize, struct dm_tree_node *node)
 {
 	if (!dm_format_dev(devbuf, bufsize, node->info.major, node->info.minor)) {
-                log_error("Failed to format %s device number for %s as dm "
+                log_error(0, "Failed to format %s device number for %s as dm "
                           "target (%u,%u)",
                           node->name, node->uuid, node->info.major, node->info.minor);
                 return 0;
@@ -1392,7 +1392,7 @@ static int _emit_segment(struct dm_task *dmt, uint32_t major, uint32_t minor,
 
 	do {
 		if (!(params = dm_malloc(paramsize))) {
-			log_error("Insufficient space for target parameters.");
+			log_error(0, "Insufficient space for target parameters.");
 			return 0;
 		}
 
@@ -1413,7 +1413,7 @@ static int _emit_segment(struct dm_task *dmt, uint32_t major, uint32_t minor,
 		paramsize *= 2;
 	} while (paramsize < MAX_TARGET_PARAMSIZE);
 
-	log_error("Target parameter size too big. Aborting.");
+	log_error(0, "Target parameter size too big. Aborting.");
 	return 0;
 }
 
@@ -1428,23 +1428,23 @@ static int _load_node(struct dm_tree_node *dnode)
 		    dnode->info.major, dnode->info.minor);
 
 	if (!(dmt = dm_task_create(DM_DEVICE_RELOAD))) {
-		log_error("Reload dm_task creation failed for %s", dnode->name);
+		log_error(0, "Reload dm_task creation failed for %s", dnode->name);
 		return 0;
 	}
 
 	if (!dm_task_set_major(dmt, dnode->info.major) ||
 	    !dm_task_set_minor(dmt, dnode->info.minor)) {
-		log_error("Failed to set device number for %s reload.", dnode->name);
+		log_error(0, "Failed to set device number for %s reload.", dnode->name);
 		goto out;
 	}
 
 	if (dnode->props.read_only && !dm_task_set_ro(dmt)) {
-		log_error("Failed to set read only flag for %s", dnode->name);
+		log_error(0, "Failed to set read only flag for %s", dnode->name);
 		goto out;
 	}
 
 	if (!dm_task_no_open_count(dmt))
-		log_error("Failed to disable open_count");
+		log_error(0, "Failed to disable open_count");
 
 	dm_list_iterate_items(seg, &dnode->props.segs)
 		if (!_emit_segment(dmt, dnode->info.major, dnode->info.minor,
@@ -1452,7 +1452,7 @@ static int _load_node(struct dm_tree_node *dnode)
 			goto_out;
 
 	if (!dm_task_suppress_identical_reload(dmt))
-		log_error("Failed to suppress reload of identical tables.");
+		log_error(0, "Failed to suppress reload of identical tables.");
 
 	if ((r = dm_task_run(dmt))) {
 		r = dm_task_get_info(dmt, &dnode->info);
@@ -1527,7 +1527,7 @@ int dm_tree_preload_children(struct dm_tree_node *dnode,
 		if (!_resume_node(child->name, child->info.major, child->info.minor,
 				  child->props.read_ahead,
 				  child->props.read_ahead_flags, &newinfo)) {
-			log_error("Unable to resume %s (%" PRIu32
+			log_error(0, "Unable to resume %s (%" PRIu32
 				  ":%" PRIu32 ")", child->name, child->info.major,
 				  child->info.minor);
 			continue;
@@ -1555,7 +1555,7 @@ int dm_tree_children_use_uuid(struct dm_tree_node *dnode,
 
 	while ((child = dm_tree_next_child(&handle, dnode, 0))) {
 		if (!(uuid = dm_tree_node_get_uuid(child))) {
-			log_error("Failed to get uuid for dtree node.");
+			log_error(0, "Failed to get uuid for dtree node.");
 			return 1;
 		}
 
@@ -1577,7 +1577,7 @@ static struct load_segment *_add_segment(struct dm_tree_node *dnode, unsigned ty
 	struct load_segment *seg;
 
 	if (!(seg = dm_pool_zalloc(dnode->dtree->mem, sizeof(*seg)))) {
-		log_error("dtree node segment allocation failed");
+		log_error(0, "dtree node segment allocation failed");
 		return NULL;
 	}
 
@@ -1608,7 +1608,7 @@ int dm_tree_node_add_snapshot_origin_target(struct dm_tree_node *dnode,
 		return_0;
 
 	if (!(origin_node = dm_tree_find_node_by_uuid(dnode->dtree, origin_uuid))) {
-		log_error("Couldn't find snapshot origin uuid %s.", origin_uuid);
+		log_error(0, "Couldn't find snapshot origin uuid %s.", origin_uuid);
 		return 0;
 	}
 
@@ -1636,7 +1636,7 @@ int dm_tree_node_add_snapshot_target(struct dm_tree_node *node,
 		return_0;
 
 	if (!(origin_node = dm_tree_find_node_by_uuid(node->dtree, origin_uuid))) {
-		log_error("Couldn't find snapshot origin uuid %s.", origin_uuid);
+		log_error(0, "Couldn't find snapshot origin uuid %s.", origin_uuid);
 		return 0;
 	}
 
@@ -1645,7 +1645,7 @@ int dm_tree_node_add_snapshot_target(struct dm_tree_node *node,
 		return_0;
 
 	if (!(cow_node = dm_tree_find_node_by_uuid(node->dtree, cow_uuid))) {
-		log_error("Couldn't find snapshot origin uuid %s.", cow_uuid);
+		log_error(0, "Couldn't find snapshot origin uuid %s.", cow_uuid);
 		return 0;
 	}
 
@@ -1733,7 +1733,7 @@ int dm_tree_node_add_mirror_target_log(struct dm_tree_node *node,
 	struct load_segment *seg;
 
 	if (!node->props.segment_count) {
-		log_error("Internal error: Attempt to add target area to missing segment.");
+		log_error(0, "Internal error: Attempt to add target area to missing segment.");
 		return 0;
 	}
 
@@ -1741,12 +1741,12 @@ int dm_tree_node_add_mirror_target_log(struct dm_tree_node *node,
 
 	if (log_uuid) {
 		if (!(seg->uuid = dm_pool_strdup(node->dtree->mem, log_uuid))) {
-			log_error("log uuid pool_strdup failed");
+			log_error(0, "log uuid pool_strdup failed");
 			return 0;
 		}
 		if (!(flags & DM_CORELOG)) {
 			if (!(log_node = dm_tree_find_node_by_uuid(node->dtree, log_uuid))) {
-				log_error("Couldn't find mirror log uuid %s.", log_uuid);
+				log_error(0, "Couldn't find mirror log uuid %s.", log_uuid);
 				return 0;
 			}
 
@@ -1780,7 +1780,7 @@ static int _add_area(struct dm_tree_node *node, struct load_segment *seg, struct
 	struct seg_area *area;
 
 	if (!(area = dm_pool_zalloc(node->dtree->mem, sizeof (*area)))) {
-		log_error("Failed to allocate target segment area.");
+		log_error(0, "Failed to allocate target segment area.");
 		return 0;
 	}
 
@@ -1803,25 +1803,25 @@ int dm_tree_node_add_target_area(struct dm_tree_node *node,
 	struct dm_tree_node *dev_node;
 
 	if ((!dev_name || !*dev_name) && (!uuid || !*uuid)) {
-		log_error("dm_tree_node_add_target_area called without device");
+		log_error(0, "dm_tree_node_add_target_area called without device");
 		return 0;
 	}
 
 	if (uuid) {
 		if (!(dev_node = dm_tree_find_node_by_uuid(node->dtree, uuid))) {
-			log_error("Couldn't find area uuid %s.", uuid);
+			log_error(0, "Couldn't find area uuid %s.", uuid);
 			return 0;
 		}
 		if (!_link_tree_nodes(node, dev_node))
 			return_0;
 	} else {
         	if (stat(dev_name, &info) < 0) {
-			log_error("Device %s not found.", dev_name);
+			log_error(0, "Device %s not found.", dev_name);
 			return 0;
 		}
 
         	if (!S_ISBLK(info.st_mode)) {
-			log_error("Device %s is not a block device.", dev_name);
+			log_error(0, "Device %s is not a block device.", dev_name);
 			return 0;
 		}
 
@@ -1831,7 +1831,7 @@ int dm_tree_node_add_target_area(struct dm_tree_node *node,
 	}
 
 	if (!node->props.segment_count) {
-		log_error("Internal error: Attempt to add target area to missing segment.");
+		log_error(0, "Internal error: Attempt to add target area to missing segment.");
 		return 0;
 	}
 
diff --git a/libdm/libdm-file.c b/libdm/libdm-file.c
index 749ee4f..cde7144 100644
--- a/libdm/libdm-file.c
+++ b/libdm/libdm-file.c
@@ -67,7 +67,7 @@ int dm_create_dir(const char *dir)
 	if (S_ISDIR(info.st_mode))
 		return 1;
 
-	log_error("Directory \"%s\" not found", dir);
+	log_error(0, "Directory \"%s\" not found", dir);
 	return 0;
 }
 
diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c
index 6784a11..54af552 100644
--- a/libdm/libdm-report.c
+++ b/libdm/libdm-report.c
@@ -105,7 +105,7 @@ int dm_report_field_string(struct dm_report *rh,
 	char *repstr;
 
 	if (!(repstr = dm_pool_strdup(rh->mem, *data))) {
-		log_error("dm_report_field_string: dm_pool_strdup failed");
+		log_error(0, "dm_report_field_string: dm_pool_strdup failed");
 		return 0;
 	}
 
@@ -123,17 +123,17 @@ int dm_report_field_int(struct dm_report *rh,
 	char *repstr;
 
 	if (!(repstr = dm_pool_zalloc(rh->mem, 13))) {
-		log_error("dm_report_field_int: dm_pool_alloc failed");
+		log_error(0, "dm_report_field_int: dm_pool_alloc failed");
 		return 0;
 	}
 
 	if (!(sortval = dm_pool_alloc(rh->mem, sizeof(int64_t)))) {
-		log_error("dm_report_field_int: dm_pool_alloc failed");
+		log_error(0, "dm_report_field_int: dm_pool_alloc failed");
 		return 0;
 	}
 
 	if (dm_snprintf(repstr, 12, "%d", value) < 0) {
-		log_error("dm_report_field_int: int too big: %d", value);
+		log_error(0, "dm_report_field_int: int too big: %d", value);
 		return 0;
 	}
 
@@ -152,17 +152,17 @@ int dm_report_field_uint32(struct dm_report *rh,
 	char *repstr;
 
 	if (!(repstr = dm_pool_zalloc(rh->mem, 12))) {
-		log_error("dm_report_field_uint32: dm_pool_alloc failed");
+		log_error(0, "dm_report_field_uint32: dm_pool_alloc failed");
 		return 0;
 	}
 
 	if (!(sortval = dm_pool_alloc(rh->mem, sizeof(uint64_t)))) {
-		log_error("dm_report_field_uint32: dm_pool_alloc failed");
+		log_error(0, "dm_report_field_uint32: dm_pool_alloc failed");
 		return 0;
 	}
 
 	if (dm_snprintf(repstr, 11, "%u", value) < 0) {
-		log_error("dm_report_field_uint32: uint32 too big: %u", value);
+		log_error(0, "dm_report_field_uint32: uint32 too big: %u", value);
 		return 0;
 	}
 
@@ -181,17 +181,17 @@ int dm_report_field_int32(struct dm_report *rh,
 	char *repstr;
 
 	if (!(repstr = dm_pool_zalloc(rh->mem, 13))) {
-		log_error("dm_report_field_int32: dm_pool_alloc failed");
+		log_error(0, "dm_report_field_int32: dm_pool_alloc failed");
 		return 0;
 	}
 
 	if (!(sortval = dm_pool_alloc(rh->mem, sizeof(int64_t)))) {
-		log_error("dm_report_field_int32: dm_pool_alloc failed");
+		log_error(0, "dm_report_field_int32: dm_pool_alloc failed");
 		return 0;
 	}
 
 	if (dm_snprintf(repstr, 12, "%d", value) < 0) {
-		log_error("dm_report_field_int32: int32 too big: %d", value);
+		log_error(0, "dm_report_field_int32: int32 too big: %d", value);
 		return 0;
 	}
 
@@ -210,17 +210,17 @@ int dm_report_field_uint64(struct dm_report *rh,
 	char *repstr;
 
 	if (!(repstr = dm_pool_zalloc(rh->mem, 22))) {
-		log_error("dm_report_field_uint64: dm_pool_alloc failed");
+		log_error(0, "dm_report_field_uint64: dm_pool_alloc failed");
 		return 0;
 	}
 
 	if (!(sortval = dm_pool_alloc(rh->mem, sizeof(uint64_t)))) {
-		log_error("dm_report_field_uint64: dm_pool_alloc failed");
+		log_error(0, "dm_report_field_uint64: dm_pool_alloc failed");
 		return 0;
 	}
 
 	if (dm_snprintf(repstr, 21, "%d", value) < 0) {
-		log_error("dm_report_field_uint64: uint64 too big: %d", value);
+		log_error(0, "dm_report_field_uint64: uint64 too big: %d", value);
 		return 0;
 	}
 
@@ -295,7 +295,7 @@ static int _copy_field(struct dm_report *rh, struct field_properties *dest,
 	/* set object type method */
 	dest->type = _find_type(rh, rh->fields[field_num].type);
 	if (!dest->type) {
-		log_error("dm_report: field not match: %s",
+		log_error(0, "dm_report: field not match: %s",
 			  rh->fields[field_num].id);
 		return 0;
 	}
@@ -309,7 +309,7 @@ static struct field_properties * _add_field(struct dm_report *rh,
 	struct field_properties *fp;
 
 	if (!(fp = dm_pool_zalloc(rh->mem, sizeof(struct field_properties)))) {
-		log_error("dm_report: struct field_properties allocation "
+		log_error(0, "dm_report: struct field_properties allocation "
 			  "failed");
 		return NULL;
 	}
@@ -459,7 +459,7 @@ static int _add_sort_key(struct dm_report *rh, uint32_t field_num,
 		return 1;
 
 	if (found->flags & FLD_SORT_KEY) {
-		log_error("dm_report: Ignoring duplicate sort field: %s",
+		log_error(0, "dm_report: Ignoring duplicate sort field: %s",
 			  rh->fields[field_num].id);
 		return 1;
 	}
@@ -492,7 +492,7 @@ static int _key_match(struct dm_report *rh, const char *key, size_t len,
 		flags = FLD_ASCENDING;
 
 	if (!len) {
-		log_error("dm_report: Missing sort field name");
+		log_error(0, "dm_report: Missing sort field name");
 		return 0;
 	}
 
@@ -524,7 +524,7 @@ static int _parse_fields(struct dm_report *rh, const char *format,
 			_display_fields(rh);
 			log_warn(" ");
 			if (strcasecmp(ws, "help") && strcmp(ws, "?"))
-				log_error("Unrecognised field: %.*s",
+				log_error(0, "Unrecognised field: %.*s",
 					  (int) (we - ws), ws);
 			return 0;
 		}
@@ -547,7 +547,7 @@ static int _parse_keys(struct dm_report *rh, const char *keys,
 		while (*we && *we != ',')
 			we++;
 		if (!_key_match(rh, ws, (size_t) (we - ws), report_type_only)) {
-			log_error("dm_report: Unrecognised field: %.*s",
+			log_error(0, "dm_report: Unrecognised field: %.*s",
 				  (int) (we - ws), ws);
 			return 0;
 		}
@@ -569,7 +569,7 @@ struct dm_report *dm_report_init(uint32_t *report_types,
 	const struct dm_report_object_type *type;
 
 	if (!(rh = dm_malloc(sizeof(*rh)))) {
-		log_error("dm_report_init: dm_malloc failed");
+		log_error(0, "dm_report_init: dm_malloc failed");
 		return 0;
 	}
 	memset(rh, 0, sizeof(*rh));
@@ -609,7 +609,7 @@ struct dm_report *dm_report_init(uint32_t *report_types,
 		rh->field_prefix = "";
 
 	if (!(rh->mem = dm_pool_create("report", 10 * 1024))) {
-		log_error("dm_report_init: allocation of memory pool failed");
+		log_error(0, "dm_report_init: allocation of memory pool failed");
 		dm_free(rh);
 		return NULL;
 	}
@@ -661,7 +661,7 @@ int dm_report_set_output_field_name_prefix(struct dm_report *rh, const char *out
 	char *prefix;
 
 	if (!(prefix = dm_pool_strdup(rh->mem, output_field_name_prefix))) {
-		log_error("dm_report_set_output_field_name_prefix: dm_pool_strdup failed");
+		log_error(0, "dm_report_set_output_field_name_prefix: dm_pool_strdup failed");
 		return 0;
 	}
 
@@ -692,7 +692,7 @@ int dm_report_object(struct dm_report *rh, void *object)
 	void *data = NULL;
 
 	if (!(row = dm_pool_zalloc(rh->mem, sizeof(*row)))) {
-		log_error("dm_report_object: struct row allocation failed");
+		log_error(0, "dm_report_object: struct row allocation failed");
 		return 0;
 	}
 
@@ -702,7 +702,7 @@ int dm_report_object(struct dm_report *rh, void *object)
 	    !(row->sort_fields =
 		dm_pool_zalloc(rh->mem, sizeof(struct dm_report_field *) *
 			       rh->keys_count))) {
-		log_error("dm_report_object: "
+		log_error(0, "dm_report_object: "
 			  "row sort value structure allocation failed");
 		return 0;
 	}
@@ -713,7 +713,7 @@ int dm_report_object(struct dm_report *rh, void *object)
 	/* For each field to be displayed, call its report_fn */
 	dm_list_iterate_items(fp, &rh->field_props) {
 		if (!(field = dm_pool_zalloc(rh->mem, sizeof(*field)))) {
-			log_error("dm_report_object: "
+			log_error(0, "dm_report_object: "
 				  "struct dm_report_field allocation failed");
 			return 0;
 		}
@@ -726,7 +726,7 @@ int dm_report_object(struct dm_report *rh, void *object)
 		if (!rh->fields[fp->field_num].report_fn(rh, rh->mem,
 							 field, data,
 							 rh->private)) {
-			log_error("dm_report_object: "
+			log_error(0, "dm_report_object: "
 				  "report function failed for field %s",
 				  rh->fields[fp->field_num].id);
 			return 0;
@@ -766,7 +766,7 @@ static int _report_headings(struct dm_report *rh)
 		return 1;
 
 	if (!dm_pool_begin_object(rh->mem, 128)) {
-		log_error("dm_report: "
+		log_error(0, "dm_report: "
 			  "dm_pool_begin_object failed for headings");
 		return 0;
 	}
@@ -780,26 +780,26 @@ static int _report_headings(struct dm_report *rh)
 		if (rh->flags & DM_REPORT_OUTPUT_ALIGNED) {
 			if (dm_snprintf(buf, sizeof(buf), "%-*.*s",
 					 fp->width, fp->width, heading) < 0) {
-				log_error("dm_report: snprintf heading failed");
+				log_error(0, "dm_report: snprintf heading failed");
 				goto bad;
 			}
 			if (!dm_pool_grow_object(rh->mem, buf, fp->width)) {
-				log_error("dm_report: Failed to generate report headings for printing");
+				log_error(0, "dm_report: Failed to generate report headings for printing");
 				goto bad;
 			}
 		} else if (!dm_pool_grow_object(rh->mem, heading, 0)) {
-			log_error("dm_report: Failed to generate report headings for printing");
+			log_error(0, "dm_report: Failed to generate report headings for printing");
 			goto bad;
 		}
 
 		if (!dm_list_end(&rh->field_props, &fp->list))
 			if (!dm_pool_grow_object(rh->mem, rh->separator, 0)) {
-				log_error("dm_report: Failed to generate report headings for printing");
+				log_error(0, "dm_report: Failed to generate report headings for printing");
 				goto bad;
 			}
 	}
 	if (!dm_pool_grow_object(rh->mem, "\0", 1)) {
-		log_error("dm_report: Failed to generate report headings for printing");
+		log_error(0, "dm_report: Failed to generate report headings for printing");
 		goto bad;
 	}
 	log_print("%s", (char *) dm_pool_end_object(rh->mem));
@@ -865,7 +865,7 @@ static int _sort_rows(struct dm_report *rh)
 
 	if (!(rows = dm_pool_alloc(rh->mem, sizeof(**rows) *
 				dm_list_size(&rh->rows)))) {
-		log_error("dm_report: sort array allocation failed");
+		log_error(0, "dm_report: sort array allocation failed");
 		return 0;
 	}
 
@@ -894,30 +894,30 @@ static int _output_field(struct dm_report *rh, struct dm_report_field *field)
 
 	if (rh->flags & DM_REPORT_OUTPUT_FIELD_NAME_PREFIX) {
 		if (!(field_id = strdup(rh->fields[field->props->field_num].id))) {
-			log_error("dm_report: Failed to copy field name");
+			log_error(0, "dm_report: Failed to copy field name");
 			return 0;
 		}
 
 		if (!dm_pool_grow_object(rh->mem, rh->output_field_name_prefix, 0)) {
-			log_error("dm_report: Unable to extend output line");
+			log_error(0, "dm_report: Unable to extend output line");
 			return 0;
 		}
 
 		if (!dm_pool_grow_object(rh->mem, _toupperstr(field_id), 0)) {
-			log_error("dm_report: Unable to extend output line");
+			log_error(0, "dm_report: Unable to extend output line");
 			return 0;
 		}
 
 		free(field_id);
 
 		if (!dm_pool_grow_object(rh->mem, "=", 1)) {
-			log_error("dm_report: Unable to extend output line");
+			log_error(0, "dm_report: Unable to extend output line");
 			return 0;
 		}
 
 		if (!(rh->flags & DM_REPORT_OUTPUT_FIELD_UNQUOTED) &&
 		    !dm_pool_grow_object(rh->mem, "\'", 1)) {
-			log_error("dm_report: Unable to extend output line");
+			log_error(0, "dm_report: Unable to extend output line");
 			return 0;
 		}
 	}
@@ -926,7 +926,7 @@ static int _output_field(struct dm_report *rh, struct dm_report_field *field)
 	width = field->props->width;
 	if (!(rh->flags & DM_REPORT_OUTPUT_ALIGNED)) {
 		if (!dm_pool_grow_object(rh->mem, repstr, 0)) {
-			log_error("dm_report: Unable to extend output line");
+			log_error(0, "dm_report: Unable to extend output line");
 			return 0;
 		}
 	} else {
@@ -936,21 +936,21 @@ static int _output_field(struct dm_report *rh, struct dm_report_field *field)
 		if (align & DM_REPORT_FIELD_ALIGN_LEFT) {
 			if (dm_snprintf(buf, sizeof(buf), "%-*.*s",
 					 width, width, repstr) < 0) {
-				log_error("dm_report: left-aligned snprintf() failed");
+				log_error(0, "dm_report: left-aligned snprintf() failed");
 				return 0;
 			}
 			if (!dm_pool_grow_object(rh->mem, buf, width)) {
-				log_error("dm_report: Unable to extend output line");
+				log_error(0, "dm_report: Unable to extend output line");
 				return 0;
 			}
 		} else if (align & DM_REPORT_FIELD_ALIGN_RIGHT) {
 			if (dm_snprintf(buf, sizeof(buf), "%*.*s",
 					 width, width, repstr) < 0) {
-				log_error("dm_report: right-aligned snprintf() failed");
+				log_error(0, "dm_report: right-aligned snprintf() failed");
 				return 0;
 			}
 			if (!dm_pool_grow_object(rh->mem, buf, width)) {
-				log_error("dm_report: Unable to extend output line");
+				log_error(0, "dm_report: Unable to extend output line");
 				return 0;
 			}
 		}
@@ -959,7 +959,7 @@ static int _output_field(struct dm_report *rh, struct dm_report_field *field)
 	if ((rh->flags & DM_REPORT_OUTPUT_FIELD_NAME_PREFIX) &&
 	    !(rh->flags & DM_REPORT_OUTPUT_FIELD_UNQUOTED))
 		if (!dm_pool_grow_object(rh->mem, "\'", 1)) {
-			log_error("dm_report: Unable to extend output line");
+			log_error(0, "dm_report: Unable to extend output line");
 			return 0;
 		}
 
@@ -973,7 +973,7 @@ static int _output_as_rows(struct dm_report *rh)
 	struct row *row;
 
 	if (!dm_pool_begin_object(rh->mem, 512)) {
-		log_error("dm_report: Unable to allocate output line");
+		log_error(0, "dm_report: Unable to allocate output line");
 		return 0;
 	}
 
@@ -988,11 +988,11 @@ static int _output_as_rows(struct dm_report *rh)
 
 		if ((rh->flags & DM_REPORT_OUTPUT_HEADINGS)) {
 			if (!dm_pool_grow_object(rh->mem, rh->fields[fp->field_num].heading, 0)) {
-				log_error("dm_report: Failed to extend row for field name");
+				log_error(0, "dm_report: Failed to extend row for field name");
 				goto bad;
 			}
 			if (!dm_pool_grow_object(rh->mem, rh->separator, 0)) {
-				log_error("dm_report: Failed to extend row with separator");
+				log_error(0, "dm_report: Failed to extend row with separator");
 				goto bad;
 			}
 		}
@@ -1006,13 +1006,13 @@ static int _output_as_rows(struct dm_report *rh)
 
 			if (!dm_list_end(&rh->rows, &row->list))
 				if (!dm_pool_grow_object(rh->mem, rh->separator, 0)) {
-					log_error("dm_report: Unable to extend output line");
+					log_error(0, "dm_report: Unable to extend output line");
 					goto bad;
 				}
 		}
 
 		if (!dm_pool_grow_object(rh->mem, "\0", 1)) {
-			log_error("dm_report: Failed to terminate row");
+			log_error(0, "dm_report: Failed to terminate row");
 			goto bad;
 		}
 		log_print("%s", (char *) dm_pool_end_object(rh->mem));
@@ -1038,7 +1038,7 @@ static int _output_as_columns(struct dm_report *rh)
 	/* Print and clear buffer */
 	dm_list_iterate_safe(rowh, rtmp, &rh->rows) {
 		if (!dm_pool_begin_object(rh->mem, 512)) {
-			log_error("dm_report: Unable to allocate output line");
+			log_error(0, "dm_report: Unable to allocate output line");
 			return 0;
 		}
 		row = dm_list_item(rowh, struct row);
@@ -1052,14 +1052,14 @@ static int _output_as_columns(struct dm_report *rh)
 
 			if (!dm_list_end(&row->fields, fh))
 				if (!dm_pool_grow_object(rh->mem, rh->separator, 0)) {
-					log_error("dm_report: Unable to extend output line");
+					log_error(0, "dm_report: Unable to extend output line");
 					goto bad;
 				}
 
 			dm_list_del(&field->list);
 		}
 		if (!dm_pool_grow_object(rh->mem, "\0", 1)) {
-			log_error("dm_report: Unable to terminate output line");
+			log_error(0, "dm_report: Unable to terminate output line");
 			goto bad;
 		}
 		log_print("%s", (char *) dm_pool_end_object(rh->mem));
diff --git a/libdm/mm/dbg_malloc.c b/libdm/mm/dbg_malloc.c
index add285a..8b53e5d 100644
--- a/libdm/mm/dbg_malloc.c
+++ b/libdm/mm/dbg_malloc.c
@@ -23,7 +23,7 @@ char *dm_strdup_aux(const char *str, const char *file, int line)
 	char *ret;
 
 	if (!str) {
-		log_error("Internal error: dm_strdup called with NULL pointer");
+		log_error(0, "Internal error: dm_strdup called with NULL pointer");
 		return NULL;
 	}
 
@@ -60,13 +60,13 @@ void *dm_malloc_aux_debug(size_t s, const char *file, int line)
 	size_t tsize = s + sizeof(*nb) + sizeof(unsigned long);
 
 	if (s > 50000000) {
-		log_error("Huge memory allocation (size %" PRIsize_t
+		log_error(0, "Huge memory allocation (size %" PRIsize_t
 			  ") rejected - metadata corruption?", s);
 		return 0;
 	}
 
 	if (!(nb = malloc(tsize))) {
-		log_error("couldn't allocate any memory, size = %" PRIsize_t,
+		log_error(0, "couldn't allocate any memory, size = %" PRIsize_t,
 			  s);
 		return 0;
 	}
@@ -235,7 +235,7 @@ void *dm_malloc_aux(size_t s, const char *file __attribute((unused)),
 		    int line __attribute((unused)))
 {
 	if (s > 50000000) {
-		log_error("Huge memory allocation (size %" PRIsize_t
+		log_error(0, "Huge memory allocation (size %" PRIsize_t
 			  ") rejected - metadata corruption?", s);
 		return 0;
 	}
diff --git a/libdm/mm/pool-debug.c b/libdm/mm/pool-debug.c
index f775dea..c70f3b8 100644
--- a/libdm/mm/pool-debug.c
+++ b/libdm/mm/pool-debug.c
@@ -51,7 +51,7 @@ struct dm_pool *dm_pool_create(const char *name, size_t chunk_hint)
 	struct dm_pool *mem = dm_malloc(sizeof(*mem));
 
 	if (!mem) {
-		log_error("Couldn't create memory pool %s (size %"
+		log_error(0, "Couldn't create memory pool %s (size %"
 			  PRIsize_t ")", name, sizeof(*mem));
 		return NULL;
 	}
@@ -149,12 +149,12 @@ static struct block *_new_block(size_t s, unsigned alignment)
 	assert(alignment == DEFAULT_ALIGNMENT);
 
 	if (!b) {
-		log_err("Out of memory");
+		log_error(0, "Out of memory");
 		return NULL;
 	}
 
 	if (!(b->data = dm_malloc(s))) {
-		log_err("Out of memory");
+		log_error(0, "Out of memory");
 		dm_free(b);
 		return NULL;
 	}
@@ -237,7 +237,7 @@ int dm_pool_grow_object(struct dm_pool *p, const void *extra, size_t delta)
 		new_size = delta;
 
 	if (!(new = _new_block(new_size, DEFAULT_ALIGNMENT))) {
-		log_err("Couldn't extend object.");
+		log_error(0, "Couldn't extend object.");
 		return 0;
 	}
 
diff --git a/libdm/mm/pool-fast.c b/libdm/mm/pool-fast.c
index d34cd9a..425e368 100644
--- a/libdm/mm/pool-fast.c
+++ b/libdm/mm/pool-fast.c
@@ -41,7 +41,7 @@ struct dm_pool *dm_pool_create(const char *name, size_t chunk_hint)
 	struct dm_pool *p = dm_malloc(sizeof(*p));
 
 	if (!p) {
-		log_error("Couldn't create memory pool %s (size %"
+		log_error(0, "Couldn't create memory pool %s (size %"
 			  PRIsize_t ")", name, sizeof(*p));
 		return 0;
 	}
@@ -132,7 +132,7 @@ void dm_pool_free(struct dm_pool *p, void *ptr)
 	}
 
 	if (!c)
-		log_error("Internal error: pool_free asked to free pointer "
+		log_error(0, "Internal error: pool_free asked to free pointer "
 			  "not in pool");
 	else
 		p->chunk = c;
@@ -224,7 +224,7 @@ struct chunk *_new_chunk(struct dm_pool *p, size_t s)
 		p->spare_chunk = 0;
 	} else {
 		if (!(c = dm_malloc(s))) {
-			log_error("Out of memory.  Requested %" PRIsize_t
+			log_error(0, "Out of memory.  Requested %" PRIsize_t
 				  " bytes.", s);
 			return NULL;
 		}
diff --git a/libdm/mm/pool.c b/libdm/mm/pool.c
index 35bfffa..fe96c1a 100644
--- a/libdm/mm/pool.c
+++ b/libdm/mm/pool.c
@@ -64,14 +64,14 @@ void dm_pools_check_leaks(void)
 	if (dm_list_empty(&_dm_pools))
 		return;
 
-	log_error("You have a memory leak (not released memory pool):");
+	log_error(0, "You have a memory leak (not released memory pool):");
 	dm_list_iterate_items(p, &_dm_pools) {
 #ifdef DEBUG_POOL
-		log_error(" [%p] %s (%u bytes)",
+		log_error(0, " [%p] %s (%u bytes)",
 			  p->orig_pool,
 			  p->name, p->stats.bytes);
 #else
-		log_error(" [%p]", p);
+		log_error(0, " [%p]", p);
 #endif
 	}
 }
diff --git a/libdm/regex/matcher.c b/libdm/regex/matcher.c
index c2dda3e..869103a 100644
--- a/libdm/regex/matcher.c
+++ b/libdm/regex/matcher.c
@@ -133,7 +133,7 @@ static void _calc_functions(struct dm_regex *m)
 			break;
 
 		default:
-			log_error("Internal error: Unknown calc node type");
+			log_error(0, "Internal error: Unknown calc node type");
 		}
 
 		/*
@@ -300,7 +300,7 @@ struct dm_regex *dm_regex_create(struct dm_pool *mem, const char **patterns,
 
 	/* parse this expression */
 	if (!(rx = rx_parse_tok(scratch, all, ptr))) {
-		log_error("Couldn't parse regex");
+		log_error(0, "Couldn't parse regex");
 		goto bad;
 	}
 
diff --git a/libdm/regex/parse_rx.c b/libdm/regex/parse_rx.c
index fdea1a3..3f090f1 100644
--- a/libdm/regex/parse_rx.c
+++ b/libdm/regex/parse_rx.c
@@ -85,7 +85,7 @@ static int _rx_get_token(struct parse_sp *ps)
 				range = 1;
 				ptr++;
 				if (ptr == ps->rx_end) {
-					log_error("Incomplete range"
+					log_error(0, "Incomplete range"
 						  "specification");
 					return -1;
 				}
@@ -163,7 +163,7 @@ static int _rx_get_token(struct parse_sp *ps)
 		/* escaped character */
 		ptr++;
 		if (ptr >= ps->rx_end) {
-			log_error("Badly quoted character at end "
+			log_error(0, "Badly quoted character at end "
 				  "of expression");
 			ps->type = -1;
 			return -1;
@@ -237,7 +237,7 @@ static struct rx_node *_term(struct parse_sp *ps)
 		_rx_get_token(ps);	/* match '(' */
 		n = _or_term(ps);
 		if (ps->type != ')') {
-			log_error("missing ')' in regular expression");
+			log_error(0, "missing ')' in regular expression");
 			return 0;
 		}
 		_rx_get_token(ps);	/* match ')' */
@@ -319,7 +319,7 @@ static struct rx_node *_or_term(struct parse_sp *ps)
 	_rx_get_token(ps);		/* match '|' */
 
 	if (!(r = _or_term(ps))) {
-		log_error("Badly formed 'or' expression");
+		log_error(0, "Badly formed 'or' expression");
 		return NULL;
 	}
 
@@ -347,7 +347,7 @@ struct rx_node *rx_parse_tok(struct dm_pool *mem,
 	_rx_get_token(ps);		/* load the first token */
 
 	if (!(r = _or_term(ps))) {
-		log_error("Parse error in regex");
+		log_error(0, "Parse error in regex");
 		dm_pool_free(mem, ps);
 	}
 
diff --git a/liblvm/lvm_base.c b/liblvm/lvm_base.c
index 6d27c4d..2841719 100644
--- a/liblvm/lvm_base.c
+++ b/liblvm/lvm_base.c
@@ -44,7 +44,7 @@ lvm_t lvm_create(const char *system_dir)
 	/* initialize locking */
 	if (!init_locking(-1, cmd)) {
 		/* FIXME: use EAGAIN as error code here */
-		log_error("Locking initialisation failed.");
+		log_error(0, "Locking initialisation failed.");
 		lvm_destroy((lvm_t) cmd);
 		return NULL;
 	}
diff --git a/old-tests/datastruct/hash_t.c b/old-tests/datastruct/hash_t.c
index e977eab..4c83e2c 100644
--- a/old-tests/datastruct/hash_t.c
+++ b/old-tests/datastruct/hash_t.c
@@ -63,7 +63,7 @@ static void _do_test(int table_size, int num_entries)
 	for (i = 0; i < num_entries; i++) {
 		/* make up a word */
 		if (!(key = _create_word_from_file(i))) {
-			log_error("Ran out of words !\n");
+			log_error(0, "Ran out of words !\n");
 			exit(1);
 		}
 
@@ -76,7 +76,7 @@ static void _do_test(int table_size, int num_entries)
 	for (key = all; key; key = key->next) {
 		tmp = (struct key_list *) hash_lookup(ht, key->key);
 		if (!tmp || (tmp != key)) {
-			log_error("lookup failed\n");
+			log_error(0, "lookup failed\n");
 			exit(1);
 		}
 	}
diff --git a/old-tests/dev-mgr/dev_cache_t.c b/old-tests/dev-mgr/dev_cache_t.c
index 7cd2085..f4b25b9 100644
--- a/old-tests/dev-mgr/dev_cache_t.c
+++ b/old-tests/dev-mgr/dev_cache_t.c
@@ -26,19 +26,19 @@ int main(int argc, char **argv)
 
 	init_log();
 	if (!dev_cache_init()) {
-		log_error("couldn't initialise dev_cache_init failed\n");
+		log_error(0, "couldn't initialise dev_cache_init failed\n");
 		exit(1);
 	}
 
 	for (i = 1; i < argc; i++) {
 		if (!dev_cache_add_dir(argv[i])) {
-			log_error("couldn't add '%s' to dev_cache\n");
+			log_error(0, "couldn't add '%s' to dev_cache\n");
 			exit(1);
 		}
 	}
 
 	if (!(iter = dev_iter_create(NULL))) {
-		log_error("couldn't create iterator\n");
+		log_error(0, "couldn't create iterator\n");
 		exit(1);
 	}
 
diff --git a/old-tests/device/dev_cache_t.c b/old-tests/device/dev_cache_t.c
index f19a56f..63342d4 100644
--- a/old-tests/device/dev_cache_t.c
+++ b/old-tests/device/dev_cache_t.c
@@ -35,19 +35,19 @@ int main(int argc, char **argv)
 	init_debug(_LOG_INFO);
 
 	if (!dev_cache_init()) {
-		log_err("couldn't initialise dev_cache_init failed");
+		log_error(0, "couldn't initialise dev_cache_init failed");
 		exit(1);
 	}
 
 	for (i = 1; i < argc; i++) {
 		if (!dev_cache_add_dir(argv[i])) {
-			log_err("couldn't add '%s' to dev_cache", argv[i]);
+			log_error(0, "couldn't add '%s' to dev_cache", argv[i]);
 			exit(1);
 		}
 	}
 
 	if (!(iter = dev_iter_create(NULL))) {
-		log_err("couldn't create iterator");
+		log_error(0, "couldn't create iterator");
 		exit(1);
 	}
 
diff --git a/old-tests/device/random.c b/old-tests/device/random.c
index d2cac3b..e253119 100644
--- a/old-tests/device/random.c
+++ b/old-tests/device/random.c
@@ -100,7 +100,7 @@ int rand_check(void)
 	rand_init(-314159L);
 
 	if (next_rand(sc) != 119318998)	{
-		log_err("Random number generator failed check 1");
+		log_error(0, "Random number generator failed check 1");
 		return 0;
 	}
 
@@ -108,7 +108,7 @@ int rand_check(void)
 		rand_get();
 
 	if (_uniform(0x55555555L) != 748103812) {
-		log_err("Random number generator failed check 2");
+		log_error(0, "Random number generator failed check 2");
 		return 0;
 	}
 
diff --git a/old-tests/filters/pfilter_t.c b/old-tests/filters/pfilter_t.c
index e9f8af4..7c2b0fd 100644
--- a/old-tests/filters/pfilter_t.c
+++ b/old-tests/filters/pfilter_t.c
@@ -80,7 +80,7 @@ int main(int argc, char **argv)
 	}
 
 	if (!(iter = dev_iter_create(pfilter))) {
-		log_err("couldn't create iterator");
+		log_error(0, "couldn't create iterator");
 		exit(1);
 	}
 
@@ -102,7 +102,7 @@ int main(int argc, char **argv)
 	}
 
 	if (!(iter = dev_iter_create(pfilter))) {
-		log_err("couldn't create iterator");
+		log_error(0, "couldn't create iterator");
 		exit(1);
 	}
 
diff --git a/old-tests/filters/rfilter_t.c b/old-tests/filters/rfilter_t.c
index 6f0bb9d..4bb6dbf 100644
--- a/old-tests/filters/rfilter_t.c
+++ b/old-tests/filters/rfilter_t.c
@@ -73,7 +73,7 @@ int main(int argc, char **argv)
 	}
 
 	if (!(iter = dev_iter_create(filter))) {
-		log_err("couldn't create iterator");
+		log_error(0, "couldn't create iterator");
 		exit(1);
 	}
 
diff --git a/tools/dmsetup.c b/tools/dmsetup.c
index 3582e4a..1367b3d 100644
--- a/tools/dmsetup.c
+++ b/tools/dmsetup.c
@@ -314,7 +314,7 @@ static char *_extract_uuid_prefix(const char *uuid, const int separator)
 
 	len = ptr ? ptr - uuid : 0;
 	if (!(uuid_prefix = dm_malloc(len + 1))) {
-		log_error("Failed to allocate memory to extract uuid prefix.");
+		log_error(0, "Failed to allocate memory to extract uuid prefix.");
 		return NULL;
 	}
 
@@ -330,7 +330,7 @@ static struct dm_split_name *_get_split_name(const char *uuid, const char *name,
 	struct dm_split_name *split_name;
 
 	if (!(split_name = dm_malloc(sizeof(*split_name)))) {
-		log_error("Failed to allocate memory to split device name "
+		log_error(0, "Failed to allocate memory to split device name "
 			  "into components.");
 		return NULL;
 	}
@@ -343,7 +343,7 @@ static struct dm_split_name *_get_split_name(const char *uuid, const char *name,
 	    (!(split_name->vg_name = dm_strdup(name)) ||
 	     !dm_split_lvm_name(NULL, NULL, &split_name->vg_name,
 			        &split_name->lv_name, &split_name->lv_layer)))
-		log_error("Failed to allocate memory to split LVM name "
+		log_error(0, "Failed to allocate memory to split LVM name "
 			  "into components.");
 
 	return split_name;
@@ -1801,18 +1801,18 @@ static int _dm_info_devno_disp(struct dm_report *rh, struct dm_pool *mem,
 	struct dm_info *info = (struct dm_info *) data;
 
 	if (!dm_pool_begin_object(mem, 8)) {
-		log_error("dm_pool_begin_object failed");
+		log_error(0, "dm_pool_begin_object failed");
 		return 0;
 	}
 
 	if (dm_snprintf(buf, sizeof(buf), "%d:%d",
 			info->major, info->minor) < 0) {
-		log_error("dm_pool_alloc failed");
+		log_error(0, "dm_pool_alloc failed");
 		goto out_abandon;
 	}
 
 	if (!dm_pool_grow_object(mem, buf, strlen(buf) + 1)) {
-		log_error("dm_pool_grow_object failed");
+		log_error(0, "dm_pool_grow_object failed");
 		goto out_abandon;
 	}
 
@@ -1836,7 +1836,7 @@ static int _dm_tree_names(struct dm_report *rh, struct dm_pool *mem,
 	char *repstr;
 
 	if (!dm_pool_begin_object(mem, 16)) {
-		log_error("dm_pool_begin_object failed");
+		log_error(0, "dm_pool_begin_object failed");
 		return 0;
 	}
 
@@ -1845,11 +1845,11 @@ static int _dm_tree_names(struct dm_report *rh, struct dm_pool *mem,
 		if (!name || !*name)
 			continue;
 		if (!first_node && !dm_pool_grow_object(mem, ",", 1)) {
-			log_error("dm_pool_grow_object failed");
+			log_error(0, "dm_pool_grow_object failed");
 			goto out_abandon;
 		}
 		if (!dm_pool_grow_object(mem, name, 0)) {
-			log_error("dm_pool_grow_object failed");
+			log_error(0, "dm_pool_grow_object failed");
 			goto out_abandon;
 		}
 		if (first_node)
@@ -1857,7 +1857,7 @@ static int _dm_tree_names(struct dm_report *rh, struct dm_pool *mem,
 	}
 
 	if (!dm_pool_grow_object(mem, "\0", 1)) {
-		log_error("dm_pool_grow_object failed");
+		log_error(0, "dm_pool_grow_object failed");
 		goto out_abandon;
 	}
 
@@ -1897,7 +1897,7 @@ static int _dm_tree_parents_devs_disp(struct dm_report *rh, struct dm_pool *mem,
 	char buf[DM_MAX_TYPE_NAME], *repstr;
 
 	if (!dm_pool_begin_object(mem, 16)) {
-		log_error("dm_pool_begin_object failed");
+		log_error(0, "dm_pool_begin_object failed");
 		return 0;
 	}
 
@@ -1906,16 +1906,16 @@ static int _dm_tree_parents_devs_disp(struct dm_report *rh, struct dm_pool *mem,
 		if (!info->major && !info->minor)
 			continue;
 		if (!first_node && !dm_pool_grow_object(mem, ",", 1)) {
-			log_error("dm_pool_grow_object failed");
+			log_error(0, "dm_pool_grow_object failed");
 			goto out_abandon;
 		}
 		if (dm_snprintf(buf, sizeof(buf), "%d:%d",
 				info->major, info->minor) < 0) {
-			log_error("dm_snprintf failed");
+			log_error(0, "dm_snprintf failed");
 			goto out_abandon;
 		}
 		if (!dm_pool_grow_object(mem, buf, 0)) {
-			log_error("dm_pool_grow_object failed");
+			log_error(0, "dm_pool_grow_object failed");
 			goto out_abandon;
 		}
 		if (first_node)
@@ -1923,7 +1923,7 @@ static int _dm_tree_parents_devs_disp(struct dm_report *rh, struct dm_pool *mem,
 	}
 
 	if (!dm_pool_grow_object(mem, "\0", 1)) {
-		log_error("dm_pool_grow_object failed");
+		log_error(0, "dm_pool_grow_object failed");
 		goto out_abandon;
 	}
 
@@ -1956,7 +1956,7 @@ static int _dm_deps_disp(struct dm_report *rh, struct dm_pool *mem,
 	char buf[DM_MAX_TYPE_NAME], *repstr;
 
 	if (!dm_pool_begin_object(mem, 16)) {
-		log_error("dm_pool_begin_object failed");
+		log_error(0, "dm_pool_begin_object failed");
 		return 0;
 	}
 
@@ -1964,21 +1964,21 @@ static int _dm_deps_disp(struct dm_report *rh, struct dm_pool *mem,
 		if (dm_snprintf(buf, sizeof(buf), "%d:%d",
 		       (int) MAJOR(deps->device[i]),
 		       (int) MINOR(deps->device[i])) < 0) {
-			log_error("dm_snprintf failed");
+			log_error(0, "dm_snprintf failed");
 			goto out_abandon;
 		}
 		if (!dm_pool_grow_object(mem, buf, 0)) {
-			log_error("dm_pool_grow_object failed");
+			log_error(0, "dm_pool_grow_object failed");
 			goto out_abandon;
 		}
 		if (i + 1 < deps->count && !dm_pool_grow_object(mem, ",", 1)) {
-			log_error("dm_pool_grow_object failed");
+			log_error(0, "dm_pool_grow_object failed");
 			goto out_abandon;
 		}
 	}
 
 	if (!dm_pool_grow_object(mem, "\0", 1)) {
-		log_error("dm_pool_grow_object failed");
+		log_error(0, "dm_pool_grow_object failed");
 		goto out_abandon;
 	}
 
@@ -2791,7 +2791,7 @@ static int _process_switches(int *argc, char ***argv, const char *dev_dir)
 					_read_ahead_flags = DM_READ_AHEAD_MINIMUM_FLAG;
 				_int_args[READAHEAD_ARG] = atoi(optarg);
 				if (_int_args[READAHEAD_ARG] < -1) {
-					log_error("Negative read ahead value "
+					log_error(0, "Negative read ahead value "
 						  "(%d) is not understood.",
 						  _int_args[READAHEAD_ARG]);
 					return 0;
diff --git a/tools/lvchange.c b/tools/lvchange.c
index f64f6d1..3931149 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -25,20 +25,20 @@ static int lvchange_permission(struct cmd_context *cmd,
 	lv_access = arg_uint_value(cmd, permission_ARG, 0);
 
 	if ((lv_access & LVM_WRITE) && (lv->status & LVM_WRITE)) {
-		log_error("Logical volume \"%s\" is already writable",
+		log_error(0, "Logical volume \"%s\" is already writable",
 			  lv->name);
 		return 0;
 	}
 
 	if (!(lv_access & LVM_WRITE) && !(lv->status & LVM_WRITE)) {
-		log_error("Logical volume \"%s\" is already read only",
+		log_error(0, "Logical volume \"%s\" is already read only",
 			  lv->name);
 		return 0;
 	}
 
 	if ((lv->status & MIRRORED) && (vg_is_clustered(lv->vg)) &&
 	    lv_info(cmd, lv, &info, 0, 0) && info.exists) {
-		log_error("Cannot change permissions of mirror \"%s\" "
+		log_error(0, "Cannot change permissions of mirror \"%s\" "
 			  "while active.", lv->name);
 		return 0;
 	}
@@ -58,7 +58,7 @@ static int lvchange_permission(struct cmd_context *cmd,
 		return_0;
 
 	if (!suspend_lv(cmd, lv)) {
-		log_error("Failed to lock %s", lv->name);
+		log_error(0, "Failed to lock %s", lv->name);
 		vg_revert(lv->vg);
 		goto out;
 	}
@@ -70,7 +70,7 @@ static int lvchange_permission(struct cmd_context *cmd,
 
 	log_very_verbose("Updating permissions for \"%s\" in kernel", lv->name);
 	if (!resume_lv(cmd, lv)) {
-		log_error("Problem reactivating %s", lv->name);
+		log_error(0, "Problem reactivating %s", lv->name);
 		goto out;
 	}
 
@@ -86,7 +86,7 @@ static int lvchange_monitoring(struct cmd_context *cmd,
 	struct lvinfo info;
 
 	if (!lv_info(cmd, lv, &info, 0, 0) || !info.exists) {
-		log_error("Logical volume, %s, is not active", lv->name);
+		log_error(0, "Logical volume, %s, is not active", lv->name);
 		return 0;
 	}
 
@@ -174,24 +174,24 @@ static int lvchange_resync(struct cmd_context *cmd,
 	struct logical_volume *log_lv;
 
 	if (!(lv->status & MIRRORED)) {
-		log_error("Unable to resync %s because it is not mirrored.",
+		log_error(0, "Unable to resync %s because it is not mirrored.",
 			  lv->name);
 		return 1;
 	}
 
 	if (lv->status & PVMOVE) {
-		log_error("Unable to resync pvmove volume %s", lv->name);
+		log_error(0, "Unable to resync pvmove volume %s", lv->name);
 		return 0;
 	}
 
 	if (lv->status & LOCKED) {
-		log_error("Unable to resync locked volume %s", lv->name);
+		log_error(0, "Unable to resync locked volume %s", lv->name);
 		return 0;
 	}
 
 	if (lv_info(cmd, lv, &info, 1, 0)) {
 		if (info.open_count) {
-			log_error("Can't resync open logical volume \"%s\"",
+			log_error(0, "Can't resync open logical volume \"%s\"",
 				  lv->name);
 			return 0;
 		}
@@ -218,12 +218,12 @@ static int lvchange_resync(struct cmd_context *cmd,
 	init_dmeventd_monitor(0);
 
 	if (!deactivate_lv(cmd, lv)) {
-		log_error("Unable to deactivate %s for resync", lv->name);
+		log_error(0, "Unable to deactivate %s for resync", lv->name);
 		return 0;
 	}
 
 	if (vg_is_clustered(lv->vg) && lv_is_active(lv)) {
-		log_error("Can't get exclusive access to clustered volume %s",
+		log_error(0, "Can't get exclusive access to clustered volume %s",
 			  lv->name);
 		return 0;
 	}
@@ -246,7 +246,7 @@ static int lvchange_resync(struct cmd_context *cmd,
 	 */
 	if (!log_lv && !(lv->status & MIRROR_NOTSYNCED)) {
 		if (active && !activate_lv(cmd, lv)) {
-			log_error("Failed to reactivate %s to resynchronize "
+			log_error(0, "Failed to reactivate %s to resynchronize "
 				  "mirror", lv->name);
 			return 0;
 		}
@@ -260,7 +260,7 @@ static int lvchange_resync(struct cmd_context *cmd,
 		detach_mirror_log(first_seg(lv));
 
 		if (!vg_write(lv->vg)) {
-			log_error("Failed to write intermediate VG metadata.");
+			log_error(0, "Failed to write intermediate VG metadata.");
 			if (!attach_mirror_log(first_seg(lv), log_lv))
 				stack;
 			if (active && !activate_lv(cmd, lv))
@@ -269,7 +269,7 @@ static int lvchange_resync(struct cmd_context *cmd,
 		}
 
 		if (!vg_commit(lv->vg)) {
-			log_error("Failed to commit intermediate VG metadata.");
+			log_error(0, "Failed to commit intermediate VG metadata.");
 			if (!attach_mirror_log(first_seg(lv), log_lv))
 				stack;
 			if (active && !activate_lv(cmd, lv))
@@ -280,22 +280,22 @@ static int lvchange_resync(struct cmd_context *cmd,
 		backup(lv->vg);
 
 		if (!activate_lv(cmd, log_lv)) {
-			log_error("Unable to activate %s for mirror log resync",
+			log_error(0, "Unable to activate %s for mirror log resync",
 				  log_lv->name);
 			return 0;
 		}
 
 		log_very_verbose("Clearing log device %s", log_lv->name);
 		if (!set_lv(cmd, log_lv, log_lv->size, 0)) {
-			log_error("Unable to reset sync status for %s", lv->name);
+			log_error(0, "Unable to reset sync status for %s", lv->name);
 			if (!deactivate_lv(cmd, log_lv))
-				log_error("Failed to deactivate log LV after "
+				log_error(0, "Failed to deactivate log LV after "
 					  "wiping failed");
 			return 0;
 		}
 
 		if (!deactivate_lv(cmd, log_lv)) {
-			log_error("Unable to deactivate log LV %s after wiping "
+			log_error(0, "Unable to deactivate log LV %s after wiping "
 				  "for resync", log_lv->name);
 			return 0;
 		}
@@ -307,12 +307,12 @@ static int lvchange_resync(struct cmd_context *cmd,
 
 	log_very_verbose("Updating logical volume \"%s\" on disk(s)", lv->name);
 	if (!vg_write(lv->vg) || !vg_commit(lv->vg)) {
-		log_error("Failed to update metadata on disk.");
+		log_error(0, "Failed to update metadata on disk.");
 		return 0;
 	}
 
 	if (active && !activate_lv(cmd, lv)) {
-		log_error("Failed to reactivate %s after resync", lv->name);
+		log_error(0, "Failed to reactivate %s after resync", lv->name);
 		return 0;
 	}
 
@@ -329,7 +329,7 @@ static int lvchange_alloc(struct cmd_context *cmd, struct logical_volume *lv)
 	alloc = arg_uint_value(cmd, alloc_ARG, alloc);
 
 	if (alloc == lv->alloc) {
-		log_error("Allocation policy of logical volume \"%s\" is "
+		log_error(0, "Allocation policy of logical volume \"%s\" is "
 			  "already %s", lv->name, get_alloc_string(alloc));
 		return 0;
 	}
@@ -364,7 +364,7 @@ static int lvchange_readahead(struct cmd_context *cmd,
 	if (read_ahead != DM_READ_AHEAD_AUTO &&
 	    (lv->vg->fid->fmt->features & FMT_RESTRICTED_READAHEAD) &&
 	    (read_ahead < 2 || read_ahead > 120)) {
-		log_error("Metadata only supports readahead values between 2 and 120.");
+		log_error(0, "Metadata only supports readahead values between 2 and 120.");
 		return 0;
 	}
 
@@ -380,9 +380,9 @@ static int lvchange_readahead(struct cmd_context *cmd,
 
 	if (lv->read_ahead == read_ahead) {
 		if (read_ahead == DM_READ_AHEAD_AUTO)
-			log_error("Read ahead is already auto for \"%s\"", lv->name);
+			log_error(0, "Read ahead is already auto for \"%s\"", lv->name);
 		else
-			log_error("Read ahead is already %u for \"%s\"",
+			log_error(0, "Read ahead is already %u for \"%s\"",
 				  read_ahead, lv->name);
 		return 0;
 	}
@@ -397,7 +397,7 @@ static int lvchange_readahead(struct cmd_context *cmd,
 		return_0;
 
 	if (!suspend_lv(cmd, lv)) {
-		log_error("Failed to lock %s", lv->name);
+		log_error(0, "Failed to lock %s", lv->name);
 		vg_revert(lv->vg);
 		goto out;
 	}
@@ -409,7 +409,7 @@ static int lvchange_readahead(struct cmd_context *cmd,
 
 	log_very_verbose("Updating permissions for \"%s\" in kernel", lv->name);
 	if (!resume_lv(cmd, lv)) {
-		log_error("Problem reactivating %s", lv->name);
+		log_error(0, "Problem reactivating %s", lv->name);
 		goto out;
 	}
 
@@ -427,7 +427,7 @@ static int lvchange_persistent(struct cmd_context *cmd,
 
 	if (!strcmp(arg_str_value(cmd, persistent_ARG, "n"), "n")) {
 		if (!(lv->status & FIXED_MINOR)) {
-			log_error("Minor number is already not persistent "
+			log_error(0, "Minor number is already not persistent "
 				  "for \"%s\"", lv->name);
 			return 0;
 		}
@@ -438,11 +438,11 @@ static int lvchange_persistent(struct cmd_context *cmd,
 			    lv->name);
 	} else {
 		if (!arg_count(cmd, minor_ARG) && lv->minor < 0) {
-			log_error("Minor number must be specified with -My");
+			log_error(0, "Minor number must be specified with -My");
 			return 0;
 		}
 		if (!arg_count(cmd, major_ARG) && lv->major < 0) {
-			log_error("Major number must be specified with -My");
+			log_error(0, "Major number must be specified with -My");
 			return 0;
 		}
 		if (lv_info(cmd, lv, &info, 0, 0) && info.exists)
@@ -461,7 +461,7 @@ static int lvchange_persistent(struct cmd_context *cmd,
 
 		log_verbose("Ensuring %s is inactive.", lv->name);
 		if (!deactivate_lv(cmd, lv)) {
-			log_error("%s: deactivation failed", lv->name);
+			log_error(0, "%s: deactivation failed", lv->name);
 			return 0;
 		}
 		lv->status |= FIXED_MINOR;
@@ -481,7 +481,7 @@ static int lvchange_persistent(struct cmd_context *cmd,
 	if (active) {
 		log_verbose("Re-activating logical volume \"%s\"", lv->name);
 		if (!activate_lv(cmd, lv)) {
-			log_error("%s: reactivation failed", lv->name);
+			log_error(0, "%s: reactivation failed", lv->name);
 			return 0;
 		}
 	}
@@ -495,25 +495,25 @@ static int lvchange_tag(struct cmd_context *cmd, struct logical_volume *lv,
 	const char *tag;
 
 	if (!(tag = arg_str_value(cmd, arg, NULL))) {
-		log_error("Failed to get tag");
+		log_error(0, "Failed to get tag");
 		return 0;
 	}
 
 	if (!(lv->vg->fid->fmt->features & FMT_TAGS)) {
-		log_error("Logical volume %s/%s does not support tags",
+		log_error(0, "Logical volume %s/%s does not support tags",
 			  lv->vg->name, lv->name);
 		return 0;
 	}
 
 	if ((arg == addtag_ARG)) {
 		if (!str_list_add(cmd->mem, &lv->tags, tag)) {
-			log_error("Failed to add tag %s to %s/%s",
+			log_error(0, "Failed to add tag %s to %s/%s",
 				  tag, lv->vg->name, lv->name);
 			return 0;
 		}
 	} else {
 		if (!str_list_del(&lv->tags, tag)) {
-			log_error("Failed to remove tag %s from %s/%s",
+			log_error(0, "Failed to remove tag %s from %s/%s",
 				  tag, lv->vg->name, lv->name);
 			return 0;
 		}
@@ -541,7 +541,7 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
 	    (arg_count(cmd, contiguous_ARG) || arg_count(cmd, permission_ARG) ||
 	     arg_count(cmd, readahead_ARG) || arg_count(cmd, persistent_ARG) ||
 	     arg_count(cmd, alloc_ARG))) {
-		log_error("Only -a permitted with read-only volume "
+		log_error(0, "Only -a permitted with read-only volume "
 			  "group \"%s\"", lv->vg->name);
 		return EINVALID_CMD_LINE;
 	}
@@ -550,32 +550,32 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
 	    (arg_count(cmd, contiguous_ARG) || arg_count(cmd, permission_ARG) ||
 	     arg_count(cmd, readahead_ARG) || arg_count(cmd, persistent_ARG) ||
 	     arg_count(cmd, alloc_ARG))) {
-		log_error("Can't change logical volume \"%s\" under snapshot",
+		log_error(0, "Can't change logical volume \"%s\" under snapshot",
 			  lv->name);
 		return ECMD_FAILED;
 	}
 
 	if (lv_is_cow(lv) && !lv_is_virtual_origin(origin_from_cow(lv)) &&
 	    arg_count(cmd, available_ARG)) {
-		log_error("Can't change snapshot logical volume \"%s\"",
+		log_error(0, "Can't change snapshot logical volume \"%s\"",
 			  lv->name);
 		return ECMD_FAILED;
 	}
 
 	if (lv->status & PVMOVE) {
-		log_error("Unable to change pvmove LV %s", lv->name);
+		log_error(0, "Unable to change pvmove LV %s", lv->name);
 		if (arg_count(cmd, available_ARG))
-			log_error("Use 'pvmove --abort' to abandon a pvmove");
+			log_error(0, "Use 'pvmove --abort' to abandon a pvmove");
 		return ECMD_FAILED;
 	}
 
 	if (lv->status & MIRROR_LOG) {
-		log_error("Unable to change mirror log LV %s directly", lv->name);
+		log_error(0, "Unable to change mirror log LV %s directly", lv->name);
 		return ECMD_FAILED;
 	}
 
 	if (lv->status & MIRROR_IMAGE) {
-		log_error("Unable to change mirror image LV %s directly",
+		log_error(0, "Unable to change mirror image LV %s directly",
 			  lv->name);
 		return ECMD_FAILED;
 	}
@@ -586,7 +586,7 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
 		lv = origin;
 
 	if (!(lv_is_visible(lv)) && !lv_is_virtual_origin(lv)) {
-		log_error("Unable to change internal LV %s directly",
+		log_error(0, "Unable to change internal LV %s directly",
 			  lv->name);
 		return ECMD_FAILED;
 	}
@@ -690,7 +690,7 @@ int lvchange(struct cmd_context *cmd, int argc, char **argv)
 	    && !arg_count(cmd, deltag_ARG) && !arg_count(cmd, refresh_ARG)
 	    && !arg_count(cmd, alloc_ARG) && !arg_count(cmd, monitor_ARG)
 	    && !arg_count(cmd, resync_ARG)) {
-		log_error("Need 1 or more of -a, -C, -j, -m, -M, -p, -r, "
+		log_error(0, "Need 1 or more of -a, -C, -j, -m, -M, -p, -r, "
 			  "--resync, --refresh, --alloc, --addtag, --deltag "
 			  "or --monitor");
 		return EINVALID_CMD_LINE;
@@ -701,28 +701,28 @@ int lvchange(struct cmd_context *cmd, int argc, char **argv)
 	     arg_count(cmd, readahead_ARG) || arg_count(cmd, persistent_ARG) ||
 	     arg_count(cmd, addtag_ARG) || arg_count(cmd, deltag_ARG) ||
 	     arg_count(cmd, refresh_ARG) || arg_count(cmd, alloc_ARG))) {
-		log_error("Only -a permitted with --ignorelockingfailure");
+		log_error(0, "Only -a permitted with --ignorelockingfailure");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (!argc) {
-		log_error("Please give logical volume path(s)");
+		log_error(0, "Please give logical volume path(s)");
 		return EINVALID_CMD_LINE;
 	}
 
 	if ((arg_count(cmd, minor_ARG) || arg_count(cmd, major_ARG)) &&
 	    !arg_count(cmd, persistent_ARG)) {
-		log_error("--major and --minor require -My");
+		log_error(0, "--major and --minor require -My");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (arg_count(cmd, minor_ARG) && argc != 1) {
-		log_error("Only give one logical volume when specifying minor");
+		log_error(0, "Only give one logical volume when specifying minor");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (arg_count(cmd, contiguous_ARG) && arg_count(cmd, alloc_ARG)) {
-		log_error("Only one of --alloc and --contiguous permitted");
+		log_error(0, "Only one of --alloc and --contiguous permitted");
 		return EINVALID_CMD_LINE;
 	}
 
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index dc8aa55..048cb24 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -51,7 +51,7 @@ static int _lvconvert_name_params(struct lvconvert_params *lp,
 
 	if (lp->snapshot) {
 		if (!*pargc) {
-			log_error("Please specify a logical volume to act as "
+			log_error(0, "Please specify a logical volume to act as "
 				  "the snapshot origin.");
 			return 0;
 		}
@@ -59,7 +59,7 @@ static int _lvconvert_name_params(struct lvconvert_params *lp,
 		lp->origin = *pargv[0];
 		(*pargv)++, (*pargc)--;
 		if (!(lp->vg_name = extract_vgname(cmd, lp->origin))) {
-			log_error("The origin name should include the "
+			log_error(0, "The origin name should include the "
 				  "volume group.");
 			return 0;
 		}
@@ -70,7 +70,7 @@ static int _lvconvert_name_params(struct lvconvert_params *lp,
 	}
 
 	if (!*pargc) {
-		log_error("Please provide logical volume path");
+		log_error(0, "Please provide logical volume path");
 		return 0;
 	}
 
@@ -80,7 +80,7 @@ static int _lvconvert_name_params(struct lvconvert_params *lp,
 	if (strchr(lp->lv_name_full, '/') &&
 	    (vg_name = extract_vgname(cmd, lp->lv_name_full)) &&
 	    lp->vg_name && strcmp(vg_name, lp->vg_name)) {
-		log_error("Please use a single volume group name "
+		log_error(0, "Please use a single volume group name "
 			  "(\"%s\" or \"%s\")", vg_name, lp->vg_name);
 		return 0;
 	}
@@ -89,7 +89,7 @@ static int _lvconvert_name_params(struct lvconvert_params *lp,
 		lp->vg_name = vg_name;
 
 	if (!validate_name(lp->vg_name)) {
-		log_error("Please provide a valid volume group name");
+		log_error(0, "Please provide a valid volume group name");
 		return 0;
 	}
 
@@ -113,7 +113,7 @@ static int _read_params(struct lvconvert_params *lp, struct cmd_context *cmd,
 	if (arg_count(cmd, snapshot_ARG) &&
 	    (arg_count(cmd, mirrorlog_ARG) || arg_count(cmd, mirrors_ARG) ||
 	     arg_count(cmd, repair_ARG))) {
-		log_error("--snapshot argument cannot be mixed "
+		log_error(0, "--snapshot argument cannot be mixed "
 			  "with --mirrors, --repair or --log");
 		return 0;
 	}
@@ -135,18 +135,18 @@ static int _read_params(struct lvconvert_params *lp, struct cmd_context *cmd,
 
 	if (lp->snapshot) {
 		if (arg_count(cmd, regionsize_ARG)) {
-			log_error("--regionsize is only available with mirrors");
+			log_error(0, "--regionsize is only available with mirrors");
 			return 0;
 		}
 
 		if (arg_sign_value(cmd, chunksize_ARG, 0) == SIGN_MINUS) {
-			log_error("Negative chunk size is invalid");
+			log_error(0, "Negative chunk size is invalid");
 			return 0;
 		}
 		lp->chunk_size = arg_uint_value(cmd, chunksize_ARG, 8);
 		if (lp->chunk_size < 8 || lp->chunk_size > 1024 ||
 		    (lp->chunk_size & (lp->chunk_size - 1))) {
-			log_error("Chunk size must be a power of 2 in the "
+			log_error(0, "Chunk size must be a power of 2 in the "
 				  "range 4K to 512K");
 			return 0;
 		}
@@ -162,13 +162,13 @@ static int _read_params(struct lvconvert_params *lp, struct cmd_context *cmd,
 
 	} else {	/* Mirrors */
 		if (arg_count(cmd, chunksize_ARG)) {
-			log_error("--chunksize is only available with "
+			log_error(0, "--chunksize is only available with "
 				  "snapshots");
 			return 0;
 		}
 
 		if (arg_count(cmd, zero_ARG)) {
-			log_error("--zero is only available with snapshots");
+			log_error(0, "--zero is only available with snapshots");
 			return 0;
 		}
 
@@ -180,7 +180,7 @@ static int _read_params(struct lvconvert_params *lp, struct cmd_context *cmd,
 		if (arg_count(cmd, regionsize_ARG)) {
 			if (arg_sign_value(cmd, regionsize_ARG, 0) ==
 				    SIGN_MINUS) {
-				log_error("Negative regionsize is invalid");
+				log_error(0, "Negative regionsize is invalid");
 				return 0;
 			}
 			lp->region_size = arg_uint_value(cmd, regionsize_ARG, 0);
@@ -189,7 +189,7 @@ static int _read_params(struct lvconvert_params *lp, struct cmd_context *cmd,
 						"activation/mirror_region_size",
 						DEFAULT_MIRROR_REGION_SIZE);
 			if (region_size < 0) {
-				log_error("Negative regionsize in "
+				log_error(0, "Negative regionsize in "
 					  "configuration file is invalid");
 				return 0;
 			}
@@ -197,7 +197,7 @@ static int _read_params(struct lvconvert_params *lp, struct cmd_context *cmd,
 		}
 
 		if (lp->region_size % (pagesize >> SECTOR_SHIFT)) {
-			log_error("Region size (%" PRIu32 ") must be "
+			log_error(0, "Region size (%" PRIu32 ") must be "
 				  "a multiple of machine memory "
 				  "page size (%d)",
 				  lp->region_size, pagesize >> SECTOR_SHIFT);
@@ -205,13 +205,13 @@ static int _read_params(struct lvconvert_params *lp, struct cmd_context *cmd,
 		}
 
 		if (lp->region_size & (lp->region_size - 1)) {
-			log_error("Region size (%" PRIu32
+			log_error(0, "Region size (%" PRIu32
 				  ") must be a power of 2", lp->region_size);
 			return 0;
 		}
 
 		if (!lp->region_size) {
-			log_error("Non-zero region size must be supplied.");
+			log_error(0, "Non-zero region size must be supplied.");
 			return 0;
 		}
 
@@ -221,7 +221,7 @@ static int _read_params(struct lvconvert_params *lp, struct cmd_context *cmd,
 
 	if (activation() && lp->segtype->ops->target_present &&
 	    !lp->segtype->ops->target_present(cmd, NULL, NULL)) {
-		log_error("%s: Required device-mapper target(s) not "
+		log_error(0, "%s: Required device-mapper target(s) not "
 			  "detected in your kernel", lp->segtype->name);
 		return 0;
 	}
@@ -276,7 +276,7 @@ static int _finish_lvconvert_mirror(struct cmd_context *cmd,
 	int r = 0;
 
 	if (!collapse_mirrored_lv(lv)) {
-		log_error("Failed to remove temporary sync layer.");
+		log_error(0, "Failed to remove temporary sync layer.");
 		return 0;
 	}
 
@@ -288,7 +288,7 @@ static int _finish_lvconvert_mirror(struct cmd_context *cmd,
 		return_0;
 
 	if (!suspend_lv(cmd, lv)) {
-		log_error("Failed to lock %s", lv->name);
+		log_error(0, "Failed to lock %s", lv->name);
 		vg_revert(vg);
 		goto out;
 	}
@@ -301,7 +301,7 @@ static int _finish_lvconvert_mirror(struct cmd_context *cmd,
 	log_very_verbose("Updating \"%s\" in kernel", lv->name);
 
 	if (!resume_lv(cmd, lv)) {
-		log_error("Problem reactivating %s", lv->name);
+		log_error(0, "Problem reactivating %s", lv->name);
 		goto out;
 	}
 
@@ -360,23 +360,23 @@ static int _insert_lvconvert_layer(struct cmd_context *cmd,
 	if (!(format = alloca(len)) ||
 	    !(layer_name = alloca(len)) ||
 	    dm_snprintf(format, len, "%s_mimage_%%d", lv->name) < 0) {
-		log_error("lvconvert: layer name allocation failed.");
+		log_error(0, "lvconvert: layer name allocation failed.");
 		return 0;
 	}
 
 	if (!generate_lv_name(lv->vg, format, layer_name, len) ||
 	    sscanf(layer_name, format, &i) != 1) {
-		log_error("lvconvert: layer name generation failed.");
+		log_error(0, "lvconvert: layer name generation failed.");
 		return 0;
 	}
 
 	if (dm_snprintf(layer_name, len, MIRROR_SYNC_LAYER "_%d", i) < 0) {
-		log_error("layer name allocation failed.");
+		log_error(0, "layer name allocation failed.");
 		return 0;
 	}
 
 	if (!insert_layer_for_lv(cmd, lv, 0, layer_name)) {
-		log_error("Failed to insert resync layer");
+		log_error(0, "Failed to insert resync layer");
 		return 0;
 	}
 
@@ -419,7 +419,7 @@ static struct dm_list *_failed_pv_list(struct volume_group *vg)
 	struct pv_list *pvl, *new_pvl;
 
 	if (!(failed_pvs = dm_pool_alloc(vg->vgmem, sizeof(*failed_pvs)))) {
-		log_error("Allocation of list of failed_pvs failed.");
+		log_error(0, "Allocation of list of failed_pvs failed.");
 		return_NULL;
 	}
 
@@ -430,7 +430,7 @@ static struct dm_list *_failed_pv_list(struct volume_group *vg)
 			continue;
 
 		if (!(new_pvl = dm_pool_alloc(vg->vgmem, sizeof(*new_pvl)))) {
-			log_error("Allocation of failed_pvs list entry failed.");
+			log_error(0, "Allocation of failed_pvs list entry failed.");
 			return_NULL;
 		}
 		new_pvl->pv = pvl->pv;
@@ -525,7 +525,7 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
 	}
 
 	if (arg_count(cmd, mirrors_ARG) && repair) {
-		log_error("You may only use one of --mirrors and --repair.");
+		log_error(0, "You may only use one of --mirrors and --repair.");
 		return 0;
 	}
 
@@ -551,13 +551,13 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
 		cmd->partial_activation = 1;
 		lp->need_polling = 0;
 		if (!(lv->status & PARTIAL_LV)) {
-			log_error("The mirror is consistent, nothing to repair.");
+			log_error(0, "The mirror is consistent, nothing to repair.");
 			return 0;
 		}
 		if ((failed_mirrors = _failed_mirrors_count(lv)) < 0)
 			return_0;
 		lp->mirrors -= failed_mirrors;
-		log_error("Mirror status: %d/%d images failed.",
+		log_error(0, "Mirror status: %d/%d images failed.",
 			  failed_mirrors, existing_mirrors);
 		old_pvh = lp->pvh;
 		if (!(lp->pvh = _failed_pv_list(lv->vg)))
@@ -570,7 +570,7 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
 		 * Did the user try to subtract more legs than available?
 		 */
 		if (lp->mirrors < 1) {
-			log_error("Logical volume %s only has %" PRIu32 " mirrors.",
+			log_error(0, "Logical volume %s only has %" PRIu32 " mirrors.",
 				  lv->name, existing_mirrors);
 			return 0;
 		}
@@ -585,7 +585,7 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
 					  corelog ? "core" : DEFAULT_MIRRORLOG);
 		if (!strcmp("disk", mirrorlog)) {
 			if (corelog) {
-				log_error("--mirrorlog disk and --corelog "
+				log_error(0, "--mirrorlog disk and --corelog "
 					  "are incompatible");
 				return 0;
 			}
@@ -593,7 +593,7 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
 		} else if (!strcmp("core", mirrorlog))
 			corelog = 1;
 		else {
-			log_error("Unknown mirrorlog type: %s", mirrorlog);
+			log_error(0, "Unknown mirrorlog type: %s", mirrorlog);
 			return 0;
 		}
 
@@ -605,7 +605,7 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
 	 */
 	if (arg_count(cmd, regionsize_ARG) && (lv->status & MIRRORED) &&
 	    (lp->region_size != seg->region_size)) {
-		log_error("Mirror log region size cannot be changed on "
+		log_error(0, "Mirror log region size cannot be changed on "
 			  "an existing mirror.");
 		return 0;
 	}
@@ -615,7 +615,7 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
 	 * early if we have encountered one.
 	 */
 	if ((lv->status & MIRRORED) && dm_list_size(&lv->segments) != 1) {
-		log_error("Logical volume %s has multiple "
+		log_error(0, "Logical volume %s has multiple "
 			  "mirror segments.", lv->name);
 		return 0;
 	}
@@ -630,7 +630,7 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
 	 */
 	if ((lp->mirrors == 1)) {
 		if (!(lv->status & MIRRORED)) {
-			log_error("Logical volume %s is already not mirrored.",
+			log_error(0, "Logical volume %s is already not mirrored.",
 				  lv->name);
 			return 1;
 		}
@@ -657,7 +657,7 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
 		/* FIXME Why is this restriction here?  Fix it! */
 		dm_list_iterate_items(seg, &lv->segments) {
 			if (seg_is_striped(seg) && seg->area_count > 1) {
-				log_error("Mirrors of striped volumes are not yet supported.");
+				log_error(0, "Mirrors of striped volumes are not yet supported.");
 				return 0;
 			}
 		}
@@ -679,7 +679,7 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
 			lp->need_polling = 1;
 	} else if (lp->mirrors > existing_mirrors || failed_mirrors) {
 		if (lv->status & MIRROR_NOTSYNCED) {
-			log_error("Can't add mirror to out-of-sync mirrored "
+			log_error(0, "Can't add mirror to out-of-sync mirrored "
 				  "LV: use lvchange --resync first.");
 			return 0;
 		}
@@ -705,7 +705,7 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
 		/* Insert a temporary layer for syncing,
 		 * only if the original lv is using disk log. */
 		if (seg->log_lv && !_insert_lvconvert_layer(cmd, lv)) {
-			log_error("Failed to insert resync layer");
+			log_error(0, "Failed to insert resync layer");
 			return 0;
 		}
 		/* FIXME: can't have multiple mlogs. force corelog. */
@@ -740,7 +740,7 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
 				return_0;
 		} else {
 			/* No change */
-			log_error("Logical volume %s already has %"
+			log_error(0, "Logical volume %s already has %"
 				  PRIu32 " mirror(s).", lv->name,
 				  lp->mirrors - 1);
 			if (lv->status & CONVERTING)
@@ -755,7 +755,7 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
 		return_0;
 
 	if (!suspend_lv(cmd, lv)) {
-		log_error("Failed to lock %s", lv->name);
+		log_error(0, "Failed to lock %s", lv->name);
 		vg_revert(lv->vg);
 		goto out;
 	}
@@ -768,7 +768,7 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
 	log_very_verbose("Updating \"%s\" in kernel", lv->name);
 
 	if (!resume_lv(cmd, lv)) {
-		log_error("Problem reactivating %s", lv->name);
+		log_error(0, "Problem reactivating %s", lv->name);
 		goto out;
 	}
 
@@ -802,18 +802,18 @@ static int lvconvert_snapshot(struct cmd_context *cmd,
 	int r = 0;
 
 	if (!(org = find_lv(lv->vg, lp->origin))) {
-		log_error("Couldn't find origin volume '%s'.", lp->origin);
+		log_error(0, "Couldn't find origin volume '%s'.", lp->origin);
 		return 0;
 	}
 
 	if (org == lv) {
-		log_error("Unable to use \"%s\" as both snapshot and origin.",
+		log_error(0, "Unable to use \"%s\" as both snapshot and origin.",
 			  lv->name);
 		return 0;
 	}
 
 	if (org->status & (LOCKED|PVMOVE|MIRRORED) || lv_is_cow(org)) {
-		log_error("Unable to create a snapshot of a %s LV.",
+		log_error(0, "Unable to create a snapshot of a %s LV.",
 			  org->status & LOCKED ? "locked" :
 			  org->status & PVMOVE ? "pvmove" :
 			  org->status & MIRRORED ? "mirrored" :
@@ -824,18 +824,18 @@ static int lvconvert_snapshot(struct cmd_context *cmd,
 	if (!lp->zero || !(lv->status & LVM_WRITE))
 		log_warn("WARNING: \"%s\" not zeroed", lv->name);
 	else if (!set_lv(cmd, lv, UINT64_C(0), 0)) {
-		log_error("Aborting. Failed to wipe snapshot "
+		log_error(0, "Aborting. Failed to wipe snapshot "
 			  "exception store.");
 		return 0;
 	}
 
 	if (!deactivate_lv(cmd, lv)) {
-		log_error("Couldn't deactivate LV %s.", lv->name);
+		log_error(0, "Couldn't deactivate LV %s.", lv->name);
 		return 0;
 	}
 
 	if (!vg_add_snapshot(org, lv, NULL, org->le_count, lp->chunk_size)) {
-		log_error("Couldn't create snapshot.");
+		log_error(0, "Couldn't create snapshot.");
 		return 0;
 	}
 
@@ -844,7 +844,7 @@ static int lvconvert_snapshot(struct cmd_context *cmd,
 		return_0;
 
 	if (!suspend_lv(cmd, org)) {
-		log_error("Failed to suspend origin %s", org->name);
+		log_error(0, "Failed to suspend origin %s", org->name);
 		vg_revert(lv->vg);
 		goto out;
 	}
@@ -853,7 +853,7 @@ static int lvconvert_snapshot(struct cmd_context *cmd,
 		goto_out;
 
 	if (!resume_lv(cmd, org)) {
-		log_error("Problem reactivating origin %s", org->name);
+		log_error(0, "Problem reactivating origin %s", org->name);
 		goto out;
 	}
 
@@ -870,35 +870,35 @@ static int lvconvert_single(struct cmd_context *cmd, struct logical_volume *lv,
 	struct lvconvert_params *lp = handle;
 
 	if (lv->status & LOCKED) {
-		log_error("Cannot convert locked LV %s", lv->name);
+		log_error(0, "Cannot convert locked LV %s", lv->name);
 		return ECMD_FAILED;
 	}
 
 	if (lv_is_origin(lv)) {
-		log_error("Can't convert logical volume \"%s\" under snapshot",
+		log_error(0, "Can't convert logical volume \"%s\" under snapshot",
 			  lv->name);
 		return ECMD_FAILED;
 	}
 
 	if (lv_is_cow(lv)) {
-		log_error("Can't convert snapshot logical volume \"%s\"",
+		log_error(0, "Can't convert snapshot logical volume \"%s\"",
 			  lv->name);
 		return ECMD_FAILED;
 	}
 
 	if (lv->status & PVMOVE) {
-		log_error("Unable to convert pvmove LV %s", lv->name);
+		log_error(0, "Unable to convert pvmove LV %s", lv->name);
 		return ECMD_FAILED;
 	}
 
 	if (arg_count(cmd, repair_ARG) && !(lv->status & MIRRORED)) {
-		log_error("Can't repair non-mirrored LV \"%s\".", lv->name);
+		log_error(0, "Can't repair non-mirrored LV \"%s\".", lv->name);
 		return ECMD_FAILED;
 	}
 
 	if (lp->snapshot) {
 		if (lv->status & MIRRORED) {
-			log_error("Unable to convert mirrored LV \"%s\" into a snapshot.", lv->name);
+			log_error(0, "Unable to convert mirrored LV \"%s\" into a snapshot.", lv->name);
 			return ECMD_FAILED;
 		}
 		if (!archive(lv->vg))
@@ -939,7 +939,7 @@ int lvconvert(struct cmd_context * cmd, int argc, char **argv)
 		goto out;
 
 	if (!(lvl = find_lv_in_vg(vg, lp.lv_name))) {
-		log_error("Logical volume \"%s\" not found in "
+		log_error(0, "Logical volume \"%s\" not found in "
 			  "volume group \"%s\"", lp.lv_name, lp.vg_name);
 		goto bad;
 	}
diff --git a/tools/lvcreate.c b/tools/lvcreate.c
index 70f237a..e482ae1 100644
--- a/tools/lvcreate.c
+++ b/tools/lvcreate.c
@@ -68,7 +68,7 @@ static int _lvcreate_name_params(struct lvcreate_params *lp,
 
 	if (lp->snapshot && !arg_count(cmd, virtualsize_ARG)) {
 		if (!argc) {
-			log_err("Please specify a logical volume to act as "
+			log_error(0, "Please specify a logical volume to act as "
 				"the snapshot origin.");
 			return 0;
 		}
@@ -76,7 +76,7 @@ static int _lvcreate_name_params(struct lvcreate_params *lp,
 		lp->origin = argv[0];
 		(*pargv)++, (*pargc)--;
 		if (!(lp->vg_name = extract_vgname(cmd, lp->origin))) {
-			log_err("The origin name should include the "
+			log_error(0, "The origin name should include the "
 				"volume group.");
 			return 0;
 		}
@@ -92,14 +92,14 @@ static int _lvcreate_name_params(struct lvcreate_params *lp,
 		 */
 		if (!argc) {
 			if (!(lp->vg_name = extract_vgname(cmd, lp->lv_name))) {
-				log_err("Please provide a volume group name");
+				log_error(0, "Please provide a volume group name");
 				return 0;
 			}
 
 		} else {
 			vg_name = skip_dev_dir(cmd, argv[0], NULL);
 			if (strrchr(vg_name, '/')) {
-				log_error("Volume group name expected "
+				log_error(0, "Volume group name expected "
 					  "(no slash)");
 				return 0;
 			}
@@ -114,7 +114,7 @@ static int _lvcreate_name_params(struct lvcreate_params *lp,
 					return 0;
 
 				if (strcmp(lp->vg_name, vg_name)) {
-					log_error("Inconsistent volume group "
+					log_error(0, "Inconsistent volume group "
 						  "names "
 						  "given: \"%s\" and \"%s\"",
 						  lp->vg_name, vg_name);
@@ -128,7 +128,7 @@ static int _lvcreate_name_params(struct lvcreate_params *lp,
 	}
 
 	if (!validate_name(lp->vg_name)) {
-		log_error("Volume group name %s has invalid characters",
+		log_error(0, "Volume group name %s has invalid characters",
 			  lp->vg_name);
 		return 0;
 	}
@@ -141,7 +141,7 @@ static int _lvcreate_name_params(struct lvcreate_params *lp,
 			return_0;
 
 		if (!validate_name(lp->lv_name)) {
-			log_error("Logical volume name \"%s\" is invalid",
+			log_error(0, "Logical volume name \"%s\" is invalid",
 				  lp->lv_name);
 			return 0;
 		}
@@ -154,13 +154,13 @@ static int _read_size_params(struct lvcreate_params *lp,
 			     struct cmd_context *cmd)
 {
 	if (arg_count(cmd, extents_ARG) + arg_count(cmd, size_ARG) != 1) {
-		log_error("Please specify either size or extents (not both)");
+		log_error(0, "Please specify either size or extents (not both)");
 		return 0;
 	}
 
 	if (arg_count(cmd, extents_ARG)) {
 		if (arg_sign_value(cmd, extents_ARG, 0) == SIGN_MINUS) {
-			log_error("Negative number of extents is invalid");
+			log_error(0, "Negative number of extents is invalid");
 			return 0;
 		}
 		lp->extents = arg_uint_value(cmd, extents_ARG, 0);
@@ -170,7 +170,7 @@ static int _read_size_params(struct lvcreate_params *lp,
 	/* Size returned in kilobyte units; held in sectors */
 	if (arg_count(cmd, size_ARG)) {
 		if (arg_sign_value(cmd, size_ARG, 0) == SIGN_MINUS) {
-			log_error("Negative size is invalid");
+			log_error(0, "Negative size is invalid");
 			return 0;
 		}
 		lp->size = arg_uint64_value(cmd, size_ARG, UINT64_C(0));
@@ -180,13 +180,13 @@ static int _read_size_params(struct lvcreate_params *lp,
 	/* Size returned in kilobyte units; held in sectors */
 	if (arg_count(cmd, virtualsize_ARG)) {
 		if (arg_sign_value(cmd, virtualsize_ARG, 0) == SIGN_MINUS) {
-			log_error("Negative virtual origin size is invalid");
+			log_error(0, "Negative virtual origin size is invalid");
 			return 0;
 		}
 		lp->voriginsize = arg_uint64_value(cmd, virtualsize_ARG,
 						   UINT64_C(0));
 		if (!lp->voriginsize) {
-			log_error("Virtual origin size may not be zero");
+			log_error(0, "Virtual origin size may not be zero");
 			return 0;
 		}
 	}
@@ -215,7 +215,7 @@ static int _validate_stripe_params(struct cmd_context *cmd,
 	}
 
 	if (lp->stripes < 1 || lp->stripes > MAX_STRIPES) {
-		log_error("Number of stripes (%d) must be between %d and %d",
+		log_error(0, "Number of stripes (%d) must be between %d and %d",
 			  lp->stripes, 1, MAX_STRIPES);
 		return 0;
 	}
@@ -223,7 +223,7 @@ static int _validate_stripe_params(struct cmd_context *cmd,
 	/* MAX size check is in _lvcreate */
 	if (lp->stripes > 1 && (lp->stripe_size < STRIPE_SIZE_MIN ||
 				lp->stripe_size & (lp->stripe_size - 1))) {
-		log_error("Invalid stripe size %s",
+		log_error(0, "Invalid stripe size %s",
 			  display_size(cmd, (uint64_t) lp->stripe_size));
 		return 0;
 	}
@@ -240,12 +240,12 @@ static int _read_stripe_params(struct lvcreate_params *lp,
 {
 	if (arg_count(cmd, stripesize_ARG)) {
 		if (arg_sign_value(cmd, stripesize_ARG, 0) == SIGN_MINUS) {
-			log_error("Negative stripesize is invalid");
+			log_error(0, "Negative stripesize is invalid");
 			return 0;
 		}
 		/* Check to make sure we won't overflow lp->stripe_size */
 		if(arg_uint_value(cmd, stripesize_ARG, 0) > STRIPE_SIZE_LIMIT * 2) {
-			log_error("Stripe size cannot be larger than %s",
+			log_error(0, "Stripe size cannot be larger than %s",
 				  display_size(cmd, (uint64_t) STRIPE_SIZE_LIMIT));
 			return 0;
 		}
@@ -269,20 +269,20 @@ static int _validate_mirror_params(const struct cmd_context *cmd __attribute((un
 	int pagesize = lvm_getpagesize();
 
 	if (lp->region_size & (lp->region_size - 1)) {
-		log_error("Region size (%" PRIu32 ") must be a power of 2",
+		log_error(0, "Region size (%" PRIu32 ") must be a power of 2",
 			  lp->region_size);
 		return 0;
 	}
 
 	if (lp->region_size % (pagesize >> SECTOR_SHIFT)) {
-		log_error("Region size (%" PRIu32 ") must be a multiple of "
+		log_error(0, "Region size (%" PRIu32 ") must be a multiple of "
 			  "machine memory page size (%d)",
 			  lp->region_size, pagesize >> SECTOR_SHIFT);
 		return 0;
 	}
 
 	if (!lp->region_size) {
-		log_error("Non-zero region size must be supplied.");
+		log_error(0, "Non-zero region size must be supplied.");
 		return 0;
 	}
 
@@ -303,7 +303,7 @@ static int _read_mirror_params(struct lvcreate_params *lp,
 
 	if (!strcmp("disk", mirrorlog)) {
 		if (lp->corelog) {
-			log_error("--mirrorlog disk and --corelog "
+			log_error(0, "--mirrorlog disk and --corelog "
 				  "are incompatible");
 			return 0;
 		}
@@ -311,7 +311,7 @@ static int _read_mirror_params(struct lvcreate_params *lp,
 	} else if (!strcmp("core", mirrorlog))
 		lp->corelog = 1;
 	else {
-		log_error("Unknown mirrorlog type: %s", mirrorlog);
+		log_error(0, "Unknown mirrorlog type: %s", mirrorlog);
 		return 0;
 	}
 
@@ -321,7 +321,7 @@ static int _read_mirror_params(struct lvcreate_params *lp,
 
 	if (arg_count(cmd, regionsize_ARG)) {
 		if (arg_sign_value(cmd, regionsize_ARG, 0) == SIGN_MINUS) {
-			log_error("Negative regionsize is invalid");
+			log_error(0, "Negative regionsize is invalid");
 			return 0;
 		}
 		lp->region_size = arg_uint_value(cmd, regionsize_ARG, 0);
@@ -330,7 +330,7 @@ static int _read_mirror_params(struct lvcreate_params *lp,
 					"activation/mirror_region_size",
 					DEFAULT_MIRROR_REGION_SIZE);
 		if (region_size < 0) {
-			log_error("Negative regionsize in configuration file "
+			log_error(0, "Negative regionsize in configuration file "
 				  "is invalid");
 			return 0;
 		}
@@ -377,24 +377,24 @@ static int _lvcreate_params(struct lvcreate_params *lp, struct cmd_context *cmd,
 		if (lp->mirrors == 1)
 			log_print("Redundant mirrors argument: default is 0");
 		if (arg_sign_value(cmd, mirrors_ARG, 0) == SIGN_MINUS) {
-			log_error("Mirrors argument may not be negative");
+			log_error(0, "Mirrors argument may not be negative");
 			return 0;
 		}
 	}
 
 	if (lp->snapshot) {
 		if (arg_count(cmd, zero_ARG)) {
-			log_error("-Z is incompatible with snapshots");
+			log_error(0, "-Z is incompatible with snapshots");
 			return 0;
 		}
 		if (arg_sign_value(cmd, chunksize_ARG, 0) == SIGN_MINUS) {
-			log_error("Negative chunk size is invalid");
+			log_error(0, "Negative chunk size is invalid");
 			return 0;
 		}
 		lp->chunk_size = arg_uint_value(cmd, chunksize_ARG, 8);
 		if (lp->chunk_size < 8 || lp->chunk_size > 1024 ||
 		    (lp->chunk_size & (lp->chunk_size - 1))) {
-			log_error("Chunk size must be a power of 2 in the "
+			log_error(0, "Chunk size must be a power of 2 in the "
 				  "range 4K to 512K");
 			return 0;
 		}
@@ -404,20 +404,20 @@ static int _lvcreate_params(struct lvcreate_params *lp, struct cmd_context *cmd,
 			return_0;
 	} else {
 		if (arg_count(cmd, chunksize_ARG)) {
-			log_error("-c is only available with snapshots");
+			log_error(0, "-c is only available with snapshots");
 			return 0;
 		}
 	}
 
 	if (lp->mirrors > 1) {
 		if (lp->snapshot) {
-			log_error("mirrors and snapshots are currently "
+			log_error(0, "mirrors and snapshots are currently "
 				  "incompatible");
 			return 0;
 		}
 
 		if (lp->stripes > 1) {
-			log_error("mirrors and stripes are currently "
+			log_error(0, "mirrors and stripes are currently "
 				  "incompatible");
 			return 0;
 		}
@@ -426,19 +426,19 @@ static int _lvcreate_params(struct lvcreate_params *lp, struct cmd_context *cmd,
 			return_0;
 	} else {
 		if (arg_count(cmd, corelog_ARG)) {
-			log_error("--corelog is only available with mirrors");
+			log_error(0, "--corelog is only available with mirrors");
 			return 0;
 		}
 
 		if (arg_count(cmd, nosync_ARG)) {
-			log_error("--nosync is only available with mirrors");
+			log_error(0, "--nosync is only available with mirrors");
 			return 0;
 		}
 	}
 
 	if (activation() && lp->segtype->ops->target_present &&
 	    !lp->segtype->ops->target_present(cmd, NULL, NULL)) {
-		log_error("%s: Required device-mapper target(s) not "
+		log_error(0, "%s: Required device-mapper target(s) not "
 			  "detected in your kernel", lp->segtype->name);
 		return 0;
 	}
@@ -465,7 +465,7 @@ static int _lvcreate_params(struct lvcreate_params *lp, struct cmd_context *cmd,
 	lp->alloc = arg_uint_value(cmd, alloc_ARG, lp->alloc);
 
 	if (contiguous && (lp->alloc != ALLOC_CONTIGUOUS)) {
-		log_error("Conflicting contiguous and alloc arguments");
+		log_error(0, "Conflicting contiguous and alloc arguments");
 		return 0;
 	}
 
@@ -504,24 +504,24 @@ static int _lvcreate_params(struct lvcreate_params *lp, struct cmd_context *cmd,
 	if (arg_count(cmd, persistent_ARG)) {
 		if (!strcmp(arg_str_value(cmd, persistent_ARG, "n"), "y")) {
 			if (lp->minor == -1) {
-				log_error("Please specify minor number with "
+				log_error(0, "Please specify minor number with "
 					  "--minor when using -My");
 				return 0;
 			}
 			if (lp->major == -1) {
-				log_error("Please specify major number with "
+				log_error(0, "Please specify major number with "
 					  "--major when using -My");
 				return 0;
 			}
 		} else {
 			if ((lp->minor != -1) || (lp->major != -1)) {
-				log_error("--major and --minor incompatible "
+				log_error(0, "--major and --minor incompatible "
 					  "with -Mn");
 				return 0;
 			}
 		}
 	} else if (arg_count(cmd, minor_ARG) || arg_count(cmd, major_ARG)) {
-		log_error("--major and --minor require -My");
+		log_error(0, "--major and --minor require -My");
 		return 0;
 	}
 
@@ -541,7 +541,7 @@ static uint64_t _extents_from_size(struct cmd_context *cmd, uint64_t size,
 	}
 
 	if (size > (uint64_t) UINT32_MAX * extent_size) {
-		log_error("Volume too large (%s) for extent size %s. "
+		log_error(0, "Volume too large (%s) for extent size %s. "
 			  "Upper limit is %s.",
 			  display_size(cmd, size),
 			  display_size(cmd, (uint64_t) extent_size),
@@ -565,14 +565,14 @@ static struct logical_volume *_create_virtual_origin(struct cmd_context *cmd,
 	struct logical_volume *lv;
 
 	if (!(segtype = get_segtype_from_string(cmd, "zero"))) {
-		log_error("Zero segment type for virtual origin not found");
+		log_error(0, "Zero segment type for virtual origin not found");
 		return NULL;
 	}
 
 	len = strlen(lv_name) + 32;
 	if (!(vorigin_name = alloca(len)) ||
 	    dm_snprintf(vorigin_name, len, "%s_vorigin", lv_name) < 0) {
-		log_error("Virtual origin name allocation failed.");
+		log_error(0, "Virtual origin name allocation failed.");
 		return NULL;
 	}
 
@@ -608,19 +608,19 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 	uint32_t pv_extent_count;
 
 	if (lp->lv_name && find_lv_in_vg(vg, lp->lv_name)) {
-		log_error("Logical volume \"%s\" already exists in "
+		log_error(0, "Logical volume \"%s\" already exists in "
 			  "volume group \"%s\"", lp->lv_name, lp->vg_name);
 		return 0;
 	}
 
 	if (vg_max_lv_reached(vg)) {
-		log_error("Maximum number of logical volumes (%u) reached "
+		log_error(0, "Maximum number of logical volumes (%u) reached "
 			  "in volume group %s", vg->max_lv, vg->name);
 		return 0;
 	}
 
 	if (lp->mirrors > 1 && !(vg->fid->fmt->features & FMT_SEGMENTS)) {
-		log_error("Metadata does not support mirroring.");
+		log_error(0, "Metadata does not support mirroring.");
 		return 0;
 	}
 
@@ -628,12 +628,12 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 	    lp->read_ahead != DM_READ_AHEAD_NONE &&
 	    (vg->fid->fmt->features & FMT_RESTRICTED_READAHEAD) &&
 	    (lp->read_ahead < 2 || lp->read_ahead > 120)) {
-		log_error("Metadata only supports readahead values between 2 and 120.");
+		log_error(0, "Metadata only supports readahead values between 2 and 120.");
 		return 0;
 	}
 
 	if (lp->stripe_size > vg->extent_size) {
-		log_error("Reducing requested stripe size %s to maximum, "
+		log_error(0, "Reducing requested stripe size %s to maximum, "
 			  "physical extent size %s",
 			  display_size(cmd, (uint64_t) lp->stripe_size),
 			  display_size(cmd, (uint64_t) vg->extent_size));
@@ -644,7 +644,7 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 	if (lp->stripes > 1 &&
 	    !(vg->fid->fmt->features & FMT_UNLIMITED_STRIPESIZE) &&
 	    (lp->stripe_size > STRIPE_SIZE_MAX)) {
-		log_error("Stripe size may not exceed %s",
+		log_error(0, "Stripe size may not exceed %s",
 			  display_size(cmd, (uint64_t) STRIPE_SIZE_MAX));
 		return 0;
 	}
@@ -677,7 +677,7 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 			break;
 		case PERCENT_PVS:
 			if (!lp->pv_count) {
-				log_error("Please specify physical volume(s) "
+				log_error(0, "Please specify physical volume(s) "
 					  "with %%PVS");
 				return 0;
 			}
@@ -685,7 +685,7 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 			lp->extents = lp->extents * pv_extent_count / 100;
 			break;
 		case PERCENT_LV:
-			log_error("Please express size as %%VG, %%PVS, or "
+			log_error(0, "Please express size as %%VG, %%PVS, or "
 				  "%%FREE.");
 			return 0;
 		case PERCENT_NONE:
@@ -700,7 +700,7 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 	}
 
 	if (lp->zero && !activation()) {
-		log_error("Can't wipe start of new LV without using "
+		log_error(0, "Can't wipe start of new LV without using "
 			  "device-mapper kernel driver");
 		return 0;
 	}
@@ -709,13 +709,13 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 
 	if (lp->snapshot) {
 		if (!activation()) {
-			log_error("Can't create snapshot without using "
+			log_error(0, "Can't create snapshot without using "
 				  "device-mapper kernel driver");
 			return 0;
 		}
 		/* FIXME Allow exclusive activation. */
 		if (vg_is_clustered(vg)) {
-			log_error("Clustered snapshots are not yet supported.");
+			log_error(0, "Clustered snapshots are not yet supported.");
 			return 0;
 		}
 
@@ -727,35 +727,35 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 		else {
 
 			if (!(org = find_lv(vg, lp->origin))) {
-				log_error("Couldn't find origin volume '%s'.",
+				log_error(0, "Couldn't find origin volume '%s'.",
 					  lp->origin);
 				return 0;
 			}
 			if (lv_is_virtual_origin(org)) {
-				log_error("Can't share virtual origins. "
+				log_error(0, "Can't share virtual origins. "
 					  "Use --virtualsize.");
 				return 0;
 			}
 			if (lv_is_cow(org)) {
-				log_error("Snapshots of snapshots are not "
+				log_error(0, "Snapshots of snapshots are not "
 					  "supported yet.");
 				return 0;
 			}
 			if (org->status & LOCKED) {
-				log_error("Snapshots of locked devices are not "
+				log_error(0, "Snapshots of locked devices are not "
 					  "supported yet");
 				return 0;
 			}
 			if (org->status & MIRROR_IMAGE ||
 			    org->status & MIRROR_LOG ||
 			    org->status & MIRRORED) {
-				log_error("Snapshots and mirrors may not yet "
+				log_error(0, "Snapshots and mirrors may not yet "
 					  "be mixed.");
 				return 0;
 			}
 
 			if (!lv_info(cmd, org, &info, 0, 0)) {
-				log_error("Check for existence of snapshot "
+				log_error(0, "Check for existence of snapshot "
 					  "origin '%s' failed.", org->name);
 				return 0;
 			}
@@ -764,26 +764,26 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 	}
 
 	if (!lp->extents) {
-		log_error("Unable to create new logical volume with no extents");
+		log_error(0, "Unable to create new logical volume with no extents");
 		return 0;
 	}
 
 	if (!seg_is_virtual(lp) &&
 	    vg->free_count < lp->extents) {
-		log_error("Insufficient free extents (%u) in volume group %s: "
+		log_error(0, "Insufficient free extents (%u) in volume group %s: "
 			  "%u required", vg->free_count, vg->name, lp->extents);
 		return 0;
 	}
 
 	if (lp->stripes > dm_list_size(pvh) && lp->alloc != ALLOC_ANYWHERE) {
-		log_error("Number of stripes (%u) must not exceed "
+		log_error(0, "Number of stripes (%u) must not exceed "
 			  "number of physical volumes (%d)", lp->stripes,
 			  dm_list_size(pvh));
 		return 0;
 	}
 
 	if (lp->mirrors > 1 && !activation()) {
-		log_error("Can't create mirror without using "
+		log_error(0, "Can't create mirror without using "
 			  "device-mapper kernel driver.");
 		return 0;
 	}
@@ -800,7 +800,7 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 		lv_name = lp->lv_name;
 	else {
 		if (!generate_lv_name(vg, "lvol%d", lv_name_buf, sizeof(lv_name_buf))) {
-			log_error("Failed to generate LV name.");
+			log_error(0, "Failed to generate LV name.");
 			return 0;
 		}
 		lv_name = &lv_name_buf[0];
@@ -808,12 +808,12 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 
 	if (arg_count(cmd, addtag_ARG)) {
 		if (!(tag = arg_str_value(cmd, addtag_ARG, NULL))) {
-			log_error("Failed to get tag");
+			log_error(0, "Failed to get tag");
 			return 0;
 		}
 
 		if (!(vg->fid->fmt->features & FMT_TAGS)) {
-			log_error("Volume group %s does not support tags",
+			log_error(0, "Volume group %s does not support tags",
 				  vg->name);
 			return 0;
 		}
@@ -847,7 +847,7 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 	}
 
 	if (tag && !str_list_add(cmd->mem, &lv->tags, tag)) {
-		log_error("Failed to add tag %s to %s/%s",
+		log_error(0, "Failed to add tag %s to %s/%s",
 			  tag, lv->vg->name, lv->name);
 		return 0;
 	}
@@ -878,24 +878,24 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 
 	if (lp->snapshot) {
 		if (!activate_lv_excl(cmd, lv)) {
-			log_error("Aborting. Failed to activate snapshot "
+			log_error(0, "Aborting. Failed to activate snapshot "
 				  "exception store.");
 			goto revert_new_lv;
 		}
 	} else if (!activate_lv(cmd, lv)) {
 		if (lp->zero) {
-			log_error("Aborting. Failed to activate new LV to wipe "
+			log_error(0, "Aborting. Failed to activate new LV to wipe "
 				  "the start of it.");
 			goto deactivate_and_revert_new_lv;
 		}
-		log_error("Failed to activate new LV.");
+		log_error(0, "Failed to activate new LV.");
 		return 0;
 	}
 
 	if (!lp->zero && !lp->snapshot)
-		log_error("WARNING: \"%s\" not zeroed", lv->name);
+		log_error(0, "WARNING: \"%s\" not zeroed", lv->name);
 	else if (!set_lv(cmd, lv, UINT64_C(0), 0)) {
-		log_error("Aborting. Failed to wipe %s.",
+		log_error(0, "Aborting. Failed to wipe %s.",
 			  lp->snapshot ? "snapshot exception store" :
 					 "start of new LV");
 		goto deactivate_and_revert_new_lv;
@@ -908,7 +908,7 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 
 		/* COW area must be deactivated if origin is not active */
 		if (!origin_active && !deactivate_lv(cmd, lv)) {
-			log_error("Aborting. Couldn't deactivate snapshot "
+			log_error(0, "Aborting. Couldn't deactivate snapshot "
 				  "COW area. Manual intervention required.");
 			return 0;
 		}
@@ -919,7 +919,7 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 						    lp->permission,
 						    lp->voriginextents)) ||
 		     !activate_lv(cmd, org))) {
-			log_error("Couldn't create virtual origin for LV %s",
+			log_error(0, "Couldn't create virtual origin for LV %s",
 				  lv->name);
 			if (org && !lv_remove(org))
 				stack;
@@ -930,7 +930,7 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 
 		if (!vg_add_snapshot(org, lv, NULL,
 				     org->le_count, lp->chunk_size)) {
-			log_error("Couldn't create snapshot.");
+			log_error(0, "Couldn't create snapshot.");
 			goto deactivate_and_revert_new_lv;
 		}
 
@@ -939,7 +939,7 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 			return_0;
 
 		if (!suspend_lv(cmd, org)) {
-			log_error("Failed to suspend origin %s", org->name);
+			log_error(0, "Failed to suspend origin %s", org->name);
 			vg_revert(vg);
 			return 0;
 		}
@@ -948,7 +948,7 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 			return_0;
 
 		if (!resume_lv(cmd, org)) {
-			log_error("Problem reactivating origin %s", org->name);
+			log_error(0, "Problem reactivating origin %s", org->name);
 			return 0;
 		}
 	}
@@ -966,7 +966,7 @@ static int _lvcreate(struct cmd_context *cmd, struct volume_group *vg,
 
 deactivate_and_revert_new_lv:
 	if (!deactivate_lv(cmd, lv)) {
-		log_error("Unable to deactivate failed new LV. "
+		log_error(0, "Unable to deactivate failed new LV. "
 			  "Manual intervention required.");
 		return 0;
 	}
@@ -974,7 +974,7 @@ deactivate_and_revert_new_lv:
 revert_new_lv:
 	/* FIXME Better to revert to backup of metadata? */
 	if (!lv_remove(lv) || !vg_write(vg) || !vg_commit(vg))
-		log_error("Manual intervention may be required to remove "
+		log_error(0, "Manual intervention may be required to remove "
 			  "abandoned LV(s) before retrying.");
 	else
 		backup(vg);
diff --git a/tools/lvdisplay.c b/tools/lvdisplay.c
index f5531cb..d0efe71 100644
--- a/tools/lvdisplay.c
+++ b/tools/lvdisplay.c
@@ -36,7 +36,7 @@ int lvdisplay(struct cmd_context *cmd, int argc, char **argv)
 {
 	if (arg_count(cmd, columns_ARG)) {
 		if (arg_count(cmd, colon_ARG) || arg_count(cmd, maps_ARG)) {
-			log_error("Incompatible options selected");
+			log_error(0, "Incompatible options selected");
 			return EINVALID_CMD_LINE;
 		}
 		return lvs(cmd, argc, argv);
@@ -45,12 +45,12 @@ int lvdisplay(struct cmd_context *cmd, int argc, char **argv)
 		   arg_count(cmd, options_ARG) ||
 		   arg_count(cmd, separator_ARG) ||
 		   arg_count(cmd, sort_ARG) || arg_count(cmd, unbuffered_ARG)) {
-		log_error("Incompatible options selected");
+		log_error(0, "Incompatible options selected");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (arg_count(cmd, colon_ARG) && arg_count(cmd, verbose_ARG)) {
-		log_error("Options -v and -c are incompatible");
+		log_error(0, "Options -v and -c are incompatible");
 		return EINVALID_CMD_LINE;
 	}
 
diff --git a/tools/lvm.c b/tools/lvm.c
index e1f7900..1f4b1f8 100644
--- a/tools/lvm.c
+++ b/tools/lvm.c
@@ -148,7 +148,7 @@ static int _hist_file(char *buffer, size_t size)
 	char *e = getenv("HOME");
 
 	if (dm_snprintf(buffer, size, "%s/.lvm_history", e) < 0) {
-		log_error("$HOME/.lvm_history: path too long");
+		log_error(0, "$HOME/.lvm_history: path too long");
 		return 0;
 	}
 
@@ -213,7 +213,7 @@ int lvm_shell(struct cmd_context *cmd, struct cmdline_context *cmdline)
 		argv = args;
 
 		if (lvm_split(input, &argc, argv, MAX_ARGS) == MAX_ARGS) {
-			log_error("Too many arguments, sorry.");
+			log_error(0, "Too many arguments, sorry.");
 			continue;
 		}
 
@@ -227,18 +227,18 @@ int lvm_shell(struct cmd_context *cmd, struct cmdline_context *cmdline)
 
 		if (!strcmp(argv[0], "quit") || !strcmp(argv[0], "exit")) {
 			remove_history(history_length - 1);
-			log_error("Exiting.");
+			log_error(0, "Exiting.");
 			break;
 		}
 
 		ret = lvm_run_command(cmd, argc, argv);
 		if (ret == ENO_SUCH_CMD)
-			log_error("No such command '%s'.  Try 'help'.",
+			log_error(0, "No such command '%s'.  Try 'help'.",
 				  argv[0]);
 
                 if ((ret != ECMD_PROCESSED) && !error_message_produced()) {
 			log_debug("Internal error: Failed command did not use log_error");
-			log_error("Command failed with status code %d.", ret);
+			log_error(0, "Command failed with status code %d.", ret);
 		}
 		_write_history();
 	}
diff --git a/tools/lvmcmdlib.c b/tools/lvmcmdlib.c
index 5cde0c4..1815743 100644
--- a/tools/lvmcmdlib.c
+++ b/tools/lvmcmdlib.c
@@ -52,7 +52,7 @@ int lvm2_run(void *handle, const char *cmdline)
 	if (!handle) {
 		oneoff = 1;
 		if (!(handle = lvm2_init())) {
-			log_error("Handle initialisation failed.");
+			log_error(0, "Handle initialisation failed.");
 			return ECMD_FAILED;
 		}
 	}
@@ -62,19 +62,19 @@ int lvm2_run(void *handle, const char *cmdline)
 	cmd->argv = argv;
 
 	if (!(cmdcopy = dm_strdup(cmdline))) {
-		log_error("Cmdline copy failed.");
+		log_error(0, "Cmdline copy failed.");
 		ret = ECMD_FAILED;
 		goto out;
 	}
 
 	if (lvm_split(cmdcopy, &argc, argv, MAX_ARGS) == MAX_ARGS) {
-		log_error("Too many arguments.  Limit is %d.", MAX_ARGS);
+		log_error(0, "Too many arguments.  Limit is %d.", MAX_ARGS);
 		ret = EINVALID_CMD_LINE;
 		goto out;
 	}
 
 	if (!argc) {
-		log_error("No command supplied");
+		log_error(0, "No command supplied");
 		ret = EINVALID_CMD_LINE;
 		goto out;
 	}
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 555be8f..210dd49 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -284,7 +284,7 @@ static int _size_arg(struct cmd_context *cmd __attribute((unused)), struct arg *
 			adjustment = v_tmp % 512;
 			if (adjustment) {
 				v_tmp += (512 - adjustment);
-				log_error("Size is not a multiple of 512. "
+				log_error(0, "Size is not a multiple of 512. "
 					  "Try using %"PRIu64" or %"PRIu64".",
 					  v_tmp - 512, v_tmp);
 				return 0;
@@ -375,7 +375,7 @@ int minor_arg(struct cmd_context *cmd __attribute((unused)), struct arg *a)
 		return 0;
 
 	if (a->i_value > 255) {
-		log_error("Minor number outside range 0-255");
+		log_error(0, "Minor number outside range 0-255");
 		return 0;
 	}
 
@@ -390,7 +390,7 @@ int major_arg(struct cmd_context *cmd __attribute((unused)), struct arg *a)
 		return 0;
 
 	if (a->i_value > 255) {
-		log_error("Major number outside range 0-255");
+		log_error(0, "Major number outside range 0-255");
 		return 0;
 	}
 
@@ -582,7 +582,7 @@ static struct command *_find_command(const char *name)
 
 static void _short_usage(const char *name)
 {
-	log_error("Run `%s --help' for more information.", name);
+	log_error(0, "Run `%s --help' for more information.", name);
 }
 
 static int _usage(const char *name)
@@ -694,7 +694,7 @@ static int _process_command_line(struct cmd_context *cmd, int *argc,
 		}
 
 		if (a->count && !(a->flags & ARG_REPEATABLE)) {
-			log_error("Option%s%c%s%s may not be repeated",
+			log_error(0, "Option%s%c%s%s may not be repeated",
 				  a->short_arg ? " -" : "",
 				  a->short_arg ? : ' ',
 				  (a->short_arg && a->long_arg) ?
@@ -704,14 +704,14 @@ static int _process_command_line(struct cmd_context *cmd, int *argc,
 
 		if (a->fn) {
 			if (!optarg) {
-				log_error("Option requires argument.");
+				log_error(0, "Option requires argument.");
 				return 0;
 			}
 
 			a->value = optarg;
 
 			if (!a->fn(cmd, a)) {
-				log_error("Invalid argument %s", optarg);
+				log_error(0, "Invalid argument %s", optarg);
 				return 0;
 			}
 		}
@@ -730,7 +730,7 @@ static int _merge_synonym(struct cmd_context *cmd, int oldarg, int newarg)
 	struct arg *new;
 
 	if (arg_count(cmd, oldarg) && arg_count(cmd, newarg)) {
-		log_error("%s and %s are synonyms.  Please only supply one.",
+		log_error(0, "%s and %s are synonyms.  Please only supply one.",
 			  _cmdline.the_args[oldarg].long_arg, _cmdline.the_args[newarg].long_arg);
 		return 0;
 	}
@@ -815,13 +815,13 @@ static int _get_settings(struct cmd_context *cmd)
 		if (!(cmd->current_settings.unit_factor =
 		      units_to_bytes(arg_str_value(cmd, units_ARG, ""),
 				     &cmd->current_settings.unit_type))) {
-			log_error("Invalid units specification");
+			log_error(0, "Invalid units specification");
 			return EINVALID_CMD_LINE;
 		}
 
 	if (arg_count(cmd, trustcache_ARG)) {
 		if (arg_count(cmd, all_ARG)) {
-			log_error("--trustcache is incompatible with --all");
+			log_error(0, "--trustcache is incompatible with --all");
 			return EINVALID_CMD_LINE;
 		}
 		init_trust_cache(1);
@@ -860,14 +860,14 @@ static void _display_help(void)
 {
 	int i;
 
-	log_error("Available lvm commands:");
-	log_error("Use 'lvm help <command>' for more information");
-	log_error(" ");
+	log_error(0, "Available lvm commands:");
+	log_error(0, "Use 'lvm help <command>' for more information");
+	log_error(0, " ");
 
 	for (i = 0; i < _cmdline.num_commands; i++) {
 		struct command *com = _cmdline.commands + i;
 
-		log_error("%-16.16s%s", com->name, com->desc);
+		log_error(0, "%-16.16s%s", com->name, com->desc);
 	}
 }
 
@@ -890,7 +890,7 @@ int help(struct cmd_context *cmd __attribute((unused)), int argc, char **argv)
 static int _override_settings(struct cmd_context *cmd)
 {
 	if (!(cmd->cft_override = create_config_tree_from_string(cmd, arg_str_value(cmd, config_ARG, "")))) {
-		log_error("Failed to set overridden configuration entries.");
+		log_error(0, "Failed to set overridden configuration entries.");
 		return EINVALID_CMD_LINE;
 	}
 
@@ -955,7 +955,7 @@ static char *_copy_command_line(struct cmd_context *cmd, int argc, char **argv)
 	return dm_pool_end_object(cmd->mem);
 
       bad:
-	log_err("Couldn't copy command line.");
+	log_error(0, "Couldn't copy command line.");
 	dm_pool_abandon_object(cmd->mem);
 	return NULL;
 }
@@ -979,7 +979,7 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
 		return ENO_SUCH_CMD;
 
 	if (!_process_command_line(cmd, &argc, &argv)) {
-		log_error("Error during parsing of command line.");
+		log_error(0, "Error during parsing of command line.");
 		return EINVALID_CMD_LINE;
 	}
 
@@ -992,7 +992,7 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
 	if (arg_count(cmd, config_ARG) || !cmd->config_valid || config_files_changed(cmd)) {
 		/* Reinitialise various settings inc. logging, filters */
 		if (!refresh_toolcontext(cmd)) {
-			log_error("Updated config file invalid. Aborting.");
+			log_error(0, "Updated config file invalid. Aborting.");
 			return ECMD_FAILED;
 		}
 	}
@@ -1016,7 +1016,7 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
 		locking_type = -1;
 
 	if (!init_locking(locking_type, cmd)) {
-		log_error("Locking type %d initialisation failed.",
+		log_error(0, "Locking type %d initialisation failed.",
 			  locking_type);
 		ret = ECMD_FAILED;
 		goto out;
@@ -1227,14 +1227,14 @@ static int _run_script(struct cmd_context *cmd, int argc, char **argv)
 		if ((strlen(buffer) == sizeof(buffer) - 1)
 		    && (buffer[sizeof(buffer) - 1] - 2 != '\n')) {
 			buffer[50] = '\0';
-			log_error("Line too long (max 255) beginning: %s",
+			log_error(0, "Line too long (max 255) beginning: %s",
 				  buffer);
 			ret = EINVALID_CMD_LINE;
 			break;
 		}
 		if (lvm_split(buffer, &argc, argv, MAX_ARGS) == MAX_ARGS) {
 			buffer[50] = '\0';
-			log_error("Too many arguments: %s", buffer);
+			log_error(0, "Too many arguments: %s", buffer);
 			ret = EINVALID_CMD_LINE;
 			break;
 		}
@@ -1246,7 +1246,7 @@ static int _run_script(struct cmd_context *cmd, int argc, char **argv)
 		if (ret != ECMD_PROCESSED) {
 			if (!error_message_produced()) {
 				log_debug("Internal error: Failed command did not use log_error");
-				log_error("Command failed with status code %d.", ret);
+				log_error(0, "Command failed with status code %d.", ret);
 			}
 			break;
 		}
@@ -1286,7 +1286,7 @@ static void _exec_lvm1_command(char **argv)
 	char path[PATH_MAX];
 
 	if (dm_snprintf(path, sizeof(path), "%s.lvm1", argv[0]) < 0) {
-		log_error("Failed to create LVM1 tool pathname");
+		log_error(0, "Failed to create LVM1 tool pathname");
 		return;
 	}
 
@@ -1335,7 +1335,7 @@ int lvm2_main(int argc, char **argv)
 			alias = 0;
 		}
 		if (!argc) {
-			log_error("Falling back to LVM1 tools, but no "
+			log_error(0, "Falling back to LVM1 tools, but no "
 				  "command specified.");
 			return ECMD_FAILED;
 		}
@@ -1367,11 +1367,11 @@ int lvm2_main(int argc, char **argv)
 	if ((ret == ENO_SUCH_CMD) && (!alias))
 		ret = _run_script(cmd, argc, argv);
 	if (ret == ENO_SUCH_CMD)
-		log_error("No such command.  Try 'help'.");
+		log_error(0, "No such command.  Try 'help'.");
 
 	if ((ret != ECMD_PROCESSED) && !error_message_produced()) {
 		log_debug("Internal error: Failed command did not use log_error");
-		log_error("Command failed with status code %d.", ret);
+		log_error(0, "Command failed with status code %d.", ret);
 	}
 
       out:
diff --git a/tools/lvmdiskscan.c b/tools/lvmdiskscan.c
index c91f5f2..328fc80 100644
--- a/tools/lvmdiskscan.c
+++ b/tools/lvmdiskscan.c
@@ -35,7 +35,7 @@ static int _get_max_dev_name_len(struct dev_filter *filter)
 	struct device *dev;
 
 	if (!(iter = dev_iter_create(filter, 1))) {
-		log_error("dev_iter_create failed");
+		log_error(0, "dev_iter_create failed");
 		return 0;
 	}
 
@@ -80,12 +80,12 @@ static int _check_device(struct cmd_context *cmd, struct device *dev)
 		return 0;
 	}
 	if (!dev_get_size(dev, &size)) {
-		log_error("Couldn't get size of \"%s\"", dev_name(dev));
+		log_error(0, "Couldn't get size of \"%s\"", dev_name(dev));
 	}
 	_print(cmd, dev, size, NULL);
 	_count(dev, &disks_found, &parts_found);
 	if (!dev_close(dev)) {
-		log_error("dev_close on \"%s\" failed", dev_name(dev));
+		log_error(0, "dev_close on \"%s\" failed", dev_name(dev));
 		return 0;
 	}
 	return 1;
@@ -111,7 +111,7 @@ int lvmdiskscan(struct cmd_context *cmd, int argc __attribute((unused)),
 	max_len = _get_max_dev_name_len(cmd->filter);
 
 	if (!(iter = dev_iter_create(cmd->filter, 0))) {
-		log_error("dev_iter_create failed");
+		log_error(0, "dev_iter_create failed");
 		return ECMD_FAILED;
 	}
 
@@ -120,7 +120,7 @@ int lvmdiskscan(struct cmd_context *cmd, int argc __attribute((unused)),
 		/* Try if it is a PV first */
 		if ((label_read(dev, &label, UINT64_C(0)))) {
 			if (!dev_get_size(dev, &size)) {
-				log_error("Couldn't get size of \"%s\"",
+				log_error(0, "Couldn't get size of \"%s\"",
 					  dev_name(dev));
 				continue;
 			}
diff --git a/tools/lvremove.c b/tools/lvremove.c
index be2107a..15299ad 100644
--- a/tools/lvremove.c
+++ b/tools/lvremove.c
@@ -35,7 +35,7 @@ static int lvremove_single(struct cmd_context *cmd, struct logical_volume *lv,
 int lvremove(struct cmd_context *cmd, int argc, char **argv)
 {
 	if (!argc) {
-		log_error("Please enter one or more logical volume paths");
+		log_error(0, "Please enter one or more logical volume paths");
 		return EINVALID_CMD_LINE;
 	}
 
diff --git a/tools/lvrename.c b/tools/lvrename.c
index 7411854..f4725fe 100644
--- a/tools/lvrename.c
+++ b/tools/lvrename.c
@@ -39,7 +39,7 @@ int lvrename(struct cmd_context *cmd, int argc, char **argv)
 		if (strchr(lv_name_old, '/') &&
 		    (vg_name_old = extract_vgname(cmd, lv_name_old)) &&
 		    strcmp(vg_name_old, vg_name)) {
-			log_error("Please use a single volume group name "
+			log_error(0, "Please use a single volume group name "
 				  "(\"%s\" or \"%s\")", vg_name, vg_name_old);
 			return EINVALID_CMD_LINE;
 		}
@@ -48,19 +48,19 @@ int lvrename(struct cmd_context *cmd, int argc, char **argv)
 		lv_name_new = argv[1];
 		vg_name = extract_vgname(cmd, lv_name_old);
 	} else {
-		log_error("Old and new logical volume names required");
+		log_error(0, "Old and new logical volume names required");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (!validate_name(vg_name)) {
-		log_error("Please provide a valid volume group name");
+		log_error(0, "Please provide a valid volume group name");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (strchr(lv_name_new, '/') &&
 	    (vg_name_new = extract_vgname(cmd, lv_name_new)) &&
 	    strcmp(vg_name, vg_name_new)) {
-		log_error("Logical volume names must "
+		log_error(0, "Logical volume names must "
 			  "have the same volume group (\"%s\" or \"%s\")",
 			  vg_name, vg_name_new);
 		return EINVALID_CMD_LINE;
@@ -75,13 +75,13 @@ int lvrename(struct cmd_context *cmd, int argc, char **argv)
 	/* Check sanity of new name */
 	maxlen = NAME_LEN - strlen(vg_name) - strlen(cmd->dev_dir) - 3;
 	if (strlen(lv_name_new) > maxlen) {
-		log_error("New logical volume path exceeds maximum length "
+		log_error(0, "New logical volume path exceeds maximum length "
 			  "of %" PRIsize_t "!", maxlen);
 		return ECMD_FAILED;
 	}
 
 	if (!*lv_name_new) {
-		log_error("New logical volume name may not be blank");
+		log_error(0, "New logical volume name may not be blank");
 		return ECMD_FAILED;
 	}
 
@@ -91,13 +91,13 @@ int lvrename(struct cmd_context *cmd, int argc, char **argv)
 	}
 
 	if (!validate_name(lv_name_new)) {
-		log_error("New logical volume name \"%s\" is invalid",
+		log_error(0, "New logical volume name \"%s\" is invalid",
 		     lv_name_new);
 		return EINVALID_CMD_LINE;
 	}
 
 	if (!strcmp(lv_name_old, lv_name_new)) {
-		log_error("Old and new logical volume names must differ");
+		log_error(0, "Old and new logical volume names must differ");
 		return EINVALID_CMD_LINE;
 	}
 
@@ -109,7 +109,7 @@ int lvrename(struct cmd_context *cmd, int argc, char **argv)
 	}
 
 	if (!(lvl = find_lv_in_vg(vg, lv_name_old))) {
-		log_error("Existing logical volume \"%s\" not found in "
+		log_error(0, "Existing logical volume \"%s\" not found in "
 			  "volume group \"%s\"", lv_name_old, vg_name);
 		goto error;
 	}
diff --git a/tools/lvresize.c b/tools/lvresize.c
index 033078f..2aa14e3 100644
--- a/tools/lvresize.c
+++ b/tools/lvresize.c
@@ -51,12 +51,12 @@ static int _validate_stripesize(struct cmd_context *cmd,
 				struct lvresize_params *lp)
 {
 	if (arg_sign_value(cmd, stripesize_ARG, 0) == SIGN_MINUS) {
-		log_error("Stripesize may not be negative.");
+		log_error(0, "Stripesize may not be negative.");
 		return 0;
 	}
 
 	if (arg_uint_value(cmd, stripesize_ARG, 0) > STRIPE_SIZE_LIMIT * 2) {
-		log_error("Stripe size cannot be larger than %s",
+		log_error(0, "Stripe size cannot be larger than %s",
 			  display_size(cmd, (uint64_t) STRIPE_SIZE_LIMIT));
 		return 0;
 	}
@@ -64,7 +64,7 @@ static int _validate_stripesize(struct cmd_context *cmd,
 	if (!(vg->fid->fmt->features & FMT_SEGMENTS))
 		log_warn("Varied stripesize not supported. Ignoring.");
 	else if (arg_uint_value(cmd, stripesize_ARG, 0) > vg->extent_size * 2) {
-		log_error("Reducing stripe size %s to maximum, "
+		log_error(0, "Reducing stripe size %s to maximum, "
 			  "physical extent size %s",
 			  display_size(cmd,
 				       (uint64_t) arg_uint_value(cmd, stripesize_ARG, 0)),
@@ -74,11 +74,11 @@ static int _validate_stripesize(struct cmd_context *cmd,
 		lp->stripe_size = arg_uint_value(cmd, stripesize_ARG, 0);
 
 	if (lp->mirrors) {
-		log_error("Mirrors and striping cannot be combined yet.");
+		log_error(0, "Mirrors and striping cannot be combined yet.");
 		return 0;
 	}
 	if (lp->stripe_size & (lp->stripe_size - 1)) {
-		log_error("Stripe size must be power of 2");
+		log_error(0, "Stripe size must be power of 2");
 		return 0;
 	}
 
@@ -95,13 +95,13 @@ static int _request_confirmation(struct cmd_context *cmd,
 	memset(&info, 0, sizeof(info));
 
 	if (!lv_info(cmd, lv, &info, 1, 0) && driver_version(NULL, 0)) {
-		log_error("lv_info failed: aborting");
+		log_error(0, "lv_info failed: aborting");
 		return 0;
 	}
 
 	if (lp->resizefs) {
 		if (!info.exists) {
-			log_error("Logical volume %s must be activated "
+			log_error(0, "Logical volume %s must be activated "
 				  "before resizing filesystem", lp->lv_name);
 			return 0;
 		}
@@ -163,7 +163,7 @@ static int _fsadm_cmd(struct cmd_context *cmd,
 
 	if (dm_snprintf(lv_path, PATH_MAX, "%s%s/%s", cmd->dev_dir, lp->vg_name,
 			lp->lv_name) < 0) {
-		log_error("Couldn't create LV path for %s", lp->lv_name);
+		log_error(0, "Couldn't create LV path for %s", lp->lv_name);
 		return 0;
 	}
 
@@ -172,7 +172,7 @@ static int _fsadm_cmd(struct cmd_context *cmd,
 	if (fcmd == FSADM_CMD_RESIZE) {
 		if (dm_snprintf(size_buf, SIZE_BUF, "%" PRIu64 "K",
 				(uint64_t) lp->extents * vg->extent_size / 2) < 0) {
-			log_error("Couldn't generate new LV size string");
+			log_error(0, "Couldn't generate new LV size string");
 			return 0;
 		}
 
@@ -212,7 +212,7 @@ static int _lvresize_params(struct cmd_context *cmd, int argc, char **argv,
 		lp->sign = SIGN_PLUS;
 	} else if ((arg_count(cmd, extents_ARG) +
 		    arg_count(cmd, size_ARG) != 1)) {
-		log_error("Please specify either size or extents but not "
+		log_error(0, "Please specify either size or extents but not "
 			  "both.");
 		return 0;
 	}
@@ -231,12 +231,12 @@ static int _lvresize_params(struct cmd_context *cmd, int argc, char **argv,
 	}
 
 	if (lp->resize == LV_EXTEND && lp->sign == SIGN_MINUS) {
-		log_error("Negative argument not permitted - use lvreduce");
+		log_error(0, "Negative argument not permitted - use lvreduce");
 		return 0;
 	}
 
 	if (lp->resize == LV_REDUCE && lp->sign == SIGN_PLUS) {
-		log_error("Positive sign not permitted - use lvextend");
+		log_error(0, "Positive sign not permitted - use lvextend");
 		return 0;
 	}
 
@@ -244,7 +244,7 @@ static int _lvresize_params(struct cmd_context *cmd, int argc, char **argv,
 	lp->nofsck = arg_count(cmd, nofsck_ARG) ? 1 : 0;
 
 	if (!argc) {
-		log_error("Please provide the logical volume name");
+		log_error(0, "Please provide the logical volume name");
 		return 0;
 	}
 
@@ -254,12 +254,12 @@ static int _lvresize_params(struct cmd_context *cmd, int argc, char **argv,
 
 	if (!(lp->lv_name = skip_dev_dir(cmd, lp->lv_name, &dev_dir_found)) ||
 	    !(lp->vg_name = extract_vgname(cmd, lp->lv_name))) {
-		log_error("Please provide a volume group name");
+		log_error(0, "Please provide a volume group name");
 		return 0;
 	}
 
 	if (!validate_name(lp->vg_name)) {
-		log_error("Volume group name %s has invalid characters",
+		log_error(0, "Volume group name %s has invalid characters",
 			  lp->vg_name);
 		return 0;
 	}
@@ -294,7 +294,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 
 	/* does LV exist? */
 	if (!(lvl = find_lv_in_vg(vg, lp->lv_name))) {
-		log_error("Logical volume %s not found in volume group %s",
+		log_error(0, "Logical volume %s not found in volume group %s",
 			  lp->lv_name, lp->vg_name);
 		return ECMD_FAILED;
 	}
@@ -312,7 +312,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 		else
 			log_warn("Mirrors not supported. Ignoring.");
 		if (arg_sign_value(cmd, mirrors_ARG, 0) == SIGN_MINUS) {
-			log_error("Mirrors argument may not be negative");
+			log_error(0, "Mirrors argument may not be negative");
 			return EINVALID_CMD_LINE;
 		}
 	}
@@ -324,12 +324,12 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 	lv = lvl->lv;
 
 	if (lv->status & LOCKED) {
-		log_error("Can't resize locked LV %s", lv->name);
+		log_error(0, "Can't resize locked LV %s", lv->name);
 		return ECMD_FAILED;
 	}
 
 	if (lv->status & CONVERTING) {
-		log_error("Can't resize %s while lvconvert in progress", lv->name);
+		log_error(0, "Can't resize %s while lvconvert in progress", lv->name);
 		return ECMD_FAILED;
 	}
 
@@ -379,7 +379,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 
 	if (lp->sign == SIGN_MINUS) {
 		if (lp->extents >= lv->le_count) {
-			log_error("Unable to reduce %s below 1 extent",
+			log_error(0, "Unable to reduce %s below 1 extent",
 				  lp->lv_name);
 			return EINVALID_CMD_LINE;
 		}
@@ -388,13 +388,13 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 	}
 
 	if (!lp->extents) {
-		log_error("New size of 0 not permitted");
+		log_error(0, "New size of 0 not permitted");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (lp->extents == lv->le_count) {
 		if (!lp->resizefs) {
-			log_error("New size (%d extents) matches existing size "
+			log_error(0, "New size (%d extents) matches existing size "
 				  "(%d extents)", lp->extents, lv->le_count);
 			return EINVALID_CMD_LINE;
 		}
@@ -410,7 +410,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 
 	/* FIXME Support LVs with mixed segment types */
 	if (lp->segtype != arg_ptr_value(cmd, type_ARG, lp->segtype)) {
-		log_error("VolumeType does not match (%s)", lp->segtype->name);
+		log_error(0, "VolumeType does not match (%s)", lp->segtype->name);
 		return EINVALID_CMD_LINE;
 	}
 
@@ -427,7 +427,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 			if ((seg_stripesize && seg_stripesize != sz &&
 			     !lp->stripe_size) ||
 			    (seg_stripes && seg_stripes != str && !lp->stripes)) {
-				log_error("Please specify number of "
+				log_error(0, "Please specify number of "
 					  "stripes (-i) and stripesize (-I)");
 				return EINVALID_CMD_LINE;
 			}
@@ -471,7 +471,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 		}
 		if ((arg_count(cmd, mirrors_ARG) || seg_mirrors) &&
 		    (lp->mirrors != seg_mirrors)) {
-			log_error("Cannot vary number of mirrors in LV yet.");
+			log_error(0, "Cannot vary number of mirrors in LV yet.");
 			return EINVALID_CMD_LINE;
 		}
 	}
@@ -481,7 +481,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 		extents_used = 0;
 
 		if (lp->stripes || lp->stripe_size || lp->mirrors)
-			log_error("Ignoring stripes, stripesize and mirrors "
+			log_error(0, "Ignoring stripes, stripesize and mirrors "
 				  "arguments when reducing");
 
 		dm_list_iterate_items(seg, &lv->segments) {
@@ -510,7 +510,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 	}
 
 	if (lp->stripes > 1 && !lp->stripe_size) {
-		log_error("Stripesize for striped segment should not be 0!");
+		log_error(0, "Stripesize for striped segment should not be 0!");
 		return EINVALID_CMD_LINE;
 	}
 
@@ -526,7 +526,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 		}
 
 		if (lp->stripe_size < STRIPE_SIZE_MIN) {
-			log_error("Invalid stripe size %s",
+			log_error(0, "Invalid stripe size %s",
 				  display_size(cmd, (uint64_t) lp->stripe_size));
 			return EINVALID_CMD_LINE;
 		}
@@ -534,7 +534,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 
 	if (lp->extents < lv->le_count) {
 		if (lp->resize == LV_EXTEND) {
-			log_error("New size given (%d extents) not larger "
+			log_error(0, "New size given (%d extents) not larger "
 				  "than existing size (%d extents)",
 				  lp->extents, lv->le_count);
 			return EINVALID_CMD_LINE;
@@ -542,7 +542,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 		lp->resize = LV_REDUCE;
 	} else if (lp->extents > lv->le_count) {
 		if (lp->resize == LV_REDUCE) {
-			log_error("New size given (%d extents) not less than "
+			log_error(0, "New size given (%d extents) not less than "
 				  "existing size (%d extents)", lp->extents,
 				  lv->le_count);
 			return EINVALID_CMD_LINE;
@@ -552,7 +552,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 
 	if (lv_is_origin(lv)) {
 		if (lp->resize == LV_REDUCE) {
-			log_error("Snapshot origin volumes cannot be reduced "
+			log_error(0, "Snapshot origin volumes cannot be reduced "
 				  "in size yet.");
 			return ECMD_FAILED;
 		}
@@ -560,7 +560,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 		memset(&info, 0, sizeof(info));
 
 		if (lv_info(cmd, lv, &info, 0, 0) && info.exists) {
-			log_error("Snapshot origin volumes can be resized "
+			log_error(0, "Snapshot origin volumes can be resized "
 				  "only while inactive: try lvchange -an");
 			return ECMD_FAILED;
 		}
@@ -627,7 +627,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 		lock_lv = lv;
 
 	if (!suspend_lv(cmd, lock_lv)) {
-		log_error("Failed to suspend %s", lp->lv_name);
+		log_error(0, "Failed to suspend %s", lp->lv_name);
 		vg_revert(vg);
 		backup(vg);
 		return ECMD_FAILED;
@@ -641,7 +641,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 	}
 
 	if (!resume_lv(cmd, lock_lv)) {
-		log_error("Problem reactivating %s", lp->lv_name);
+		log_error(0, "Problem reactivating %s", lp->lv_name);
 		backup(vg);
 		return ECMD_FAILED;
 	}
diff --git a/tools/lvscan.c b/tools/lvscan.c
index 21bf01c..e47c282 100644
--- a/tools/lvscan.c
+++ b/tools/lvscan.c
@@ -76,7 +76,7 @@ static int lvscan_single(struct cmd_context *cmd, struct logical_volume *lv,
 int lvscan(struct cmd_context *cmd, int argc, char **argv)
 {
 	if (argc) {
-		log_error("No additional command line arguments allowed");
+		log_error(0, "No additional command line arguments allowed");
 		return EINVALID_CMD_LINE;
 	}
 
diff --git a/tools/polldaemon.c b/tools/polldaemon.c
index 4dcbc22..2429548 100644
--- a/tools/polldaemon.c
+++ b/tools/polldaemon.c
@@ -36,7 +36,7 @@ static int _become_daemon(struct cmd_context *cmd)
 	sigaction(SIGCHLD, &act, NULL);
 
 	if ((pid = fork()) == -1) {
-		log_error("fork failed: %s", strerror(errno));
+		log_error(0, "fork failed: %s", strerror(errno));
 		return 1;
 	}
 
@@ -46,7 +46,7 @@ static int _become_daemon(struct cmd_context *cmd)
 
 	/* Child */
 	if (setsid() == -1)
-		log_error("Background process failed to setsid: %s",
+		log_error(0, "Background process failed to setsid: %s",
 			  strerror(errno));
 	init_verbose(VERBOSE_BASE_LEVEL);
 
@@ -78,7 +78,7 @@ static int _check_mirror_status(struct cmd_context *cmd,
 
 	if (parms->aborting) {
 		if (!(lvs_changed = lvs_using_lv(cmd, vg, lv_mirr))) {
-			log_error("Failed to generate list of copied LVs: "
+			log_error(0, "Failed to generate list of copied LVs: "
 				  "can't abort.");
 			return 0;
 		}
@@ -88,7 +88,7 @@ static int _check_mirror_status(struct cmd_context *cmd,
 
 	if (!lv_mirror_percent(cmd, lv_mirr, !parms->interval, &segment_percent,
 			       &event_nr)) {
-		log_error("ABORTING: Mirror percentage check failed.");
+		log_error(0, "ABORTING: Mirror percentage check failed.");
 		return 0;
 	}
 
@@ -107,7 +107,7 @@ static int _check_mirror_status(struct cmd_context *cmd,
 	}
 
 	if (!(lvs_changed = lvs_using_lv(cmd, vg, lv_mirr))) {
-		log_error("ABORTING: Failed to generate list of copied LVs");
+		log_error(0, "ABORTING: Failed to generate list of copied LVs");
 		return 0;
 	}
 
@@ -119,7 +119,7 @@ static int _check_mirror_status(struct cmd_context *cmd,
 	} else {
 		if (!parms->poll_fns->update_metadata(cmd, vg, lv_mirr,
 						      lvs_changed, 0)) {
-			log_error("ABORTING: Segment progression failed.");
+			log_error(0, "ABORTING: Segment progression failed.");
 			parms->poll_fns->finish_copy(cmd, vg, lv_mirr,
 						     lvs_changed);
 			return 0;
@@ -151,14 +151,14 @@ static int _wait_for_single_mirror(struct cmd_context *cmd, const char *name, co
 		vg = parms->poll_fns->get_copy_vg(cmd, name, uuid);
 		if (vg_read_error(vg)) {
 			vg_release(vg);
-			log_error("ABORTING: Can't reread VG for %s", name);
+			log_error(0, "ABORTING: Can't reread VG for %s", name);
 			/* What more could we do here? */
 			return 0;
 		}
 
 		if (!(lv_mirr = parms->poll_fns->get_copy_lv(cmd, vg, name, uuid,
 							     parms->lv_type))) {
-			log_error("ABORTING: Can't find mirror LV in %s for %s",
+			log_error(0, "ABORTING: Can't find mirror LV in %s for %s",
 				  vg->name, name);
 			unlock_and_release_vg(cmd, vg, vg->name);
 			return 0;
diff --git a/tools/pvchange.c b/tools/pvchange.c
index def78cc..ef37175 100644
--- a/tools/pvchange.c
+++ b/tools/pvchange.c
@@ -47,7 +47,7 @@ static int _pvchange_single(struct cmd_context *cmd, struct physical_volume *pv,
 		allocatable = !strcmp(arg_str_value(cmd, allocatable_ARG, "n"),
 				      "y");
 	else if (tagarg && !(tag = arg_str_value(cmd, tagarg, NULL))) {
-		log_error("Failed to get tag");
+		log_error(0, "Failed to get tag");
 		return 0;
 	}
 
@@ -64,17 +64,17 @@ static int _pvchange_single(struct cmd_context *cmd, struct physical_volume *pv,
 		}
 
 		if (!(pvl = find_pv_in_vg(vg, pv_name))) {
-			log_error("Unable to find \"%s\" in volume group \"%s\"",
+			log_error(0, "Unable to find \"%s\" in volume group \"%s\"",
 				  pv_name, vg->name);
 			goto out;
 		}
 		if (tagarg && !(vg->fid->fmt->features & FMT_TAGS)) {
-			log_error("Volume group containing %s does not "
+			log_error(0, "Volume group containing %s does not "
 				  "support tags", pv_name);
 			goto out;
 		}
 		if (arg_count(cmd, uuid_ARG) && lvs_in_vg_activated(vg)) {
-			log_error("Volume group containing %s has active "
+			log_error(0, "Volume group containing %s has active "
 				  "logical volumes", pv_name);
 			goto out;
 		}
@@ -83,7 +83,7 @@ static int _pvchange_single(struct cmd_context *cmd, struct physical_volume *pv,
 			goto out;
 	} else {
 		if (tagarg) {
-			log_error("Can't change tag on Physical Volume %s not "
+			log_error(0, "Can't change tag on Physical Volume %s not "
 				  "in volume group", pv_name);
 			return 0;
 		}
@@ -91,13 +91,13 @@ static int _pvchange_single(struct cmd_context *cmd, struct physical_volume *pv,
 		vg_name = VG_ORPHANS;
 
 		if (!lock_vol(cmd, vg_name, LCK_VG_WRITE)) {
-			log_error("Can't get lock for orphans");
+			log_error(0, "Can't get lock for orphans");
 			return 0;
 		}
 
 		if (!(pv = pv_read(cmd, pv_name, NULL, &sector, 1, 0))) {
 			unlock_vg(cmd, vg_name);
-			log_error("Unable to read PV \"%s\"", pv_name);
+			log_error(0, "Unable to read PV \"%s\"", pv_name);
 			return 0;
 		}
 	}
@@ -105,21 +105,21 @@ static int _pvchange_single(struct cmd_context *cmd, struct physical_volume *pv,
 	if (arg_count(cmd, allocatable_ARG)) {
 		if (is_orphan(pv) &&
 		    !(pv->fmt->features & FMT_ORPHAN_ALLOCATABLE)) {
-			log_error("Allocatability not supported by orphan "
+			log_error(0, "Allocatability not supported by orphan "
 				  "%s format PV %s", pv->fmt->name, pv_name);
 			goto out;
 		}
 
 		/* change allocatability for a PV */
 		if (allocatable && (pv_status(pv) & ALLOCATABLE_PV)) {
-			log_error("Physical volume \"%s\" is already "
+			log_error(0, "Physical volume \"%s\" is already "
 				  "allocatable", pv_name);
 			r = 1;
 			goto out;
 		}
 
 		if (!allocatable && !(pv_status(pv) & ALLOCATABLE_PV)) {
-			log_error("Physical volume \"%s\" is already "
+			log_error(0, "Physical volume \"%s\" is already "
 				  "unallocatable", pv_name);
 			r = 1;
 			goto out;
@@ -138,13 +138,13 @@ static int _pvchange_single(struct cmd_context *cmd, struct physical_volume *pv,
 		/* tag or deltag */
 		if ((tagarg == addtag_ARG)) {
 			if (!str_list_add(cmd->mem, &pv->tags, tag)) {
-				log_error("Failed to add tag %s to physical "
+				log_error(0, "Failed to add tag %s to physical "
 					  "volume %s", tag, pv_name);
 				goto out;
 			}
 		} else {
 			if (!str_list_del(&pv->tags, tag)) {
-				log_error("Failed to remove tag %s from "
+				log_error(0, "Failed to remove tag %s from "
 					  "physical volume" "%s", tag, pv_name);
 				goto out;
 			}
@@ -152,7 +152,7 @@ static int _pvchange_single(struct cmd_context *cmd, struct physical_volume *pv,
 	} else {
 		/* --uuid: Change PV ID randomly */
 		if (!id_create(&pv->id)) {
-			log_error("Failed to generate new random UUID for %s.",
+			log_error(0, "Failed to generate new random UUID for %s.",
 				  pv_name);
 			goto out;
 		}
@@ -171,7 +171,7 @@ static int _pvchange_single(struct cmd_context *cmd, struct physical_volume *pv,
 			pv->vg_name = pv->fmt->orphan_vg_name;
 			pv->pe_alloc_count = 0;
 			if (!(pv_write(cmd, pv, NULL, INT64_C(-1)))) {
-				log_error("pv_write with new uuid failed "
+				log_error(0, "pv_write with new uuid failed "
 					  "for %s.", pv_name);
 				goto out;
 			}
@@ -187,13 +187,13 @@ static int _pvchange_single(struct cmd_context *cmd, struct physical_volume *pv,
 	log_verbose("Updating physical volume \"%s\"", pv_name);
 	if (!is_orphan(pv)) {
 		if (!vg_write(vg) || !vg_commit(vg)) {
-			log_error("Failed to store physical volume \"%s\" in "
+			log_error(0, "Failed to store physical volume \"%s\" in "
 				  "volume group \"%s\"", pv_name, vg->name);
 			goto out;
 		}
 		backup(vg);
 	} else if (!(pv_write(cmd, pv, NULL, INT64_C(-1)))) {
-		log_error("Failed to store physical volume \"%s\"",
+		log_error(0, "Failed to store physical volume \"%s\"",
 			  pv_name);
 		goto out;
 	}
@@ -221,18 +221,18 @@ int pvchange(struct cmd_context *cmd, int argc, char **argv)
 
 	if (arg_count(cmd, allocatable_ARG) + arg_count(cmd, addtag_ARG) +
 	    arg_count(cmd, deltag_ARG) + arg_count(cmd, uuid_ARG) != 1) {
-		log_error("Please give exactly one option of -x, -uuid, "
+		log_error(0, "Please give exactly one option of -x, -uuid, "
 			  "--addtag or --deltag");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (!(arg_count(cmd, all_ARG)) && !argc) {
-		log_error("Please give a physical volume path");
+		log_error(0, "Please give a physical volume path");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (arg_count(cmd, all_ARG) && argc) {
-		log_error("Option a and PhysicalVolumePath are exclusive");
+		log_error(0, "Option a and PhysicalVolumePath are exclusive");
 		return EINVALID_CMD_LINE;
 	}
 
@@ -242,7 +242,7 @@ int pvchange(struct cmd_context *cmd, int argc, char **argv)
 			pv_name = argv[opt];
 			dm_list_init(&mdas);
 			if (!(pv = pv_read(cmd, pv_name, &mdas, NULL, 1, 0))) {
-				log_error("Failed to read physical volume %s",
+				log_error(0, "Failed to read physical volume %s",
 					  pv_name);
 				continue;
 			}
@@ -255,13 +255,13 @@ int pvchange(struct cmd_context *cmd, int argc, char **argv)
 			 */
 			if (is_orphan(pv) && !dm_list_size(&mdas)) {
 				if (!scan_vgs_for_pvs(cmd)) {
-					log_error("Rescan for PVs without "
+					log_error(0, "Rescan for PVs without "
 						  "metadata areas failed.");
 					continue;
 				}
 				if (!(pv = pv_read(cmd, pv_name,
 						   NULL, NULL, 1, 0))) {
-					log_error("Failed to read "
+					log_error(0, "Failed to read "
 						  "physical volume %s",
 						  pv_name);
 					continue;
diff --git a/tools/pvcreate.c b/tools/pvcreate.c
index 0f71df5..ede77a2 100644
--- a/tools/pvcreate.c
+++ b/tools/pvcreate.c
@@ -68,7 +68,7 @@ static int pvcreate_check(struct cmd_context *cmd, const char *name,
 	/* Allow partial & exported VGs to be destroyed. */
 	/* We must have -ff to overwrite a non orphan */
 	if (pv && !is_orphan(pv) && pp->force != DONT_PROMPT_OVERRIDE) {
-		log_error("Can't initialize physical volume \"%s\" of "
+		log_error(0, "Can't initialize physical volume \"%s\" of "
 			  "volume group \"%s\" without -ff", name, pv_vg_name(pv));
 		return 0;
 	}
@@ -94,7 +94,7 @@ static int pvcreate_check(struct cmd_context *cmd, const char *name,
 
 		init_md_filtering(0);
 		if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE)) {
-			log_error("Can't get lock for orphan PVs");
+			log_error(0, "Can't get lock for orphan PVs");
 			init_md_filtering(1);
 			return 0;
 		}
@@ -103,7 +103,7 @@ static int pvcreate_check(struct cmd_context *cmd, const char *name,
 	}
 
 	if (!dev) {
-		log_error("Device %s not found (or ignored by filtering).", name);
+		log_error(0, "Device %s not found (or ignored by filtering).", name);
 		return 0;
 	}
 
@@ -112,7 +112,7 @@ static int pvcreate_check(struct cmd_context *cmd, const char *name,
 	 */
 	if (!dev_test_excl(dev)) {
 		/* FIXME Detect whether device-mapper itself is still using it */
-		log_error("Can't open %s exclusively.  Mounted filesystem?",
+		log_error(0, "Can't open %s exclusively.  Mounted filesystem?",
 			  name);
 		return 0;
 	}
@@ -124,14 +124,14 @@ static int pvcreate_check(struct cmd_context *cmd, const char *name,
 			    "detected on %s. Wipe it? [y/n] ", name) == 'y'))) {
 		log_print("Wiping software RAID md superblock on %s", name);
 		if (!dev_set(dev, md_superblock, 4, 0)) {
-			log_error("Failed to wipe RAID md superblock on %s",
+			log_error(0, "Failed to wipe RAID md superblock on %s",
 				  name);
 			return 0;
 		}
 	}
 
 	if (wipe_md == -1) {
-		log_error("Fatal error while trying to detect software "
+		log_error(0, "Fatal error while trying to detect software "
 			  "RAID md superblock on %s", name);
 		return 0;
 	}
@@ -142,13 +142,13 @@ static int pvcreate_check(struct cmd_context *cmd, const char *name,
 			    name) == 'y'))) {
 		log_print("Wiping swap signature on %s", name);
 		if (!dev_set(dev, swap_signature, 10, 0)) {
-			log_error("Failed to wipe swap signature on %s", name);
+			log_error(0, "Failed to wipe swap signature on %s", name);
 			return 0;
 		}
 	}
 
 	if (wipe_swap == -1) {
-		log_error("Fatal error while trying to detect swap "
+		log_error(0, "Fatal error while trying to detect swap "
 			  "signature on %s", name);
 		return 0;
 	}
@@ -178,14 +178,14 @@ static int pvcreate_single(struct cmd_context *cmd, const char *pv_name,
 	if (pp->idp) {
 		if ((dev = device_from_pvid(cmd, pp->idp)) &&
 		    (dev != dev_cache_get(pv_name, cmd->filter))) {
-			log_error("uuid %s already in use on \"%s\"",
+			log_error(0, "uuid %s already in use on \"%s\"",
 				  pp->idp->uuid, dev_name(dev));
 			return 0;
 		}
 	}
 
 	if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE)) {
-		log_error("Can't get lock for orphan PVs");
+		log_error(0, "Can't get lock for orphan PVs");
 		return 0;
 	}
 
@@ -196,7 +196,7 @@ static int pvcreate_single(struct cmd_context *cmd, const char *pv_name,
 		goto error;
 
 	if (!(dev = dev_cache_get(pv_name, cmd->filter))) {
-		log_error("%s: Couldn't find device.  Check your filters?",
+		log_error(0, "%s: Couldn't find device.  Check your filters?",
 			  pv_name);
 		goto error;
 	}
@@ -207,7 +207,7 @@ static int pvcreate_single(struct cmd_context *cmd, const char *pv_name,
 			     pp->extent_count, pp->extent_size,
 			     pp->pvmetadatacopies,
 			     pp->pvmetadatasize,&mdas))) {
-		log_error("Failed to setup physical volume \"%s\"", pv_name);
+		log_error(0, "Failed to setup physical volume \"%s\"", pv_name);
 		goto error;
 	}
 
@@ -216,19 +216,19 @@ static int pvcreate_single(struct cmd_context *cmd, const char *pv_name,
 
 	/* Wipe existing label first */
 	if (!label_remove(pv_dev(pv))) {
-		log_error("Failed to wipe existing label on %s", pv_name);
+		log_error(0, "Failed to wipe existing label on %s", pv_name);
 		goto error;
 	}
 
 	if (pp->zero) {
 		log_verbose("Zeroing start of device %s", pv_name);
 		if (!dev_open_quiet(dev)) {
-			log_error("%s not opened: device not zeroed", pv_name);
+			log_error(0, "%s not opened: device not zeroed", pv_name);
 			goto error;
 		}
 
 		if (!dev_set(dev, UINT64_C(0), (size_t) 2048, 0)) {
-			log_error("%s not wiped: aborting", pv_name);
+			log_error(0, "%s not wiped: aborting", pv_name);
 			dev_close(dev);
 			goto error;
 		}
@@ -239,7 +239,7 @@ static int pvcreate_single(struct cmd_context *cmd, const char *pv_name,
 			 pv_name);
 	if (!(pv_write(cmd, (struct physical_volume *)pv, &mdas,
 		       pp->labelsector))) {
-		log_error("Failed to write physical volume \"%s\"", pv_name);
+		log_error(0, "Failed to write physical volume \"%s\"", pv_name);
 		goto error;
 	}
 
@@ -273,17 +273,17 @@ static int pvcreate_validate_params(struct cmd_context *cmd,
 	memset(pp, 0, sizeof(*pp));
 
 	if (!argc) {
-		log_error("Please enter a physical volume path");
+		log_error(0, "Please enter a physical volume path");
 		return 0;
 	}
 
 	if (arg_count(cmd, restorefile_ARG) && !arg_count(cmd, uuidstr_ARG)) {
-		log_error("--uuid is required with --restorefile");
+		log_error(0, "--uuid is required with --restorefile");
 		return 0;
 	}
 
 	if (arg_count(cmd, uuidstr_ARG) && argc != 1) {
-		log_error("Can only set uuid on one volume at once");
+		log_error(0, "Can only set uuid on one volume at once");
 		return 0;
 	}
 
@@ -298,12 +298,12 @@ static int pvcreate_validate_params(struct cmd_context *cmd,
 		pp->restorefile = arg_str_value(cmd, restorefile_ARG, "");
 		/* The uuid won't already exist */
 		if (!(vg = backup_read_vg(cmd, NULL, pp->restorefile))) {
-			log_error("Unable to read volume group from %s",
+			log_error(0, "Unable to read volume group from %s",
 				  pp->restorefile);
 			return 0;
 		}
 		if (!(existing_pv = find_pv_in_vg_by_uuid(vg, pp->idp))) {
-			log_error("Can't find uuid %s in backup file %s",
+			log_error(0, "Can't find uuid %s in backup file %s",
 				  uuid, pp->restorefile);
 			return 0;
 		}
@@ -314,7 +314,7 @@ static int pvcreate_validate_params(struct cmd_context *cmd,
 	}
 
 	if (arg_count(cmd, yes_ARG) && !arg_count(cmd, force_ARG)) {
-		log_error("Option y can only be given with option f");
+		log_error(0, "Option y can only be given with option f");
 		return 0;
 	}
 
@@ -322,7 +322,7 @@ static int pvcreate_validate_params(struct cmd_context *cmd,
 	pp->force = arg_count(cmd, force_ARG);
 
 	if (arg_int_value(cmd, labelsector_ARG, 0) >= LABEL_SCAN_SECTORS) {
-		log_error("labelsector must be less than %lu",
+		log_error(0, "labelsector must be less than %lu",
 			  LABEL_SCAN_SECTORS);
 		return 0;
 	} else {
@@ -334,14 +334,14 @@ static int pvcreate_validate_params(struct cmd_context *cmd,
 	    (arg_count(cmd, metadatacopies_ARG) ||
 	     arg_count(cmd, metadatasize_ARG)   ||
 	     arg_count(cmd, dataalignment_ARG))) {
-		log_error("Metadata and data alignment parameters only "
+		log_error(0, "Metadata and data alignment parameters only "
 			  "apply to text format.");
 		return 0;
 	}
 
 	if (arg_count(cmd, metadatacopies_ARG) &&
 	    arg_int_value(cmd, metadatacopies_ARG, -1) > 2) {
-		log_error("Metadatacopies may only be 0, 1 or 2");
+		log_error(0, "Metadatacopies may only be 0, 1 or 2");
 		return 0;
 	}
 
@@ -353,19 +353,19 @@ static int pvcreate_validate_params(struct cmd_context *cmd,
 		pp->zero = 1;
 
 	if (arg_sign_value(cmd, physicalvolumesize_ARG, 0) == SIGN_MINUS) {
-		log_error("Physical volume size may not be negative");
+		log_error(0, "Physical volume size may not be negative");
 		return 0;
 	}
 	pp->size = arg_uint64_value(cmd, physicalvolumesize_ARG, UINT64_C(0));
 
 	if (arg_sign_value(cmd, dataalignment_ARG, 0) == SIGN_MINUS) {
-		log_error("Physical volume data alignment may not be negative");
+		log_error(0, "Physical volume data alignment may not be negative");
 		return 0;
 	}
 	pp->data_alignment = arg_uint64_value(cmd, dataalignment_ARG, UINT64_C(0));
 
 	if (pp->data_alignment > ULONG_MAX) {
-		log_error("Physical volume data alignment is too big.");
+		log_error(0, "Physical volume data alignment is too big.");
 		return 0;
 	}
 
@@ -378,7 +378,7 @@ static int pvcreate_validate_params(struct cmd_context *cmd,
 	}
 
 	if (arg_sign_value(cmd, metadatasize_ARG, 0) == SIGN_MINUS) {
-		log_error("Metadata size may not be negative");
+		log_error(0, "Metadata size may not be negative");
 		return 0;
 	}
 
diff --git a/tools/pvdisplay.c b/tools/pvdisplay.c
index c8c4a88..2c24a2d 100644
--- a/tools/pvdisplay.c
+++ b/tools/pvdisplay.c
@@ -31,7 +31,7 @@ static int _pvdisplay_single(struct cmd_context *cmd,
 		vg_name = pv_vg_name(pv);
 		vg = vg_read(cmd, vg_name, (char *)&pv->vgid, 0);
 		if (vg_read_error(vg)) {
-		 	log_error("Skipping volume group %s", vg_name);
+		 	log_error(0, "Skipping volume group %s", vg_name);
 			/* FIXME If CLUSTERED should return ECMD_PROCESSED here */
 		 	return ECMD_FAILED;
 	 	}
@@ -41,7 +41,7 @@ static int _pvdisplay_single(struct cmd_context *cmd,
 		 * allocated in vg_read_internal() path.
 		 */
 		 if (!(pvl = find_pv_in_vg(vg, pv_name))) {
-			 log_error("Unable to find \"%s\" in volume group \"%s\"",
+			 log_error(0, "Unable to find \"%s\" in volume group \"%s\"",
 				   pv_name, vg->name);
 			 ret = ECMD_FAILED;
 			 goto out;
@@ -94,7 +94,7 @@ int pvdisplay(struct cmd_context *cmd, int argc, char **argv)
 	if (arg_count(cmd, columns_ARG)) {
 		if (arg_count(cmd, colon_ARG) || arg_count(cmd, maps_ARG) ||
 		    arg_count(cmd, short_ARG)) {
-			log_error("Incompatible options selected");
+			log_error(0, "Incompatible options selected");
 			return EINVALID_CMD_LINE;
 		}
 		return pvs(cmd, argc, argv);
@@ -104,12 +104,12 @@ int pvdisplay(struct cmd_context *cmd, int argc, char **argv)
 		   arg_count(cmd, options_ARG) ||
 		   arg_count(cmd, separator_ARG) ||
 		   arg_count(cmd, sort_ARG) || arg_count(cmd, unbuffered_ARG)) {
-		log_error("Incompatible options selected");
+		log_error(0, "Incompatible options selected");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (arg_count(cmd, colon_ARG) && arg_count(cmd, maps_ARG)) {
-		log_error("Option -v not allowed with option -c");
+		log_error(0, "Option -v not allowed with option -c");
 		return EINVALID_CMD_LINE;
 	}
 
diff --git a/tools/pvmove.c b/tools/pvmove.c
index 2490863..f2ee8e1 100644
--- a/tools/pvmove.c
+++ b/tools/pvmove.c
@@ -70,18 +70,18 @@ static const char *_extract_lvname(struct cmd_context *cmd, const char *vgname,
 	while (*lvname == '/')
 		lvname++;
 	if (!strchr(lvname, '/')) {
-		log_error("--name takes a logical volume name");
+		log_error(0, "--name takes a logical volume name");
 		return NULL;
 	}
 	if (strncmp(vgname, lvname, strlen(vgname)) ||
 	    (lvname += strlen(vgname), *lvname != '/')) {
-		log_error("Named LV and old PV must be in the same VG");
+		log_error(0, "Named LV and old PV must be in the same VG");
 		return NULL;
 	}
 	while (*lvname == '/')
 		lvname++;
 	if (!*lvname) {
-		log_error("Incomplete LV name supplied with --name");
+		log_error(0, "Incomplete LV name supplied with --name");
 		return NULL;
 	}
 	return lvname;
@@ -126,7 +126,7 @@ static struct dm_list *_get_allocatable_pvs(struct cmd_context *cmd, int argc,
 	}
 
 	if (dm_list_empty(allocatable_pvs)) {
-		log_error("No extents available for allocation");
+		log_error(0, "No extents available for allocation");
 		return NULL;
 	}
 
@@ -185,14 +185,14 @@ static struct logical_volume *_set_up_pvmove_lv(struct cmd_context *cmd,
 	if (!(lv_mirr = lv_create_empty("pvmove%d", NULL,
 					LVM_READ | LVM_WRITE,
 					ALLOC_CONTIGUOUS, vg))) {
-		log_error("Creation of temporary pvmove LV failed");
+		log_error(0, "Creation of temporary pvmove LV failed");
 		return NULL;
 	}
 
 	lv_mirr->status |= (PVMOVE | LOCKED);
 
 	if (!(*lvs_changed = dm_pool_alloc(cmd->mem, sizeof(**lvs_changed)))) {
-		log_error("lvs_changed list struct allocation failed");
+		log_error(0, "lvs_changed list struct allocation failed");
 		return NULL;
 	}
 
@@ -234,24 +234,24 @@ static struct logical_volume *_set_up_pvmove_lv(struct cmd_context *cmd,
 	}
 
 	if (lv_name && !lv_found) {
-		log_error("Logical volume %s not found.", lv_name);
+		log_error(0, "Logical volume %s not found.", lv_name);
 		return NULL;
 	}
 
 	/* Is temporary mirror empty? */
 	if (!lv_mirr->le_count) {
-		log_error("No data to move for %s", vg->name);
+		log_error(0, "No data to move for %s", vg->name);
 		return NULL;
 	}
 
 	if (!lv_add_mirrors(cmd, lv_mirr, 1, 1, 0, log_count,
 			    allocatable_pvs, alloc, MIRROR_BY_SEG)) {
-		log_error("Failed to convert pvmove LV to mirrored");
+		log_error(0, "Failed to convert pvmove LV to mirrored");
 		return_NULL;
 	}
 
 	if (!split_parent_segments_for_layer(cmd, lv_mirr)) {
-		log_error("Failed to split segments being moved");
+		log_error(0, "Failed to split segments being moved");
 		return_NULL;
 	}
 
@@ -281,7 +281,7 @@ static int _update_metadata(struct cmd_context *cmd, struct volume_group *vg,
 
 	log_verbose("Updating volume group metadata");
 	if (!vg_write(vg)) {
-		log_error("ABORTING: Volume group metadata update failed.");
+		log_error(0, "ABORTING: Volume group metadata update failed.");
 		return 0;
 	}
 
@@ -300,7 +300,7 @@ static int _update_metadata(struct cmd_context *cmd, struct volume_group *vg,
 
 	/* Commit on-disk metadata */
 	if (!vg_commit(vg)) {
-		log_error("ABORTING: Volume group metadata update failed.");
+		log_error(0, "ABORTING: Volume group metadata update failed.");
 		if (!first_time)
 			resume_lv(cmd, lv_mirr);
 		resume_lvs(cmd, lvs_changed);
@@ -318,14 +318,14 @@ static int _update_metadata(struct cmd_context *cmd, struct volume_group *vg,
 			/*
 			 * Nothing changed yet, try to revert pvmove.
 			 */
-			log_error("Temporary pvmove mirror activation failed.");
+			log_error(0, "Temporary pvmove mirror activation failed.");
 			if (!_finish_pvmove(cmd, vg, lv_mirr, lvs_changed))
-				log_error("ABORTING: Restoring original configuration "
+				log_error(0, "ABORTING: Restoring original configuration "
 					  "before pvmove failed. Run pvmove --abort.");
 			goto out;
 		}
 	} else if (!resume_lv(cmd, lv_mirr)) {
-		log_error("Unable to reactivate logical volume \"%s\"",
+		log_error(0, "Unable to reactivate logical volume \"%s\"",
 			  lv_mirr->name);
 		resume_lvs(cmd, lvs_changed);
 		goto out;
@@ -333,7 +333,7 @@ static int _update_metadata(struct cmd_context *cmd, struct volume_group *vg,
 
 	/* Unsuspend LVs */
 	if (!resume_lvs(cmd, lvs_changed)) {
-		log_error("Unable to resume logical volumes");
+		log_error(0, "Unable to resume logical volumes");
 		goto out;
 	}
 
@@ -377,7 +377,7 @@ static int _set_up_pvmove(struct cmd_context *cmd, const char *pv_name,
 		}
 
 		if (!validate_name(lv_name)) {
-			log_error("Logical volume name %s is invalid", lv_name);
+			log_error(0, "Logical volume name %s is invalid", lv_name);
 			return EINVALID_CMD_LINE;
 		}
 	}
@@ -397,16 +397,16 @@ static int _set_up_pvmove(struct cmd_context *cmd, const char *pv_name,
 	if ((lv_mirr = find_pvmove_lv(vg, pv_dev(pv), PVMOVE))) {
 		log_print("Detected pvmove in progress for %s", pv_name);
 		if (argc || lv_name)
-			log_error("Ignoring remaining command line arguments");
+			log_error(0, "Ignoring remaining command line arguments");
 
 		if (!(lvs_changed = lvs_using_lv(cmd, vg, lv_mirr))) {
-			log_error("ABORTING: Failed to generate list of moving LVs");
+			log_error(0, "ABORTING: Failed to generate list of moving LVs");
 			goto out;
 		}
 
 		/* Ensure mirror LV is active */
 		if (!_activate_lv(cmd, lv_mirr, exclusive)) {
-			log_error("ABORTING: Temporary mirror activation failed.");
+			log_error(0, "ABORTING: Temporary mirror activation failed.");
 			goto out;
 		}
 
@@ -469,7 +469,7 @@ static int _finish_pvmove(struct cmd_context *cmd, struct volume_group *vg,
 	if (!lv_remove_mirrors(cmd, lv_mirr, 1, 0, NULL, PVMOVE) ||
 	    !remove_layers_for_segments_all(cmd, lv_mirr, PVMOVE,
 					    &lvs_completed)) {
-		log_error("ABORTING: Removal of temporary mirror failed");
+		log_error(0, "ABORTING: Removal of temporary mirror failed");
 		return 0;
 	}
 
@@ -479,26 +479,26 @@ static int _finish_pvmove(struct cmd_context *cmd, struct volume_group *vg,
 
 	/* Store metadata without dependencies on mirror segments */
 	if (!vg_write(vg)) {
-		log_error("ABORTING: Failed to write new data locations "
+		log_error(0, "ABORTING: Failed to write new data locations "
 			  "to disk.");
 		return 0;
 	}
 
 	/* Suspend LVs changed */
 	if (!suspend_lvs(cmd, lvs_changed)) {
-		log_error("Locking LVs to remove temporary mirror failed");
+		log_error(0, "Locking LVs to remove temporary mirror failed");
 		r = 0;
 	}
 
 	/* Suspend mirror LV to flush pending I/O */
 	if (!suspend_lv(cmd, lv_mirr)) {
-		log_error("Suspension of temporary mirror LV failed");
+		log_error(0, "Suspension of temporary mirror LV failed");
 		r = 0;
 	}
 
 	/* Store metadata without dependencies on mirror segments */
 	if (!vg_commit(vg)) {
-		log_error("ABORTING: Failed to write new data locations "
+		log_error(0, "ABORTING: Failed to write new data locations "
 			  "to disk.");
 		vg_revert(vg);
 		resume_lv(cmd, lv_mirr);
@@ -508,7 +508,7 @@ static int _finish_pvmove(struct cmd_context *cmd, struct volume_group *vg,
 
 	/* Release mirror LV.  (No pending I/O because it's been suspended.) */
 	if (!resume_lv(cmd, lv_mirr)) {
-		log_error("Unable to reactivate logical volume \"%s\"",
+		log_error(0, "Unable to reactivate logical volume \"%s\"",
 			  lv_mirr->name);
 		r = 0;
 	}
@@ -518,21 +518,21 @@ static int _finish_pvmove(struct cmd_context *cmd, struct volume_group *vg,
 
 	/* Deactivate mirror LV */
 	if (!deactivate_lv(cmd, lv_mirr)) {
-		log_error("ABORTING: Unable to deactivate temporary logical "
+		log_error(0, "ABORTING: Unable to deactivate temporary logical "
 			  "volume \"%s\"", lv_mirr->name);
 		r = 0;
 	}
 
 	log_verbose("Removing temporary pvmove LV");
 	if (!lv_remove(lv_mirr)) {
-		log_error("ABORTING: Removal of temporary pvmove LV failed");
+		log_error(0, "ABORTING: Removal of temporary pvmove LV failed");
 		return 0;
 	}
 
 	/* Store it on disks */
 	log_verbose("Writing out final volume group after pvmove");
 	if (!vg_write(vg) || !vg_commit(vg)) {
-		log_error("ABORTING: Failed to write new data locations "
+		log_error(0, "ABORTING: Failed to write new data locations "
 			  "to disk.");
 		return 0;
 	}
@@ -550,7 +550,7 @@ static struct volume_group *_get_move_vg(struct cmd_context *cmd,
 
 	/* Reread all metadata in case it got changed */
 	if (!(pv = find_pv_by_name(cmd, name))) {
-		log_error("ABORTING: Can't reread PV %s", name);
+		log_error(0, "ABORTING: Can't reread PV %s", name);
 		/* What more could we do here? */
 		return NULL;
 	}
@@ -581,7 +581,7 @@ int pvmove(struct cmd_context *cmd, int argc, char **argv)
 
 	/* dm raid1 target must be present in every case */
 	if (!_pvmove_target_present(cmd, 0)) {
-		log_error("Required device-mapper target(s) not "
+		log_error(0, "Required device-mapper target(s) not "
 			  "detected in your kernel");
 		return ECMD_FAILED;
 	}
@@ -594,7 +594,7 @@ int pvmove(struct cmd_context *cmd, int argc, char **argv)
 			if (!(pv_name = dm_pool_strndup(cmd->mem, pv_name,
 						     (unsigned) (colon -
 								 pv_name)))) {
-				log_error("Failed to clone PV name");
+				log_error(0, "Failed to clone PV name");
 				return ECMD_FAILED;
 			}
 		}
diff --git a/tools/pvremove.c b/tools/pvremove.c
index 3d75480..172901d 100644
--- a/tools/pvremove.c
+++ b/tools/pvremove.c
@@ -36,7 +36,7 @@ static int pvremove_check(struct cmd_context *cmd, const char *name)
 	if (!(pv = pv_read(cmd, name, &mdas, NULL, 1, 0))) {
 		if (arg_count(cmd, force_ARG))
 			return 1;
-		log_error("Physical Volume %s not found", name);
+		log_error(0, "Physical Volume %s not found", name);
 		return 0;
 	}
 
@@ -49,12 +49,12 @@ static int pvremove_check(struct cmd_context *cmd, const char *name)
 	 */
 	if (is_orphan(pv) && !dm_list_size(&mdas)) {
 		if (!scan_vgs_for_pvs(cmd)) {
-			log_error("Rescan for PVs without metadata areas "
+			log_error(0, "Rescan for PVs without metadata areas "
 				  "failed.");
 			return 0;
 		}
 		if (!(pv = pv_read(cmd, name, NULL, NULL, 1, 0))) {
-			log_error("Failed to read physical volume %s", name);
+			log_error(0, "Failed to read physical volume %s", name);
 			return 0;
 		}
 	}
@@ -66,7 +66,7 @@ static int pvremove_check(struct cmd_context *cmd, const char *name)
 	/* Allow partial & exported VGs to be destroyed. */
 	/* we must have -ff to overwrite a non orphan */
 	if (arg_count(cmd, force_ARG) < 2) {
-		log_error("Can't pvremove physical volume \"%s\" of "
+		log_error(0, "Can't pvremove physical volume \"%s\" of "
 			  "volume group \"%s\" without -ff", name, pv_vg_name(pv));
 		return 0;
 	}
@@ -96,7 +96,7 @@ static int pvremove_single(struct cmd_context *cmd, const char *pv_name,
 	int ret = ECMD_FAILED;
 
 	if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE)) {
-		log_error("Can't get lock for orphan PVs");
+		log_error(0, "Can't get lock for orphan PVs");
 		return ECMD_FAILED;
 	}
 
@@ -104,21 +104,21 @@ static int pvremove_single(struct cmd_context *cmd, const char *pv_name,
 		goto error;
 
 	if (!(dev = dev_cache_get(pv_name, cmd->filter))) {
-		log_error("%s: Couldn't find device.  Check your filters?",
+		log_error(0, "%s: Couldn't find device.  Check your filters?",
 			  pv_name);
 		goto error;
 	}
 
 	if (!dev_test_excl(dev)) {
 		/* FIXME Detect whether device-mapper is still using the device */
-		log_error("Can't open %s exclusively - not removing. "
+		log_error(0, "Can't open %s exclusively - not removing. "
 			  "Mounted filesystem?", dev_name(dev));
 		goto error;
 	}
 
 	/* Wipe existing label(s) */
 	if (!label_remove(dev)) {
-		log_error("Failed to wipe existing label(s) on %s", pv_name);
+		log_error(0, "Failed to wipe existing label(s) on %s", pv_name);
 		goto error;
 	}
 
@@ -139,12 +139,12 @@ int pvremove(struct cmd_context *cmd, int argc, char **argv)
 	int ret = ECMD_PROCESSED;
 
 	if (!argc) {
-		log_error("Please enter a physical volume path");
+		log_error(0, "Please enter a physical volume path");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (arg_count(cmd, yes_ARG) && !arg_count(cmd, force_ARG)) {
-		log_error("Option y can only be given with option f");
+		log_error(0, "Option y can only be given with option f");
 		return EINVALID_CMD_LINE;
 	}
 
diff --git a/tools/pvresize.c b/tools/pvresize.c
index 964d6a5..60788e1 100644
--- a/tools/pvresize.c
+++ b/tools/pvresize.c
@@ -44,13 +44,13 @@ static int _pv_resize_single(struct cmd_context *cmd,
 	if (is_orphan_vg(pv_vg_name(pv))) {
 		vg_name = VG_ORPHANS;
 		if (!lock_vol(cmd, vg_name, LCK_VG_WRITE)) {
-			log_error("Can't get lock for orphans");
+			log_error(0, "Can't get lock for orphans");
 			return 0;
 		}
 
 		if (!(pv = pv_read(cmd, pv_name, &mdas, NULL, 1, 0))) {
 			unlock_vg(cmd, vg_name);
-			log_error("Unable to read PV \"%s\"", pv_name);
+			log_error(0, "Unable to read PV \"%s\"", pv_name);
 			return 0;
 		}
 
@@ -64,7 +64,7 @@ static int _pv_resize_single(struct cmd_context *cmd,
 			goto bad;
 
 		if (!(pvl = find_pv_in_vg(vg, pv_name))) {
-			log_error("Unable to find \"%s\" in volume group \"%s\"",
+			log_error(0, "Unable to find \"%s\" in volume group \"%s\"",
 				  pv_name, vg->name);
 			goto bad;
 		}
@@ -72,7 +72,7 @@ static int _pv_resize_single(struct cmd_context *cmd,
 		pv = pvl->pv;
 
 		if (!(info = info_from_pvid(pv->dev->pvid, 0))) {
-			log_error("Can't get info for PV %s in volume group %s",
+			log_error(0, "Can't get info for PV %s in volume group %s",
 				  pv_name, vg->name);
 			goto bad;
 		}
@@ -85,19 +85,19 @@ static int _pv_resize_single(struct cmd_context *cmd,
 
 	/* FIXME Create function to test compatibility properly */
 	if (mda_count > 1) {
-		log_error("%s: too many metadata areas for pvresize", pv_name);
+		log_error(0, "%s: too many metadata areas for pvresize", pv_name);
 		goto bad;
 	}
 
 	if (!(pv->fmt->features & FMT_RESIZE_PV)) {
-		log_error("Physical volume %s format does not support resizing.",
+		log_error(0, "Physical volume %s format does not support resizing.",
 			  pv_name);
 		goto bad;
 	}
 
 	/* Get new size */
 	if (!dev_get_size(pv_dev(pv), &size)) {
-		log_error("%s: Couldn't get size.", pv_name);
+		log_error(0, "%s: Couldn't get size.", pv_name);
 		goto bad;
 	}
 
@@ -111,13 +111,13 @@ static int _pv_resize_single(struct cmd_context *cmd,
 	}
 
 	if (size < PV_MIN_SIZE) {
-		log_error("%s: Size must exceed minimum of %ld sectors.",
+		log_error(0, "%s: Size must exceed minimum of %ld sectors.",
 			  pv_name, PV_MIN_SIZE);
 		goto bad;
 	}
 
 	if (size < pv_pe_start(pv)) {
-		log_error("%s: Size must exceed physical extent start of "
+		log_error(0, "%s: Size must exceed physical extent start of "
 			  "%" PRIu64 " sectors.", pv_name, pv_pe_start(pv));
 		goto bad;
 	}
@@ -129,7 +129,7 @@ static int _pv_resize_single(struct cmd_context *cmd,
 		new_pe_count = pv_size(pv) / vg->extent_size;
 
  		if (!new_pe_count) {
-			log_error("%s: Size must leave space for at "
+			log_error(0, "%s: Size must leave space for at "
 				  "least one physical extent of "
 				  "%" PRIu32 " sectors.", pv_name,
 				  pv_pe_size(pv));
@@ -146,13 +146,13 @@ static int _pv_resize_single(struct cmd_context *cmd,
 	log_verbose("Updating physical volume \"%s\"", pv_name);
 	if (!is_orphan_vg(pv_vg_name(pv))) {
 		if (!vg_write(vg) || !vg_commit(vg)) {
-			log_error("Failed to store physical volume \"%s\" in "
+			log_error(0, "Failed to store physical volume \"%s\" in "
 				  "volume group \"%s\"", pv_name, vg->name);
 			goto bad;
 		}
 		backup(vg);
 	} else if (!(pv_write(cmd, pv, NULL, INT64_C(-1)))) {
-		log_error("Failed to store physical volume \"%s\"",
+		log_error(0, "Failed to store physical volume \"%s\"",
 			  pv_name);
 		goto bad;;
 	}
@@ -190,12 +190,12 @@ int pvresize(struct cmd_context *cmd, int argc, char **argv)
 	int ret;
 
 	if (!argc) {
-		log_error("Please supply physical volume(s)");
+		log_error(0, "Please supply physical volume(s)");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (arg_sign_value(cmd, physicalvolumesize_ARG, 0) == SIGN_MINUS) {
-		log_error("Physical volume size may not be negative");
+		log_error(0, "Physical volume size may not be negative");
 		return 0;
 	}
 
diff --git a/tools/pvscan.c b/tools/pvscan.c
index 494af3d..fb7ee32 100644
--- a/tools/pvscan.c
+++ b/tools/pvscan.c
@@ -115,7 +115,7 @@ int pvscan(struct cmd_context *cmd, int argc __attribute((unused)),
 	vg_max_name_len = 0;
 
 	if (arg_count(cmd, novolumegroup_ARG) && arg_count(cmd, exported_ARG)) {
-		log_error("Options -e and -n are incompatible");
+		log_error(0, "Options -e and -n are incompatible");
 		return EINVALID_CMD_LINE;
 	}
 
@@ -125,7 +125,7 @@ int pvscan(struct cmd_context *cmd, int argc __attribute((unused)),
 			  "of exported volume group(s)" : "in no volume group");
 
 	if (!lock_vol(cmd, VG_GLOBAL, LCK_VG_WRITE)) {
-		log_error("Unable to obtain global lock.");
+		log_error(0, "Unable to obtain global lock.");
 		return ECMD_FAILED;
 	}
 
diff --git a/tools/reporter.c b/tools/reporter.c
index d1368d4..bcc8b14 100644
--- a/tools/reporter.c
+++ b/tools/reporter.c
@@ -137,7 +137,7 @@ static int _pvs_single(struct cmd_context *cmd, struct volume_group *vg,
 
 		vg = vg_read(cmd, vg_name, (char *)&pv->vgid, 0);
 		if (vg_read_error(vg)) {
-			log_error("Skipping volume group %s", vg_name);
+			log_error(0, "Skipping volume group %s", vg_name);
 			return ECMD_FAILED;
 		}
 
@@ -146,7 +146,7 @@ static int _pvs_single(struct cmd_context *cmd, struct volume_group *vg,
 		 * allocated in vg_read_internal() path.
 		*/
 		if (!(pvl = find_pv_in_vg(vg, pv_dev_name(pv)))) {
-			log_error("Unable to find \"%s\" in volume group \"%s\"",
+			log_error(0, "Unable to find \"%s\" in volume group \"%s\"",
 				  pv_dev_name(pv), vg->name);
 			ret = ECMD_FAILED;
 			goto out;
@@ -296,13 +296,13 @@ static int _report(struct cmd_context *cmd, int argc, char **argv,
 	if (arg_count(cmd, options_ARG)) {
 		opts = arg_str_value(cmd, options_ARG, "");
 		if (!opts || !*opts) {
-			log_error("Invalid options string: %s", opts);
+			log_error(0, "Invalid options string: %s", opts);
 			return EINVALID_CMD_LINE;
 		}
 		if (*opts == '+') {
 			if (!(str = dm_pool_alloc(cmd->mem,
 					 strlen(options) + strlen(opts) + 1))) {
-				log_error("options string allocation failed");
+				log_error(0, "options string allocation failed");
 				return ECMD_FAILED;
 			}
 			strcpy(str, options);
@@ -350,7 +350,7 @@ static int _report(struct cmd_context *cmd, int argc, char **argv,
 	if (report_type & PVSEGS)
 		report_type |= PVS;
 	if ((report_type & LVS) && (report_type & (PVS | LABEL)) && !args_are_pvs) {
-		log_error("Can't report LV and PV fields at the same time");
+		log_error(0, "Can't report LV and PV fields at the same time");
 		dm_report_free(report_handle);
 		return ECMD_FAILED;
 	}
diff --git a/tools/stub.h b/tools/stub.h
index 1523797..2d19403 100644
--- a/tools/stub.h
+++ b/tools/stub.h
@@ -14,7 +14,7 @@
  */
 
 #define unimplemented \
-	log_error("Command not implemented yet."); return ECMD_FAILED
+	log_error(0, "Command not implemented yet."); return ECMD_FAILED
 
 /*int e2fsadm(struct cmd_context *cmd, int argc, char **argv) unimplemented*/
 int lvmsadc(struct cmd_context *cmd __attribute((unused)),
@@ -35,9 +35,9 @@ int pvdata(struct cmd_context *cmd __attribute((unused)),
 	   int argc __attribute((unused)),
 	   char **argv __attribute((unused)))
 {
-	log_error("There's no 'pvdata' command in LVM2.");
-	log_error("Use lvs, pvs, vgs instead; or use vgcfgbackup and read the text file backup.");
-	log_error("Metadata in LVM1 format can still be displayed using LVM1's pvdata command.");
+	log_error(0, "There's no 'pvdata' command in LVM2.");
+	log_error(0, "Use lvs, pvs, vgs instead; or use vgcfgbackup and read the text file backup.");
+	log_error(0, "Metadata in LVM1 format can still be displayed using LVM1's pvdata command.");
 	return ECMD_FAILED;
 }
 
diff --git a/tools/toollib.c b/tools/toollib.c
index 248fafb..1f63842 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -52,7 +52,7 @@ char *skip_dev_dir(struct cmd_context *cmd, const char *vg_name,
 
 		if (!dm_split_lvm_name(cmd->mem, vg_name, &vgname, &lvname, &layer) ||
 		    *layer) {
-			log_error("skip_dev_dir: Couldn't split up device name %s",
+			log_error(0, "skip_dev_dir: Couldn't split up device name %s",
 				  vg_name);
 			return (char *) vg_name;
 		}
@@ -61,7 +61,7 @@ char *skip_dev_dir(struct cmd_context *cmd, const char *vg_name,
 		    dm_snprintf(vglv, vglv_sz, "%s%s%s", vgname,
 				 *lvname ? "/" : "",
 				 lvname) < 0) {
-			log_error("vg/lv string alloc failed");
+			log_error(0, "vg/lv string alloc failed");
 			return (char *) vg_name;
 		}
 		return vglv;
@@ -155,7 +155,7 @@ int process_each_lv_in_vg(struct cmd_context *cmd,
 	}
 
 	if (lvargs_supplied && lvargs_matched != dm_list_size(arg_lvnames)) {
-		log_error("One or more specified logical volume(s) not found.");
+		log_error(0, "One or more specified logical volume(s) not found.");
 		if (ret_max < ECMD_FAILED)
 			ret_max = ECMD_FAILED;
 	}
@@ -203,14 +203,14 @@ int process_each_lv(struct cmd_context *cmd, int argc, char **argv,
 
 			if (*vgname == '@') {
 				if (!validate_name(vgname + 1)) {
-					log_error("Skipping invalid tag %s",
+					log_error(0, "Skipping invalid tag %s",
 						  vgname);
 					continue;
 				}
 				if (!str_list_add(cmd->mem, &tags,
 						  dm_pool_strdup(cmd->mem,
 							      vgname + 1))) {
-					log_error("strlist allocation failed");
+					log_error(0, "strlist allocation failed");
 					return ECMD_FAILED;
 				}
 				continue;
@@ -220,7 +220,7 @@ int process_each_lv(struct cmd_context *cmd, int argc, char **argv,
 			vgname = skip_dev_dir(cmd, vgname, &dev_dir_found);
 
 			if (*vgname == '/') {
-				log_error("\"%s\": Invalid path for Logical "
+				log_error(0, "\"%s\": Invalid path for Logical "
 					  "Volume", argv[opt]);
 				if (ret_max < ECMD_FAILED)
 					ret_max = ECMD_FAILED;
@@ -245,7 +245,7 @@ int process_each_lv(struct cmd_context *cmd, int argc, char **argv,
 
 			if (!str_list_add(cmd->mem, &arg_vgnames,
 					  dm_pool_strdup(cmd->mem, vgname))) {
-				log_error("strlist allocation failed");
+				log_error(0, "strlist allocation failed");
 				return ECMD_FAILED;
 			}
 
@@ -253,7 +253,7 @@ int process_each_lv(struct cmd_context *cmd, int argc, char **argv,
 				if (!str_list_add(cmd->mem, &arg_lvnames,
 						  dm_pool_strdup(cmd->mem,
 							      vgname))) {
-					log_error("strlist allocation failed");
+					log_error(0, "strlist allocation failed");
 					return ECMD_FAILED;
 				}
 			} else {
@@ -261,11 +261,11 @@ int process_each_lv(struct cmd_context *cmd, int argc, char **argv,
 				if (!(vglv = dm_pool_alloc(cmd->mem, vglv_sz)) ||
 				    dm_snprintf(vglv, vglv_sz, "%s/%s", vgname,
 						 lv_name) < 0) {
-					log_error("vg/lv string alloc failed");
+					log_error(0, "vg/lv string alloc failed");
 					return ECMD_FAILED;
 				}
 				if (!str_list_add(cmd->mem, &arg_lvnames, vglv)) {
-					log_error("strlist allocation failed");
+					log_error(0, "strlist allocation failed");
 					return ECMD_FAILED;
 				}
 			}
@@ -276,7 +276,7 @@ int process_each_lv(struct cmd_context *cmd, int argc, char **argv,
 	if (!argc || !dm_list_empty(&tags)) {
 		log_verbose("Finding all logical volumes");
 		if (!(vgnames = get_vgnames(cmd, 0)) || dm_list_empty(vgnames)) {
-			log_error("No volume groups found");
+			log_error(0, "No volume groups found");
 			return ret_max;
 		}
 	}
@@ -291,7 +291,7 @@ int process_each_lv(struct cmd_context *cmd, int argc, char **argv,
 		if (vg_read_error(vg)) {
 			vg_release(vg);
 			if (ret_max < ECMD_FAILED) {
-				log_error("Skipping volume group %s", vgname);
+				log_error(0, "Skipping volume group %s", vgname);
 				ret_max = ECMD_FAILED;
 			}
 			continue;
@@ -313,7 +313,7 @@ int process_each_lv(struct cmd_context *cmd, int argc, char **argv,
 				if (!str_list_add(cmd->mem, &lvnames,
 						  dm_pool_strdup(cmd->mem,
 							      lv_name + 1))) {
-					log_error("strlist allocation failed");
+					log_error(0, "strlist allocation failed");
 					vg_release(vg);
 					return ECMD_FAILED;
 				}
@@ -355,7 +355,7 @@ int process_each_segment_in_pv(struct cmd_context *cmd,
 		vg = vg_read(cmd, vg_name, NULL, 0);
 		if (vg_read_error(vg)) {
 			vg_release(vg);
-			log_error("Skipping volume group %s", vg_name);
+			log_error(0, "Skipping volume group %s", vg_name);
 			return ECMD_FAILED;
 		}
 
@@ -364,7 +364,7 @@ int process_each_segment_in_pv(struct cmd_context *cmd,
 		 * allocated in vg_read_internal() path.
 		 */
 		if (!(pvl = find_pv_in_vg(vg, pv_dev_name(pv)))) {
-			 log_error("Unable to find %s in volume group %s",
+			 log_error(0, "Unable to find %s in volume group %s",
 				   pv_dev_name(pv), vg_name);
 			vg_release(vg);
 			return ECMD_FAILED;
@@ -475,14 +475,14 @@ int process_each_vg(struct cmd_context *cmd, int argc, char **argv,
 			vg_name = argv[opt];
 			if (*vg_name == '@') {
 				if (!validate_name(vg_name + 1)) {
-					log_error("Skipping invalid tag %s",
+					log_error(0, "Skipping invalid tag %s",
 						  vg_name);
 					continue;
 				}
 				if (!str_list_add(cmd->mem, &tags,
 						  dm_pool_strdup(cmd->mem,
 							      vg_name + 1))) {
-					log_error("strlist allocation failed");
+					log_error(0, "strlist allocation failed");
 					return ECMD_FAILED;
 				}
 				continue;
@@ -490,13 +490,13 @@ int process_each_vg(struct cmd_context *cmd, int argc, char **argv,
 
 			vg_name = skip_dev_dir(cmd, vg_name, NULL);
 			if (strchr(vg_name, '/')) {
-				log_error("Invalid volume group name: %s",
+				log_error(0, "Invalid volume group name: %s",
 					  vg_name);
 				continue;
 			}
 			if (!str_list_add(cmd->mem, &arg_vgnames,
 					  dm_pool_strdup(cmd->mem, vg_name))) {
-				log_error("strlist allocation failed");
+				log_error(0, "strlist allocation failed");
 				return ECMD_FAILED;
 			}
 		}
@@ -507,7 +507,7 @@ int process_each_vg(struct cmd_context *cmd, int argc, char **argv,
 	if (!argc || !dm_list_empty(&tags)) {
 		log_verbose("Finding all volume groups");
 		if (!(vgids = get_vgids(cmd, 0)) || dm_list_empty(vgids)) {
-			log_error("No volume groups found");
+			log_error(0, "No volume groups found");
 			return ret_max;
 		}
 		dm_list_iterate_items(sl, vgids) {
@@ -581,7 +581,7 @@ static int _process_all_devs(struct cmd_context *cmd, void *handle,
 	}
 
 	if (!(iter = dev_iter_create(cmd->filter, 1))) {
-		log_error("dev_iter creation failed");
+		log_error(0, "dev_iter creation failed");
 		return ECMD_FAILED;
 	}
 
@@ -636,7 +636,7 @@ int process_each_pv(struct cmd_context *cmd, int argc, char **argv,
 	dm_list_init(&tags);
 
 	if (lock_global && !lock_vol(cmd, VG_GLOBAL, lock_type)) {
-		log_error("Unable to obtain global lock.");
+		log_error(0, "Unable to obtain global lock.");
 		return ECMD_FAILED;
 	}
 
@@ -647,7 +647,7 @@ int process_each_pv(struct cmd_context *cmd, int argc, char **argv,
 				tagname = argv[opt] + 1;
 
 				if (!validate_name(tagname)) {
-					log_error("Skipping invalid tag %s",
+					log_error(0, "Skipping invalid tag %s",
 						  tagname);
 					if (ret_max < EINVALID_CMD_LINE)
 						ret_max = EINVALID_CMD_LINE;
@@ -656,14 +656,14 @@ int process_each_pv(struct cmd_context *cmd, int argc, char **argv,
 				if (!str_list_add(cmd->mem, &tags,
 						  dm_pool_strdup(cmd->mem,
 							      tagname))) {
-					log_error("strlist allocation failed");
+					log_error(0, "strlist allocation failed");
 					goto bad;
 				}
 				continue;
 			}
 			if (vg) {
 				if (!(pvl = find_pv_in_vg(vg, argv[opt]))) {
-					log_error("Physical Volume \"%s\" not "
+					log_error(0, "Physical Volume \"%s\" not "
 						  "found in Volume Group "
 						  "\"%s\"", argv[opt],
 						  vg->name);
@@ -674,7 +674,7 @@ int process_each_pv(struct cmd_context *cmd, int argc, char **argv,
 			} else {
 				if (!(pv = pv_read(cmd, argv[opt], NULL,
 						   NULL, 1, scan_label_only))) {
-					log_error("Failed to read physical "
+					log_error(0, "Failed to read physical "
 						  "volume \"%s\"", argv[opt]);
 					ret_max = ECMD_FAILED;
 					continue;
@@ -698,7 +698,7 @@ int process_each_pv(struct cmd_context *cmd, int argc, char **argv,
 					if (!(pv = pv_read(cmd, argv[opt],
 							   NULL, NULL, 1,
 							   scan_label_only))) {
-						log_error("Failed to read "
+						log_error(0, "Failed to read "
 							  "physical volume "
 							  "\"%s\"", argv[opt]);
 						ret_max = ECMD_FAILED;
@@ -717,12 +717,12 @@ int process_each_pv(struct cmd_context *cmd, int argc, char **argv,
 			   !dm_list_empty(vgnames)) {
 			dm_list_iterate_items(sll, vgnames) {
 				if (!lock_vol(cmd, sll->str, lock_type)) {
-					log_error("Can't lock %s: skipping", sll->str);
+					log_error(0, "Can't lock %s: skipping", sll->str);
 					ret_max = ECMD_FAILED;
 					continue;
 				}
 				if (!(vg = vg_read_internal(cmd, sll->str, NULL, &consistent))) {
-					log_error("Volume group \"%s\" not found", sll->str);
+					log_error(0, "Volume group \"%s\" not found", sll->str);
 					unlock_vg(cmd, sll->str);
 					ret_max = ECMD_FAILED;
 					continue;
@@ -817,7 +817,7 @@ const char *extract_vgname(struct cmd_context *cmd, const char *lv_name)
 				vg_name++;
 		}
 		if (*vg_name == '/') {
-			log_error("\"%s\": Invalid path for Logical "
+			log_error(0, "\"%s\": Invalid path for Logical "
 				  "Volume", lv_name);
 			return 0;
 		}
@@ -828,14 +828,14 @@ const char *extract_vgname(struct cmd_context *cmd, const char *lv_name)
 				st++;
 
 		if (!strchr(vg_name, '/') || strchr(st, '/')) {
-			log_error("\"%s\": Invalid path for Logical Volume",
+			log_error(0, "\"%s\": Invalid path for Logical Volume",
 				  lv_name);
 			return 0;
 		}
 
 		vg_name = dm_pool_strdup(cmd->mem, vg_name);
 		if (!vg_name) {
-			log_error("Allocation of vg_name failed");
+			log_error(0, "Allocation of vg_name failed");
 			return 0;
 		}
 
@@ -845,7 +845,7 @@ const char *extract_vgname(struct cmd_context *cmd, const char *lv_name)
 
 	if (!(vg_name = default_vgname(cmd))) {
 		if (lv_name)
-			log_error("Path required for Logical Volume \"%s\"",
+			log_error(0, "Path required for Logical Volume \"%s\"",
 				  lv_name);
 		return 0;
 	}
@@ -868,7 +868,7 @@ char *default_vgname(struct cmd_context *cmd)
 	vg_path = skip_dev_dir(cmd, vg_path, NULL);
 
 	if (strchr(vg_path, '/')) {
-		log_error("Environment Volume Group in LVM_VG_NAME invalid: "
+		log_error(0, "Environment Volume Group in LVM_VG_NAME invalid: "
 			  "\"%s\"", vg_path);
 		return 0;
 	}
@@ -892,7 +892,7 @@ static int _add_pe_range(struct dm_pool *mem, const char *pvname,
 		if (((start < per->start) && (start + count - 1 >= per->start))
 		    || ((start >= per->start) &&
 			(per->start + per->count - 1) >= start)) {
-			log_error("Overlapping PE ranges specified (%" PRIu32
+			log_error(0, "Overlapping PE ranges specified (%" PRIu32
 				  "-%" PRIu32 ", %" PRIu32 "-%" PRIu32 ")"
 				  " on %s",
 				  start, start + count - 1, per->start,
@@ -902,7 +902,7 @@ static int _add_pe_range(struct dm_pool *mem, const char *pvname,
 	}
 
 	if (!(per = dm_pool_alloc(mem, sizeof(*per)))) {
-		log_error("Allocation of list failed");
+		log_error(0, "Allocation of list failed");
 		return 0;
 	}
 
@@ -974,7 +974,7 @@ static int _parse_pes(struct dm_pool *mem, char *c, struct dm_list *pe_ranges,
 			goto error;
 
 		if ((start > end) || (end > size - 1)) {
-			log_error("PE range error: start extent %" PRIu32 " to "
+			log_error(0, "PE range error: start extent %" PRIu32 " to "
 				  "end extent %" PRIu32, start, end);
 			return 0;
 		}
@@ -987,7 +987,7 @@ static int _parse_pes(struct dm_pool *mem, char *c, struct dm_list *pe_ranges,
 	return 1;
 
       error:
-	log_error("Physical extent parsing error at %s", c);
+	log_error(0, "Physical extent parsing error at %s", c);
 	return 0;
 }
 
@@ -1000,18 +1000,18 @@ static int _create_pv_entry(struct dm_pool *mem, struct pv_list *pvl,
 
 	pvname = pv_dev_name(pvl->pv);
 	if (allocatable_only && !(pvl->pv->status & ALLOCATABLE_PV)) {
-		log_error("Physical volume %s not allocatable", pvname);
+		log_error(0, "Physical volume %s not allocatable", pvname);
 		return 1;
 	}
 
 	if (allocatable_only && (pvl->pv->status & MISSING_PV)) {
-		log_error("Physical volume %s is missing", pvname);
+		log_error(0, "Physical volume %s is missing", pvname);
 		return 1;
 	}
 
 	if (allocatable_only &&
 	    (pvl->pv->pe_count == pvl->pv->pe_alloc_count)) {
-		log_err("No free extents on physical volume \"%s\"", pvname);
+		log_error(0, "No free extents on physical volume \"%s\"", pvname);
 		return 1;
 	}
 
@@ -1023,14 +1023,14 @@ static int _create_pv_entry(struct dm_pool *mem, struct pv_list *pvl,
 	
 	if (!new_pvl) {
 		if (!(new_pvl = dm_pool_alloc(mem, sizeof(*new_pvl)))) {
-			log_err("Unable to allocate physical volume list.");
+			log_error(0, "Unable to allocate physical volume list.");
 			return 0;
 		}
 
 		memcpy(new_pvl, pvl, sizeof(*new_pvl));
 
 		if (!(pe_ranges = dm_pool_alloc(mem, sizeof(*pe_ranges)))) {
-			log_error("Allocation of pe_ranges list failed");
+			log_error(0, "Allocation of pe_ranges list failed");
 			return 0;
 		}
 		dm_list_init(pe_ranges);
@@ -1058,7 +1058,7 @@ struct dm_list *create_pv_list(struct dm_pool *mem, struct volume_group *vg, int
 
 	/* Build up list of PVs */
 	if (!(r = dm_pool_alloc(mem, sizeof(*r)))) {
-		log_error("Allocation of list failed");
+		log_error(0, "Allocation of list failed");
 		return NULL;
 	}
 	dm_list_init(r);
@@ -1070,7 +1070,7 @@ struct dm_list *create_pv_list(struct dm_pool *mem, struct volume_group *vg, int
 		if (*argv[i] == '@') {
 			tagname = argv[i] + 1;
 			if (!validate_name(tagname)) {
-				log_error("Skipping invalid tag %s", tagname);
+				log_error(0, "Skipping invalid tag %s", tagname);
 				continue;
 			}
 			dm_list_iterate_items(pvl, &vg->pvs) {
@@ -1091,13 +1091,13 @@ struct dm_list *create_pv_list(struct dm_pool *mem, struct volume_group *vg, int
 			if (!(pvname = dm_pool_strndup(mem, pvname,
 						    (unsigned) (colon -
 								pvname)))) {
-				log_error("Failed to clone PV name");
+				log_error(0, "Failed to clone PV name");
 				return NULL;
 			}
 		}
 
 		if (!(pvl = find_pv_in_vg(vg, pvname))) {
-			log_err("Physical Volume \"%s\" not found in "
+			log_error(0, "Physical Volume \"%s\" not found in "
 				"Volume Group \"%s\"", pvname, vg->name);
 			return NULL;
 		}
@@ -1106,7 +1106,7 @@ struct dm_list *create_pv_list(struct dm_pool *mem, struct volume_group *vg, int
 	}
 
 	if (dm_list_empty(r))
-		log_error("No specified PVs have space available");
+		log_error(0, "No specified PVs have space available");
 
 	return dm_list_empty(r) ? NULL : r;
 }
@@ -1118,14 +1118,14 @@ struct dm_list *clone_pv_list(struct dm_pool *mem, struct dm_list *pvsl)
 
 	/* Build up list of PVs */
 	if (!(r = dm_pool_alloc(mem, sizeof(*r)))) {
-		log_error("Allocation of list failed");
+		log_error(0, "Allocation of list failed");
 		return NULL;
 	}
 	dm_list_init(r);
 
 	dm_list_iterate_items(pvl, pvsl) {
 		if (!(new_pvl = dm_pool_zalloc(mem, sizeof(*new_pvl)))) {
-			log_error("Unable to allocate physical volume list.");
+			log_error(0, "Unable to allocate physical volume list.");
 			return NULL;
 		}
 
@@ -1139,31 +1139,31 @@ struct dm_list *clone_pv_list(struct dm_pool *mem, struct dm_list *pvsl)
 int apply_lvname_restrictions(const char *name)
 {
 	if (!strncmp(name, "snapshot", 8)) {
-		log_error("Names starting \"snapshot\" are reserved. "
+		log_error(0, "Names starting \"snapshot\" are reserved. "
 			  "Please choose a different LV name.");
 		return 0;
 	}
 
 	if (!strncmp(name, "pvmove", 6)) {
-		log_error("Names starting \"pvmove\" are reserved. "
+		log_error(0, "Names starting \"pvmove\" are reserved. "
 			  "Please choose a different LV name.");
 		return 0;
 	}
 
 	if (strstr(name, "_mlog")) {
-		log_error("Names including \"_mlog\" are reserved. "
+		log_error(0, "Names including \"_mlog\" are reserved. "
 			  "Please choose a different LV name.");
 		return 0;
 	}
 
 	if (strstr(name, "_mimage")) {
-		log_error("Names including \"_mimage\" are reserved. "
+		log_error(0, "Names including \"_mimage\" are reserved. "
 			  "Please choose a different LV name.");
 		return 0;
 	}
 
 	if (strstr(name, "_vorigin")) {
-		log_error("Names including \"_vorigin\" are reserved. "
+		log_error(0, "Names including \"_vorigin\" are reserved. "
 			  "Please choose a different LV name.");
 		return 0;
 	}
@@ -1212,17 +1212,17 @@ int fill_vg_create_params(struct cmd_context *cmd,
 		vp_new->clustered = locking_is_clustered();
 
 	if (arg_sign_value(cmd, physicalextentsize_ARG, 0) == SIGN_MINUS) {
-		log_error("Physical extent size may not be negative");
+		log_error(0, "Physical extent size may not be negative");
 		return 1;
 	}
 
 	if (arg_sign_value(cmd, maxlogicalvolumes_ARG, 0) == SIGN_MINUS) {
-		log_error("Max Logical Volumes may not be negative");
+		log_error(0, "Max Logical Volumes may not be negative");
 		return 1;
 	}
 
 	if (arg_sign_value(cmd, maxphysicalvolumes_ARG, 0) == SIGN_MINUS) {
-		log_error("Max Physical Volumes may not be negative");
+		log_error(0, "Max Physical Volumes may not be negative");
 		return 1;
 	}
 
diff --git a/tools/vgcfgbackup.c b/tools/vgcfgbackup.c
index c8ae40c..9336eed 100644
--- a/tools/vgcfgbackup.c
+++ b/tools/vgcfgbackup.c
@@ -24,18 +24,18 @@ static char *_expand_filename(const char *template, const char *vg_name,
 		return dm_strdup(template);
 
 	if (!(filename = dm_malloc(PATH_MAX))) {
-		log_error("Failed to allocate filename.");
+		log_error(0, "Failed to allocate filename.");
 		return NULL;
 	}
 
 	if (snprintf(filename, PATH_MAX, template, vg_name) < 0) {
-		log_error("Error processing filename template %s",
+		log_error(0, "Error processing filename template %s",
 			   template);
 		dm_free(filename);	
 		return NULL;
 	}
 	if (*last_filename && !strncmp(*last_filename, filename, PATH_MAX)) {
-		log_error("VGs must be backed up into different files. "
+		log_error(0, "VGs must be backed up into different files. "
 			  "Use %%s in filename for VG name.");
 		dm_free(filename);
 		return NULL;
@@ -68,7 +68,7 @@ static int vg_backup_single(struct cmd_context *cmd, const char *vg_name,
 			return ECMD_FAILED;
 	} else {
 		if (vg_read_error(vg) == FAILED_INCONSISTENT) {
-			log_error("No backup taken: specify filename with -f "
+			log_error(0, "No backup taken: specify filename with -f "
 				  "to backup an inconsistent VG");
 			stack;
 			return ECMD_FAILED;
diff --git a/tools/vgcfgrestore.c b/tools/vgcfgrestore.c
index 6ec20d1..6ed9077 100644
--- a/tools/vgcfgrestore.c
+++ b/tools/vgcfgrestore.c
@@ -22,11 +22,11 @@ int vgcfgrestore(struct cmd_context *cmd, int argc, char **argv)
 	if (argc == 1) {
 		vg_name = skip_dev_dir(cmd, argv[0], NULL);
 		if (!validate_name(vg_name)) {
-			log_error("Volume group name \"%s\" is invalid", vg_name);
+			log_error(0, "Volume group name \"%s\" is invalid", vg_name);
 			return ECMD_FAILED;
 		}
 	} else if (!(arg_count(cmd, list_ARG) && arg_count(cmd, file_ARG))) {
-		log_err("Please specify a *single* volume group to restore.");
+		log_error(0, "Please specify a *single* volume group to restore.");
 		return ECMD_FAILED;
 	}
 
@@ -44,12 +44,12 @@ int vgcfgrestore(struct cmd_context *cmd, int argc, char **argv)
 	}
 
 	if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE)) {
-		log_error("Unable to lock orphans");
+		log_error(0, "Unable to lock orphans");
 		return ECMD_FAILED;
 	}
 
 	if (!lock_vol(cmd, vg_name, LCK_VG_WRITE)) {
-		log_error("Unable to lock volume group %s", vg_name);
+		log_error(0, "Unable to lock volume group %s", vg_name);
 		unlock_vg(cmd, VG_ORPHANS);
 		return ECMD_FAILED;
 	}
@@ -60,7 +60,7 @@ int vgcfgrestore(struct cmd_context *cmd, int argc, char **argv)
 	      backup_restore(cmd, vg_name))) {
 		unlock_vg(cmd, vg_name);
 		unlock_vg(cmd, VG_ORPHANS);
-		log_err("Restore failed.");
+		log_error(0, "Restore failed.");
 		return ECMD_FAILED;
 	}
 
diff --git a/tools/vgchange.c b/tools/vgchange.c
index a5121fc..2e7f9b5 100644
--- a/tools/vgchange.c
+++ b/tools/vgchange.c
@@ -133,13 +133,13 @@ static int _vgchange_available(struct cmd_context *cmd, struct volume_group *vg)
 
 	/* FIXME: Force argument to deactivate them? */
 	if (!activate && (lv_open = lvs_in_vg_opened(vg))) {
-		log_error("Can't deactivate volume group \"%s\" with %d open "
+		log_error(0, "Can't deactivate volume group \"%s\" with %d open "
 			  "logical volume(s)", vg->name, lv_open);
 		return ECMD_FAILED;
 	}
 
 	if (activate && lockingfailed() && (vg_is_clustered(vg))) {
-		log_error("Locking inactive: ignoring clustered "
+		log_error(0, "Locking inactive: ignoring clustered "
 			  "volume group %s", vg->name);
 		return ECMD_FAILED;
 	}
@@ -180,13 +180,13 @@ static int _vgchange_alloc(struct cmd_context *cmd, struct volume_group *vg)
 	alloc = arg_uint_value(cmd, alloc_ARG, ALLOC_NORMAL);
 
 	if (alloc == ALLOC_INHERIT) {
-		log_error("Volume Group allocation policy cannot inherit "
+		log_error(0, "Volume Group allocation policy cannot inherit "
 			  "from anything");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (alloc == vg->alloc) {
-		log_error("Volume group allocation policy is already %s",
+		log_error(0, "Volume group allocation policy is already %s",
 			  get_alloc_string(vg->alloc));
 		return ECMD_FAILED;
 	}
@@ -212,13 +212,13 @@ static int _vgchange_resizeable(struct cmd_context *cmd,
 	int resizeable = !strcmp(arg_str_value(cmd, resizeable_ARG, "n"), "y");
 
 	if (resizeable && (vg_status(vg) & RESIZEABLE_VG)) {
-		log_error("Volume group \"%s\" is already resizeable",
+		log_error(0, "Volume group \"%s\" is already resizeable",
 			  vg->name);
 		return ECMD_FAILED;
 	}
 
 	if (!resizeable && !(vg_status(vg) & RESIZEABLE_VG)) {
-		log_error("Volume group \"%s\" is already not resizeable",
+		log_error(0, "Volume group \"%s\" is already not resizeable",
 			  vg->name);
 		return ECMD_FAILED;
 	}
@@ -248,13 +248,13 @@ static int _vgchange_clustered(struct cmd_context *cmd,
 	struct lv_list *lvl;
 
 	if (clustered && (vg_is_clustered(vg))) {
-		log_error("Volume group \"%s\" is already clustered",
+		log_error(0, "Volume group \"%s\" is already clustered",
 			  vg->name);
 		return ECMD_FAILED;
 	}
 
 	if (!clustered && !(vg_is_clustered(vg))) {
-		log_error("Volume group \"%s\" is already not clustered",
+		log_error(0, "Volume group \"%s\" is already not clustered",
 			  vg->name);
 		return ECMD_FAILED;
 	}
@@ -262,7 +262,7 @@ static int _vgchange_clustered(struct cmd_context *cmd,
 	if (clustered) {
 		dm_list_iterate_items(lvl, &vg->lvs) {
 			if (lv_is_origin(lvl->lv) || lv_is_cow(lvl->lv)) {
-				log_error("Volume group %s contains snapshots "
+				log_error(0, "Volume group %s contains snapshots "
 					  "that are not yet supported.",
 					  vg->name);
 				return ECMD_FAILED;
@@ -294,7 +294,7 @@ static int _vgchange_logicalvolume(struct cmd_context *cmd,
 	uint32_t max_lv = arg_uint_value(cmd, logicalvolume_ARG, 0);
 
 	if (!(vg_status(vg) & RESIZEABLE_VG)) {
-		log_error("Volume group \"%s\" must be resizeable "
+		log_error(0, "Volume group \"%s\" must be resizeable "
 			  "to change MaxLogicalVolume", vg->name);
 		return ECMD_FAILED;
 	}
@@ -303,13 +303,13 @@ static int _vgchange_logicalvolume(struct cmd_context *cmd,
 		if (!max_lv)
 			max_lv = 255;
 		else if (max_lv > 255) {
-			log_error("MaxLogicalVolume limit is 255");
+			log_error(0, "MaxLogicalVolume limit is 255");
 			return ECMD_FAILED;
 		}
 	}
 
 	if (max_lv && max_lv < vg_visible_lvs(vg)) {
-		log_error("MaxLogicalVolume is less than the current number "
+		log_error(0, "MaxLogicalVolume is less than the current number "
 			  "%d of LVs for %s", vg_visible_lvs(vg),
 			  vg->name);
 		return ECMD_FAILED;
@@ -336,13 +336,13 @@ static int _vgchange_physicalvolumes(struct cmd_context *cmd,
 	uint32_t max_pv = arg_uint_value(cmd, maxphysicalvolumes_ARG, 0);
 
 	if (!(vg_status(vg) & RESIZEABLE_VG)) {
-		log_error("Volume group \"%s\" must be resizeable "
+		log_error(0, "Volume group \"%s\" must be resizeable "
 			  "to change MaxPhysicalVolumes", vg->name);
 		return ECMD_FAILED;
 	}
 
 	if (arg_sign_value(cmd, maxphysicalvolumes_ARG, 0) == SIGN_MINUS) {
-		log_error("MaxPhysicalVolumes may not be negative");
+		log_error(0, "MaxPhysicalVolumes may not be negative");
 		return EINVALID_CMD_LINE;
 	}
 
@@ -350,13 +350,13 @@ static int _vgchange_physicalvolumes(struct cmd_context *cmd,
 		if (!max_pv)
 			max_pv = 255;
 		else if (max_pv > 255) {
-			log_error("MaxPhysicalVolume limit is 255");
+			log_error(0, "MaxPhysicalVolume limit is 255");
 			return ECMD_FAILED;
 		}
 	}
 
 	if (max_pv && max_pv < vg->pv_count) {
-		log_error("MaxPhysicalVolumes is less than the current number "
+		log_error(0, "MaxPhysicalVolumes is less than the current number "
 			  "%d of PVs for \"%s\"", vg->pv_count,
 			  vg->name);
 		return ECMD_FAILED;
@@ -382,37 +382,37 @@ static int _vgchange_pesize(struct cmd_context *cmd, struct volume_group *vg)
 	uint32_t extent_size;
 
 	if (!(vg_status(vg) & RESIZEABLE_VG)) {
-		log_error("Volume group \"%s\" must be resizeable "
+		log_error(0, "Volume group \"%s\" must be resizeable "
 			  "to change PE size", vg->name);
 		return ECMD_FAILED;
 	}
 
 	if (arg_sign_value(cmd, physicalextentsize_ARG, 0) == SIGN_MINUS) {
-		log_error("Physical extent size may not be negative");
+		log_error(0, "Physical extent size may not be negative");
 		return EINVALID_CMD_LINE;
 	}
 
 	extent_size = arg_uint_value(cmd, physicalextentsize_ARG, 0);
 	if (!extent_size) {
-		log_error("Physical extent size may not be zero");
+		log_error(0, "Physical extent size may not be zero");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (extent_size == vg->extent_size) {
-		log_error("Physical extent size of VG %s is already %s",
+		log_error(0, "Physical extent size of VG %s is already %s",
 			  vg->name, display_size(cmd, (uint64_t) extent_size));
 		return ECMD_PROCESSED;
 	}
 
 	if (extent_size & (extent_size - 1)) {
-		log_error("Physical extent size must be a power of 2.");
+		log_error(0, "Physical extent size must be a power of 2.");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (extent_size > vg->extent_size) {
 		if ((uint64_t) vg->extent_size * vg->extent_count % extent_size) {
 			/* FIXME Adjust used PV sizes instead */
-			log_error("New extent size is not a perfect fit");
+			log_error(0, "New extent size is not a perfect fit");
 			return EINVALID_CMD_LINE;
 		}
 	}
@@ -441,12 +441,12 @@ static int _vgchange_tag(struct cmd_context *cmd, struct volume_group *vg,
 	const char *tag;
 
 	if (!(tag = arg_str_value(cmd, arg, NULL))) {
-		log_error("Failed to get tag");
+		log_error(0, "Failed to get tag");
 		return ECMD_FAILED;
 	}
 
 	if (!(vg->fid->fmt->features & FMT_TAGS)) {
-		log_error("Volume group %s does not support tags", vg->name);
+		log_error(0, "Volume group %s does not support tags", vg->name);
 		return ECMD_FAILED;
 	}
 
@@ -455,13 +455,13 @@ static int _vgchange_tag(struct cmd_context *cmd, struct volume_group *vg,
 
 	if ((arg == addtag_ARG)) {
 		if (!str_list_add(cmd->mem, &vg->tags, tag)) {
-			log_error("Failed to add tag %s to volume group %s",
+			log_error(0, "Failed to add tag %s to volume group %s",
 				  tag, vg->name);
 			return ECMD_FAILED;
 		}
 	} else {
 		if (!str_list_del(&vg->tags, tag)) {
-			log_error("Failed to remove tag %s from volume group "
+			log_error(0, "Failed to remove tag %s from volume group "
 				  "%s", tag, vg->name);
 			return ECMD_FAILED;
 		}
@@ -483,7 +483,7 @@ static int _vgchange_uuid(struct cmd_context *cmd __attribute((unused)),
 	struct lv_list *lvl;
 
 	if (lvs_in_vg_activated(vg)) {
-		log_error("Volume group has active logical volumes");
+		log_error(0, "Volume group has active logical volumes");
 		return ECMD_FAILED;
 	}
 
@@ -491,7 +491,7 @@ static int _vgchange_uuid(struct cmd_context *cmd __attribute((unused)),
 		return ECMD_FAILED;
 
 	if (!id_create(&vg->id)) {
-		log_error("Failed to generate new random UUID for VG %s.",
+		log_error(0, "Failed to generate new random UUID for VG %s.",
 			  vg->name);
 		return ECMD_FAILED;
 	}
@@ -530,7 +530,7 @@ static int vgchange_single(struct cmd_context *cmd, const char *vg_name,
 		return ECMD_FAILED;
 
 	if (vg_status(vg) & EXPORTED_VG) {
-		log_error("Volume group \"%s\" is exported", vg_name);
+		log_error(0, "Volume group \"%s\" is exported", vg_name);
 		return ECMD_FAILED;
 	}
 
@@ -587,7 +587,7 @@ int vgchange(struct cmd_context *cmd, int argc, char **argv)
 	     arg_count(cmd, physicalextentsize_ARG) +
 	     arg_count(cmd, clustered_ARG) + arg_count(cmd, alloc_ARG) +
 	     arg_count(cmd, monitor_ARG) + arg_count(cmd, refresh_ARG))) {
-		log_error("One of -a, -c, -l, -p, -s, -x, --refresh, "
+		log_error(0, "One of -a, -c, -l, -p, -s, -x, --refresh, "
 				"--uuid, --alloc, --addtag or --deltag required");
 		return EINVALID_CMD_LINE;
 	}
@@ -599,20 +599,20 @@ int vgchange(struct cmd_context *cmd, int argc, char **argv)
 	    arg_count(cmd, addtag_ARG) + arg_count(cmd, alloc_ARG) +
 	    arg_count(cmd, uuid_ARG) + arg_count(cmd, clustered_ARG) +
 	    arg_count(cmd, physicalextentsize_ARG) > 1) {
-		log_error("Only one of -a, -c, -l, -p, -s, -x, --uuid, "
+		log_error(0, "Only one of -a, -c, -l, -p, -s, -x, --uuid, "
 			  "--alloc, --addtag or --deltag allowed");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (arg_count(cmd, ignorelockingfailure_ARG) &&
 	    !arg_count(cmd, available_ARG)) {
-		log_error("--ignorelockingfailure only available with -a");
+		log_error(0, "--ignorelockingfailure only available with -a");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (arg_count(cmd, available_ARG) == 1
 	    && arg_count(cmd, autobackup_ARG)) {
-		log_error("-A option not necessary with -a option");
+		log_error(0, "-A option not necessary with -a option");
 		return EINVALID_CMD_LINE;
 	}
 
diff --git a/tools/vgconvert.c b/tools/vgconvert.c
index 0996d95..baf9aee 100644
--- a/tools/vgconvert.c
+++ b/tools/vgconvert.c
@@ -39,14 +39,14 @@ static int vgconvert_single(struct cmd_context *cmd, const char *vg_name,
 		return ECMD_FAILED;
 
 	if (vg->fid->fmt == cmd->fmt) {
-		log_error("Volume group \"%s\" already uses format %s",
+		log_error(0, "Volume group \"%s\" already uses format %s",
 			  vg_name, cmd->fmt->name);
 		return ECMD_FAILED;
 	}
 
 	if (cmd->fmt->features & FMT_MDAS) {
 		if (arg_sign_value(cmd, metadatasize_ARG, 0) == SIGN_MINUS) {
-			log_error("Metadata size may not be negative");
+			log_error(0, "Metadata size may not be negative");
 			return EINVALID_CMD_LINE;
 		}
 
@@ -67,7 +67,7 @@ static int vgconvert_single(struct cmd_context *cmd, const char *vg_name,
 	}
 
 	if (!archive(vg)) {
-		log_error("Archive of \"%s\" metadata failed.", vg_name);
+		log_error(0, "Archive of \"%s\" metadata failed.", vg_name);
 		return ECMD_FAILED;
 	}
 
@@ -85,7 +85,7 @@ static int vgconvert_single(struct cmd_context *cmd, const char *vg_name,
 	    cmd->fmt->features & FMT_RESTRICTED_LVIDS)
 		dm_list_iterate_items(lvl, &vg->lvs)
 			if (!lvid_in_restricted_range(&lvl->lv->lvid)) {
-				log_error("Logical volume %s lvid format is"
+				log_error(0, "Logical volume %s lvid format is"
 					  " incompatible with requested"
 					  " metadata format.", lvl->lv->name);
 				return ECMD_FAILED;
@@ -100,7 +100,7 @@ static int vgconvert_single(struct cmd_context *cmd, const char *vg_name,
 			if (lvnum_from_lvid(&lv->lvid) < MAX_RESTRICTED_LVS)
 				continue;
 			if (lv_info(cmd, lv, &info, 0, 0) && info.exists) {
-				log_error("Logical volume %s must be "
+				log_error(0, "Logical volume %s must be "
 					  "deactivated before conversion.",
 					   lv->name);
 				active++;
@@ -127,10 +127,10 @@ static int vgconvert_single(struct cmd_context *cmd, const char *vg_name,
 				     pe_start, pv_pe_count(existing_pv),
 				     pv_pe_size(existing_pv), pvmetadatacopies,
 				     pvmetadatasize, &mdas))) {
-			log_error("Failed to setup physical volume \"%s\"",
+			log_error(0, "Failed to setup physical volume \"%s\"",
 				  pv_dev_name(existing_pv));
 			if (change_made)
-				log_error("Use pvcreate and vgcfgrestore to "
+				log_error(0, "Use pvcreate and vgcfgrestore to "
 					  "repair from archived metadata.");
 			return ECMD_FAILED;
 		}
@@ -143,9 +143,9 @@ static int vgconvert_single(struct cmd_context *cmd, const char *vg_name,
 
 		/* Wipe existing label first */
 		if (!label_remove(pv_dev(pv))) {
-			log_error("Failed to wipe existing label on %s",
+			log_error(0, "Failed to wipe existing label on %s",
 				  pv_dev_name(pv));
-			log_error("Use pvcreate and vgcfgrestore to repair "
+			log_error(0, "Use pvcreate and vgcfgrestore to repair "
 				  "from archived metadata.");
 			return ECMD_FAILED;
 		}
@@ -155,9 +155,9 @@ static int vgconvert_single(struct cmd_context *cmd, const char *vg_name,
 		if (!(pv_write(cmd, pv, &mdas,
 			       arg_int64_value(cmd, labelsector_ARG,
 					       DEFAULT_LABELSECTOR)))) {
-			log_error("Failed to write physical volume \"%s\"",
+			log_error(0, "Failed to write physical volume \"%s\"",
 				  pv_dev_name(pv));
-			log_error("Use pvcreate and vgcfgrestore to repair "
+			log_error(0, "Use pvcreate and vgcfgrestore to repair "
 				  "from archived metadata.");
 			return ECMD_FAILED;
 		}
@@ -168,9 +168,9 @@ static int vgconvert_single(struct cmd_context *cmd, const char *vg_name,
 
 	log_verbose("Deleting existing metadata for VG %s", vg_name);
 	if (!vg_remove(vg)) {
-		log_error("Removal of existing metadata for %s failed.",
+		log_error(0, "Removal of existing metadata for %s failed.",
 			  vg_name);
-		log_error("Use pvcreate and vgcfgrestore to repair "
+		log_error(0, "Use pvcreate and vgcfgrestore to repair "
 			  "from archived metadata.");
 		return ECMD_FAILED;
 	}
@@ -185,8 +185,8 @@ static int vgconvert_single(struct cmd_context *cmd, const char *vg_name,
 	log_verbose("Writing metadata for VG %s using format %s", vg_name,
 		    cmd->fmt->name);
 	if (!backup_restore_vg(cmd, vg)) {
-		log_error("Conversion failed for volume group %s.", vg_name);
-		log_error("Use pvcreate and vgcfgrestore to repair from "
+		log_error(0, "Conversion failed for volume group %s.", vg_name);
+		log_error(0, "Use pvcreate and vgcfgrestore to repair from "
 			  "archived metadata.");
 		return ECMD_FAILED;
 	}
@@ -200,12 +200,12 @@ static int vgconvert_single(struct cmd_context *cmd, const char *vg_name,
 int vgconvert(struct cmd_context *cmd, int argc, char **argv)
 {
 	if (!argc) {
-		log_error("Please enter volume group(s)");
+		log_error(0, "Please enter volume group(s)");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (arg_int_value(cmd, labelsector_ARG, 0) >= LABEL_SCAN_SECTORS) {
-		log_error("labelsector must be less than %lu",
+		log_error(0, "labelsector must be less than %lu",
 			  LABEL_SCAN_SECTORS);
 		return EINVALID_CMD_LINE;
 	}
@@ -213,13 +213,13 @@ int vgconvert(struct cmd_context *cmd, int argc, char **argv)
 	if (!(cmd->fmt->features & FMT_MDAS) &&
 	    (arg_count(cmd, metadatacopies_ARG) ||
 	     arg_count(cmd, metadatasize_ARG))) {
-		log_error("Metadata parameters only apply to text format");
+		log_error(0, "Metadata parameters only apply to text format");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (arg_count(cmd, metadatacopies_ARG) &&
 	    arg_int_value(cmd, metadatacopies_ARG, -1) > 2) {
-		log_error("Metadatacopies may only be 0, 1 or 2");
+		log_error(0, "Metadatacopies may only be 0, 1 or 2");
 		return EINVALID_CMD_LINE;
 	}
 
diff --git a/tools/vgcreate.c b/tools/vgcreate.c
index 232b570..f840106 100644
--- a/tools/vgcreate.c
+++ b/tools/vgcreate.c
@@ -24,13 +24,13 @@ int vgcreate(struct cmd_context *cmd, int argc, char **argv)
 	const char *clustered_message = "";
 
 	if (!argc) {
-		log_error("Please provide volume group name and "
+		log_error(0, "Please provide volume group name and "
 			  "physical volumes");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (argc == 1) {
-		log_error("Please enter physical volume name(s)");
+		log_error(0, "Please enter physical volume name(s)");
 		return EINVALID_CMD_LINE;
 	}
 
@@ -47,12 +47,12 @@ int vgcreate(struct cmd_context *cmd, int argc, char **argv)
 	    return EINVALID_CMD_LINE;
 
 	if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE)) {
-		log_error("Can't get lock for orphan PVs");
+		log_error(0, "Can't get lock for orphan PVs");
 		return ECMD_FAILED;
 	}
 
 	if (vg_lock_newname(cmd, vp_new.vg_name) != SUCCESS) {
-		log_error("Can't get lock for %s", vp_new.vg_name);
+		log_error(0, "Can't get lock for %s", vp_new.vg_name);
 		unlock_vg(cmd, VG_ORPHANS);
 		return ECMD_FAILED;
 	}
@@ -73,17 +73,17 @@ int vgcreate(struct cmd_context *cmd, int argc, char **argv)
 
 	if (arg_count(cmd, addtag_ARG)) {
 		if (!(tag = arg_str_value(cmd, addtag_ARG, NULL))) {
-			log_error("Failed to get tag");
+			log_error(0, "Failed to get tag");
 			goto bad;
 		}
 
 		if (!(vg->fid->fmt->features & FMT_TAGS)) {
-			log_error("Volume group format does not support tags");
+			log_error(0, "Volume group format does not support tags");
 			goto bad;
 		}
 
 		if (!str_list_add(cmd->mem, &vg->tags, tag)) {
-			log_error("Failed to add tag %s to volume group %s",
+			log_error(0, "Failed to add tag %s to volume group %s",
 				  tag, vp_new.vg_name);
 			goto bad;
 		}
diff --git a/tools/vgdisplay.c b/tools/vgdisplay.c
index bbabcee..d2e006e 100644
--- a/tools/vgdisplay.c
+++ b/tools/vgdisplay.c
@@ -59,7 +59,7 @@ int vgdisplay(struct cmd_context *cmd, int argc, char **argv)
 		if (arg_count(cmd, colon_ARG) ||
 		    arg_count(cmd, activevolumegroups_ARG) ||
 		    arg_count(cmd, short_ARG)) {
-			log_error("Incompatible options selected");
+			log_error(0, "Incompatible options selected");
 			return EINVALID_CMD_LINE;
 		}
 		return vgs(cmd, argc, argv);
@@ -68,17 +68,17 @@ int vgdisplay(struct cmd_context *cmd, int argc, char **argv)
 		   arg_count(cmd, options_ARG) ||
 		   arg_count(cmd, separator_ARG) ||
 		   arg_count(cmd, sort_ARG) || arg_count(cmd, unbuffered_ARG)) {
-		log_error("Incompatible options selected");
+		log_error(0, "Incompatible options selected");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (arg_count(cmd, colon_ARG) && arg_count(cmd, short_ARG)) {
-		log_error("Option -c is not allowed with option -s");
+		log_error(0, "Option -c is not allowed with option -s");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (argc && arg_count(cmd, activevolumegroups_ARG)) {
-		log_error("Option -A is not allowed with volume group names");
+		log_error(0, "Option -A is not allowed with volume group names");
 		return EINVALID_CMD_LINE;
 	}
 
diff --git a/tools/vgexport.c b/tools/vgexport.c
index 59627b9..7ed293e 100644
--- a/tools/vgexport.c
+++ b/tools/vgexport.c
@@ -27,7 +27,7 @@ static int vgexport_single(struct cmd_context *cmd __attribute((unused)),
 		goto error;
 
 	if (lvs_in_vg_activated(vg)) {
-		log_error("Volume group \"%s\" has active logical volumes",
+		log_error(0, "Volume group \"%s\" has active logical volumes",
 			  vg_name);
 		goto error;
 	}
@@ -58,12 +58,12 @@ static int vgexport_single(struct cmd_context *cmd __attribute((unused)),
 int vgexport(struct cmd_context *cmd, int argc, char **argv)
 {
 	if (!argc && !arg_count(cmd, all_ARG)) {
-		log_error("Please supply volume groups or use -a for all.");
+		log_error(0, "Please supply volume groups or use -a for all.");
 		return ECMD_FAILED;
 	}
 
 	if (argc && arg_count(cmd, all_ARG)) {
-		log_error("No arguments permitted when using -a for all.");
+		log_error(0, "No arguments permitted when using -a for all.");
 		return ECMD_FAILED;
 	}
 
diff --git a/tools/vgextend.c b/tools/vgextend.c
index 1000dc2..2690be8 100644
--- a/tools/vgextend.c
+++ b/tools/vgextend.c
@@ -22,13 +22,13 @@ int vgextend(struct cmd_context *cmd, int argc, char **argv)
 	int r = ECMD_FAILED;
 
 	if (!argc) {
-		log_error("Please enter volume group name and "
+		log_error(0, "Please enter volume group name and "
 			  "physical volume(s)");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (argc == 1) {
-		log_error("Please enter physical volume(s)");
+		log_error(0, "Please enter physical volume(s)");
 		return EINVALID_CMD_LINE;
 	}
 
@@ -37,7 +37,7 @@ int vgextend(struct cmd_context *cmd, int argc, char **argv)
 	argv++;
 
 	if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE)) {
-		log_error("Can't get lock for orphan PVs");
+		log_error(0, "Can't get lock for orphan PVs");
 		return ECMD_FAILED;
 	}
 
diff --git a/tools/vgimport.c b/tools/vgimport.c
index 864a700..7ceb8bf 100644
--- a/tools/vgimport.c
+++ b/tools/vgimport.c
@@ -27,12 +27,12 @@ static int vgimport_single(struct cmd_context *cmd __attribute((unused)),
 		goto error;
 
 	if (!(vg_status(vg) & EXPORTED_VG)) {
-		log_error("Volume group \"%s\" is not exported", vg_name);
+		log_error(0, "Volume group \"%s\" is not exported", vg_name);
 		goto error;
 	}
 
 	if (vg_status(vg) & PARTIAL_VG) {
-		log_error("Volume group \"%s\" is partially missing", vg_name);
+		log_error(0, "Volume group \"%s\" is partially missing", vg_name);
 		goto error;
 	}
 
@@ -62,12 +62,12 @@ static int vgimport_single(struct cmd_context *cmd __attribute((unused)),
 int vgimport(struct cmd_context *cmd, int argc, char **argv)
 {
 	if (!argc && !arg_count(cmd, all_ARG)) {
-		log_error("Please supply volume groups or use -a for all.");
+		log_error(0, "Please supply volume groups or use -a for all.");
 		return ECMD_FAILED;
 	}
 
 	if (argc && arg_count(cmd, all_ARG)) {
-		log_error("No arguments permitted when using -a for all.");
+		log_error(0, "No arguments permitted when using -a for all.");
 		return ECMD_FAILED;
 	}
 
diff --git a/tools/vgmerge.c b/tools/vgmerge.c
index 4a9e377..ff9874f 100644
--- a/tools/vgmerge.c
+++ b/tools/vgmerge.c
@@ -23,7 +23,7 @@ static int _vgmerge_single(struct cmd_context *cmd, const char *vg_name_to,
 	int r = ECMD_FAILED;
 
 	if (!strcmp(vg_name_to, vg_name_from)) {
-		log_error("Duplicate volume group name \"%s\"", vg_name_from);
+		log_error(0, "Duplicate volume group name \"%s\"", vg_name_from);
 		return ECMD_FAILED;
 	}
 
@@ -75,7 +75,7 @@ static int _vgmerge_single(struct cmd_context *cmd, const char *vg_name_to,
 
 			if (id_equal(&lvid1->id[1], &lvid2->id[1])) {
 				if (!id_create(&lvid2->id[1])) {
-					log_error("Failed to generate new "
+					log_error(0, "Failed to generate new "
 						  "random LVID for %s",
 						  lvl2->lv->name);
 					goto bad;
@@ -129,7 +129,7 @@ int vgmerge(struct cmd_context *cmd, int argc, char **argv)
 	int ret = 0, ret_max = 0;
 
 	if (argc < 2) {
-		log_error("Please enter 2 or more volume groups to merge");
+		log_error(0, "Please enter 2 or more volume groups to merge");
 		return EINVALID_CMD_LINE;
 	}
 
diff --git a/tools/vgreduce.c b/tools/vgreduce.c
index 44010e3..ec84d62 100644
--- a/tools/vgreduce.c
+++ b/tools/vgreduce.c
@@ -21,7 +21,7 @@ static int _remove_pv(struct volume_group *vg, struct pv_list *pvl, int silent)
 	char uuid[64] __attribute((aligned(8)));
 
 	if (vg->pv_count == 1) {
-		log_error("Volume Groups must always contain at least one PV");
+		log_error(0, "Volume Groups must always contain at least one PV");
 		return 0;
 	}
 
@@ -32,7 +32,7 @@ static int _remove_pv(struct volume_group *vg, struct pv_list *pvl, int silent)
 
 	if (pvl->pv->pe_alloc_count) {
 		if (!silent)
-			log_error("LVs still present on PV with UUID %s: "
+			log_error(0, "LVs still present on PV with UUID %s: "
 				  "Can't remove from VG %s", uuid, vg->name);
 		return 0;
 	}
@@ -67,7 +67,7 @@ static int _remove_lv(struct cmd_context *cmd, struct logical_volume *lv,
 			    "(origin of %s)", snap_seg->origin->name, lv->name);
 
 		if (!test_mode() && !deactivate_lv(cmd, snap_seg->origin)) {
-			log_error("Failed to deactivate LV %s",
+			log_error(0, "Failed to deactivate LV %s",
 				  snap_seg->origin->name);
 			return 0;
 		}
@@ -84,7 +84,7 @@ static int _remove_lv(struct cmd_context *cmd, struct logical_volume *lv,
 
 		if (first && !test_mode() &&
 		    !deactivate_lv(cmd, snap_seg->origin)) {
-			log_error("Failed to deactivate LV %s",
+			log_error(0, "Failed to deactivate LV %s",
 				  snap_seg->origin->name);
 			return 0;
 		}
@@ -116,7 +116,7 @@ static int _remove_lv(struct cmd_context *cmd, struct logical_volume *lv,
 			return_0;
 
 		if (!(lvl = dm_pool_alloc(cmd->mem, sizeof(*lvl)))) {
-			log_error("lv_list alloc failed");
+			log_error(0, "lv_list alloc failed");
 			return 0;
 		}
 		lvl->lv = lv;
@@ -196,7 +196,7 @@ static int _make_vg_consistent(struct cmd_context *cmd, struct volume_group *vg)
 				    (pv->status & MISSING_PV)) {
 					if (arg_count(cmd, mirrorsonly_ARG) &&
 					    !(lv->status & MIRROR_IMAGE)) {
-						log_error("Non-mirror-image LV %s found: can't remove.", lv->name);
+						log_error(0, "Non-mirror-image LV %s found: can't remove.", lv->name);
 						only_mirror_images_found = 0;
 						continue;
 					}
@@ -210,7 +210,7 @@ static int _make_vg_consistent(struct cmd_context *cmd, struct volume_group *vg)
 	}
 
 	if (!only_mirror_images_found) {
-		log_error("Aborting because --mirrorsonly was specified.");
+		log_error(0, "Aborting because --mirrorsonly was specified.");
 		return 0;
 	}
 
@@ -234,7 +234,7 @@ static int _make_vg_consistent(struct cmd_context *cmd, struct volume_group *vg)
 
 	if (!dm_list_empty(&lvs_changed)) {
 		if (!vg_write(vg)) {
-			log_error("Failed to write out a consistent VG for %s",
+			log_error(0, "Failed to write out a consistent VG for %s",
 				  vg->name);
 			return 0;
 		}
@@ -249,7 +249,7 @@ static int _make_vg_consistent(struct cmd_context *cmd, struct volume_group *vg)
 		}
 
 		if (!vg_commit(vg)) {
-			log_error("Failed to commit consistent VG for %s",
+			log_error(0, "Failed to commit consistent VG for %s",
 				  vg->name);
 			vg_revert(vg);
 			return 0;
@@ -257,7 +257,7 @@ static int _make_vg_consistent(struct cmd_context *cmd, struct volume_group *vg)
 
 		if (!test_mode()) {
 			if (!resume_lvs(cmd, &lvs_changed)) {
-				log_error("Failed to resume LVs using error segments.");
+				log_error(0, "Failed to resume LVs using error segments.");
 				return 0;
 			}
 		}
@@ -310,13 +310,13 @@ static int _make_vg_consistent(struct cmd_context *cmd, struct volume_group *vg)
 					return_0;
 
 				if (!vg_write(vg)) {
-					log_error("Failed to write out updated "
+					log_error(0, "Failed to write out updated "
 						  "VG for %s", vg->name);
 					return 0;
 				}
 		
 				if (!vg_commit(vg)) {
-					log_error("Failed to commit updated VG "
+					log_error(0, "Failed to commit updated VG "
 						  "for %s", vg->name);
 					vg_revert(vg);
 					return 0;
@@ -348,7 +348,7 @@ static int _make_vg_consistent(struct cmd_context *cmd, struct volume_group *vg)
 					    lvl->lv->name);
 
 				if (!deactivate_lv(cmd, lvl->lv)) {
-					log_error("Failed to deactivate LV %s",
+					log_error(0, "Failed to deactivate LV %s",
 						  lvl->lv->name);
 					/*
 					 * We failed to deactivate.
@@ -386,18 +386,18 @@ static int _vgreduce_single(struct cmd_context *cmd, struct volume_group *vg,
 	const char *name = pv_dev_name(pv);
 
 	if (pv_pe_alloc_count(pv)) {
-		log_error("Physical volume \"%s\" still in use", name);
+		log_error(0, "Physical volume \"%s\" still in use", name);
 		return ECMD_FAILED;
 	}
 
 	if (vg->pv_count == 1) {
-		log_error("Can't remove final physical volume \"%s\" from "
+		log_error(0, "Can't remove final physical volume \"%s\" from "
 			  "volume group \"%s\"", name, vg->name);
 		return ECMD_FAILED;
 	}
 
 	if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE)) {
-		log_error("Can't get lock for orphan PVs");
+		log_error(0, "Can't get lock for orphan PVs");
 		return ECMD_FAILED;
 	}
 
@@ -415,7 +415,7 @@ static int _vgreduce_single(struct cmd_context *cmd, struct volume_group *vg,
 	pv->status = ALLOCATABLE_PV;
 
 	if (!dev_get_size(pv_dev(pv), &pv->size)) {
-		log_error("%s: Couldn't get size.", pv_dev_name(pv));
+		log_error(0, "%s: Couldn't get size.", pv_dev_name(pv));
 		goto bad;
 	}
 
@@ -430,19 +430,19 @@ static int _vgreduce_single(struct cmd_context *cmd, struct volume_group *vg,
 		goto bad;
 
 	if (!vg_split_mdas(cmd, vg, orphan_vg) || !vg->pv_count) {
-		log_error("Cannot remove final metadata area on \"%s\" from \"%s\"",
+		log_error(0, "Cannot remove final metadata area on \"%s\" from \"%s\"",
 			  name, vg->name);
 		goto bad;
 	}
 
 	if (!vg_write(vg) || !vg_commit(vg)) {
-		log_error("Removal of physical volume \"%s\" from "
+		log_error(0, "Removal of physical volume \"%s\" from "
 			  "\"%s\" failed", name, vg->name);
 		goto bad;
 	}
 
 	if (!pv_write(cmd, pv, NULL, INT64_C(-1))) {
-		log_error("Failed to clear metadata from physical "
+		log_error(0, "Failed to clear metadata from physical "
 			  "volume \"%s\" "
 			  "after removal from \"%s\"", name, vg->name);
 		goto bad;
@@ -467,34 +467,34 @@ int vgreduce(struct cmd_context *cmd, int argc, char **argv)
 	int saved_ignore_suspended_devices = ignore_suspended_devices();
 
 	if (!argc && !repairing) {
-		log_error("Please give volume group name and "
+		log_error(0, "Please give volume group name and "
 			  "physical volume paths");
 		return EINVALID_CMD_LINE;
 	}
 	
 	if (!argc && repairing) {
-		log_error("Please give volume group name");
+		log_error(0, "Please give volume group name");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (arg_count(cmd, mirrorsonly_ARG) && !repairing) {
-		log_error("--mirrorsonly requires --removemissing");
+		log_error(0, "--mirrorsonly requires --removemissing");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (argc == 1 && !arg_count(cmd, all_ARG) && !repairing) {
-		log_error("Please enter physical volume paths or option -a");
+		log_error(0, "Please enter physical volume paths or option -a");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (argc > 1 && arg_count(cmd, all_ARG)) {
-		log_error("Option -a and physical volume paths mutually "
+		log_error(0, "Option -a and physical volume paths mutually "
 			  "exclusive");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (argc > 1 && repairing) {
-		log_error("Please only specify the volume group");
+		log_error(0, "Please only specify the volume group");
 		return EINVALID_CMD_LINE;
 	}
 
@@ -503,7 +503,7 @@ int vgreduce(struct cmd_context *cmd, int argc, char **argv)
 	argc--;
 
 	if (!validate_name(vg_name)) {
-		log_error("Volume group name \"%s\" is invalid",
+		log_error(0, "Volume group name \"%s\" is invalid",
 			  vg_name);
 		return ECMD_FAILED;
 	}
@@ -525,7 +525,7 @@ int vgreduce(struct cmd_context *cmd, int argc, char **argv)
 
 	if (repairing) {
 		if (!vg_read_error(vg) && !vg_missing_pv_count(vg)) {
-			log_error("Volume group \"%s\" is already consistent",
+			log_error(0, "Volume group \"%s\" is already consistent",
 				  vg_name);
 			ret = ECMD_PROCESSED;
 			goto out;
@@ -552,7 +552,7 @@ int vgreduce(struct cmd_context *cmd, int argc, char **argv)
 			fixed = _consolidate_vg(cmd, vg);
 
 		if (!vg_write(vg) || !vg_commit(vg)) {
-			log_error("Failed to write out a consistent VG for %s",
+			log_error(0, "Failed to write out a consistent VG for %s",
 				  vg_name);
 			goto out;
 		}
diff --git a/tools/vgremove.c b/tools/vgremove.c
index 5956075..102415c 100644
--- a/tools/vgremove.c
+++ b/tools/vgremove.c
@@ -31,12 +31,12 @@ int vgremove(struct cmd_context *cmd, int argc, char **argv)
 	int ret;
 
 	if (!argc) {
-		log_error("Please enter one or more volume group paths");
+		log_error(0, "Please enter one or more volume group paths");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE)) {
-		log_error("Can't get lock for orphan PVs");
+		log_error(0, "Can't get lock for orphan PVs");
 		return ECMD_FAILED;
 	}
 
diff --git a/tools/vgrename.c b/tools/vgrename.c
index 57229e7..094bfb2 100644
--- a/tools/vgrename.c
+++ b/tools/vgrename.c
@@ -42,7 +42,7 @@ static int vg_rename_path(struct cmd_context *cmd, const char *old_vg_path,
 
 	/* Avoid duplicates */
 	if (!(vgids = get_vgids(cmd, 0)) || dm_list_empty(vgids)) {
-		log_error("No complete volume groups found");
+		log_error(0, "No complete volume groups found");
 		return 0;
 	}
 
@@ -53,7 +53,7 @@ static int vg_rename_path(struct cmd_context *cmd, const char *old_vg_path,
 			continue;
 		if (!strcmp(vg_name, vg_name_old)) {
 			if (match) {
-				log_error("Found more than one VG called %s. "
+				log_error(0, "Found more than one VG called %s. "
 					  "Please supply VG uuid.", vg_name_old);
 				return 0;
 			}
@@ -80,7 +80,7 @@ static int vg_rename_path(struct cmd_context *cmd, const char *old_vg_path,
 
 	if (lvs_in_vg_activated_by_uuid_only(vg)) {
 		unlock_and_release_vg(cmd, vg, vg_name_old);
-		log_error("Volume group \"%s\" still has active LVs",
+		log_error(0, "Volume group \"%s\" still has active LVs",
 			  vg_name_old);
 		/* FIXME Remove this restriction */
 		return 0;
@@ -92,12 +92,12 @@ static int vg_rename_path(struct cmd_context *cmd, const char *old_vg_path,
 
 	if (rc == FAILED_LOCKING) {
 		unlock_and_release_vg(cmd, vg, vg_name_old);
-		log_error("Can't get lock for %s", vg_name_new);
+		log_error(0, "Can't get lock for %s", vg_name_new);
 		return 0;
 	}
 
 	if (rc == FAILED_EXIST) {
-		log_error("New volume group \"%s\" already exists",
+		log_error(0, "New volume group \"%s\" already exists",
 			  vg_name_new);
 		unlock_and_release_vg(cmd, vg, vg_name_old);
 		return 0;
@@ -129,7 +129,7 @@ static int vg_rename_path(struct cmd_context *cmd, const char *old_vg_path,
 
 		else if (lvs_in_vg_activated_by_uuid_only(vg)) {
 			if (!vg_refresh_visible(cmd, vg)) {
-				log_error("Renaming \"%s\" to \"%s\" failed", 
+				log_error(0, "Renaming \"%s\" to \"%s\" failed", 
 					old_path, new_path);
 				goto error;
 			}
@@ -162,7 +162,7 @@ static int vg_rename_path(struct cmd_context *cmd, const char *old_vg_path,
 int vgrename(struct cmd_context *cmd, int argc, char **argv)
 {
 	if (argc != 2) {
-		log_error("Old and new volume group names need specifying");
+		log_error(0, "Old and new volume group names need specifying");
 		return EINVALID_CMD_LINE;
 	}
 
diff --git a/tools/vgscan.c b/tools/vgscan.c
index 769c5cf..cb79159 100644
--- a/tools/vgscan.c
+++ b/tools/vgscan.c
@@ -36,12 +36,12 @@ int vgscan(struct cmd_context *cmd, int argc, char **argv)
 	int maxret, ret;
 
 	if (argc) {
-		log_error("Too many parameters on command line");
+		log_error(0, "Too many parameters on command line");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (!lock_vol(cmd, VG_GLOBAL, LCK_VG_WRITE)) {
-		log_error("Unable to obtain global lock.");
+		log_error(0, "Unable to obtain global lock.");
 		return ECMD_FAILED;
 	}
 
diff --git a/tools/vgsplit.c b/tools/vgsplit.c
index 9cd90b8..9e8afc0 100644
--- a/tools/vgsplit.c
+++ b/tools/vgsplit.c
@@ -23,7 +23,7 @@ static int _move_pv(struct volume_group *vg_from, struct volume_group *vg_to,
 
 	/* FIXME: handle tags */
 	if (!(pvl = find_pv_in_vg(vg_from, pv_name))) {
-		log_error("Physical volume %s not in volume group %s",
+		log_error(0, "Physical volume %s not in volume group %s",
 			  pv_name, vg_from->name);
 		return 0;
 	}
@@ -55,7 +55,7 @@ static int _move_pvs_used_by_lv(struct volume_group *vg_from,
 
 	/* FIXME: handle tags */
 	if (!(lvl = find_lv_in_vg(vg_from, lv_name))) {
-		log_error("Logical volume %s not in volume group %s",
+		log_error(0, "Logical volume %s not in volume group %s",
 			  lv_name, vg_from->name);
 		return 0;
 	}
@@ -102,7 +102,7 @@ static int _move_one_lv(struct volume_group *vg_from,
 	dm_list_move(&vg_to->lvs, lvh);
 	
 	if (lv_is_active(lv)) {
-		log_error("Logical volume \"%s\" must be inactive", lv->name);
+		log_error(0, "Logical volume \"%s\" must be inactive", lv->name);
 		return 0;
 	}
 
@@ -139,7 +139,7 @@ static int _move_lvs(struct volume_group *vg_from, struct volume_group *vg_to)
 				pv = seg_pv(seg, s);
 				if (vg_with) {
 					if (!pv_is_in_vg(vg_with, pv)) {
-						log_error("Can't split Logical "
+						log_error(0, "Can't split Logical "
 							  "Volume %s between "
 							  "two Volume Groups",
 							  lv->name);
@@ -156,7 +156,7 @@ static int _move_lvs(struct volume_group *vg_from, struct volume_group *vg_to)
 					vg_with = vg_to;
 					continue;
 				}
-				log_error("Physical Volume %s not found",
+				log_error(0, "Physical Volume %s not found",
 					  pv_dev_name(pv));
 				return 0;
 			}
@@ -202,7 +202,7 @@ static int _move_snapshots(struct volume_group *vg_from,
 				continue;
 			if ((!cow_from && origin_from) ||
 			     (cow_from && !origin_from)) {
-				log_error("Can't split snapshot %s between"
+				log_error(0, "Can't split snapshot %s between"
 					  " two Volume Groups", seg->cow->name);
 				return 0;
 			}
@@ -249,7 +249,7 @@ static int _move_mirrors(struct volume_group *vg_from,
 		if ((seg_in && seg_in < seg->area_count) ||
 		    (seg_in && seg->log_lv && !log_in) ||
 		    (!seg_in && seg->log_lv && log_in)) {
-			log_error("Can't split mirror %s between "
+			log_error(0, "Can't split mirror %s between "
 				  "two Volume Groups", lv->name);
 			return 0;
 		}
@@ -287,13 +287,13 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv)
 	uint32_t rc;
 
 	if ((arg_count(cmd, name_ARG) + argc) < 3) {
-		log_error("Existing VG, new VG and either physical volumes "
+		log_error(0, "Existing VG, new VG and either physical volumes "
 			  "or logical volume required.");
 		return EINVALID_CMD_LINE;
 	}
 
 	if (arg_count(cmd, name_ARG) && (argc > 2)) {
-		log_error("A logical volume name cannot be given with "
+		log_error(0, "A logical volume name cannot be given with "
 			  "physical volumes.");
 		return ECMD_FAILED;
 	}
@@ -309,7 +309,7 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv)
 	argv += 2;
 
 	if (!strcmp(vg_name_to, vg_name_from)) {
-		log_error("Duplicate volume group name \"%s\"", vg_name_from);
+		log_error(0, "Duplicate volume group name \"%s\"", vg_name_from);
 		return ECMD_FAILED;
 	}
 
@@ -334,7 +334,7 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv)
 	 */
 	rc = vg_lock_newname(cmd, vg_name_to);
 	if (rc == FAILED_LOCKING) {
-		log_error("Can't get lock for %s", vg_name_to);
+		log_error(0, "Can't get lock for %s", vg_name_to);
 		unlock_and_release_vg(cmd, vg_from, vg_name_from);
 		return ECMD_FAILED;
 	}
@@ -349,7 +349,7 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv)
 			goto_bad;
 
 		if (new_vg_option_specified(cmd)) {
-			log_error("Volume group \"%s\" exists, but new VG "
+			log_error(0, "Volume group \"%s\" exists, but new VG "
 				    "option specified", vg_name_to);
 			goto_bad;
 		}
@@ -416,7 +416,7 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv)
 
 	/* Split metadata areas and check if both vgs have at least one area */
 	if (!(vg_split_mdas(cmd, vg_from, vg_to)) && vg_from->pv_count) {
-		log_error("Cannot split: Nowhere to store metadata for new Volume Group");
+		log_error(0, "Cannot split: Nowhere to store metadata for new Volume Group");
 		goto_bad;
 	}
 
@@ -463,7 +463,7 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv)
 		vg_to = vg_read_for_update(cmd, vg_name_to, NULL,
 					   READ_ALLOW_EXPORTED);
 		if (vg_read_error(vg_to)) {
-			log_error("Volume group \"%s\" became inconsistent: "
+			log_error(0, "Volume group \"%s\" became inconsistent: "
 				  "please fix manually", vg_name_to);
 			goto_bad;
 		}
-- 
1.6.2.5




More information about the lvm-devel mailing list