|
@@ -443,9 +443,14 @@ static ssize_t ppp_read(struct file *file, char __user *buf,
|
|
* network traffic (demand mode).
|
|
* network traffic (demand mode).
|
|
*/
|
|
*/
|
|
struct ppp *ppp = PF_TO_PPP(pf);
|
|
struct ppp *ppp = PF_TO_PPP(pf);
|
|
|
|
+
|
|
|
|
+ ppp_recv_lock(ppp);
|
|
if (ppp->n_channels == 0 &&
|
|
if (ppp->n_channels == 0 &&
|
|
- (ppp->flags & SC_LOOP_TRAFFIC) == 0)
|
|
|
|
|
|
+ (ppp->flags & SC_LOOP_TRAFFIC) == 0) {
|
|
|
|
+ ppp_recv_unlock(ppp);
|
|
break;
|
|
break;
|
|
|
|
+ }
|
|
|
|
+ ppp_recv_unlock(ppp);
|
|
}
|
|
}
|
|
ret = -EAGAIN;
|
|
ret = -EAGAIN;
|
|
if (file->f_flags & O_NONBLOCK)
|
|
if (file->f_flags & O_NONBLOCK)
|
|
@@ -532,9 +537,12 @@ static unsigned int ppp_poll(struct file *file, poll_table *wait)
|
|
else if (pf->kind == INTERFACE) {
|
|
else if (pf->kind == INTERFACE) {
|
|
/* see comment in ppp_read */
|
|
/* see comment in ppp_read */
|
|
struct ppp *ppp = PF_TO_PPP(pf);
|
|
struct ppp *ppp = PF_TO_PPP(pf);
|
|
|
|
+
|
|
|
|
+ ppp_recv_lock(ppp);
|
|
if (ppp->n_channels == 0 &&
|
|
if (ppp->n_channels == 0 &&
|
|
(ppp->flags & SC_LOOP_TRAFFIC) == 0)
|
|
(ppp->flags & SC_LOOP_TRAFFIC) == 0)
|
|
mask |= POLLIN | POLLRDNORM;
|
|
mask |= POLLIN | POLLRDNORM;
|
|
|
|
+ ppp_recv_unlock(ppp);
|
|
}
|
|
}
|
|
|
|
|
|
return mask;
|
|
return mask;
|