2021-10-27 21:25:18

by Huaisheng Ye

[permalink] [raw]
Subject: [PATCH 0/4] add ro state control function for nvdimm drivers

libndctl failed to pass for the reason of writing pmem disk when running
ndctl testing.

Here is the error message below,

namespace6.0: failed to write /dev/pmem6
check_namespaces: namespace6.0 validate_bdev failed
ndctl-test1 failed: -6

Commit 98f49b63e84d4ee1a5c327d0b5f4e8699f6c70fe removes set_device_ro and
e00adcadf3af7a8335026d71ab9f0e0a922191ac adds a new set_read_only method
to allow for driver-specific processing when changing the block device's
read-only state.

Current drivers nd_pmem, nd_blk and nd_btt don't have the capability to
enable or disable write protect (read-only) state. Without that,
blkdev_roset just modifies the value of bd_read_only of struct block_device
and returns success to ioctl of block device. Error would happen when writing
read-only disk next.

Add ro state control function in libnvdimm for this purpose, and implement
set_read_only for BLKROSET.

Huaisheng Ye (4):
libnvdimm: add a ro state control function for nvdimm
libnvdimm/pmem: implement ->set_read_only to hook into BLKROSET
processing
libnvdimm/blk: implement ->set_read_only to hook into BLKROSET
processing
libnvdimm/btt: implement ->set_read_only to hook into BLKROSET
processing

drivers/nvdimm/blk.c | 1 +
drivers/nvdimm/btt.c | 1 +
drivers/nvdimm/bus.c | 17 +++++++++++++++++
drivers/nvdimm/nd.h | 1 +
drivers/nvdimm/pmem.c | 1 +
5 files changed, 21 insertions(+)

--
2.27.0


2021-10-27 21:25:21

by Huaisheng Ye

[permalink] [raw]
Subject: [PATCH 4/4] libnvdimm/btt: implement ->set_read_only to hook into BLKROSET processing

Implement the ->set_read_only method for nd_btt.

Signed-off-by: Huaisheng Ye <[email protected]>
---
drivers/nvdimm/btt.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index 92dec4952297..91fcdac7858f 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1514,6 +1514,7 @@ static const struct block_device_operations btt_fops = {
.submit_bio = btt_submit_bio,
.rw_page = btt_rw_page,
.getgeo = btt_getgeo,
+ .set_read_only = nd_set_ro,
};

static int btt_blk_init(struct btt *btt)
--
2.27.0

2021-10-27 21:27:16

by Huaisheng Ye

[permalink] [raw]
Subject: [PATCH 1/4] libnvdimm: add a ro state control function for nvdimm

libndctl failed to pass when writing pmem disk.
Here is the error message below,

namespace6.0: failed to write /dev/pmem6
check_namespaces: namespace6.0 validate_bdev failed
ndctl-test1 failed: -6

Commit 98f49b63e84d4ee1a5c327d0b5f4e8699f6c70fe removes set_device_ro and
e00adcadf3af7a8335026d71ab9f0e0a922191ac adds a new set_read_only method
to allow for driver-specific processing when changing the block device's
read-only state.

Current drivers nd_pmem, nd_blk and nd_btt don't have the capability to
enable or disable write protect (read-only) state. Without that,
blkdev_roset just modifies the value of bd_read_only of struct block_device
and returns success to ioctl of block device. Error would happen when writing
read-only disk next.

Add ro state control function in libnvdimm for this purpose.

Signed-off-by: Huaisheng Ye <[email protected]>
---
drivers/nvdimm/bus.c | 17 +++++++++++++++++
drivers/nvdimm/nd.h | 1 +
2 files changed, 18 insertions(+)

diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c
index 9dc7f3edd42b..299dd5e11ae7 100644
--- a/drivers/nvdimm/bus.c
+++ b/drivers/nvdimm/bus.c
@@ -636,6 +636,23 @@ void nvdimm_check_and_set_ro(struct gendisk *disk)
}
EXPORT_SYMBOL(nvdimm_check_and_set_ro);

+int nd_set_ro(struct block_device *bdev, bool ro)
+{
+ struct gendisk *disk = bdev->bd_disk;
+ struct device *dev = disk_to_dev(disk)->parent;
+ int disk_ro = get_disk_ro(disk);
+
+ /* nothing to change with ro state */
+ if (disk_ro == ro)
+ return 0;
+
+ dev_info(dev, "set %s to read-%s\n",
+ disk->disk_name, ro ? "only" : "write");
+ set_disk_ro(disk, ro);
+ return 0;
+}
+EXPORT_SYMBOL(nd_set_ro);
+
static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h
index 5467ebbb4a6b..f1cf3eb21292 100644
--- a/drivers/nvdimm/nd.h
+++ b/drivers/nvdimm/nd.h
@@ -512,6 +512,7 @@ void nvdimm_bus_lock(struct device *dev);
void nvdimm_bus_unlock(struct device *dev);
bool is_nvdimm_bus_locked(struct device *dev);
void nvdimm_check_and_set_ro(struct gendisk *disk);
+int nd_set_ro(struct block_device *bdev, bool ro);
void nvdimm_drvdata_release(struct kref *kref);
void put_ndd(struct nvdimm_drvdata *ndd);
int nd_label_reserve_dpa(struct nvdimm_drvdata *ndd);
--
2.27.0

2021-11-09 15:50:10

by Christoph Hellwig

[permalink] [raw]