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; }