1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

Fix thread race in clvmd.

This commit is contained in:
Patrick Caulfield 2007-04-24 15:13:13 +00:00
parent 6e23a8aa20
commit 05aa860fd7
2 changed files with 13 additions and 2 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.25 - Version 2.02.25 -
================================= =================================
Fix thread race in clvmd.
Add scan_sector param to label_read and _find_labeller. Add scan_sector param to label_read and _find_labeller.
Make clvmd cope with quorum devices on RHEL5 Make clvmd cope with quorum devices on RHEL5
Add dev_read_circular. Add dev_read_circular.

View File

@ -50,6 +50,7 @@
static struct cmd_context *cmd = NULL; static struct cmd_context *cmd = NULL;
static struct dm_hash_table *lv_hash = NULL; static struct dm_hash_table *lv_hash = NULL;
static pthread_mutex_t lv_hash_lock; static pthread_mutex_t lv_hash_lock;
static pthread_mutex_t lvm_lock;
static char last_error[1024]; static char last_error[1024];
struct lv_info { struct lv_info {
@ -311,10 +312,12 @@ int do_lock_lv(unsigned char command, unsigned char lock_flags, char *resource)
DEBUGLOG("do_lock_lv: resource '%s', cmd = 0x%x, flags = %x\n", DEBUGLOG("do_lock_lv: resource '%s', cmd = 0x%x, flags = %x\n",
resource, command, lock_flags); resource, command, lock_flags);
pthread_mutex_lock(&lvm_lock);
if (!cmd->config_valid || config_files_changed(cmd)) { if (!cmd->config_valid || config_files_changed(cmd)) {
/* Reinitialise various settings inc. logging, filters */ /* Reinitialise various settings inc. logging, filters */
if (!refresh_toolcontext(cmd)) { if (!refresh_toolcontext(cmd)) {
log_error("Updated config file invalid. Aborting."); log_error("Updated config file invalid. Aborting.");
pthread_mutex_unlock(&lvm_lock);
return EINVAL; return EINVAL;
} }
} }
@ -367,6 +370,7 @@ int do_lock_lv(unsigned char command, unsigned char lock_flags, char *resource)
/* clean the pool for another command */ /* clean the pool for another command */
dm_pool_empty(cmd->mem); dm_pool_empty(cmd->mem);
pthread_mutex_unlock(&lvm_lock);
DEBUGLOG("Command return is %d\n", status); DEBUGLOG("Command return is %d\n", status);
return status; return status;
@ -393,6 +397,8 @@ int pre_lock_lv(unsigned char command, unsigned char lock_flags, char *resource)
int post_lock_lv(unsigned char command, unsigned char lock_flags, int post_lock_lv(unsigned char command, unsigned char lock_flags,
char *resource) char *resource)
{ {
int status;
/* Opposite of above, done on resume after a metadata update */ /* Opposite of above, done on resume after a metadata update */
if (command == LCK_LV_RESUME) { if (command == LCK_LV_RESUME) {
int oldmode; int oldmode;
@ -406,7 +412,10 @@ int post_lock_lv(unsigned char command, unsigned char lock_flags,
if (oldmode == LKM_PWMODE) { if (oldmode == LKM_PWMODE) {
struct lvinfo lvi; struct lvinfo lvi;
if (!lv_info_by_lvid(cmd, resource, &lvi, 0)) pthread_mutex_lock(&lvm_lock);
status = lv_info_by_lvid(cmd, resource, &lvi, 0);
pthread_mutex_unlock(&lvm_lock);
if (!status)
return EIO; return EIO;
if (lvi.exists) { if (lvi.exists) {
@ -533,7 +542,7 @@ static void lvm2_log_fn(int level, const char *file, int line,
const char *message) const char *message)
{ {
/* /*
* Ignore non-error messages, but store the latest one for returning * Ignore non-error messages, but store the latest one for returning
* to the user. * to the user.
*/ */
if (level != _LOG_ERR && level != _LOG_FATAL) if (level != _LOG_ERR && level != _LOG_FATAL)
@ -572,6 +581,7 @@ void init_lvhash()
/* Create hash table for keeping LV locks & status */ /* Create hash table for keeping LV locks & status */
lv_hash = dm_hash_create(100); lv_hash = dm_hash_create(100);
pthread_mutex_init(&lv_hash_lock, NULL); pthread_mutex_init(&lv_hash_lock, NULL);
pthread_mutex_init(&lvm_lock, NULL);
} }
/* Called to initialise the LVM context of the daemon */ /* Called to initialise the LVM context of the daemon */