diff
+	int ret = 0;
 	if (!mem) {
 		struct io_tlb_pool *pool;
 
 		mem = kzalloc(sizeof(*mem), GFP_KERNEL);
 		if (!mem)
 			return -ENOMEM;
 		pool = &mem->defpool;
 
 		pool->slots = kcalloc(nslabs, sizeof(*pool->slots), GFP_KERNEL);
 		if (!pool->slots) {
-			kfree(mem);
-			return -ENOMEM;
+			ret = -ENOMEM;
+			goto err_free_mem;
 		}
 		pool->areas = kcalloc(nareas, sizeof(*pool->areas),
 				GFP_KERNEL);
 		if (!pool->areas) {
-			kfree(pool->slots);
-			kfree(mem);
-			return -ENOMEM;
+			ret = -ENOMEM;
+			goto err_free_slots;
 		}
+	}
+	/* ... rest of the function ... */
+	return ret;
+
+err_free_slots:
+	kfree(pool->slots);
+err_free_mem:
+	kfree(mem);
+	return ret;
