[PATCH] [11/11] SYSCTL: Convert IRDA text sysctl to RCU

From: Andi Kleen
Date: Sun Dec 20 2009 - 20:21:40 EST



This avoids races with lockless sysctl

Cc: samuel@xxxxxxxxxx

---
net/irda/irlmp.c | 3 +--
net/irda/irsysctl.c | 9 ++++++---
2 files changed, 7 insertions(+), 5 deletions(-)

Index: linux-2.6.33-rc1-ak/net/irda/irlmp.c
===================================================================
--- linux-2.6.33-rc1-ak.orig/net/irda/irlmp.c
+++ linux-2.6.33-rc1-ak/net/irda/irlmp.c
@@ -56,7 +56,7 @@ int sysctl_discovery = 0;
int sysctl_discovery_timeout = 3; /* 3 seconds by default */
int sysctl_discovery_slots = 6; /* 6 slots by default */
int sysctl_lap_keepalive_time = LM_IDLE_TIMEOUT * 1000 / HZ;
-char sysctl_devname[65];
+char *sysctl_devname = "Linux";

const char *irlmp_reasons[] = {
"ERROR, NOT USED",
@@ -101,7 +101,6 @@ int __init irlmp_init(void)
spin_lock_init(&irlmp->cachelog->hb_spinlock);

irlmp->last_lsap_sel = 0x0f; /* Reserved 0x00-0x0f */
- strcpy(sysctl_devname, "Linux");

init_timer(&irlmp->discovery_timer);

Index: linux-2.6.33-rc1-ak/net/irda/irsysctl.c
===================================================================
--- linux-2.6.33-rc1-ak.orig/net/irda/irsysctl.c
+++ linux-2.6.33-rc1-ak/net/irda/irsysctl.c
@@ -27,6 +27,7 @@
#include <linux/ctype.h>
#include <linux/sysctl.h>
#include <linux/init.h>
+#include <linux/rcupdate.h>

#include <net/irda/irda.h> /* irda_debug */
#include <net/irda/irlmp.h>
@@ -38,7 +39,7 @@ extern int sysctl_discovery_slots;
extern int sysctl_discovery_timeout;
extern int sysctl_slot_timeout;
extern int sysctl_fast_poll_increase;
-extern char sysctl_devname[];
+extern char *sysctl_devname;
extern int sysctl_max_baud_rate;
extern int sysctl_min_tx_turn_time;
extern int sysctl_max_tx_data_size;
@@ -78,13 +79,15 @@ static int do_devname(ctl_table *table,
{
int ret;

- ret = proc_dostring(table, write, buffer, lenp, ppos);
+ ret = proc_rcu_string(table, write, buffer, lenp, ppos);
if (ret == 0 && write) {
struct ias_value *val;

+ rcu_read_lock();
val = irias_new_string_value(sysctl_devname);
if (val)
irias_object_change_attribute("Device", "DeviceName", val);
+ rcu_read_unlock();
}
return ret;
}
@@ -121,7 +124,7 @@ static ctl_table irda_table[] = {
},
{
.procname = "devname",
- .data = sysctl_devname,
+ .data = &sysctl_devname,
.maxlen = 65,
.mode = 0644,
.proc_handler = do_devname,
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/