Index: kernel/generic/src/sysinfo/stats.c
===================================================================
--- kernel/generic/src/sysinfo/stats.c	(revision dfa4be625ce02c0a9d62197b2b62b4c8d6043bf3)
+++ kernel/generic/src/sysinfo/stats.c	(revision 28ca31edbe1636231b006df50ab0d40aec06f59d)
@@ -221,5 +221,5 @@
 	stats_task->virtmem = get_task_virtmem(task->as);
 	stats_task->resmem = get_task_resmem(task->as);
-	stats_task->threads = atomic_load(&task->refcount);
+	stats_task->threads = atomic_load(&task->lifecount);
 	task_get_accounting(task, &(stats_task->ucycles),
 	    &(stats_task->kcycles));
@@ -511,6 +511,7 @@
 {
 	/* Initially no return value */
-	sysinfo_return_t ret;
-	ret.tag = SYSINFO_VAL_UNDEFINED;
+	sysinfo_return_t ret = {
+		.tag = SYSINFO_VAL_UNDEFINED,
+	};
 
 	/* Parse the task ID */
@@ -519,13 +520,7 @@
 		return ret;
 
-	/* Messing with task structures, avoid deadlock */
-	irq_spinlock_lock(&tasks_lock, true);
-
 	task_t *task = task_find_by_id(task_id);
-	if (task == NULL) {
-		/* No task with this ID */
-		irq_spinlock_unlock(&tasks_lock, true);
+	if (!task)
 		return ret;
-	}
 
 	if (dry_run) {
@@ -533,28 +528,21 @@
 		ret.data.data = NULL;
 		ret.data.size = sizeof(stats_task_t);
-
-		irq_spinlock_unlock(&tasks_lock, true);
 	} else {
 		/* Allocate stats_task_t structure */
-		stats_task_t *stats_task =
-		    (stats_task_t *) malloc(sizeof(stats_task_t));
-		if (stats_task == NULL) {
-			irq_spinlock_unlock(&tasks_lock, true);
-			return ret;
+		stats_task_t *stats_task = malloc(sizeof(stats_task_t));
+
+		if (stats_task != NULL) {
+			/* Correct return value */
+			ret.tag = SYSINFO_VAL_FUNCTION_DATA;
+			ret.data.data = stats_task;
+			ret.data.size = sizeof(stats_task_t);
+
+			irq_spinlock_lock(&task->lock, true);
+			produce_stats_task(task, stats_task);
+			irq_spinlock_unlock(&task->lock, true);
 		}
-
-		/* Correct return value */
-		ret.tag = SYSINFO_VAL_FUNCTION_DATA;
-		ret.data.data = (void *) stats_task;
-		ret.data.size = sizeof(stats_task_t);
-
-		/* Hand-over-hand locking */
-		irq_spinlock_exchange(&tasks_lock, &task->lock);
-
-		produce_stats_task(task, stats_task);
-
-		irq_spinlock_unlock(&task->lock, true);
-	}
-
+	}
+
+	task_release(task);
 	return ret;
 }
