[lvm-devel] master - clvmd: validate open device state
Zdenek Kabelac
zkabelac at fedoraproject.org
Tue Mar 25 10:23:34 UTC 2014
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=b714c7ebc618872abca1c6c7764c84c50b7fbcbe
Commit: b714c7ebc618872abca1c6c7764c84c50b7fbcbe
Parent: b522312678abaccd16b51299994e032d96a79267
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Tue Mar 25 10:17:34 2014 +0100
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Tue Mar 25 11:22:57 2014 +0100
clvmd: validate open device state
If clvmd does not hold any lock, it should also not keep any opened
device.
The reason for this patch is, that refresh_toolcontext calls
dev_cache_exit() which destroys whole device cache (even those with
opened file) - previous patch added recovery path to avoid memory
corruption, but opened files are still bugs that need to be fixed.
So this patch certainly kills many internal mirror & raid tests,
since they leak opened file descriptors (when tests are executed
with 'abort_on_error').
---
daemons/clvmd/lvm-functions.c | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/daemons/clvmd/lvm-functions.c b/daemons/clvmd/lvm-functions.c
index 622eb79..4ce0fcc 100644
--- a/daemons/clvmd/lvm-functions.c
+++ b/daemons/clvmd/lvm-functions.c
@@ -182,6 +182,15 @@ static void remove_info(const char *resource)
{
pthread_mutex_lock(&lv_hash_lock);
dm_hash_remove(lv_hash, resource);
+
+ /* When last lock is remove, validate there are not left opened devices */
+ if (!dm_hash_get_first(lv_hash)) {
+ if (dev_cache_check_for_open_devices())
+ log_error(INTERNAL_ERROR "Nothing is locked however there are still opened devices.");
+ if (critical_section())
+ log_error(INTERNAL_ERROR "Nothing is locked however clvmd is left in critical section.");
+ }
+
pthread_mutex_unlock(&lv_hash_lock);
}
More information about the lvm-devel
mailing list