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:
parent
96c4abee62
commit
9cda028a96
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user