summaryrefslogtreecommitdiff
path: root/daemons/lvmlockd/lvmlockd-dlm.c
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2015-08-26 10:01:05 -0500
committerDavid Teigland <teigland@redhat.com>2015-08-27 10:27:24 -0500
commit231b7df6cc80ffb1a93db6f948670d9c37b169ea (patch)
tree893f645246572e38fde3abd1c90aa23f074731d9 /daemons/lvmlockd/lvmlockd-dlm.c
parent521136181b6c6cfde4c07d5aecf1dcc5e0ab9594 (diff)
downloadlvm2-231b7df6cc80ffb1a93db6f948670d9c37b169ea.tar.gz
lvmlockd: improve VG removal for lock_type dlm
This makes lvmlockd removal steps for dlm VGs closely match sanlock VGs. Because dlm lockspaces are not required to be stopped on all hosts before vgremove, there is an extra bit for dlm lockspaces, where a flag is set in the VG lock lvb indicating that the VG was removed. If other hosts happen to use the VG lock they will see this flag and stop their lockspace.
Diffstat (limited to 'daemons/lvmlockd/lvmlockd-dlm.c')
-rw-r--r--daemons/lvmlockd/lvmlockd-dlm.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/daemons/lvmlockd/lvmlockd-dlm.c b/daemons/lvmlockd/lvmlockd-dlm.c
index e24268588..676c94477 100644
--- a/daemons/lvmlockd/lvmlockd-dlm.c
+++ b/daemons/lvmlockd/lvmlockd-dlm.c
@@ -443,6 +443,7 @@ int lm_lock_dlm(struct lockspace *ls, struct resource *r, int ld_mode,
struct val_blk vb;
uint32_t flags = 0;
uint16_t vb_version;
+ uint16_t vb_flags;
int mode;
int rv;
@@ -522,6 +523,7 @@ lockrv:
memcpy(&vb, lksb->sb_lvbptr, sizeof(struct val_blk));
vb_version = le16_to_cpu(vb.version);
+ vb_flags = le16_to_cpu(vb.flags);
if (vb_version && ((vb_version & 0xFF00) > (VAL_BLK_VERSION & 0xFF00))) {
log_error("S %s R %s lock_dlm ignore vb_version %x",
@@ -536,8 +538,14 @@ lockrv:
*r_version = le32_to_cpu(vb.r_version);
memcpy(rdd->vb, &vb, sizeof(vb)); /* rdd->vb saved as le */
- log_debug("S %s R %s lock_dlm get r_version %u",
- ls->name, r->name, *r_version);
+ log_debug("S %s R %s lock_dlm get r_version %u flags %x",
+ ls->name, r->name, *r_version, vb_flags);
+
+ if (vb_flags & VBF_REMOVED) {
+ log_debug("S %s R %s lock_dlm VG has been removed",
+ ls->name, r->name);
+ return -EREMOVED;
+ }
}
out:
return 0;
@@ -593,7 +601,7 @@ int lm_convert_dlm(struct lockspace *ls, struct resource *r,
}
int lm_unlock_dlm(struct lockspace *ls, struct resource *r,
- uint32_t r_version, uint32_t lmuf_flags)
+ uint32_t r_version, uint32_t lmu_flags)
{
struct lm_dlm *lmd = (struct lm_dlm *)ls->lm_data;
struct rd_dlm *rdd = (struct rd_dlm *)r->lm_data;
@@ -602,7 +610,7 @@ int lm_unlock_dlm(struct lockspace *ls, struct resource *r,
int rv;
log_debug("S %s R %s unlock_dlm r_version %u flags %x",
- ls->name, r->name, r_version, lmuf_flags);
+ ls->name, r->name, r_version, lmu_flags);
/*
* Do not set PERSISTENT, because we don't need an orphan
@@ -611,12 +619,17 @@ int lm_unlock_dlm(struct lockspace *ls, struct resource *r,
flags |= LKF_CONVERT;
- if (rdd->vb && r_version && (r->mode == LD_LK_EX)) {
+ if (rdd->vb && (r->mode == LD_LK_EX)) {
if (!rdd->vb->version) {
/* first time vb has been written */
rdd->vb->version = cpu_to_le16(VAL_BLK_VERSION);
}
- rdd->vb->r_version = cpu_to_le32(r_version);
+ if (r_version)
+ rdd->vb->r_version = cpu_to_le32(r_version);
+
+ if ((lmu_flags & LMUF_FREE_VG) && (r->type == LD_RT_VG))
+ rdd->vb->flags = cpu_to_le16(VBF_REMOVED);
+
memcpy(lksb->sb_lvbptr, rdd->vb, sizeof(struct val_blk));
log_debug("S %s R %s unlock_dlm set r_version %u",