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:
Samuel Ortiz 2010-10-05 01:24:20 +02:00 committed by Samuel Ortiz
parent 5b40964ead
commit f8cba16cad
2 changed files with 44 additions and 19 deletions

View File

@ -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;
/* /*

View File

@ -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;