Index: uspace/srv/logger/initlvl.c
===================================================================
--- uspace/srv/logger/initlvl.c	(revision 90dc45860d434f077d0d99e8a76986bb1796922e)
+++ uspace/srv/logger/initlvl.c	(revision ae2c925a3139fa7eb0eba60f90669adaf86cc0ad)
@@ -62,7 +62,6 @@
 		return;
 
-	logger_log_t *log;
-	rc = find_or_create_log_and_acquire(key, 0, &log);
-	if (rc != EOK)
+	logger_log_t *log = find_or_create_log_and_acquire(key, 0);
+	if (log == NULL)
 		return;
 
Index: uspace/srv/logger/logger.h
===================================================================
--- uspace/srv/logger/logger.h	(revision 90dc45860d434f077d0d99e8a76986bb1796922e)
+++ uspace/srv/logger/logger.h	(revision ae2c925a3139fa7eb0eba60f90669adaf86cc0ad)
@@ -69,5 +69,5 @@
 
 logger_log_t *find_log_by_name_and_acquire(const char *name);
-int find_or_create_log_and_acquire(const char *, sysarg_t, logger_log_t **);
+logger_log_t *find_or_create_log_and_acquire(const char *, sysarg_t);
 logger_log_t *find_log_by_id_and_acquire(sysarg_t);
 bool shall_log_message(logger_log_t *, log_level_t);
Index: uspace/srv/logger/logs.c
===================================================================
--- uspace/srv/logger/logs.c	(revision 90dc45860d434f077d0d99e8a76986bb1796922e)
+++ uspace/srv/logger/logs.c	(revision ae2c925a3139fa7eb0eba60f90669adaf86cc0ad)
@@ -42,12 +42,10 @@
 
 
-static logger_log_t *find_log_by_name_and_parent_no_list_lock_and_acquire(const char *name, logger_log_t *parent)
+static logger_log_t *find_log_by_name_and_parent_no_list_lock(const char *name, logger_log_t *parent)
 {
 	list_foreach(log_list, it) {
 		logger_log_t *log = list_get_instance(it, logger_log_t, link);
-		if ((parent == log->parent) && (str_cmp(log->name, name) == 0)) {
-			fibril_mutex_lock(&log->guard);
+		if ((parent == log->parent) && (str_cmp(log->name, name) == 0))
 			return log;
-		}
 	}
 
@@ -71,66 +69,72 @@
 }
 
-int find_or_create_log_and_acquire(const char *name, sysarg_t parent_id, logger_log_t **log_out)
-{
-	int rc;
-	logger_log_t *result = NULL;
-	logger_log_t *parent = (logger_log_t *) parent_id;
-
-	fibril_mutex_lock(&log_list_guard);
-
-	result = find_log_by_name_and_parent_no_list_lock_and_acquire(name, parent);
-	if (result != NULL) {
-		rc = EOK;
-		goto leave;
-	}
-
-	result = calloc(1, sizeof(logger_log_t));
-	if (result == NULL) {
-		rc = ENOMEM;
-		goto leave;
-	}
-
-	result->logged_level = LOG_LEVEL_USE_DEFAULT;
+static logger_log_t *create_log_no_locking(const char *name, logger_log_t *parent)
+{
+	logger_log_t *result = calloc(1, sizeof(logger_log_t));
+	if (result == NULL)
+		return NULL;
+
 	result->name = str_dup(name);
+	if (result->name == NULL)
+		goto error;
+
+	/*
+	 * Notice that we create new dest as the last
+	 * operation that can fail and thus there is no code
+	 * to deallocate dest.
+	 */
 	if (parent == NULL) {
 		result->full_name = str_dup(name);
-		rc = create_dest(name, &result->dest);
+		if (result->full_name == NULL)
+			goto error;
+		int rc = create_dest(name, &result->dest);
 		if (rc != EOK)
-			goto error_result_allocated;
+			goto error;
 	} else {
-		rc = asprintf(&result->full_name, "%s/%s",
+		int rc = asprintf(&result->full_name, "%s/%s",
 		    parent->full_name, name);
 		if (rc < 0)
-			goto error_result_allocated;
+			goto error;
 		result->dest = parent->dest;
 	}
+
+	/* Following initializations cannot fail. */
+	result->logged_level = LOG_LEVEL_USE_DEFAULT;
+	fibril_mutex_initialize(&result->guard);
+	link_initialize(&result->link);
 	result->parent = parent;
-	fibril_mutex_initialize(&result->guard);
-
-	link_initialize(&result->link);
-
-	fibril_mutex_lock(&result->guard);
-
-	list_append(&result->link, &log_list);
-
-
-leave:
-	fibril_mutex_unlock(&log_list_guard);
-
-	if (rc == EOK) {
-		assert(fibril_mutex_is_locked(&result->guard));
-		*log_out = result;
-	}
-
-	return rc;
-
-error_result_allocated:
+
+	return result;
+
+error:
 	free(result->name);
 	free(result->full_name);
 	free(result);
-
-	fibril_mutex_unlock(&log_list_guard);
-
-	return rc;
+	return NULL;
+
+}
+
+logger_log_t *find_or_create_log_and_acquire(const char *name, sysarg_t parent_id)
+{
+	logger_log_t *result = NULL;
+	logger_log_t *parent = (logger_log_t *) parent_id;
+
+	fibril_mutex_lock(&log_list_guard);
+
+	result = find_log_by_name_and_parent_no_list_lock(name, parent);
+	if (result == NULL) {
+		result = create_log_no_locking(name, parent);
+		if (result == NULL)
+			goto leave;
+	}
+
+	fibril_mutex_lock(&result->guard);
+
+	list_append(&result->link, &log_list);
+
+leave:
+	fibril_mutex_unlock(&log_list_guard);
+
+	return result;
 }
 
Index: uspace/srv/logger/writer.c
===================================================================
--- uspace/srv/logger/writer.c	(revision 90dc45860d434f077d0d99e8a76986bb1796922e)
+++ uspace/srv/logger/writer.c	(revision ae2c925a3139fa7eb0eba60f90669adaf86cc0ad)
@@ -56,7 +56,5 @@
 		return NULL;
 
-	logger_log_t *log = NULL;
-	rc = find_or_create_log_and_acquire(name, parent, &log);
-	if (rc)
+	logger_log_t *log = find_or_create_log_and_acquire(name, parent);
 
 	free(name);
