patch-2.4.5 linux/drivers/char/pcxx.c
Next file: linux/drivers/char/pcxx.h
Previous file: linux/drivers/char/pcwd.c
Back to the patch index
Back to the overall index
- Lines: 59
- Date:
Tue May 22 10:23:16 2001
- Orig file:
v2.4.4/linux/drivers/char/pcxx.c
- Orig date:
Fri Feb 16 16:02:35 2001
diff -u --recursive --new-file v2.4.4/linux/drivers/char/pcxx.c linux/drivers/char/pcxx.c
@@ -685,7 +685,6 @@
int total, remain, size, stlen;
unsigned int head, tail;
unsigned long flags;
-
/* printk("Entering pcxe_write()\n"); */
if ((ch=chan(tty))==NULL)
@@ -696,6 +695,7 @@
if (from_user) {
+ down(&ch->tmp_buf_sem);
save_flags(flags);
cli();
globalwinon(ch);
@@ -703,19 +703,21 @@
/* It seems to be necessary to make sure that the value is stable here somehow
This is a rather odd pice of code here. */
do
- { tail = bc->tout;
+ {
+ tail = bc->tout;
} while (tail != bc->tout);
tail &= (size - 1);
stlen = (head >= tail) ? (size - (head - tail) - 1) : (tail - head - 1);
count = MIN(stlen, count);
+ memoff(ch);
+ restore_flags(flags);
+
if (count)
if (copy_from_user(ch->tmp_buf, buf, count))
count = 0;
buf = ch->tmp_buf;
- memoff(ch);
- restore_flags(flags);
}
/*
@@ -763,6 +765,9 @@
}
memoff(ch);
restore_flags(flags);
+
+ if(from_user)
+ up(&ch->tmp_buf_sem);
return(total);
}
@@ -1587,6 +1592,7 @@
ch->txbufsize = bc->tmax + 1;
ch->rxbufsize = bc->rmax + 1;
ch->tmp_buf = kmalloc(ch->txbufsize,GFP_KERNEL);
+ init_MUTEX(&ch->tmp_buf_sem);
if (!ch->tmp_buf) {
printk(KERN_ERR "Unable to allocate memory for temp buffers\n");
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)