[lvm-devel] master - scan: fix missing close in lib
David Teigland
teigland at sourceware.org
Wed May 16 19:50:47 UTC 2018
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=28d35e5c590a01a196ce5a9a1239921921519809
Commit: 28d35e5c590a01a196ce5a9a1239921921519809
Parent: 64dd656ef7943f9991c83802dfa5f762c902e1fb
Author: David Teigland <teigland at redhat.com>
AuthorDate: Wed May 16 13:24:00 2018 -0500
Committer: David Teigland <teigland at redhat.com>
CommitterDate: Wed May 16 14:48:30 2018 -0500
scan: fix missing close in lib
lib was using dev_test_excl which wasn't closing the device.
Switch code to new io layer with excl open.
Also use exclusive open in some other places.
---
lib/label/label.c | 8 +++++++-
lib/label/label.h | 1 +
lib/metadata/metadata-liblvm.c | 13 +------------
lib/metadata/metadata.c | 2 +-
tools/toollib.c | 2 +-
5 files changed, 11 insertions(+), 15 deletions(-)
diff --git a/lib/label/label.c b/lib/label/label.c
index 40537d1..b9227f5 100644
--- a/lib/label/label.c
+++ b/lib/label/label.c
@@ -114,7 +114,7 @@ int label_remove(struct device *dev)
log_very_verbose("Scanning for labels to wipe from %s", dev_name(dev));
- if (!label_scan_open(dev)) {
+ if (!label_scan_open_excl(dev)) {
log_error("Failed to open device %s", dev_name(dev));
return 0;
}
@@ -977,6 +977,12 @@ int label_scan_open(struct device *dev)
return 1;
}
+int label_scan_open_excl(struct device *dev)
+{
+ dev->flags |= DEV_BCACHE_EXCL;
+ 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 0ef1d83..3d8882f 100644
--- a/lib/label/label.h
+++ b/lib/label/label.h
@@ -114,6 +114,7 @@ int label_read_sector(struct device *dev, uint64_t scan_sector);
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);
/*
* Wrappers around bcache equivalents.
diff --git a/lib/metadata/metadata-liblvm.c b/lib/metadata/metadata-liblvm.c
index df4fdd9..ffd07a5 100644
--- a/lib/metadata/metadata-liblvm.c
+++ b/lib/metadata/metadata-liblvm.c
@@ -227,13 +227,12 @@ static int _pvcreate_check(struct cmd_context *cmd, const char *name,
/*
* This test will fail if the device belongs to an MD array.
*/
- if (!dev_test_excl(dev)) {
+ if (!label_scan_open_excl(dev)) {
/* FIXME Detect whether device-mapper itself is still using it */
log_error("Can't open %s exclusively. Mounted filesystem?",
name);
goto out;
}
- dev_close(dev);
if (!wipe_known_signatures(cmd, dev, name,
TYPE_LVM1_MEMBER | TYPE_LVM2_MEMBER,
@@ -578,16 +577,6 @@ static int _pvremove_single(struct cmd_context *cmd, const char *pv_name,
goto out;
}
- // FIXME: why is this called if info is not used?
- //info = lvmcache_info_from_pvid(dev->pvid, dev, 0);
-
- if (!dev_test_excl(dev)) {
- /* FIXME Detect whether device-mapper is still using the device */
- log_error("Can't open %s exclusively - not removing. "
- "Mounted filesystem?", dev_name(dev));
- goto out;
- }
-
/* Wipe existing label(s) */
if (!label_remove(dev)) {
log_error("Failed to wipe existing label(s) on %s", pv_name);
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index 1636026..1cbaf95 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -1413,7 +1413,7 @@ static int _pvcreate_write(struct cmd_context *cmd, struct pv_to_write *pvw)
struct device *dev = pv->dev;
const char *pv_name = dev_name(dev);
- if (!label_scan_open(dev)) {
+ if (!label_scan_open_excl(dev)) {
log_error("%s not opened: device not written", pv_name);
return 0;
}
diff --git a/tools/toollib.c b/tools/toollib.c
index afd8060..0fc86cf 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -5785,7 +5785,7 @@ do_command:
pv_name = pd->name;
- label_scan_open(pd->dev);
+ label_scan_open_excl(pd->dev);
log_debug("Creating a new PV on %s.", pv_name);
More information about the lvm-devel
mailing list