aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2018-04-09 13:50:17 -0400
committerDan Williams <dan.j.williams@intel.com>2018-04-09 13:50:17 -0400
commite13e75b86ef2f88e3a47d672dd4c52a293efb95b (patch)
tree2617aebd952d1aec09d323f6b2484b93f659e753 /drivers/md
parent1ed41b5696ccc3ff40a1dee39fe14eff273faf82 (diff)
parent976431b02c2ef92ae3f8b6a7d699fc554025e118 (diff)
Merge branch 'for-4.17/dax' into libnvdimm-for-next
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/Kconfig2
-rw-r--r--drivers/md/dm-linear.c6
-rw-r--r--drivers/md/dm-log-writes.c95
-rw-r--r--drivers/md/dm-stripe.c6
-rw-r--r--drivers/md/dm.c10
5 files changed, 69 insertions, 50 deletions
diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig
index 2c8ac3688815..edff083f7c4e 100644
--- a/drivers/md/Kconfig
+++ b/drivers/md/Kconfig
@@ -201,7 +201,7 @@ config BLK_DEV_DM_BUILTIN
201config BLK_DEV_DM 201config BLK_DEV_DM
202 tristate "Device mapper support" 202 tristate "Device mapper support"
203 select BLK_DEV_DM_BUILTIN 203 select BLK_DEV_DM_BUILTIN
204 select DAX 204 depends on DAX || DAX=n
205 ---help--- 205 ---help---
206 Device-mapper is a low level volume manager. It works by allowing 206 Device-mapper is a low level volume manager. It works by allowing
207 people to specify mappings for ranges of logical sectors. Various 207 people to specify mappings for ranges of logical sectors. Various
diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c
index d5f8eff7c11d..89443e0ededa 100644
--- a/drivers/md/dm-linear.c
+++ b/drivers/md/dm-linear.c
@@ -154,6 +154,7 @@ static int linear_iterate_devices(struct dm_target *ti,
154 return fn(ti, lc->dev, lc->start, ti->len, data); 154 return fn(ti, lc->dev, lc->start, ti->len, data);
155} 155}
156 156
157#if IS_ENABLED(CONFIG_DAX_DRIVER)
157static long linear_dax_direct_access(struct dm_target *ti, pgoff_t pgoff, 158static long linear_dax_direct_access(struct dm_target *ti, pgoff_t pgoff,
158 long nr_pages, void **kaddr, pfn_t *pfn) 159 long nr_pages, void **kaddr, pfn_t *pfn)
159{ 160{
@@ -184,6 +185,11 @@ static size_t linear_dax_copy_from_iter(struct dm_target *ti, pgoff_t pgoff,
184 return dax_copy_from_iter(dax_dev, pgoff, addr, bytes, i); 185 return dax_copy_from_iter(dax_dev, pgoff, addr, bytes, i);
185} 186}
186 187
188#else
189#define linear_dax_direct_access NULL
190#define linear_dax_copy_from_iter NULL
191#endif
192
187static struct target_type linear_target = { 193static struct target_type linear_target = {
188 .name = "linear", 194 .name = "linear",
189 .version = {1, 4, 0}, 195 .version = {1, 4, 0},
diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c
index 3362d866793b..7fcb4216973f 100644
--- a/drivers/md/dm-log-writes.c
+++ b/drivers/md/dm-log-writes.c
@@ -610,51 +610,6 @@ static int log_mark(struct log_writes_c *lc, char *data)
610 return 0; 610 return 0;
611} 611}
612 612
613static int log_dax(struct log_writes_c *lc, sector_t sector, size_t bytes,
614 struct iov_iter *i)
615{
616 struct pending_block *block;
617
618 if (!bytes)
619 return 0;
620
621 block = kzalloc(sizeof(struct pending_block), GFP_KERNEL);
622 if (!block) {
623 DMERR("Error allocating dax pending block");
624 return -ENOMEM;
625 }
626
627 block->data = kzalloc(bytes, GFP_KERNEL);
628 if (!block->data) {
629 DMERR("Error allocating dax data space");
630 kfree(block);
631 return -ENOMEM;
632 }
633
634 /* write data provided via the iterator */
635 if (!copy_from_iter(block->data, bytes, i)) {
636 DMERR("Error copying dax data");
637 kfree(block->data);
638 kfree(block);
639 return -EIO;
640 }
641
642 /* rewind the iterator so that the block driver can use it */
643 iov_iter_revert(i, bytes);
644
645 block->datalen = bytes;
646 block->sector = bio_to_dev_sectors(lc, sector);
647 block->nr_sectors = ALIGN(bytes, lc->sectorsize) >> lc->sectorshift;
648
649 atomic_inc(&lc->pending_blocks);
650 spin_lock_irq(&lc->blocks_lock);
651 list_add_tail(&block->list, &lc->unflushed_blocks);
652 spin_unlock_irq(&lc->blocks_lock);
653 wake_up_process(lc->log_kthread);
654
655 return 0;
656}
657
658static void log_writes_dtr(struct dm_target *ti) 613static void log_writes_dtr(struct dm_target *ti)
659{ 614{
660 struct log_writes_c *lc = ti->private; 615 struct log_writes_c *lc = ti->private;
@@ -920,6 +875,52 @@ static void log_writes_io_hints(struct dm_target *ti, struct queue_limits *limit
920 limits->io_min = limits->physical_block_size; 875 limits->io_min = limits->physical_block_size;
921} 876}
922 877
878#if IS_ENABLED(CONFIG_DAX_DRIVER)
879static int log_dax(struct log_writes_c *lc, sector_t sector, size_t bytes,
880 struct iov_iter *i)
881{
882 struct pending_block *block;
883
884 if (!bytes)
885 return 0;
886
887 block = kzalloc(sizeof(struct pending_block), GFP_KERNEL);
888 if (!block) {
889 DMERR("Error allocating dax pending block");
890 return -ENOMEM;
891 }
892
893 block->data = kzalloc(bytes, GFP_KERNEL);
894 if (!block->data) {
895 DMERR("Error allocating dax data space");
896 kfree(block);
897 return -ENOMEM;
898 }
899
900 /* write data provided via the iterator */
901 if (!copy_from_iter(block->data, bytes, i)) {
902 DMERR("Error copying dax data");
903 kfree(block->data);
904 kfree(block);
905 return -EIO;
906 }
907
908 /* rewind the iterator so that the block driver can use it */
909 iov_iter_revert(i, bytes);
910
911 block->datalen = bytes;
912 block->sector = bio_to_dev_sectors(lc, sector);
913 block->nr_sectors = ALIGN(bytes, lc->sectorsize) >> lc->sectorshift;
914
915 atomic_inc(&lc->pending_blocks);
916 spin_lock_irq(&lc->blocks_lock);
917 list_add_tail(&block->list, &lc->unflushed_blocks);
918 spin_unlock_irq(&lc->blocks_lock);
919 wake_up_process(lc->log_kthread);
920
921 return 0;
922}
923
923static long log_writes_dax_direct_access(struct dm_target *ti, pgoff_t pgoff, 924static long log_writes_dax_direct_access(struct dm_target *ti, pgoff_t pgoff,
924 long nr_pages, void **kaddr, pfn_t *pfn) 925 long nr_pages, void **kaddr, pfn_t *pfn)
925{ 926{
@@ -956,6 +957,10 @@ static size_t log_writes_dax_copy_from_iter(struct dm_target *ti,
956dax_copy: 957dax_copy:
957 return dax_copy_from_iter(lc->dev->dax_dev, pgoff, addr, bytes, i); 958 return dax_copy_from_iter(lc->dev->dax_dev, pgoff, addr, bytes, i);
958} 959}
960#else
961#define log_writes_dax_direct_access NULL
962#define log_writes_dax_copy_from_iter NULL
963#endif
959 964
960static struct target_type log_writes_target = { 965static struct target_type log_writes_target = {
961 .name = "log-writes", 966 .name = "log-writes",
diff --git a/drivers/md/dm-stripe.c b/drivers/md/dm-stripe.c
index b5e892149c54..ac2e8ee9d586 100644
--- a/drivers/md/dm-stripe.c
+++ b/drivers/md/dm-stripe.c
@@ -311,6 +311,7 @@ static int stripe_map(struct dm_target *ti, struct bio *bio)
311 return DM_MAPIO_REMAPPED; 311 return DM_MAPIO_REMAPPED;
312} 312}
313 313
314#if IS_ENABLED(CONFIG_DAX_DRIVER)
314static long stripe_dax_direct_access(struct dm_target *ti, pgoff_t pgoff, 315static long stripe_dax_direct_access(struct dm_target *ti, pgoff_t pgoff,
315 long nr_pages, void **kaddr, pfn_t *pfn) 316 long nr_pages, void **kaddr, pfn_t *pfn)
316{ 317{
@@ -351,6 +352,11 @@ static size_t stripe_dax_copy_from_iter(struct dm_target *ti, pgoff_t pgoff,
351 return dax_copy_from_iter(dax_dev, pgoff, addr, bytes, i); 352 return dax_copy_from_iter(dax_dev, pgoff, addr, bytes, i);
352} 353}
353 354
355#else
356#define stripe_dax_direct_access NULL
357#define stripe_dax_copy_from_iter NULL
358#endif
359
354/* 360/*
355 * Stripe status: 361 * Stripe status:
356 * 362 *
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 45328d8b2859..bac79f40f3cb 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -1805,7 +1805,7 @@ static void cleanup_mapped_device(struct mapped_device *md)
1805static struct mapped_device *alloc_dev(int minor) 1805static struct mapped_device *alloc_dev(int minor)
1806{ 1806{
1807 int r, numa_node_id = dm_get_numa_node(); 1807 int r, numa_node_id = dm_get_numa_node();
1808 struct dax_device *dax_dev; 1808 struct dax_device *dax_dev = NULL;
1809 struct mapped_device *md; 1809 struct mapped_device *md;
1810 void *old_md; 1810 void *old_md;
1811 1811
@@ -1871,9 +1871,11 @@ static struct mapped_device *alloc_dev(int minor)
1871 md->disk->private_data = md; 1871 md->disk->private_data = md;
1872 sprintf(md->disk->disk_name, "dm-%d", minor); 1872 sprintf(md->disk->disk_name, "dm-%d", minor);
1873 1873
1874 dax_dev = alloc_dax(md, md->disk->disk_name, &dm_dax_ops); 1874 if (IS_ENABLED(CONFIG_DAX_DRIVER)) {
1875 if (!dax_dev) 1875 dax_dev = alloc_dax(md, md->disk->disk_name, &dm_dax_ops);
1876 goto bad; 1876 if (!dax_dev)
1877 goto bad;
1878 }
1877 md->dax_dev = dax_dev; 1879 md->dax_dev = dax_dev;
1878 1880
1879 add_disk_no_queue_reg(md->disk); 1881 add_disk_no_queue_reg(md->disk);