summaryrefslogtreecommitdiffstats
path: root/drivers/isdn/divert/divert_procfs.c
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2014-02-26 12:01:54 +0100
committerDavid S. Miller <davem@davemloft.net>2014-02-26 22:06:13 +0100
commitc11da83bdae210e1d40a6755b78f8543a9be9227 (patch)
tree5f3849f1681cd3c273030895c493e2c7180caa20 /drivers/isdn/divert/divert_procfs.c
parentisdn: hisax/elsa: fix sleep_on race in elsa FSM (diff)
downloadlinux-c11da83bdae210e1d40a6755b78f8543a9be9227.tar.xz
linux-c11da83bdae210e1d40a6755b78f8543a9be9227.zip
isdn: divert, hysdn: fix interruptible_sleep_on race
These two drivers use identical code for their procfs status file handling, which contains a small race against status data becoming available while reading the file. This uses wait_event_interruptible instead to fix this particular race and eventually get rid of all sleep_on instances. There seems to be another race involving multiple concurrent readers of the same procfs file, which I don't try to fix here. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Cc: Karsten Keil <isdn@linux-pingi.de> Cc: netdev@vger.kernel.org Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/isdn/divert/divert_procfs.c')
-rw-r--r--drivers/isdn/divert/divert_procfs.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/isdn/divert/divert_procfs.c b/drivers/isdn/divert/divert_procfs.c
index fb4f1bac0133..1c5dc345e7c5 100644
--- a/drivers/isdn/divert/divert_procfs.c
+++ b/drivers/isdn/divert/divert_procfs.c
@@ -86,12 +86,13 @@ isdn_divert_read(struct file *file, char __user *buf, size_t count, loff_t *off)
struct divert_info *inf;
int len;
- if (!*((struct divert_info **) file->private_data)) {
+ if (!(inf = *((struct divert_info **) file->private_data))) {
if (file->f_flags & O_NONBLOCK)
return -EAGAIN;
- interruptible_sleep_on(&(rd_queue));
+ wait_event_interruptible(rd_queue, (inf =
+ *((struct divert_info **) file->private_data)));
}
- if (!(inf = *((struct divert_info **) file->private_data)))
+ if (!inf)
return (0);
inf->usage_cnt--; /* new usage count */