in check_namespaces(), add a step to validate the write_cache status and controls for the namespaces that support it. Also add a negative test for the namespaces that don't have a write_cache (blk, sector etc), making sure the APIs fail as expected.
Cc: Dan Williams <dan.j.willi...@intel.com> Signed-off-by: Vishal Verma <vishal.l.ve...@intel.com> --- test/libndctl.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/test/libndctl.c b/test/libndctl.c index a66bcb7..72271f4 100644 --- a/test/libndctl.c +++ b/test/libndctl.c @@ -1614,6 +1614,56 @@ static int validate_bdev(const char *devname, struct ndctl_btt *btt, return rc; } +static int validate_write_cache(struct ndctl_namespace *ndns) +{ + const char *devname = ndctl_namespace_get_devname(ndns); + int wc, mode, type, rc; + + type = ndctl_namespace_get_type(ndns); + mode = ndctl_namespace_get_mode(ndns); + wc = ndctl_namespace_write_cache_is_enabled(ndns); + + if ((type == ND_DEVICE_NAMESPACE_PMEM || type == ND_DEVICE_NAMESPACE_IO) && + (mode == NDCTL_NS_MODE_FSDAX || mode == NDCTL_NS_MODE_RAW)) { + if (wc != 1) { + fprintf(stderr, "%s: expected write_cache enabled\n", + devname); + return -ENXIO; + } + rc = ndctl_namespace_disable_write_cache(ndns); + if (rc) { + fprintf(stderr, "%s: failed to disable write_cache\n", + devname); + return rc; + } + rc = ndctl_namespace_write_cache_is_enabled(ndns); + if (rc != 0) { + fprintf(stderr, "%s: write_cache could not be disabled\n", + devname); + return rc; + } + rc = ndctl_namespace_enable_write_cache(ndns); + if (rc) { + fprintf(stderr, "%s: failed to re-enable write_cache\n", + devname); + return rc; + } + rc = ndctl_namespace_write_cache_is_enabled(ndns); + if (rc != 1) { + fprintf(stderr, "%s: write_cache could not be re-enabled\n", + devname); + return rc; + } + } else { + if (wc == 0 || wc == 1) { + fprintf(stderr, "%s: expected write_cache to be absent\n", + devname); + return -ENXIO; + } + } + return 0; +} + static int check_namespaces(struct ndctl_region *region, struct namespace **namespaces, enum ns_mode mode) { @@ -1787,6 +1837,13 @@ static int check_namespaces(struct ndctl_region *region, break; } + rc = validate_write_cache(ndns); + if (rc) { + fprintf(stderr, "%s: %s validate_write_cache failed\n", + __func__, devname); + break; + } + if (ndctl_namespace_disable_invalidate(ndns) < 0) { fprintf(stderr, "%s: failed to disable\n", devname); rc = -ENXIO; -- 2.14.3 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm