提交 1f8cabb7 编写于 作者: A Alan Cox 提交者: Linus Torvalds

synclink series: Prepare for BKL pushdown

As these are quite complex I've simply pushed the BKL down into the ioctl
handler not tried to do anything neater.
Signed-off-by: NAlan Cox <alan@redhat.com>
Cc: Paul Fulghum <paulkf@microgate.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 341339e7
...@@ -2942,6 +2942,7 @@ static int mgsl_ioctl(struct tty_struct *tty, struct file * file, ...@@ -2942,6 +2942,7 @@ static int mgsl_ioctl(struct tty_struct *tty, struct file * file,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
struct mgsl_struct * info = (struct mgsl_struct *)tty->driver_data; struct mgsl_struct * info = (struct mgsl_struct *)tty->driver_data;
int ret;
if (debug_level >= DEBUG_LEVEL_INFO) if (debug_level >= DEBUG_LEVEL_INFO)
printk("%s(%d):mgsl_ioctl %s cmd=%08X\n", __FILE__,__LINE__, printk("%s(%d):mgsl_ioctl %s cmd=%08X\n", __FILE__,__LINE__,
...@@ -2956,7 +2957,10 @@ static int mgsl_ioctl(struct tty_struct *tty, struct file * file, ...@@ -2956,7 +2957,10 @@ static int mgsl_ioctl(struct tty_struct *tty, struct file * file,
return -EIO; return -EIO;
} }
return mgsl_ioctl_common(info, cmd, arg); lock_kernel();
ret = mgsl_ioctl_common(info, cmd, arg);
unlock_kernel();
return ret;
} }
static int mgsl_ioctl_common(struct mgsl_struct *info, unsigned int cmd, unsigned long arg) static int mgsl_ioctl_common(struct mgsl_struct *info, unsigned int cmd, unsigned long arg)
......
...@@ -1097,6 +1097,7 @@ static int ioctl(struct tty_struct *tty, struct file *file, ...@@ -1097,6 +1097,7 @@ static int ioctl(struct tty_struct *tty, struct file *file,
struct serial_icounter_struct __user *p_cuser; /* user space */ struct serial_icounter_struct __user *p_cuser; /* user space */
unsigned long flags; unsigned long flags;
void __user *argp = (void __user *)arg; void __user *argp = (void __user *)arg;
int ret;
if (sanity_check(info, tty->name, "ioctl")) if (sanity_check(info, tty->name, "ioctl"))
return -ENODEV; return -ENODEV;
...@@ -1108,37 +1109,54 @@ static int ioctl(struct tty_struct *tty, struct file *file, ...@@ -1108,37 +1109,54 @@ static int ioctl(struct tty_struct *tty, struct file *file,
return -EIO; return -EIO;
} }
lock_kernel();
switch (cmd) { switch (cmd) {
case MGSL_IOCGPARAMS: case MGSL_IOCGPARAMS:
return get_params(info, argp); ret = get_params(info, argp);
break;
case MGSL_IOCSPARAMS: case MGSL_IOCSPARAMS:
return set_params(info, argp); ret = set_params(info, argp);
break;
case MGSL_IOCGTXIDLE: case MGSL_IOCGTXIDLE:
return get_txidle(info, argp); ret = get_txidle(info, argp);
break;
case MGSL_IOCSTXIDLE: case MGSL_IOCSTXIDLE:
return set_txidle(info, (int)arg); ret = set_txidle(info, (int)arg);
break;
case MGSL_IOCTXENABLE: case MGSL_IOCTXENABLE:
return tx_enable(info, (int)arg); ret = tx_enable(info, (int)arg);
break;
case MGSL_IOCRXENABLE: case MGSL_IOCRXENABLE:
return rx_enable(info, (int)arg); ret = rx_enable(info, (int)arg);
break;
case MGSL_IOCTXABORT: case MGSL_IOCTXABORT:
return tx_abort(info); ret = tx_abort(info);
break;
case MGSL_IOCGSTATS: case MGSL_IOCGSTATS:
return get_stats(info, argp); ret = get_stats(info, argp);
break;
case MGSL_IOCWAITEVENT: case MGSL_IOCWAITEVENT:
return wait_mgsl_event(info, argp); ret = wait_mgsl_event(info, argp);
break;
case TIOCMIWAIT: case TIOCMIWAIT:
return modem_input_wait(info,(int)arg); ret = modem_input_wait(info,(int)arg);
break;
case MGSL_IOCGIF: case MGSL_IOCGIF:
return get_interface(info, argp); ret = get_interface(info, argp);
break;
case MGSL_IOCSIF: case MGSL_IOCSIF:
return set_interface(info,(int)arg); ret = set_interface(info,(int)arg);
break;
case MGSL_IOCSGPIO: case MGSL_IOCSGPIO:
return set_gpio(info, argp); ret = set_gpio(info, argp);
break;
case MGSL_IOCGGPIO: case MGSL_IOCGGPIO:
return get_gpio(info, argp); ret = get_gpio(info, argp);
break;
case MGSL_IOCWAITGPIO: case MGSL_IOCWAITGPIO:
return wait_gpio(info, argp); ret = wait_gpio(info, argp);
break;
case TIOCGICOUNT: case TIOCGICOUNT:
spin_lock_irqsave(&info->lock,flags); spin_lock_irqsave(&info->lock,flags);
cnow = info->icount; cnow = info->icount;
...@@ -1155,12 +1173,14 @@ static int ioctl(struct tty_struct *tty, struct file *file, ...@@ -1155,12 +1173,14 @@ static int ioctl(struct tty_struct *tty, struct file *file,
put_user(cnow.parity, &p_cuser->parity) || put_user(cnow.parity, &p_cuser->parity) ||
put_user(cnow.brk, &p_cuser->brk) || put_user(cnow.brk, &p_cuser->brk) ||
put_user(cnow.buf_overrun, &p_cuser->buf_overrun)) put_user(cnow.buf_overrun, &p_cuser->buf_overrun))
return -EFAULT; ret = -EFAULT;
return 0; ret = 0;
break;
default: default:
return -ENOIOCTLCMD; ret = -ENOIOCTLCMD;
} }
return 0; unlock_kernel();
return ret;
} }
/* /*
......
...@@ -1303,7 +1303,7 @@ static void tx_release(struct tty_struct *tty) ...@@ -1303,7 +1303,7 @@ static void tx_release(struct tty_struct *tty)
* *
* Return Value: 0 if success, otherwise error code * Return Value: 0 if success, otherwise error code
*/ */
static int ioctl(struct tty_struct *tty, struct file *file, static int do_ioctl(struct tty_struct *tty, struct file *file,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
SLMP_INFO *info = (SLMP_INFO *)tty->driver_data; SLMP_INFO *info = (SLMP_INFO *)tty->driver_data;
...@@ -1393,6 +1393,16 @@ static int ioctl(struct tty_struct *tty, struct file *file, ...@@ -1393,6 +1393,16 @@ static int ioctl(struct tty_struct *tty, struct file *file,
return 0; return 0;
} }
static int ioctl(struct tty_struct *tty, struct file *file,
unsigned int cmd, unsigned long arg)
{
int ret;
lock_kernel();
ret = do_ioctl(tty, file, cmd, arg);
unlock_kernel();
return ret;
}
/* /*
* /proc fs routines.... * /proc fs routines....
*/ */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册