Skip to content

Commit bdfd99e

Browse files
committed
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
2 parents 7c22677 + 11d2498 commit bdfd99e

File tree

5 files changed

+56
-18
lines changed

5 files changed

+56
-18
lines changed

drivers/dax/bus.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,11 @@ static ssize_t do_id_store(struct device_driver *drv, const char *buf,
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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -631,16 +631,14 @@ void nvdimm_check_and_set_ro(struct gendisk *disk)
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

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
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)
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)
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)
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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,12 @@ static ssize_t read_only_show(struct device *dev,
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,
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)
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)
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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
enum nvdimm_event {
1313
NVDIMM_REVALIDATE_POISON,
14+
NVDIMM_REVALIDATE_REGION,
1415
};
1516

1617
enum nvdimm_claim_class {

0 commit comments

Comments
 (0)