1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-03 05:18:29 +03:00

clean up critical section patch

This commit is contained in:
Alasdair Kergon 2011-04-28 20:29:59 +00:00
parent 96c4abee62
commit 9cda028a96
5 changed files with 29 additions and 13 deletions

View File

@ -574,11 +574,13 @@ int remote_lock_held(const char *vol, int *exclusive)
int sync_local_dev_names(struct cmd_context* cmd) int sync_local_dev_names(struct cmd_context* cmd)
{ {
memlock_unlock(cmd); memlock_unlock(cmd);
return lock_vol(cmd, VG_SYNC_NAMES, LCK_NONE | LCK_CACHE | LCK_LOCAL);
return lock_vol(cmd, VG_SYNC_NAMES, LCK_VG_SYNC_LOCAL);
} }
int sync_dev_names(struct cmd_context* cmd) int sync_dev_names(struct cmd_context* cmd)
{ {
memlock_unlock(cmd); memlock_unlock(cmd);
return lock_vol(cmd, VG_SYNC_NAMES, LCK_NONE | LCK_CACHE);
return lock_vol(cmd, VG_SYNC_NAMES, LCK_VG_SYNC);
} }

View File

@ -39,6 +39,9 @@ int remote_lock_held(const char *vol, int *exclusive);
* acquired in alphabetical order of 'vol' (to avoid deadlocks), with * acquired in alphabetical order of 'vol' (to avoid deadlocks), with
* VG_ORPHANS last. * VG_ORPHANS last.
* *
* Use VG_SYNC_NAMES to wait for any outstanding asynchronous /dev nodes
* events to complete.
*
* LCK_LV: * LCK_LV:
* Lock/unlock an individual logical volume * Lock/unlock an individual logical volume
* char *vol holds lvid * char *vol holds lvid
@ -127,6 +130,9 @@ int check_lvm1_vg_inactive(struct cmd_context *cmd, const char *vgname);
#define LCK_VG_BACKUP (LCK_VG | LCK_CACHE) #define LCK_VG_BACKUP (LCK_VG | LCK_CACHE)
#define LCK_VG_SYNC (LCK_NONE | LCK_CACHE)
#define LCK_VG_SYNC_LOCAL (LCK_NONE | LCK_CACHE | LCK_LOCAL)
#define LCK_LV_EXCLUSIVE (LCK_LV | LCK_EXCL) #define LCK_LV_EXCLUSIVE (LCK_LV | LCK_EXCL)
#define LCK_LV_SUSPEND (LCK_LV | LCK_WRITE) #define LCK_LV_SUSPEND (LCK_LV | LCK_WRITE)
#define LCK_LV_RESUME (LCK_LV | LCK_UNLOCK) #define LCK_LV_RESUME (LCK_LV | LCK_UNLOCK)
@ -175,12 +181,7 @@ int check_lvm1_vg_inactive(struct cmd_context *cmd, const char *vgname);
lock_vol((vg)->cmd, (vg)->name, LCK_VG_REVERT) lock_vol((vg)->cmd, (vg)->name, LCK_VG_REVERT)
#define remote_backup_metadata(vg) \ #define remote_backup_metadata(vg) \
lock_vol((vg)->cmd, (vg)->name, LCK_VG_BACKUP) lock_vol((vg)->cmd, (vg)->name, LCK_VG_BACKUP)
/* cleanup later
#define sync_local_dev_names(cmd) \
lock_vol(cmd, VG_SYNC_NAMES, LCK_NONE | LCK_CACHE | LCK_LOCAL)
#define sync_dev_names(cmd) \
lock_vol(cmd, VG_SYNC_NAMES, LCK_NONE | LCK_CACHE)
*/
int sync_local_dev_names(struct cmd_context* cmd); int sync_local_dev_names(struct cmd_context* cmd);
int sync_dev_names(struct cmd_context* cmd); int sync_dev_names(struct cmd_context* cmd);

View File

@ -196,7 +196,7 @@ struct pv_segment {
#define FMT_INSTANCE_PRIVATE_MDAS 0x00000008U #define FMT_INSTANCE_PRIVATE_MDAS 0x00000008U
struct format_instance { struct format_instance {
unsigned ref_count; unsigned ref_count; /* Refs to this fid from VG and PV structs */
struct dm_pool *mem; struct dm_pool *mem;
uint32_t type; uint32_t type;

View File

@ -987,11 +987,11 @@ static int _remove_mirror_images(struct logical_volume *lv,
} }
/* FIXME: second suspend should not be needed /* FIXME: second suspend should not be needed
* Explicitly suspend temporary LV * Explicitly suspend temporary LV.
* This balance critical_section_inc() calls with critical_section_dec() in resume * This balances critical_section_inc() calls with critical_section_dec()
* (both localy and in cluster) and also properly propagates precommited * in resume (both local and cluster) and also properly propagates precommitted
* metadata into dm table on other nodes. * metadata into dm table on other nodes.
* (visible flag set causes the suspend is not properly propagated?) * FIXME: check propagation of suspend with visible flag
*/ */
if (temp_layer_lv && !suspend_lv(temp_layer_lv->vg->cmd, temp_layer_lv)) if (temp_layer_lv && !suspend_lv(temp_layer_lv->vg->cmd, temp_layer_lv))
log_error("Problem suspending temporary LV %s", temp_layer_lv->name); log_error("Problem suspending temporary LV %s", temp_layer_lv->name);

View File

@ -18,6 +18,19 @@
struct cmd_context; struct cmd_context;
/*
* Inside a critical section, memory is always locked.
*
* After leaving the critical section, memory stays locked until
* memlock_unlock() is called. This happens with
* sync_local_dev_names() and sync_dev_names().
*
* This allows critical sections to be entered and exited repeatedly without
* incurring the expense of locking memory every time.
*
* memlock_reset() is necessary to clear the state after forking (polldaemon).
*/
void critical_section_inc(struct cmd_context *cmd); void critical_section_inc(struct cmd_context *cmd);
void critical_section_dec(struct cmd_context *cmd); void critical_section_dec(struct cmd_context *cmd);
int critical_section(void); int critical_section(void);