[lvm-devel] master - wipe_lv: initially open LV in writable mode

David Teigland teigland at sourceware.org
Fri Apr 26 19:51:56 UTC 2019


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=ccd13860708a1538b46c1b82b45d0ab44a26d89e
Commit:        ccd13860708a1538b46c1b82b45d0ab44a26d89e
Parent:        8fbaa6d9a5dd738a566906a23f5bbe901d80a9d2
Author:        David Teigland <teigland at redhat.com>
AuthorDate:    Fri Apr 26 14:49:27 2019 -0500
Committer:     David Teigland <teigland at redhat.com>
CommitterDate: Fri Apr 26 14:49:27 2019 -0500

wipe_lv: initially open LV in writable mode

wipe_lv knows it's going to write the device, so it
can open rw from the start.  It was opening readonly,
and then dev_write needed to reopen it readwrite.
---
 lib/label/label.c       |   12 ++++++++++++
 lib/label/label.h       |    1 +
 lib/metadata/lv_manip.c |    2 +-
 3 files changed, 14 insertions(+), 1 deletions(-)

diff --git a/lib/label/label.c b/lib/label/label.c
index fc74272..3b9d9fd 100644
--- a/lib/label/label.c
+++ b/lib/label/label.c
@@ -1272,6 +1272,18 @@ int label_scan_open_excl(struct device *dev)
 	return label_scan_open(dev);
 }
 
+int label_scan_open_rw(struct device *dev)
+{
+	if (_in_bcache(dev) && !(dev->flags & DEV_BCACHE_WRITE)) {
+		/* FIXME: avoid tossing out bcache blocks just to replace fd. */
+		log_debug("Close and reopen rw %s", dev_name(dev));
+		bcache_invalidate_fd(scan_bcache, dev->bcache_fd);
+		_scan_dev_close(dev);
+	}
+	dev->flags |= DEV_BCACHE_WRITE;
+	return label_scan_open(dev);
+}
+
 bool dev_read_bytes(struct device *dev, uint64_t start, size_t len, void *data)
 {
 	if (!scan_bcache) {
diff --git a/lib/label/label.h b/lib/label/label.h
index 5939655..8f1f0e2 100644
--- a/lib/label/label.h
+++ b/lib/label/label.h
@@ -115,6 +115,7 @@ void label_scan_confirm(struct device *dev);
 int label_scan_setup_bcache(void);
 int label_scan_open(struct device *dev);
 int label_scan_open_excl(struct device *dev);
+int label_scan_open_rw(struct device *dev);
 
 /*
  * Wrappers around bcache equivalents.
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index 76d18b0..6aee947 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -7365,7 +7365,7 @@ int wipe_lv(struct logical_volume *lv, struct wipe_params wp)
 		return 0;
 	}
 
-	if (!label_scan_open(dev)) {
+	if (!label_scan_open_rw(dev)) {
 		log_error("Failed to open %s/%s for wiping and zeroing.", lv->vg->name, lv->name);
 		goto out;
 	}




More information about the lvm-devel mailing list