VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / drivers / char / scx200_gpio.c
index 3758fb1..70b5e94 100644 (file)
@@ -26,15 +26,12 @@ static int major = 0;               /* default to dynamic major */
 MODULE_PARM(major, "i");
 MODULE_PARM_DESC(major, "Major device number");
 
-static ssize_t scx200_gpio_write(struct file *file, const char *data, 
+static ssize_t scx200_gpio_write(struct file *file, const char __user *data, 
                                 size_t len, loff_t *ppos)
 {
        unsigned m = iminor(file->f_dentry->d_inode);
        size_t i;
 
-       if (ppos != &file->f_pos)
-               return -ESPIPE;
-
        for (i = 0; i < len; ++i) {
                char c;
                if (get_user(c, data+i))
@@ -77,15 +74,12 @@ static ssize_t scx200_gpio_write(struct file *file, const char *data,
        return len;
 }
 
-static ssize_t scx200_gpio_read(struct file *file, char *buf,
+static ssize_t scx200_gpio_read(struct file *file, char __user *buf,
                                size_t len, loff_t *ppos)
 {
        unsigned m = iminor(file->f_dentry->d_inode);
        int value;
 
-       if (ppos != &file->f_pos)
-               return -ESPIPE;
-
        value = scx200_gpio_get(m);
        if (put_user(value ? '1' : '0', buf))
                return -EFAULT;
@@ -98,7 +92,7 @@ static int scx200_gpio_open(struct inode *inode, struct file *file)
        unsigned m = iminor(inode);
        if (m > 63)
                return -EINVAL;
-       return 0;
+       return nonseekable_open(inode, file);
 }
 
 static int scx200_gpio_release(struct inode *inode, struct file *file)