These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / md / dm-log-writes.c
index 93e0844..624589d 100644 (file)
@@ -55,8 +55,8 @@
 #define LOG_DISCARD_FLAG (1 << 2)
 #define LOG_MARK_FLAG (1 << 3)
 
-#define WRITE_LOG_VERSION 1
-#define WRITE_LOG_MAGIC 0x6a736677736872
+#define WRITE_LOG_VERSION 1ULL
+#define WRITE_LOG_MAGIC 0x6a736677736872ULL
 
 /*
  * The disk format for this is braindead simple.
@@ -146,16 +146,16 @@ static void put_io_block(struct log_writes_c *lc)
        }
 }
 
-static void log_end_io(struct bio *bio, int err)
+static void log_end_io(struct bio *bio)
 {
        struct log_writes_c *lc = bio->bi_private;
        struct bio_vec *bvec;
        int i;
 
-       if (err) {
+       if (bio->bi_error) {
                unsigned long flags;
 
-               DMERR("Error writing log block, error=%d", err);
+               DMERR("Error writing log block, error=%d", bio->bi_error);
                spin_lock_irqsave(&lc->blocks_lock, flags);
                lc->logging_enabled = false;
                spin_unlock_irqrestore(&lc->blocks_lock, flags);
@@ -205,7 +205,6 @@ static int write_metadata(struct log_writes_c *lc, void *entry,
        bio->bi_bdev = lc->logdev->bdev;
        bio->bi_end_io = log_end_io;
        bio->bi_private = lc;
-       set_bit(BIO_UPTODATE, &bio->bi_flags);
 
        page = alloc_page(GFP_KERNEL);
        if (!page) {
@@ -270,7 +269,6 @@ static int log_one_block(struct log_writes_c *lc,
        bio->bi_bdev = lc->logdev->bdev;
        bio->bi_end_io = log_end_io;
        bio->bi_private = lc;
-       set_bit(BIO_UPTODATE, &bio->bi_flags);
 
        for (i = 0; i < block->vec_cnt; i++) {
                /*
@@ -292,7 +290,6 @@ static int log_one_block(struct log_writes_c *lc,
                        bio->bi_bdev = lc->logdev->bdev;
                        bio->bi_end_io = log_end_io;
                        bio->bi_private = lc;
-                       set_bit(BIO_UPTODATE, &bio->bi_flags);
 
                        ret = bio_add_page(bio, block->vecs[i].bv_page,
                                           block->vecs[i].bv_len, 0);
@@ -420,6 +417,7 @@ static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv)
        struct log_writes_c *lc;
        struct dm_arg_set as;
        const char *devname, *logdevname;
+       int ret;
 
        as.argc = argc;
        as.argv = argv;
@@ -443,18 +441,22 @@ static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv)
        atomic_set(&lc->pending_blocks, 0);
 
        devname = dm_shift_arg(&as);
-       if (dm_get_device(ti, devname, dm_table_get_mode(ti->table), &lc->dev)) {
+       ret = dm_get_device(ti, devname, dm_table_get_mode(ti->table), &lc->dev);
+       if (ret) {
                ti->error = "Device lookup failed";
                goto bad;
        }
 
        logdevname = dm_shift_arg(&as);
-       if (dm_get_device(ti, logdevname, dm_table_get_mode(ti->table), &lc->logdev)) {
+       ret = dm_get_device(ti, logdevname, dm_table_get_mode(ti->table),
+                           &lc->logdev);
+       if (ret) {
                ti->error = "Log device lookup failed";
                dm_put_device(ti, lc->dev);
                goto bad;
        }
 
+       ret = -EINVAL;
        lc->log_kthread = kthread_run(log_writes_kthread, lc, "log-write");
        if (!lc->log_kthread) {
                ti->error = "Couldn't alloc kthread";
@@ -479,7 +481,7 @@ static int log_writes_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 
 bad:
        kfree(lc);
-       return -EINVAL;
+       return ret;
 }
 
 static int log_mark(struct log_writes_c *lc, char *data)
@@ -606,7 +608,7 @@ static int log_writes_map(struct dm_target *ti, struct bio *bio)
                WARN_ON(flush_bio || fua_bio);
                if (lc->device_supports_discard)
                        goto map_bio;
-               bio_endio(bio, 0);
+               bio_endio(bio);
                return DM_MAPIO_SUBMITTED;
        }
 
@@ -712,35 +714,19 @@ static void log_writes_status(struct dm_target *ti, status_type_t type,
        }
 }
 
-static int log_writes_ioctl(struct dm_target *ti, unsigned int cmd,
-                           unsigned long arg)
+static int log_writes_prepare_ioctl(struct dm_target *ti,
+               struct block_device **bdev, fmode_t *mode)
 {
        struct log_writes_c *lc = ti->private;
        struct dm_dev *dev = lc->dev;
-       int r = 0;
 
+       *bdev = dev->bdev;
        /*
         * Only pass ioctls through if the device sizes match exactly.
         */
        if (ti->len != i_size_read(dev->bdev->bd_inode) >> SECTOR_SHIFT)
-               r = scsi_verify_blk_ioctl(NULL, cmd);
-
-       return r ? : __blkdev_driver_ioctl(dev->bdev, dev->mode, cmd, arg);
-}
-
-static int log_writes_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
-                           struct bio_vec *biovec, int max_size)
-{
-       struct log_writes_c *lc = ti->private;
-       struct request_queue *q = bdev_get_queue(lc->dev->bdev);
-
-       if (!q->merge_bvec_fn)
-               return max_size;
-
-       bvm->bi_bdev = lc->dev->bdev;
-       bvm->bi_sector = dm_target_offset(ti, bvm->bi_sector);
-
-       return min(max_size, q->merge_bvec_fn(q, bvm, biovec));
+               return 1;
+       return 0;
 }
 
 static int log_writes_iterate_devices(struct dm_target *ti,
@@ -795,8 +781,7 @@ static struct target_type log_writes_target = {
        .map    = log_writes_map,
        .end_io = normal_end_io,
        .status = log_writes_status,
-       .ioctl  = log_writes_ioctl,
-       .merge  = log_writes_merge,
+       .prepare_ioctl = log_writes_prepare_ioctl,
        .message = log_writes_message,
        .iterate_devices = log_writes_iterate_devices,
        .io_hints = log_writes_io_hints,