From ccd13860708a1538b46c1b82b45d0ab44a26d89e Mon Sep 17 00:00:00 2001 From: David Teigland Date: Fri, 26 Apr 2019 14:49:27 -0500 Subject: [PATCH] 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 deletion(-) diff --git a/lib/label/label.c b/lib/label/label.c index fc7427245..3b9d9fdb7 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 59396559a..8f1f0e2d4 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 76d18b0d6..6aee947b9 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; }