From nobody Sat Feb 7 21:11:54 2026 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2124530ACFF; Sun, 16 Nov 2025 15:35:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763307331; cv=none; b=bYc7ZojH1XBWpRHLqUg6uCqwFARyfHM2j4VMeiC+kjm2xhSKy5qMMENiPg8ZWw8WHFvFEBd4zGpOAuXTFph5/LMXW02L29jWCacuFqLnXifHfoBRYaig7QsINEDN0zResOBo9nqI0S1ux5YSHjGX56dRn5MSm7GX6AU9NdnEKB8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763307331; c=relaxed/simple; bh=jE5CLOdngilNCk2xW/6WyHceE/D+Y7M6FypvSBe/dp4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mNXlKCAOmzTog+fzviTka7TK3LcNYud0k+dnTmyttQclLPjFx91526v4LTgmT05eFEZ2ct6o3hVIqYxKgEHRs3N+W6i+JlzVgCI3qQZghtUD86pAPb/IPZgNtlZeC+bg3jXlFxrH3YnzMnY01glGan3HGSdvn6g0+InBk9jqLp4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=GVx1A/uL; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=VAHh3/bV; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="GVx1A/uL"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="VAHh3/bV" From: Nam Cao DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1763307322; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1kWrUXN5HQBr7r6r5KX/Cf7xKxvk1/tdF/q9prsBnvI=; b=GVx1A/uL4wsMncIeagQm/3+jifiqcVcix7iVh0p4Nxiy91KD4WeSkhshTQO6c8P33EeUEs laIGlZKEwuSUU6iMj9Dd/k+o82dUwiXiHzBEt3WOQYt1/YDBBfo1iYYqki+syHTIHSSajR ZDfX1dIfo4LSdYRQlH7iOphrK3xqm3dWqEQDM8F+AbS6R0fITHFvh4h/OMa8LzFVT1nt7V IM7mj+y97NBdJPCABWM1sk1nqjrsMwSI7VmBpuwLPFBVKb/F1E9xtnhrDtsMZuCCOrlkMf 25TC4f7u/31OhYg5grwfIXNxxX7GPTaQFi/2X24yVNaRVsspjUGWiY9d0ZMSow== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1763307322; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1kWrUXN5HQBr7r6r5KX/Cf7xKxvk1/tdF/q9prsBnvI=; b=VAHh3/bV7ceaz/5CSqLCLMVL66vjYtI3vkAJGsgsR3yxkC0EyHHHN5VlkX97WXf+0roAY5 xEtQ08xUDeYF4rAQ== To: Gabriele Monaco , Steven Rostedt Cc: Masami Hiramatsu , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org, linux-kernel@vger.kernel.org, Nam Cao Subject: [PATCH 1/2] rv: Convert to use lock guard Date: Sun, 16 Nov 2025 15:35:11 +0000 Message-ID: In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Convert to use lock guard to tidy up the code. Signed-off-by: Nam Cao --- kernel/trace/rv/rv.c | 39 ++++++++++++----------------------- kernel/trace/rv/rv_reactors.c | 26 +++++++---------------- 2 files changed, 20 insertions(+), 45 deletions(-) diff --git a/kernel/trace/rv/rv.c b/kernel/trace/rv/rv.c index 43e9ea473cda..b1059a3cf4fa 100644 --- a/kernel/trace/rv/rv.c +++ b/kernel/trace/rv/rv.c @@ -375,15 +375,13 @@ static ssize_t monitor_enable_write_data(struct file = *filp, const char __user *u if (retval) return retval; =20 - mutex_lock(&rv_interface_lock); + guard(mutex)(&rv_interface_lock); =20 if (val) retval =3D rv_enable_monitor(mon); else retval =3D rv_disable_monitor(mon); =20 - mutex_unlock(&rv_interface_lock); - return retval ? : count; } =20 @@ -568,7 +566,7 @@ static void disable_all_monitors(void) struct rv_monitor *mon; int enabled =3D 0; =20 - mutex_lock(&rv_interface_lock); + guard(mutex)(&rv_interface_lock); =20 list_for_each_entry(mon, &rv_monitors_list, list) enabled +=3D __rv_disable_monitor(mon, false); @@ -581,8 +579,6 @@ static void disable_all_monitors(void) */ tracepoint_synchronize_unregister(); } - - mutex_unlock(&rv_interface_lock); } =20 static int enabled_monitors_open(struct inode *inode, struct file *file) @@ -623,7 +619,7 @@ static ssize_t enabled_monitors_write(struct file *filp= , const char __user *user if (!len) return count; =20 - mutex_lock(&rv_interface_lock); + guard(mutex)(&rv_interface_lock); =20 retval =3D -EINVAL; =20 @@ -644,13 +640,11 @@ static ssize_t enabled_monitors_write(struct file *fi= lp, const char __user *user else retval =3D rv_disable_monitor(mon); =20 - if (!retval) - retval =3D count; - - break; + if (retval) + return retval; + return count; } =20 - mutex_unlock(&rv_interface_lock); return retval; } =20 @@ -737,7 +731,7 @@ static ssize_t monitoring_on_write_data(struct file *fi= lp, const char __user *us if (retval) return retval; =20 - mutex_lock(&rv_interface_lock); + guard(mutex)(&rv_interface_lock); =20 if (val) turn_monitoring_on_with_reset(); @@ -750,8 +744,6 @@ static ssize_t monitoring_on_write_data(struct file *fi= lp, const char __user *us */ tracepoint_synchronize_unregister(); =20 - mutex_unlock(&rv_interface_lock); - return count; } =20 @@ -784,28 +776,26 @@ int rv_register_monitor(struct rv_monitor *monitor, s= truct rv_monitor *parent) return -EINVAL; } =20 - mutex_lock(&rv_interface_lock); + guard(mutex)(&rv_interface_lock); =20 list_for_each_entry(r, &rv_monitors_list, list) { if (strcmp(monitor->name, r->name) =3D=3D 0) { pr_info("Monitor %s is already registered\n", monitor->name); - retval =3D -EEXIST; - goto out_unlock; + return -EEXIST; } } =20 if (parent && rv_is_nested_monitor(parent)) { pr_info("Parent monitor %s is already nested, cannot nest further\n", parent->name); - retval =3D -EINVAL; - goto out_unlock; + return -EINVAL; } =20 monitor->parent =3D parent; =20 retval =3D create_monitor_dir(monitor, parent); if (retval) - goto out_unlock; + return retval; =20 /* keep children close to the parent for easier visualisation */ if (parent) @@ -813,9 +803,7 @@ int rv_register_monitor(struct rv_monitor *monitor, str= uct rv_monitor *parent) else list_add_tail(&monitor->list, &rv_monitors_list); =20 -out_unlock: - mutex_unlock(&rv_interface_lock); - return retval; + return 0; } =20 /** @@ -826,13 +814,12 @@ int rv_register_monitor(struct rv_monitor *monitor, s= truct rv_monitor *parent) */ int rv_unregister_monitor(struct rv_monitor *monitor) { - mutex_lock(&rv_interface_lock); + guard(mutex)(&rv_interface_lock); =20 rv_disable_monitor(monitor); list_del(&monitor->list); destroy_monitor_dir(monitor); =20 - mutex_unlock(&rv_interface_lock); return 0; } =20 diff --git a/kernel/trace/rv/rv_reactors.c b/kernel/trace/rv/rv_reactors.c index d32859fec238..37d1d37a27a3 100644 --- a/kernel/trace/rv/rv_reactors.c +++ b/kernel/trace/rv/rv_reactors.c @@ -232,9 +232,7 @@ monitor_reactors_write(struct file *file, const char __= user *user_buf, seq_f =3D file->private_data; mon =3D seq_f->private; =20 - mutex_lock(&rv_interface_lock); - - retval =3D -EINVAL; + guard(mutex)(&rv_interface_lock); =20 list_for_each_entry(reactor, &rv_reactors_list, list) { if (strcmp(ptr, reactor->name) !=3D 0) @@ -242,13 +240,10 @@ monitor_reactors_write(struct file *file, const char = __user *user_buf, =20 monitor_swap_reactors(mon, reactor); =20 - retval =3D count; - break; + return count; } =20 - mutex_unlock(&rv_interface_lock); - - return retval; + return -EINVAL; } =20 /* @@ -309,18 +304,14 @@ static int __rv_register_reactor(struct rv_reactor *r= eactor) */ int rv_register_reactor(struct rv_reactor *reactor) { - int retval =3D 0; - if (strlen(reactor->name) >=3D MAX_RV_REACTOR_NAME_SIZE) { pr_info("Reactor %s has a name longer than %d\n", reactor->name, MAX_RV_MONITOR_NAME_SIZE); return -EINVAL; } =20 - mutex_lock(&rv_interface_lock); - retval =3D __rv_register_reactor(reactor); - mutex_unlock(&rv_interface_lock); - return retval; + guard(mutex)(&rv_interface_lock); + return __rv_register_reactor(reactor); } =20 /** @@ -331,9 +322,8 @@ int rv_register_reactor(struct rv_reactor *reactor) */ int rv_unregister_reactor(struct rv_reactor *reactor) { - mutex_lock(&rv_interface_lock); + guard(mutex)(&rv_interface_lock); list_del(&reactor->list); - mutex_unlock(&rv_interface_lock); return 0; } =20 @@ -389,7 +379,7 @@ static ssize_t reacting_on_write_data(struct file *filp= , const char __user *user if (retval) return retval; =20 - mutex_lock(&rv_interface_lock); + guard(mutex)(&rv_interface_lock); =20 if (val) turn_reacting_on(); @@ -402,8 +392,6 @@ static ssize_t reacting_on_write_data(struct file *filp= , const char __user *user */ tracepoint_synchronize_unregister(); =20 - mutex_unlock(&rv_interface_lock); - return count; } =20 --=20 2.51.0 From nobody Sat Feb 7 21:11:54 2026 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 211C72F90CE; Sun, 16 Nov 2025 15:35:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763307331; cv=none; b=dMLsbnPJZQajQTCHJKiaLjpv5P80EzFHIzibFouv/0ls9BVfcyngwRdGuKgz4VbUKzhTth/fFPO1X9uBlz770Buphgvm+6hI/EubOmDm11NypGd+roznH/DtvnOMEWOD9MpjHoAtb2RVTfCf4IRChfoLavbfKX0x1HtMtqh6D/M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763307331; c=relaxed/simple; bh=1AUDK2k6BYXs9Ocop6CTNDxSsPHbU0eFMhJqIPeQSxk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HO2wGLrZBaEaQv+5+Yt9IHBED0lehhdcs/N87SYqeHCMmUuGDcpvO6TQOJxDfe4uMPK/E+uA0wFWwocfQQfGajaf44i3+aiU414zeEkypPAS9wFibYZD97vAdFoSj5i2rYfenarcTgICzs6VQ+Ux9U+5pGC1SNaimmljBWZPZa4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=wLkuAWOy; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=PfMDTDyl; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="wLkuAWOy"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="PfMDTDyl" From: Nam Cao DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1763307323; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Mdj6MrQjodzZlCz5/uyCgL71sBo/Om3/GSK5b71/bpg=; b=wLkuAWOywRTeCMTOGwKvcSVEvvNCzJgq5jZf8N/PHrlLmpIfk9PL8lfxXiRNT1Hn9NOFo4 rbz2IQp0r2ih6IsLoxmBoqPgwYO1jWCkKWJv87WnhlkbnR/k9XLBsOTrxeBUvb3hI6Z86i INpyi7yr5PQEpeybO2lmVsGB6mgbQHuplroAOgE0iGtzHGhW4eEu6+6XeAd1XAS9PDtv7z w2uKSnvqmOAyd8jsTpXtS3apOoDuvQYYcm4Ih9vTzWzwXLAxGSdGBJzugXpR90m2DFTxuK KPqCdOMiob7OGbrHqb1fnZsfx7gkmAxamKK3Gemm2B3moFrwVCkXV6o3yM/hOA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1763307323; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Mdj6MrQjodzZlCz5/uyCgL71sBo/Om3/GSK5b71/bpg=; b=PfMDTDylppHVWew/70IaWcD05WFwVKvh8HD3iAy1hW3ovwzwCshHCGFMgd0ujHN0fh2zDJ 92RJGdSRDsf9H1Cw== To: Gabriele Monaco , Steven Rostedt Cc: Masami Hiramatsu , Mathieu Desnoyers , linux-trace-kernel@vger.kernel.org, linux-kernel@vger.kernel.org, Nam Cao Subject: [PATCH 2/2] rv: Convert to use __free Date: Sun, 16 Nov 2025 15:35:12 +0000 Message-ID: <6b2a618815b45ac4ac09976ef4fb0bd3635c143d.1763306824.git.namcao@linutronix.de> In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Convert to use __free to tidy up the code. Signed-off-by: Nam Cao --- kernel/trace/rv/rv.c | 65 +++++++++++++++-------------------- kernel/trace/rv/rv.h | 6 ++-- kernel/trace/rv/rv_reactors.c | 32 ++++++++--------- 3 files changed, 46 insertions(+), 57 deletions(-) diff --git a/kernel/trace/rv/rv.c b/kernel/trace/rv/rv.c index b1059a3cf4fa..e83dc9f0c7bb 100644 --- a/kernel/trace/rv/rv.c +++ b/kernel/trace/rv/rv.c @@ -420,35 +420,28 @@ static const struct file_operations interface_desc_fo= ps =3D { static int create_monitor_dir(struct rv_monitor *mon, struct rv_monitor *p= arent) { struct dentry *root =3D parent ? parent->root_d : get_monitors_root(); - const char *name =3D mon->name; + struct dentry *dir __free(rv_remove) =3D rv_create_dir(mon->name, root); struct dentry *tmp; int retval; =20 - mon->root_d =3D rv_create_dir(name, root); - if (!mon->root_d) + if (!dir) return -ENOMEM; =20 - tmp =3D rv_create_file("enable", RV_MODE_WRITE, mon->root_d, mon, &interf= ace_enable_fops); - if (!tmp) { - retval =3D -ENOMEM; - goto out_remove_root; - } + tmp =3D rv_create_file("enable", RV_MODE_WRITE, dir, mon, &interface_enab= le_fops); + if (!tmp) + return -ENOMEM; =20 - tmp =3D rv_create_file("desc", RV_MODE_READ, mon->root_d, mon, &interface= _desc_fops); - if (!tmp) { - retval =3D -ENOMEM; - goto out_remove_root; - } + tmp =3D rv_create_file("desc", RV_MODE_READ, dir, mon, &interface_desc_fo= ps); + if (!tmp) + return -ENOMEM; =20 - retval =3D reactor_populate_monitor(mon); + retval =3D reactor_populate_monitor(mon, dir); if (retval) - goto out_remove_root; + return retval; =20 + mon->root_d =3D dir; + retain_and_null_ptr(dir); return 0; - -out_remove_root: - rv_remove(mon->root_d); - return retval; } =20 /* @@ -827,39 +820,37 @@ int __init rv_init_interface(void) { struct dentry *tmp; int retval; + struct dentry *root_dir __free(rv_remove) =3D rv_create_dir("rv", NULL); =20 - rv_root.root_dir =3D rv_create_dir("rv", NULL); - if (!rv_root.root_dir) - goto out_err; + if (!root_dir) + return 1; =20 - rv_root.monitors_dir =3D rv_create_dir("monitors", rv_root.root_dir); + rv_root.monitors_dir =3D rv_create_dir("monitors", root_dir); if (!rv_root.monitors_dir) - goto out_err; + return 1; =20 - tmp =3D rv_create_file("available_monitors", RV_MODE_READ, rv_root.root_d= ir, NULL, + tmp =3D rv_create_file("available_monitors", RV_MODE_READ, root_dir, NULL, &available_monitors_ops); if (!tmp) - goto out_err; + return 1; =20 - tmp =3D rv_create_file("enabled_monitors", RV_MODE_WRITE, rv_root.root_di= r, NULL, + tmp =3D rv_create_file("enabled_monitors", RV_MODE_WRITE, root_dir, NULL, &enabled_monitors_ops); if (!tmp) - goto out_err; + return 1; =20 - tmp =3D rv_create_file("monitoring_on", RV_MODE_WRITE, rv_root.root_dir, = NULL, + tmp =3D rv_create_file("monitoring_on", RV_MODE_WRITE, root_dir, NULL, &monitoring_on_fops); if (!tmp) - goto out_err; - retval =3D init_rv_reactors(rv_root.root_dir); + return 1; + retval =3D init_rv_reactors(root_dir); if (retval) - goto out_err; + return 1; =20 turn_monitoring_on(); =20 - return 0; + rv_root.root_dir =3D root_dir; + retain_and_null_ptr(root_dir); =20 -out_err: - rv_remove(rv_root.root_dir); - printk(KERN_ERR "RV: Error while creating the RV interface\n"); - return 1; + return 0; } diff --git a/kernel/trace/rv/rv.h b/kernel/trace/rv/rv.h index 1485a70c1bf4..8661d1b6ede4 100644 --- a/kernel/trace/rv/rv.h +++ b/kernel/trace/rv/rv.h @@ -17,6 +17,8 @@ struct rv_interface { #define rv_create_file tracefs_create_file #define rv_remove tracefs_remove =20 +DEFINE_FREE(rv_remove, struct dentry *, rv_remove(_T)); + #define MAX_RV_MONITOR_NAME_SIZE 32 #define MAX_RV_REACTOR_NAME_SIZE 32 =20 @@ -30,10 +32,10 @@ bool rv_is_container_monitor(struct rv_monitor *mon); bool rv_is_nested_monitor(struct rv_monitor *mon); =20 #ifdef CONFIG_RV_REACTORS -int reactor_populate_monitor(struct rv_monitor *mon); +int reactor_populate_monitor(struct rv_monitor *mon, struct dentry *root); int init_rv_reactors(struct dentry *root_dir); #else -static inline int reactor_populate_monitor(struct rv_monitor *mon) +static inline int reactor_populate_monitor(struct rv_monitor *mon, struct = dentry *root) { return 0; } diff --git a/kernel/trace/rv/rv_reactors.c b/kernel/trace/rv/rv_reactors.c index 37d1d37a27a3..ce7d22cbde57 100644 --- a/kernel/trace/rv/rv_reactors.c +++ b/kernel/trace/rv/rv_reactors.c @@ -404,14 +404,15 @@ static const struct file_operations reacting_on_fops = =3D { /** * reactor_populate_monitor - creates per monitor reactors file * @mon: The monitor. + * @root: The directory of the monitor. * * Returns 0 if successful, error otherwise. */ -int reactor_populate_monitor(struct rv_monitor *mon) +int reactor_populate_monitor(struct rv_monitor *mon, struct dentry *root) { struct dentry *tmp; =20 - tmp =3D rv_create_file("reactors", RV_MODE_WRITE, mon->root_d, mon, &moni= tor_reactors_ops); + tmp =3D rv_create_file("reactors", RV_MODE_WRITE, root, mon, &monitor_rea= ctors_ops); if (!tmp) return -ENOMEM; =20 @@ -438,30 +439,25 @@ static struct rv_reactor rv_nop =3D { =20 int init_rv_reactors(struct dentry *root_dir) { - struct dentry *available, *reacting; int retval; =20 - available =3D rv_create_file("available_reactors", RV_MODE_READ, root_dir= , NULL, - &available_reactors_ops); - if (!available) - goto out_err; + struct dentry *available __free(rv_remove) =3D + rv_create_file("available_reactors", RV_MODE_READ, root_dir, + NULL, &available_reactors_ops); =20 - reacting =3D rv_create_file("reacting_on", RV_MODE_WRITE, root_dir, NULL,= &reacting_on_fops); - if (!reacting) - goto rm_available; + struct dentry *reacting =3D + rv_create_file("reacting_on", RV_MODE_WRITE, root_dir, NULL, &reacting_o= n_fops); + + if (!reacting || !available) + return -ENOMEM; =20 retval =3D __rv_register_reactor(&rv_nop); if (retval) - goto rm_reacting; + return retval; =20 turn_reacting_on(); =20 + retain_and_null_ptr(available); + retain_and_null_ptr(reacting); return 0; - -rm_reacting: - rv_remove(reacting); -rm_available: - rv_remove(available); -out_err: - return -ENOMEM; } --=20 2.51.0