]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/md/dm-stripe.c
Merge tag 'libnvdimm-for-4.12' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdim...
[karo-tx-linux.git] / drivers / md / dm-stripe.c
index 4b50ae115c6d34370cde6780178c1c49aabeba67..75152482f3ad068b71e17001129903c091a5628d 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/init.h>
 #include <linux/blkdev.h>
 #include <linux/bio.h>
+#include <linux/dax.h>
 #include <linux/slab.h>
 #include <linux/log2.h>
 
@@ -310,27 +311,25 @@ static int stripe_map(struct dm_target *ti, struct bio *bio)
        return DM_MAPIO_REMAPPED;
 }
 
-static long stripe_direct_access(struct dm_target *ti, sector_t sector,
-                                void **kaddr, pfn_t *pfn, long size)
+static long stripe_dax_direct_access(struct dm_target *ti, pgoff_t pgoff,
+               long nr_pages, void **kaddr, pfn_t *pfn)
 {
+       sector_t dev_sector, sector = pgoff * PAGE_SECTORS;
        struct stripe_c *sc = ti->private;
-       uint32_t stripe;
+       struct dax_device *dax_dev;
        struct block_device *bdev;
-       struct blk_dax_ctl dax = {
-               .size = size,
-       };
+       uint32_t stripe;
        long ret;
 
-       stripe_map_sector(sc, sector, &stripe, &dax.sector);
-
-       dax.sector += sc->stripe[stripe].physical_start;
+       stripe_map_sector(sc, sector, &stripe, &dev_sector);
+       dev_sector += sc->stripe[stripe].physical_start;
+       dax_dev = sc->stripe[stripe].dev->dax_dev;
        bdev = sc->stripe[stripe].dev->bdev;
 
-       ret = bdev_direct_access(bdev, &dax);
-       *kaddr = dax.addr;
-       *pfn = dax.pfn;
-
-       return ret;
+       ret = bdev_dax_pgoff(bdev, dev_sector, nr_pages * PAGE_SIZE, &pgoff);
+       if (ret)
+               return ret;
+       return dax_direct_access(dax_dev, pgoff, nr_pages, kaddr, pfn);
 }
 
 /*
@@ -451,7 +450,7 @@ static struct target_type stripe_target = {
        .status = stripe_status,
        .iterate_devices = stripe_iterate_devices,
        .io_hints = stripe_io_hints,
-       .direct_access = stripe_direct_access,
+       .direct_access = stripe_dax_direct_access,
 };
 
 int __init dm_stripe_init(void)