Merge tag 'xtensa-next-20130508' of git://github.com/czankel/xtensa-linux
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / arch / xtensa / platforms / iss / simdisk.c
index 74f86fbab742f9378fcb90c3fb3eea73858d4b12..c0edb35424cea9ed8a077b25d682202f9d50e533 100644 (file)
@@ -139,13 +139,12 @@ static int simdisk_open(struct block_device *bdev, fmode_t mode)
        return 0;
 }
 
-static int simdisk_release(struct gendisk *disk, fmode_t mode)
+static void simdisk_release(struct gendisk *disk, fmode_t mode)
 {
        struct simdisk *dev = disk->private_data;
        spin_lock(&dev->lock);
        --dev->users;
        spin_unlock(&dev->lock);
-       return 0;
 }
 
 static const struct block_device_operations simdisk_ops = {
@@ -214,25 +213,32 @@ static int simdisk_detach(struct simdisk *dev)
        return err;
 }
 
-static int proc_read_simdisk(char *page, char **start, off_t off,
-               int count, int *eof, void *data)
+static ssize_t proc_read_simdisk(struct file *file, char __user *buf,
+                       size_t size, loff_t *ppos)
 {
-       int len;
-       struct simdisk *dev = (struct simdisk *) data;
-       len = sprintf(page, "%s\n", dev->filename ? dev->filename : "");
-       return len;
+       struct simdisk *dev = PDE_DATA(file_inode(file));
+       const char *s = dev->filename;
+       if (s) {
+               ssize_t n = simple_read_from_buffer(buf, size, ppos,
+                                                       s, strlen(s));
+               if (n < 0)
+                       return n;
+               buf += n;
+               size -= n;
+       }
+       return simple_read_from_buffer(buf, size, ppos, "\n", 1);
 }
 
-static int proc_write_simdisk(struct file *file, const char *buffer,
-               unsigned long count, void *data)
+static ssize_t proc_write_simdisk(struct file *file, const char __user *buf,
+                       size_t count, loff_t *ppos)
 {
        char *tmp = kmalloc(count + 1, GFP_KERNEL);
-       struct simdisk *dev = (struct simdisk *) data;
+       struct simdisk *dev = PDE_DATA(file_inode(file));
        int err;
 
        if (tmp == NULL)
                return -ENOMEM;
-       if (copy_from_user(tmp, buffer, count)) {
+       if (copy_from_user(tmp, buf, count)) {
                err = -EFAULT;
                goto out_free;
        }
@@ -256,6 +262,12 @@ out_free:
        return err;
 }
 
+static const struct file_operations fops = {
+       .read = proc_read_simdisk,
+       .write = proc_write_simdisk,
+       .llseek = default_llseek,
+};
+
 static int __init simdisk_setup(struct simdisk *dev, int which,
                struct proc_dir_entry *procdir)
 {
@@ -289,10 +301,7 @@ static int __init simdisk_setup(struct simdisk *dev, int which,
        set_capacity(dev->gd, 0);
        add_disk(dev->gd);
 
-       dev->procfile = create_proc_entry(tmp, 0644, procdir);
-       dev->procfile->data = dev;
-       dev->procfile->read_proc = proc_read_simdisk;
-       dev->procfile->write_proc = proc_write_simdisk;
+       dev->procfile = proc_create_data(tmp, 0644, procdir, &fops, dev);
        return 0;
 
 out_alloc_disk: