diff options
Diffstat (limited to 'drivers/char/lp.c')
| -rw-r--r-- | drivers/char/lp.c | 21 | 
1 files changed, 11 insertions, 10 deletions
diff --git a/drivers/char/lp.c b/drivers/char/lp.c index 97c3edb95ae..c4094c4e22c 100644 --- a/drivers/char/lp.c +++ b/drivers/char/lp.c @@ -135,7 +135,6 @@  #include <asm/irq.h>  #include <asm/uaccess.h> -#include <asm/system.h>  /* if you have more than 8 printers, remember to increase LP_NO */  #define LP_NO 8 @@ -295,7 +294,7 @@ static int lp_wait_ready(int minor, int nonblock)  static ssize_t lp_write(struct file * file, const char __user * buf,  		        size_t count, loff_t *ppos)  { -	unsigned int minor = iminor(file->f_path.dentry->d_inode); +	unsigned int minor = iminor(file_inode(file));  	struct parport *port = lp_table[minor].dev->port;  	char *kbuf = lp_table[minor].lp_buffer;  	ssize_t retv = 0; @@ -414,7 +413,7 @@ static ssize_t lp_read(struct file * file, char __user * buf,  		       size_t count, loff_t *ppos)  {  	DEFINE_WAIT(wait); -	unsigned int minor=iminor(file->f_path.dentry->d_inode); +	unsigned int minor=iminor(file_inode(file));  	struct parport *port = lp_table[minor].dev->port;  	ssize_t retval = 0;  	char *kbuf = lp_table[minor].lp_buffer; @@ -588,6 +587,8 @@ static int lp_do_ioctl(unsigned int minor, unsigned int cmd,  		return -ENODEV;  	switch ( cmd ) {  		case LPTIME: +			if (arg > UINT_MAX / HZ) +				return -EINVAL;  			LP_TIME(minor) = arg * HZ/100;  			break;  		case LPCHAR: @@ -623,9 +624,12 @@ static int lp_do_ioctl(unsigned int minor, unsigned int cmd,  				return -EFAULT;  			break;  		case LPGETSTATUS: +			if (mutex_lock_interruptible(&lp_table[minor].port_mutex)) +				return -EINTR;  			lp_claim_parport_or_block (&lp_table[minor]);  			status = r_str(minor);  			lp_release_parport (&lp_table[minor]); +			mutex_unlock(&lp_table[minor].port_mutex);  			if (copy_to_user(argp, &status, sizeof(int)))  				return -EFAULT; @@ -680,7 +684,7 @@ static long lp_ioctl(struct file *file, unsigned int cmd,  	struct timeval par_timeout;  	int ret; -	minor = iminor(file->f_path.dentry->d_inode); +	minor = iminor(file_inode(file));  	mutex_lock(&lp_mutex);  	switch (cmd) {  	case LPSETTIMEOUT: @@ -706,16 +710,13 @@ static long lp_compat_ioctl(struct file *file, unsigned int cmd,  {  	unsigned int minor;  	struct timeval par_timeout; -	struct compat_timeval __user *tc;  	int ret; -	minor = iminor(file->f_path.dentry->d_inode); +	minor = iminor(file_inode(file));  	mutex_lock(&lp_mutex);  	switch (cmd) {  	case LPSETTIMEOUT: -		tc = compat_ptr(arg); -		if (get_user(par_timeout.tv_sec, &tc->tv_sec) || -		    get_user(par_timeout.tv_usec, &tc->tv_usec)) { +		if (compat_get_timeval(&par_timeout, compat_ptr(arg))) {  			ret = -EFAULT;  			break;  		} @@ -829,7 +830,7 @@ static struct console lpcons = {  static int parport_nr[LP_NO] = { [0 ... LP_NO-1] = LP_PARPORT_UNSPEC };  static char *parport[LP_NO]; -static int reset; +static bool reset;  module_param_array(parport, charp, NULL, 0);  module_param(reset, bool, 0);  | 
