OSDN Git Service

Merge branch 'for-3.20/core' of git://git.kernel.dk/linux-block
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / drivers / s390 / block / dcssblk.c
index 7f90022..96128cb 100644 (file)
@@ -28,8 +28,8 @@
 static int dcssblk_open(struct block_device *bdev, fmode_t mode);
 static void dcssblk_release(struct gendisk *disk, fmode_t mode);
 static void dcssblk_make_request(struct request_queue *q, struct bio *bio);
-static int dcssblk_direct_access(struct block_device *bdev, sector_t secnum,
-                                void **kaddr, unsigned long *pfn);
+static long dcssblk_direct_access(struct block_device *bdev, sector_t secnum,
+                                void **kaddr, unsigned long *pfn, long size);
 
 static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0";
 
@@ -877,25 +877,22 @@ fail:
        bio_io_error(bio);
 }
 
-static int
+static long
 dcssblk_direct_access (struct block_device *bdev, sector_t secnum,
-                       void **kaddr, unsigned long *pfn)
+                       void **kaddr, unsigned long *pfn, long size)
 {
        struct dcssblk_dev_info *dev_info;
-       unsigned long pgoff;
+       unsigned long offset, dev_sz;
 
        dev_info = bdev->bd_disk->private_data;
        if (!dev_info)
                return -ENODEV;
-       if (secnum % (PAGE_SIZE/512))
-               return -EINVAL;
-       pgoff = secnum / (PAGE_SIZE / 512);
-       if ((pgoff+1)*PAGE_SIZE-1 > dev_info->end - dev_info->start)
-               return -ERANGE;
-       *kaddr = (void *) (dev_info->start+pgoff*PAGE_SIZE);
+       dev_sz = dev_info->end - dev_info->start;
+       offset = secnum * 512;
+       *kaddr = (void *) (dev_info->start + offset);
        *pfn = virt_to_phys(*kaddr) >> PAGE_SHIFT;
 
-       return 0;
+       return dev_sz - offset;
 }
 
 static void