History

Merge tag 'libnvdimm-fixes-for-5.12-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm

Pull libnvdimm fixes from Dan Williams: "The largest change is for a regression that landed during -rc1 for block-device read-only handling. Vaibhav found a new use for the ability (originally introduced by virtio_pmem) to call back to the platform to flush data, but also found an original bug in that implementation. Lastly, Arnd cleans up some compile warnings in dax. This has all appeared in -next with no reported issues. Summary: - Fix a regression of read-only handling in the pmem driver - Fix a compile warning - Fix support for platform cache flush commands on powerpc/papr" * tag 'libnvdimm-fixes-for-5.12-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm: libnvdimm/region: Fix nvdimm_has_flush() to handle ND_REGION_ASYNC libnvdimm: Notify disk drivers to revalidate region read-only dax: avoid -Wempty-body warnings

Linus Torvalds committed 5 years ago

Commit bdfd99e2 parents 7c22677 11d24985 files · +56 −18Browse files

Unified · Split

5 files
  1. drivers/dax/bus.c +2 −4
  2. drivers/nvdimm/bus.c +6 −8
  3. drivers/nvdimm/pmem.c +33 −4
  4. drivers/nvdimm/region_devs.c +14 −2
  5. include/linux/nd.h +1 −0
drivers/dax/bus.c+2−4
@@ -90,13 +90,11 @@ static ssize_t do_id_store(struct device_driver *drv, const char *buf, · 89 unmodified lines
9090 list_add(&dax_id->list, &dax_drv->ids);
9191 } else
9292 rc = -ENOMEM;
93− } else
94− /* nothing to remove */;
93+ }
9594 } else if (action == ID_REMOVE) {
9695 list_del(&dax_id->list);
9796 kfree(dax_id);
98− } else
99− /* dax_id already added */;
97+ }
10098 mutex_unlock(&dax_bus_lock);
10199
102100 if (rc < 0)
drivers/nvdimm/bus.c+6−8
@@ -631,16 +631,14 @@ void nvdimm_check_and_set_ro(struct gendisk *disk) · 630 unmodified lines
631631 struct nd_region *nd_region = to_nd_region(dev->parent);
632632 int disk_ro = get_disk_ro(disk);
633633
634− /*
635− * Upgrade to read-only if the region is read-only preserve as
636− * read-only if the disk is already read-only.
637− */
638− if (disk_ro || nd_region->ro == disk_ro)
634+ /* catch the disk up with the region ro state */
635+ if (disk_ro == nd_region->ro)
639636 return;
640637
641− dev_info(dev, "%s read-only, marking %s read-only\n",
642− dev_name(&nd_region->dev), disk->disk_name);
643− set_disk_ro(disk, 1);
638+ dev_info(dev, "%s read-%s, marking %s read-%s\n",
639+ dev_name(&nd_region->dev), nd_region->ro ? "only" : "write",
640+ disk->disk_name, nd_region->ro ? "only" : "write");
641+ set_disk_ro(disk, nd_region->ro);
644642 }
645643 EXPORT_SYMBOL(nvdimm_check_and_set_ro);
646644
drivers/nvdimm/pmem.c+33−4
@@ -26,6 +26,7 @@ · 25 unmodified lines
2626 #include <linux/mm.h>
2727 #include <asm/cacheflush.h>
2828 #include "pmem.h"
29+#include "btt.h"
2930 #include "pfn.h"
3031 #include "nd.h"
3132
@@ -585,7 +586,7 @@ static void nd_pmem_shutdown(struct device *dev) · 553 unmodified lines
585586 nvdimm_flush(to_nd_region(dev->parent), NULL);
586587 }
587588
588−static void nd_pmem_notify(struct device *dev, enum nvdimm_event event)
589+static void pmem_revalidate_poison(struct device *dev)
589590 {
590591 struct nd_region *nd_region;
591592 resource_size_t offset = 0, end_trunc = 0;
@@ -595,9 +596,6 @@ static void nd_pmem_notify(struct device *dev, enum nvdimm_event event) · 3 unmodified lines
595596 struct range range;
596597 struct kernfs_node *bb_state;
597598
598− if (event != NVDIMM_REVALIDATE_POISON)
599− return;
600−
601599 if (is_nd_btt(dev)) {
602600 struct nd_btt *nd_btt = to_nd_btt(dev);
603601
@@ -635,6 +633,37 @@ static void nd_pmem_notify(struct device *dev, enum nvdimm_event event) · 31 unmodified lines
635633 sysfs_notify_dirent(bb_state);
636634 }
637635
636+static void pmem_revalidate_region(struct device *dev)
637+{
638+ struct pmem_device *pmem;
639+
640+ if (is_nd_btt(dev)) {
641+ struct nd_btt *nd_btt = to_nd_btt(dev);
642+ struct btt *btt = nd_btt->btt;
643+
644+ nvdimm_check_and_set_ro(btt->btt_disk);
645+ return;
646+ }
647+
648+ pmem = dev_get_drvdata(dev);
649+ nvdimm_check_and_set_ro(pmem->disk);
650+}
651+
652+static void nd_pmem_notify(struct device *dev, enum nvdimm_event event)
653+{
654+ switch (event) {
655+ case NVDIMM_REVALIDATE_POISON:
656+ pmem_revalidate_poison(dev);
657+ break;
658+ case NVDIMM_REVALIDATE_REGION:
659+ pmem_revalidate_region(dev);
660+ break;
661+ default:
662+ dev_WARN_ONCE(dev, 1, "notify: unknown event: %d\n", event);
663+ break;
664+ }
665+}
666+
638667 MODULE_ALIAS("pmem");
639668 MODULE_ALIAS_ND_DEVICE(ND_DEVICE_NAMESPACE_IO);
640669 MODULE_ALIAS_ND_DEVICE(ND_DEVICE_NAMESPACE_PMEM);
drivers/nvdimm/region_devs.c+14−2
@@ -518,6 +518,12 @@ static ssize_t read_only_show(struct device *dev, · 517 unmodified lines
518518 return sprintf(buf, "%d\n", nd_region->ro);
519519 }
520520
521+static int revalidate_read_only(struct device *dev, void *data)
522+{
523+ nd_device_notify(dev, NVDIMM_REVALIDATE_REGION);
524+ return 0;
525+}
526+
521527 static ssize_t read_only_store(struct device *dev,
522528 struct device_attribute *attr, const char *buf, size_t len)
523529 {
@@ -529,6 +535,7 @@ static ssize_t read_only_store(struct device *dev, · 5 unmodified lines
529535 return rc;
530536
531537 nd_region->ro = ro;
538+ device_for_each_child(dev, NULL, revalidate_read_only);
532539 return len;
533540 }
534541 static DEVICE_ATTR_RW(read_only);
@@ -1239,6 +1246,11 @@ int nvdimm_has_flush(struct nd_region *nd_region) · 704 unmodified lines
12391246 || !IS_ENABLED(CONFIG_ARCH_HAS_PMEM_API))
12401247 return -ENXIO;
12411248
1249+ /* Test if an explicit flush function is defined */
1250+ if (test_bit(ND_REGION_ASYNC, &nd_region->flags) && nd_region->flush)
1251+ return 1;
1252+
1253+ /* Test if any flush hints for the region are available */
12421254 for (i = 0; i < nd_region->ndr_mappings; i++) {
12431255 struct nd_mapping *nd_mapping = &nd_region->mapping[i];
12441256 struct nvdimm *nvdimm = nd_mapping->nvdimm;
@@ -1249,8 +1261,8 @@ int nvdimm_has_flush(struct nd_region *nd_region) · 4 unmodified lines
12491261 }
12501262
12511263 /*
1252− * The platform defines dimm devices without hints, assume
1253− * platform persistence mechanism like ADR
1264+ * The platform defines dimm devices without hints nor explicit flush,
1265+ * assume platform persistence mechanism like ADR
12541266 */
12551267 return 0;
12561268 }
include/linux/nd.h+1−0
@@ -11,6 +11,7 @@ · 10 unmodified lines
1111
1212 enum nvdimm_event {
1313 NVDIMM_REVALIDATE_POISON,
14+ NVDIMM_REVALIDATE_REGION,
1415 };
1516
1617 enum nvdimm_claim_class {