diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2010-08-12 01:04:27 -0400 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2010-08-11 09:34:31 -0400 |
commit | d6d1b650ae6acce73d55dd0246de22180303ae73 (patch) | |
tree | 7a342999c119a5ee6395966cee91ddf5186f5665 /arch | |
parent | dca41306395eab37e222ff9e72765e692fcc7251 (diff) |
param: simple locking for sysfs-writable charp parameters
Since the writing to sysfs can free the old one, we need to block that
when we access the charp variables.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Reviewed-by: Takashi Iwai <tiwai@suse.de>
Tested-by: Phil Carmody <ext-phil.2.carmody@nokia.com>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: Dan Williams <dcbw@redhat.com>
Cc: John W. Linville <linville@tuxdriver.com>
Cc: Jing Huang <huangj@brocade.com>
Cc: James E.J. Bottomley <James.Bottomley@suse.de>
Cc: Greg Kroah-Hartman <gregkh@suse.de>
Cc: Johannes Berg <johannes@sipsolutions.net>
Cc: David S. Miller <davem@davemloft.net>
Cc: user-mode-linux-devel@lists.sourceforge.net
Cc: libertas-dev@lists.infradead.org
Cc: linux-wireless@vger.kernel.org
Cc: netdev@vger.kernel.org
Cc: linux-scsi@vger.kernel.org
Cc: linux-usb@vger.kernel.org
Diffstat (limited to 'arch')
-rw-r--r-- | arch/um/drivers/hostaudio_kern.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/arch/um/drivers/hostaudio_kern.c b/arch/um/drivers/hostaudio_kern.c index 68142df76608..0c46e398cd8f 100644 --- a/arch/um/drivers/hostaudio_kern.c +++ b/arch/um/drivers/hostaudio_kern.c | |||
@@ -187,7 +187,9 @@ static int hostaudio_open(struct inode *inode, struct file *file) | |||
187 | int ret; | 187 | int ret; |
188 | 188 | ||
189 | #ifdef DEBUG | 189 | #ifdef DEBUG |
190 | kparam_block_sysfs_write(dsp); | ||
190 | printk(KERN_DEBUG "hostaudio: open called (host: %s)\n", dsp); | 191 | printk(KERN_DEBUG "hostaudio: open called (host: %s)\n", dsp); |
192 | kparam_unblock_sysfs_write(dsp); | ||
191 | #endif | 193 | #endif |
192 | 194 | ||
193 | state = kmalloc(sizeof(struct hostaudio_state), GFP_KERNEL); | 195 | state = kmalloc(sizeof(struct hostaudio_state), GFP_KERNEL); |
@@ -199,9 +201,11 @@ static int hostaudio_open(struct inode *inode, struct file *file) | |||
199 | if (file->f_mode & FMODE_WRITE) | 201 | if (file->f_mode & FMODE_WRITE) |
200 | w = 1; | 202 | w = 1; |
201 | 203 | ||
204 | kparam_block_sysfs_write(dsp); | ||
202 | lock_kernel(); | 205 | lock_kernel(); |
203 | ret = os_open_file(dsp, of_set_rw(OPENFLAGS(), r, w), 0); | 206 | ret = os_open_file(dsp, of_set_rw(OPENFLAGS(), r, w), 0); |
204 | unlock_kernel(); | 207 | unlock_kernel(); |
208 | kparam_unblock_sysfs_write(dsp); | ||
205 | 209 | ||
206 | if (ret < 0) { | 210 | if (ret < 0) { |
207 | kfree(state); | 211 | kfree(state); |
@@ -258,13 +262,17 @@ static int hostmixer_open_mixdev(struct inode *inode, struct file *file) | |||
258 | if (file->f_mode & FMODE_WRITE) | 262 | if (file->f_mode & FMODE_WRITE) |
259 | w = 1; | 263 | w = 1; |
260 | 264 | ||
265 | kparam_block_sysfs_write(mixer); | ||
261 | lock_kernel(); | 266 | lock_kernel(); |
262 | ret = os_open_file(mixer, of_set_rw(OPENFLAGS(), r, w), 0); | 267 | ret = os_open_file(mixer, of_set_rw(OPENFLAGS(), r, w), 0); |
263 | unlock_kernel(); | 268 | unlock_kernel(); |
269 | kparam_unblock_sysfs_write(mixer); | ||
264 | 270 | ||
265 | if (ret < 0) { | 271 | if (ret < 0) { |
272 | kparam_block_sysfs_write(dsp); | ||
266 | printk(KERN_ERR "hostaudio_open_mixdev failed to open '%s', " | 273 | printk(KERN_ERR "hostaudio_open_mixdev failed to open '%s', " |
267 | "err = %d\n", dsp, -ret); | 274 | "err = %d\n", dsp, -ret); |
275 | kparam_unblock_sysfs_write(dsp); | ||
268 | kfree(state); | 276 | kfree(state); |
269 | return ret; | 277 | return ret; |
270 | } | 278 | } |
@@ -320,8 +328,10 @@ MODULE_LICENSE("GPL"); | |||
320 | 328 | ||
321 | static int __init hostaudio_init_module(void) | 329 | static int __init hostaudio_init_module(void) |
322 | { | 330 | { |
331 | __kernel_param_lock(); | ||
323 | printk(KERN_INFO "UML Audio Relay (host dsp = %s, host mixer = %s)\n", | 332 | printk(KERN_INFO "UML Audio Relay (host dsp = %s, host mixer = %s)\n", |
324 | dsp, mixer); | 333 | dsp, mixer); |
334 | __kernel_param_unlock(); | ||
325 | 335 | ||
326 | module_data.dev_audio = register_sound_dsp(&hostaudio_fops, -1); | 336 | module_data.dev_audio = register_sound_dsp(&hostaudio_fops, -1); |
327 | if (module_data.dev_audio < 0) { | 337 | if (module_data.dev_audio < 0) { |