Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / arch / mips / kernel / irixioctl.c
index 4cd3d38..e286382 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/syscalls.h>
 #include <linux/tty.h>
 #include <linux/file.h>
+#include <linux/rcupdate.h>
 
 #include <asm/uaccess.h>
 #include <asm/ioctl.h>
@@ -33,7 +34,7 @@ static struct tty_struct *get_tty(int fd)
        struct file *filp;
        struct tty_struct *ttyp = NULL;
 
-       spin_lock(&current->files->file_lock);
+       rcu_read_lock();
        filp = fcheck(fd);
        if(filp && filp->private_data) {
                ttyp = (struct tty_struct *) filp->private_data;
@@ -41,7 +42,7 @@ static struct tty_struct *get_tty(int fd)
                if(ttyp->magic != TTY_MAGIC)
                        ttyp =NULL;
        }
-       spin_unlock(&current->files->file_lock);
+       rcu_read_unlock();
        return ttyp;
 }
 
@@ -58,7 +59,7 @@ asmlinkage int irix_ioctl(int fd, unsigned long cmd, unsigned long arg)
 {
        struct tty_struct *tp, *rtp;
        mm_segment_t old_fs;
-       int error = 0;
+       int i, error = 0;
 
 #ifdef DEBUG_IOCTLS
        printk("[%s:%d] irix_ioctl(%d, ", current->comm, current->pid, fd);
@@ -73,12 +74,13 @@ asmlinkage int irix_ioctl(int fd, unsigned long cmd, unsigned long arg)
 
        case 0x0000540d: {
                struct termios kt;
-               struct irix_termios *it = (struct irix_termios *) arg;
+               struct irix_termios __user *it =
+                       (struct irix_termios __user *) arg;
 
 #ifdef DEBUG_IOCTLS
                printk("TCGETS, %08lx) ", arg);
 #endif
-               if(!access_ok(VERIFY_WRITE, it, sizeof(*it))) {
+               if (!access_ok(VERIFY_WRITE, it, sizeof(*it))) {
                        error = -EFAULT;
                        break;
                }
@@ -87,13 +89,14 @@ asmlinkage int irix_ioctl(int fd, unsigned long cmd, unsigned long arg)
                set_fs(old_fs);
                if (error)
                        break;
-               __put_user(kt.c_iflag, &it->c_iflag);
-               __put_user(kt.c_oflag, &it->c_oflag);
-               __put_user(kt.c_cflag, &it->c_cflag);
-               __put_user(kt.c_lflag, &it->c_lflag);
-               for(error = 0; error < NCCS; error++)
-                       __put_user(kt.c_cc[error], &it->c_cc[error]);
-               error = 0;
+
+               error = __put_user(kt.c_iflag, &it->c_iflag);
+               error |= __put_user(kt.c_oflag, &it->c_oflag);
+               error |= __put_user(kt.c_cflag, &it->c_cflag);
+               error |= __put_user(kt.c_lflag, &it->c_lflag);
+
+               for (i = 0; i < NCCS; i++)
+                       error |= __put_user(kt.c_cc[i], &it->c_cc[i]);
                break;
        }
 
@@ -111,14 +114,19 @@ asmlinkage int irix_ioctl(int fd, unsigned long cmd, unsigned long arg)
                old_fs = get_fs(); set_fs(get_ds());
                error = sys_ioctl(fd, TCGETS, (unsigned long) &kt);
                set_fs(old_fs);
-               if(error)
+               if (error)
+                       break;
+
+               error = __get_user(kt.c_iflag, &it->c_iflag);
+               error |= __get_user(kt.c_oflag, &it->c_oflag);
+               error |= __get_user(kt.c_cflag, &it->c_cflag);
+               error |= __get_user(kt.c_lflag, &it->c_lflag);
+
+               for (i = 0; i < NCCS; i++)
+                       error |= __get_user(kt.c_cc[i], &it->c_cc[i]);
+
+               if (error)
                        break;
-               __get_user(kt.c_iflag, &it->c_iflag);
-               __get_user(kt.c_oflag, &it->c_oflag);
-               __get_user(kt.c_cflag, &it->c_cflag);
-               __get_user(kt.c_lflag, &it->c_lflag);
-               for(error = 0; error < NCCS; error++)
-                       __get_user(kt.c_cc[error], &it->c_cc[error]);
                old_fs = get_fs(); set_fs(get_ds());
                error = sys_ioctl(fd, TCSETS, (unsigned long) &kt);
                set_fs(old_fs);
@@ -152,7 +160,7 @@ asmlinkage int irix_ioctl(int fd, unsigned long cmd, unsigned long arg)
 #ifdef DEBUG_IOCTLS
                printk("rtp->session=%d ", rtp->session);
 #endif
-               error = put_user(rtp->session, (unsigned long *) arg);
+               error = put_user(rtp->session, (unsigned long __user *) arg);
                break;
 
        case 0x746e:
@@ -194,50 +202,32 @@ asmlinkage int irix_ioctl(int fd, unsigned long cmd, unsigned long arg)
                break;
 
        case 0x8004667e:
-#ifdef DEBUG_IOCTLS
-               printk("FIONBIO, %08lx) arg=%d ", arg, *(int *)arg);
-#endif
                error = sys_ioctl(fd, FIONBIO, arg);
                break;
 
        case 0x80047476:
-#ifdef DEBUG_IOCTLS
-               printk("TIOCSPGRP, %08lx) arg=%d ", arg, *(int *)arg);
-#endif
                error = sys_ioctl(fd, TIOCSPGRP, arg);
                break;
 
        case 0x8020690c:
-#ifdef DEBUG_IOCTLS
-               printk("SIOCSIFADDR, %08lx) arg=%d ", arg, *(int *)arg);
-#endif
                error = sys_ioctl(fd, SIOCSIFADDR, arg);
                break;
 
        case 0x80206910:
-#ifdef DEBUG_IOCTLS
-               printk("SIOCSIFFLAGS, %08lx) arg=%d ", arg, *(int *)arg);
-#endif
                error = sys_ioctl(fd, SIOCSIFFLAGS, arg);
                break;
 
        case 0xc0206911:
-#ifdef DEBUG_IOCTLS
-               printk("SIOCGIFFLAGS, %08lx) arg=%d ", arg, *(int *)arg);
-#endif
                error = sys_ioctl(fd, SIOCGIFFLAGS, arg);
                break;
 
        case 0xc020691b:
-#ifdef DEBUG_IOCTLS
-               printk("SIOCGIFMETRIC, %08lx) arg=%d ", arg, *(int *)arg);
-#endif
                error = sys_ioctl(fd, SIOCGIFMETRIC, arg);
                break;
 
        default: {
 #ifdef DEBUG_MISSING_IOCTL
-               char *msg = "Unimplemented IOCTL cmd tell linux@engr.sgi.com\n";
+               char *msg = "Unimplemented IOCTL cmd tell linux-mips@linux-mips.org\n";
 
 #ifdef DEBUG_IOCTLS
                printk("UNIMP_IOCTL, %08lx)\n", arg);