mirror of
https://github.com/torvalds/linux.git
synced 2024-10-31 17:21:49 +00:00
irda: Remove BKL instances from irnet
The code intends to lock the irnet_socket, so adding a mutex to it allows for a complet BKL removal. Signed-off-by: Samuel Ortiz <samuel@sortiz.org>
This commit is contained in:
parent
5b40964ead
commit
f8cba16cad
@ -458,6 +458,8 @@ typedef struct irnet_socket
|
|||||||
int disco_index; /* Last read in the discovery log */
|
int disco_index; /* Last read in the discovery log */
|
||||||
int disco_number; /* Size of the discovery log */
|
int disco_number; /* Size of the discovery log */
|
||||||
|
|
||||||
|
struct mutex lock;
|
||||||
|
|
||||||
} irnet_socket;
|
} irnet_socket;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -480,7 +480,6 @@ dev_irnet_open(struct inode * inode,
|
|||||||
ap = kzalloc(sizeof(*ap), GFP_KERNEL);
|
ap = kzalloc(sizeof(*ap), GFP_KERNEL);
|
||||||
DABORT(ap == NULL, -ENOMEM, FS_ERROR, "Can't allocate struct irnet...\n");
|
DABORT(ap == NULL, -ENOMEM, FS_ERROR, "Can't allocate struct irnet...\n");
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
/* initialize the irnet structure */
|
/* initialize the irnet structure */
|
||||||
ap->file = file;
|
ap->file = file;
|
||||||
|
|
||||||
@ -502,18 +501,20 @@ dev_irnet_open(struct inode * inode,
|
|||||||
{
|
{
|
||||||
DERROR(FS_ERROR, "Can't setup IrDA link...\n");
|
DERROR(FS_ERROR, "Can't setup IrDA link...\n");
|
||||||
kfree(ap);
|
kfree(ap);
|
||||||
unlock_kernel();
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For the control channel */
|
/* For the control channel */
|
||||||
ap->event_index = irnet_events.index; /* Cancel all past events */
|
ap->event_index = irnet_events.index; /* Cancel all past events */
|
||||||
|
|
||||||
|
mutex_init(&ap->lock);
|
||||||
|
|
||||||
/* Put our stuff where we will be able to find it later */
|
/* Put our stuff where we will be able to find it later */
|
||||||
file->private_data = ap;
|
file->private_data = ap;
|
||||||
|
|
||||||
DEXIT(FS_TRACE, " - ap=0x%p\n", ap);
|
DEXIT(FS_TRACE, " - ap=0x%p\n", ap);
|
||||||
unlock_kernel();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -664,7 +665,9 @@ dev_irnet_ioctl(
|
|||||||
{
|
{
|
||||||
DEBUG(FS_INFO, "Entering PPP discipline.\n");
|
DEBUG(FS_INFO, "Entering PPP discipline.\n");
|
||||||
/* PPP channel setup (ap->chan in configued in dev_irnet_open())*/
|
/* PPP channel setup (ap->chan in configued in dev_irnet_open())*/
|
||||||
lock_kernel();
|
if (mutex_lock_interruptible(&ap->lock))
|
||||||
|
return -EINTR;
|
||||||
|
|
||||||
err = ppp_register_channel(&ap->chan);
|
err = ppp_register_channel(&ap->chan);
|
||||||
if(err == 0)
|
if(err == 0)
|
||||||
{
|
{
|
||||||
@ -677,14 +680,17 @@ dev_irnet_ioctl(
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
DERROR(FS_ERROR, "Can't setup PPP channel...\n");
|
DERROR(FS_ERROR, "Can't setup PPP channel...\n");
|
||||||
unlock_kernel();
|
|
||||||
|
mutex_unlock(&ap->lock);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* In theory, should be N_TTY */
|
/* In theory, should be N_TTY */
|
||||||
DEBUG(FS_INFO, "Exiting PPP discipline.\n");
|
DEBUG(FS_INFO, "Exiting PPP discipline.\n");
|
||||||
/* Disconnect from the generic PPP layer */
|
/* Disconnect from the generic PPP layer */
|
||||||
lock_kernel();
|
if (mutex_lock_interruptible(&ap->lock))
|
||||||
|
return -EINTR;
|
||||||
|
|
||||||
if(ap->ppp_open)
|
if(ap->ppp_open)
|
||||||
{
|
{
|
||||||
ap->ppp_open = 0;
|
ap->ppp_open = 0;
|
||||||
@ -693,24 +699,31 @@ dev_irnet_ioctl(
|
|||||||
else
|
else
|
||||||
DERROR(FS_ERROR, "Channel not registered !\n");
|
DERROR(FS_ERROR, "Channel not registered !\n");
|
||||||
err = 0;
|
err = 0;
|
||||||
unlock_kernel();
|
|
||||||
|
mutex_unlock(&ap->lock);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Query PPP channel and unit number */
|
/* Query PPP channel and unit number */
|
||||||
case PPPIOCGCHAN:
|
case PPPIOCGCHAN:
|
||||||
lock_kernel();
|
if (mutex_lock_interruptible(&ap->lock))
|
||||||
|
return -EINTR;
|
||||||
|
|
||||||
if(ap->ppp_open && !put_user(ppp_channel_index(&ap->chan),
|
if(ap->ppp_open && !put_user(ppp_channel_index(&ap->chan),
|
||||||
(int __user *)argp))
|
(int __user *)argp))
|
||||||
err = 0;
|
err = 0;
|
||||||
unlock_kernel();
|
|
||||||
|
mutex_unlock(&ap->lock);
|
||||||
break;
|
break;
|
||||||
case PPPIOCGUNIT:
|
case PPPIOCGUNIT:
|
||||||
lock_kernel();
|
if (mutex_lock_interruptible(&ap->lock))
|
||||||
|
return -EINTR;
|
||||||
|
|
||||||
if(ap->ppp_open && !put_user(ppp_unit_number(&ap->chan),
|
if(ap->ppp_open && !put_user(ppp_unit_number(&ap->chan),
|
||||||
(int __user *)argp))
|
(int __user *)argp))
|
||||||
err = 0;
|
err = 0;
|
||||||
unlock_kernel();
|
|
||||||
|
mutex_unlock(&ap->lock);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* All these ioctls can be passed both directly and from ppp_generic,
|
/* All these ioctls can be passed both directly and from ppp_generic,
|
||||||
@ -730,9 +743,12 @@ dev_irnet_ioctl(
|
|||||||
if(!capable(CAP_NET_ADMIN))
|
if(!capable(CAP_NET_ADMIN))
|
||||||
err = -EPERM;
|
err = -EPERM;
|
||||||
else {
|
else {
|
||||||
lock_kernel();
|
if (mutex_lock_interruptible(&ap->lock))
|
||||||
|
return -EINTR;
|
||||||
|
|
||||||
err = ppp_irnet_ioctl(&ap->chan, cmd, arg);
|
err = ppp_irnet_ioctl(&ap->chan, cmd, arg);
|
||||||
unlock_kernel();
|
|
||||||
|
mutex_unlock(&ap->lock);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -740,7 +756,9 @@ dev_irnet_ioctl(
|
|||||||
/* Get termios */
|
/* Get termios */
|
||||||
case TCGETS:
|
case TCGETS:
|
||||||
DEBUG(FS_INFO, "Get termios.\n");
|
DEBUG(FS_INFO, "Get termios.\n");
|
||||||
lock_kernel();
|
if (mutex_lock_interruptible(&ap->lock))
|
||||||
|
return -EINTR;
|
||||||
|
|
||||||
#ifndef TCGETS2
|
#ifndef TCGETS2
|
||||||
if(!kernel_termios_to_user_termios((struct termios __user *)argp, &ap->termios))
|
if(!kernel_termios_to_user_termios((struct termios __user *)argp, &ap->termios))
|
||||||
err = 0;
|
err = 0;
|
||||||
@ -748,12 +766,15 @@ dev_irnet_ioctl(
|
|||||||
if(kernel_termios_to_user_termios_1((struct termios __user *)argp, &ap->termios))
|
if(kernel_termios_to_user_termios_1((struct termios __user *)argp, &ap->termios))
|
||||||
err = 0;
|
err = 0;
|
||||||
#endif
|
#endif
|
||||||
unlock_kernel();
|
|
||||||
|
mutex_unlock(&ap->lock);
|
||||||
break;
|
break;
|
||||||
/* Set termios */
|
/* Set termios */
|
||||||
case TCSETSF:
|
case TCSETSF:
|
||||||
DEBUG(FS_INFO, "Set termios.\n");
|
DEBUG(FS_INFO, "Set termios.\n");
|
||||||
lock_kernel();
|
if (mutex_lock_interruptible(&ap->lock))
|
||||||
|
return -EINTR;
|
||||||
|
|
||||||
#ifndef TCGETS2
|
#ifndef TCGETS2
|
||||||
if(!user_termios_to_kernel_termios(&ap->termios, (struct termios __user *)argp))
|
if(!user_termios_to_kernel_termios(&ap->termios, (struct termios __user *)argp))
|
||||||
err = 0;
|
err = 0;
|
||||||
@ -761,7 +782,8 @@ dev_irnet_ioctl(
|
|||||||
if(!user_termios_to_kernel_termios_1(&ap->termios, (struct termios __user *)argp))
|
if(!user_termios_to_kernel_termios_1(&ap->termios, (struct termios __user *)argp))
|
||||||
err = 0;
|
err = 0;
|
||||||
#endif
|
#endif
|
||||||
unlock_kernel();
|
|
||||||
|
mutex_unlock(&ap->lock);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Set DTR/RTS */
|
/* Set DTR/RTS */
|
||||||
@ -784,9 +806,10 @@ dev_irnet_ioctl(
|
|||||||
* We should also worry that we don't accept junk here and that
|
* We should also worry that we don't accept junk here and that
|
||||||
* we get rid of our own buffers */
|
* we get rid of our own buffers */
|
||||||
#ifdef FLUSH_TO_PPP
|
#ifdef FLUSH_TO_PPP
|
||||||
lock_kernel();
|
if (mutex_lock_interruptible(&ap->lock))
|
||||||
|
return -EINTR;
|
||||||
ppp_output_wakeup(&ap->chan);
|
ppp_output_wakeup(&ap->chan);
|
||||||
unlock_kernel();
|
mutex_unlock(&ap->lock);
|
||||||
#endif /* FLUSH_TO_PPP */
|
#endif /* FLUSH_TO_PPP */
|
||||||
err = 0;
|
err = 0;
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user