diff options
Diffstat (limited to 'drivers/net/ppp_generic.c')
| -rw-r--r-- | drivers/net/ppp_generic.c | 37 | 
1 files changed, 15 insertions, 22 deletions
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c index 1b2c2915020..6695a51e09e 100644 --- a/drivers/net/ppp_generic.c +++ b/drivers/net/ppp_generic.c @@ -40,7 +40,6 @@  #include <linux/if_arp.h>  #include <linux/ip.h>  #include <linux/tcp.h> -#include <linux/smp_lock.h>  #include <linux/spinlock.h>  #include <linux/rwsem.h>  #include <linux/stddef.h> @@ -69,7 +68,6 @@  #define MPHDRLEN	6	/* multilink protocol header length */  #define MPHDRLEN_SSN	4	/* ditto with short sequence numbers */ -#define MIN_FRAG_SIZE	64  /*   * An instance of /dev/ppp can be associated with either a ppp @@ -181,6 +179,7 @@ struct channel {   * channel.downl.   */ +static DEFINE_MUTEX(ppp_mutex);  static atomic_t ppp_unit_count = ATOMIC_INIT(0);  static atomic_t channel_count = ATOMIC_INIT(0); @@ -363,7 +362,6 @@ static const int npindex_to_ethertype[NUM_NP] = {   */  static int ppp_open(struct inode *inode, struct file *file)  { -	cycle_kernel_lock();  	/*  	 * This could (should?) be enforced by the permissions on /dev/ppp.  	 */ @@ -539,14 +537,9 @@ static int get_filter(void __user *arg, struct sock_filter **p)  	}  	len = uprog.len * sizeof(struct sock_filter); -	code = kmalloc(len, GFP_KERNEL); -	if (code == NULL) -		return -ENOMEM; - -	if (copy_from_user(code, uprog.filter, len)) { -		kfree(code); -		return -EFAULT; -	} +	code = memdup_user(uprog.filter, len); +	if (IS_ERR(code)) +		return PTR_ERR(code);  	err = sk_chk_filter(code, uprog.len);  	if (err) { @@ -588,7 +581,7 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  		 * this fd and reopening /dev/ppp.  		 */  		err = -EINVAL; -		lock_kernel(); +		mutex_lock(&ppp_mutex);  		if (pf->kind == INTERFACE) {  			ppp = PF_TO_PPP(pf);  			if (file == ppp->owner) @@ -600,7 +593,7 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  		} else  			printk(KERN_DEBUG "PPPIOCDETACH file->f_count=%ld\n",  			       atomic_long_read(&file->f_count)); -		unlock_kernel(); +		mutex_unlock(&ppp_mutex);  		return err;  	} @@ -608,7 +601,7 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  		struct channel *pch;  		struct ppp_channel *chan; -		lock_kernel(); +		mutex_lock(&ppp_mutex);  		pch = PF_TO_CHANNEL(pf);  		switch (cmd) { @@ -630,7 +623,7 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  				err = chan->ops->ioctl(chan, cmd, arg);  			up_read(&pch->chan_sem);  		} -		unlock_kernel(); +		mutex_unlock(&ppp_mutex);  		return err;  	} @@ -640,7 +633,7 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  		return -EINVAL;  	} -	lock_kernel(); +	mutex_lock(&ppp_mutex);  	ppp = PF_TO_PPP(pf);  	switch (cmd) {  	case PPPIOCSMRU: @@ -788,7 +781,7 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  	default:  		err = -ENOTTY;  	} -	unlock_kernel(); +	mutex_unlock(&ppp_mutex);  	return err;  } @@ -801,7 +794,7 @@ static int ppp_unattached_ioctl(struct net *net, struct ppp_file *pf,  	struct ppp_net *pn;  	int __user *p = (int __user *)arg; -	lock_kernel(); +	mutex_lock(&ppp_mutex);  	switch (cmd) {  	case PPPIOCNEWUNIT:  		/* Create a new ppp unit */ @@ -852,7 +845,7 @@ static int ppp_unattached_ioctl(struct net *net, struct ppp_file *pf,  	default:  		err = -ENOTTY;  	} -	unlock_kernel(); +	mutex_unlock(&ppp_mutex);  	return err;  } @@ -1933,9 +1926,9 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)  	/* If the queue is getting long, don't wait any longer for packets  	   before the start of the queue. */  	if (skb_queue_len(&ppp->mrq) >= PPP_MP_MAX_QLEN) { -		struct sk_buff *skb = skb_peek(&ppp->mrq); -		if (seq_before(ppp->minseq, skb->sequence)) -			ppp->minseq = skb->sequence; +		struct sk_buff *mskb = skb_peek(&ppp->mrq); +		if (seq_before(ppp->minseq, mskb->sequence)) +			ppp->minseq = mskb->sequence;  	}  	/* Pull completed packets off the queue and receive them. */  |