diff options
author | Dan Williams <dan.j.williams@intel.com> | 2018-04-09 13:50:17 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2018-04-09 13:50:17 -0400 |
commit | e13e75b86ef2f88e3a47d672dd4c52a293efb95b (patch) | |
tree | 2617aebd952d1aec09d323f6b2484b93f659e753 /drivers/md | |
parent | 1ed41b5696ccc3ff40a1dee39fe14eff273faf82 (diff) | |
parent | 976431b02c2ef92ae3f8b6a7d699fc554025e118 (diff) |
Merge branch 'for-4.17/dax' into libnvdimm-for-next
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/Kconfig | 2 | ||||
-rw-r--r-- | drivers/md/dm-linear.c | 6 | ||||
-rw-r--r-- | drivers/md/dm-log-writes.c | 95 | ||||
-rw-r--r-- | drivers/md/dm-stripe.c | 6 | ||||
-rw-r--r-- | drivers/md/dm.c | 10 |
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 | |||
201 | config BLK_DEV_DM | 201 | config 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) | ||
157 | static long linear_dax_direct_access(struct dm_target *ti, pgoff_t pgoff, | 158 | static 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 | |||
187 | static struct target_type linear_target = { | 193 | static 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 | ||
613 | static 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 | |||
658 | static void log_writes_dtr(struct dm_target *ti) | 613 | static 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) | ||
879 | static 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 | |||
923 | static long log_writes_dax_direct_access(struct dm_target *ti, pgoff_t pgoff, | 924 | static 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, | |||
956 | dax_copy: | 957 | dax_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 | ||
960 | static struct target_type log_writes_target = { | 965 | static 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) | ||
314 | static long stripe_dax_direct_access(struct dm_target *ti, pgoff_t pgoff, | 315 | static 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) | |||
1805 | static struct mapped_device *alloc_dev(int minor) | 1805 | static 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); |