These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / s390 / block / dcssblk.c
index da21281..94a8f4a 100644 (file)
 
 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 blk_qc_t dcssblk_make_request(struct request_queue *q,
+                                               struct bio *bio);
 static long dcssblk_direct_access(struct block_device *bdev, sector_t secnum,
-                                void **kaddr, unsigned long *pfn, long size);
+                        void __pmem **kaddr, unsigned long *pfn);
 
 static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0";
 
@@ -548,10 +549,10 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
         */
        num_of_segments = 0;
        for (i = 0; (i < count && (buf[i] != '\0') && (buf[i] != '\n')); i++) {
-               for (j = i; (buf[j] != ':') &&
+               for (j = i; j < count &&
+                       (buf[j] != ':') &&
                        (buf[j] != '\0') &&
-                       (buf[j] != '\n') &&
-                       j < count; j++) {
+                       (buf[j] != '\n'); j++) {
                        local_buf[j-i] = toupper(buf[j]);
                }
                local_buf[j-i] = '\0';
@@ -723,7 +724,7 @@ dcssblk_remove_store(struct device *dev, struct device_attribute *attr, const ch
        /*
         * parse input
         */
-       for (i = 0; ((*(buf+i)!='\0') && (*(buf+i)!='\n') && i < count); i++) {
+       for (i = 0; (i < count && (*(buf+i)!='\0') && (*(buf+i)!='\n')); i++) {
                local_buf[i] = toupper(buf[i]);
        }
        local_buf[i] = '\0';
@@ -815,7 +816,7 @@ dcssblk_release(struct gendisk *disk, fmode_t mode)
        up_write(&dcssblk_devices_sem);
 }
 
-static void
+static blk_qc_t
 dcssblk_make_request(struct request_queue *q, struct bio *bio)
 {
        struct dcssblk_dev_info *dev_info;
@@ -826,6 +827,8 @@ dcssblk_make_request(struct request_queue *q, struct bio *bio)
        unsigned long source_addr;
        unsigned long bytes_done;
 
+       blk_queue_split(q, &bio, q->bio_split);
+
        bytes_done = 0;
        dev_info = bio->bi_bdev->bd_disk->private_data;
        if (dev_info == NULL)
@@ -871,26 +874,29 @@ dcssblk_make_request(struct request_queue *q, struct bio *bio)
                }
                bytes_done += bvec.bv_len;
        }
-       bio_endio(bio, 0);
-       return;
+       bio_endio(bio);
+       return BLK_QC_T_NONE;
 fail:
        bio_io_error(bio);
+       return BLK_QC_T_NONE;
 }
 
 static long
 dcssblk_direct_access (struct block_device *bdev, sector_t secnum,
-                       void **kaddr, unsigned long *pfn, long size)
+                       void __pmem **kaddr, unsigned long *pfn)
 {
        struct dcssblk_dev_info *dev_info;
        unsigned long offset, dev_sz;
+       void *addr;
 
        dev_info = bdev->bd_disk->private_data;
        if (!dev_info)
                return -ENODEV;
        dev_sz = dev_info->end - dev_info->start;
        offset = secnum * 512;
-       *kaddr = (void *) (dev_info->start + offset);
-       *pfn = virt_to_phys(*kaddr) >> PAGE_SHIFT;
+       addr = (void *) (dev_info->start + offset);
+       *pfn = virt_to_phys(addr) >> PAGE_SHIFT;
+       *kaddr = (void __pmem *) addr;
 
        return dev_sz - offset;
 }
@@ -904,10 +910,10 @@ dcssblk_check_params(void)
 
        for (i = 0; (i < DCSSBLK_PARM_LEN) && (dcssblk_segments[i] != '\0');
             i++) {
-               for (j = i; (dcssblk_segments[j] != ',')  &&
+               for (j = i; (j < DCSSBLK_PARM_LEN) &&
+                           (dcssblk_segments[j] != ',')  &&
                            (dcssblk_segments[j] != '\0') &&
-                           (dcssblk_segments[j] != '(')  &&
-                           (j < DCSSBLK_PARM_LEN); j++)
+                           (dcssblk_segments[j] != '('); j++)
                {
                        buf[j-i] = dcssblk_segments[j];
                }