These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / block / brd.c
index 64ab495..a5880f4 100644 (file)
@@ -323,7 +323,7 @@ out:
        return err;
 }
 
-static void brd_make_request(struct request_queue *q, struct bio *bio)
+static blk_qc_t brd_make_request(struct request_queue *q, struct bio *bio)
 {
        struct block_device *bdev = bio->bi_bdev;
        struct brd_device *brd = bdev->bd_disk->private_data;
@@ -331,14 +331,15 @@ static void brd_make_request(struct request_queue *q, struct bio *bio)
        struct bio_vec bvec;
        sector_t sector;
        struct bvec_iter iter;
-       int err = -EIO;
 
        sector = bio->bi_iter.bi_sector;
        if (bio_end_sector(bio) > get_capacity(bdev->bd_disk))
-               goto out;
+               goto io_error;
 
        if (unlikely(bio->bi_rw & REQ_DISCARD)) {
-               err = 0;
+               if (sector & ((PAGE_SIZE >> SECTOR_SHIFT) - 1) ||
+                   bio->bi_iter.bi_size & PAGE_MASK)
+                       goto io_error;
                discard_from_brd(brd, sector, bio->bi_iter.bi_size);
                goto out;
        }
@@ -349,15 +350,21 @@ static void brd_make_request(struct request_queue *q, struct bio *bio)
 
        bio_for_each_segment(bvec, bio, iter) {
                unsigned int len = bvec.bv_len;
+               int err;
+
                err = brd_do_bvec(brd, bvec.bv_page, len,
                                        bvec.bv_offset, rw, sector);
                if (err)
-                       break;
+                       goto io_error;
                sector += len >> SECTOR_SHIFT;
        }
 
 out:
-       bio_endio(bio, err);
+       bio_endio(bio);
+       return BLK_QC_T_NONE;
+io_error:
+       bio_io_error(bio);
+       return BLK_QC_T_NONE;
 }
 
 static int brd_rw_page(struct block_device *bdev, sector_t sector,
@@ -371,7 +378,7 @@ static int brd_rw_page(struct block_device *bdev, sector_t sector,
 
 #ifdef CONFIG_BLK_DEV_RAM_DAX
 static long brd_direct_access(struct block_device *bdev, sector_t sector,
-                       void **kaddr, unsigned long *pfn, long size)
+                       void __pmem **kaddr, unsigned long *pfn)
 {
        struct brd_device *brd = bdev->bd_disk->private_data;
        struct page *page;
@@ -381,13 +388,9 @@ static long brd_direct_access(struct block_device *bdev, sector_t sector,
        page = brd_insert_page(brd, sector);
        if (!page)
                return -ENOSPC;
-       *kaddr = page_address(page);
+       *kaddr = (void __pmem *)page_address(page);
        *pfn = page_to_pfn(page);
 
-       /*
-        * TODO: If size > PAGE_SIZE, we could look to see if the next page in
-        * the file happens to be mapped to the next page of physical RAM.
-        */
        return PAGE_SIZE;
 }
 #else
@@ -500,7 +503,7 @@ static struct brd_device *brd_alloc(int i)
        blk_queue_physical_block_size(brd->brd_queue, PAGE_SIZE);
 
        brd->brd_queue->limits.discard_granularity = PAGE_SIZE;
-       brd->brd_queue->limits.max_discard_sectors = UINT_MAX;
+       blk_queue_max_discard_sectors(brd->brd_queue, UINT_MAX);
        brd->brd_queue->limits.discard_zeroes_data = 1;
        queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, brd->brd_queue);