Version 2.01.15 -
=================================
+ Change LV locking macros to take lv instead of lvid.
Prepend 'cluster' activation parameter to mirror log when appropriate.
Pass exclusive flag to lv_activate and on to target activation code.
Prevent snapshot creation in a clustered VG for now.
struct lv_list *lvl;
list_iterate_items(lvl, lvs)
- resume_lv(cmd, lvl->lv->lvid.s);
+ resume_lv(cmd, lvl->lv);
return 1;
}
struct lv_list *lvl;
list_iterate_items(lvl, lvs) {
- if (!suspend_lv(cmd, lvl->lv->lvid.s)) {
+ if (!suspend_lv(cmd, lvl->lv)) {
log_error("Failed to suspend %s", lvl->lv->name);
list_uniterate(lvh, lvs, &lvl->list) {
lvl = list_item(lvh, struct lv_list);
- resume_lv(cmd, lvl->lv->lvid.s);
+ resume_lv(cmd, lvl->lv);
}
return 0;
struct lv_list *lvl;
list_iterate_items(lvl, lvs) {
- if (!activate_lv_excl(cmd, lvl->lv->lvid.s)) {
+ if (!activate_lv_excl(cmd, lvl->lv)) {
log_error("Failed to activate %s", lvl->lv->name);
list_uniterate(lvh, lvs, &lvl->list) {
lvl = list_item(lvh, struct lv_list);
- activate_lv(cmd, lvl->lv->lvid.s);
+ activate_lv(cmd, lvl->lv);
}
return 0;
#define unlock_vg(cmd, vol) lock_vol(cmd, vol, LCK_VG_UNLOCK)
-#define resume_lv(cmd, vol) lock_vol(cmd, vol, LCK_LV_RESUME)
-#define suspend_lv(cmd, vol) lock_vol(cmd, vol, LCK_LV_SUSPEND | LCK_HOLD)
-#define deactivate_lv(cmd, vol) lock_vol(cmd, vol, LCK_LV_DEACTIVATE)
-#define activate_lv(cmd, vol) lock_vol(cmd, vol, LCK_LV_ACTIVATE | LCK_HOLD)
-#define activate_lv_excl(cmd, vol) \
- lock_vol(cmd, vol, LCK_LV_EXCLUSIVE | LCK_HOLD)
-#define activate_lv_local(cmd, vol) \
- lock_vol(cmd, vol, LCK_LV_ACTIVATE | LCK_HOLD | LCK_LOCAL)
-#define deactivate_lv_local(cmd, vol) \
- lock_vol(cmd, vol, LCK_LV_DEACTIVATE | LCK_LOCAL)
+#define resume_lv(cmd, lv) lock_vol(cmd, (lv)->lvid.s, LCK_LV_RESUME)
+#define suspend_lv(cmd, lv) lock_vol(cmd, (lv)->lvid.s, LCK_LV_SUSPEND | LCK_HOLD)
+#define deactivate_lv(cmd, lv) lock_vol(cmd, (lv)->lvid.s, LCK_LV_DEACTIVATE)
+#define activate_lv(cmd, lv) lock_vol(cmd, (lv)->lvid.s, LCK_LV_ACTIVATE | LCK_HOLD)
+#define activate_lv_excl(cmd, lv) \
+ lock_vol(cmd, (lv)->lvid.s, LCK_LV_EXCLUSIVE | LCK_HOLD)
+#define activate_lv_local(cmd, lv) \
+ lock_vol(cmd, (lv)->lvid.s, LCK_LV_ACTIVATE | LCK_HOLD | LCK_LOCAL)
+#define deactivate_lv_local(cmd, lv) \
+ lock_vol(cmd, (lv)->lvid.s, LCK_LV_DEACTIVATE | LCK_LOCAL)
/* Process list of LVs */
int suspend_lvs(struct cmd_context *cmd, struct list *lvs);
backup(lv->vg);
- if (!suspend_lv(cmd, lv->lvid.s)) {
+ if (!suspend_lv(cmd, lv)) {
log_error("Failed to lock %s", lv->name);
vg_revert(lv->vg);
return 0;
}
if (!vg_commit(lv->vg)) {
- resume_lv(cmd, lv->lvid.s);
+ resume_lv(cmd, lv);
return 0;
}
log_very_verbose("Updating permissions for \"%s\" in kernel", lv->name);
- if (!resume_lv(cmd, lv->lvid.s)) {
+ if (!resume_lv(cmd, lv)) {
log_error("Problem reactivating %s", lv->name);
return 0;
}
if (activate == CHANGE_ALN) {
log_verbose("Deactivating logical volume \"%s\" locally",
lv->name);
- if (!deactivate_lv_local(cmd, lv->lvid.s)) {
+ if (!deactivate_lv_local(cmd, lv)) {
stack;
return 0;
}
} else if (activate == CHANGE_AN) {
log_verbose("Deactivating logical volume \"%s\"", lv->name);
- if (!deactivate_lv(cmd, lv->lvid.s)) {
+ if (!deactivate_lv(cmd, lv)) {
stack;
return 0;
}
if (lv_is_origin(lv) || (activate == CHANGE_AE)) {
log_verbose("Activating logical volume \"%s\" "
"exclusively", lv->name);
- if (!activate_lv_excl(cmd, lv->lvid.s)) {
+ if (!activate_lv_excl(cmd, lv)) {
stack;
return 0;
}
} else if (activate == CHANGE_ALY) {
log_verbose("Activating logical volume \"%s\" locally",
lv->name);
- if (!activate_lv_local(cmd, lv->lvid.s)) {
+ if (!activate_lv_local(cmd, lv)) {
stack;
return 0;
}
} else {
log_verbose("Activating logical volume \"%s\"",
lv->name);
- if (!activate_lv(cmd, lv->lvid.s)) {
+ if (!activate_lv(cmd, lv)) {
stack;
return 0;
}
static int lvchange_refresh(struct cmd_context *cmd, struct logical_volume *lv)
{
log_verbose("Refreshing logical volume \"%s\" (if active)", lv->name);
- if (!suspend_lv(cmd, lv->lvid.s) || !resume_lv(cmd, lv->lvid.s))
+ if (!suspend_lv(cmd, lv) || !resume_lv(cmd, lv))
return 0;
return 1;
backup(lv->vg);
- if (!suspend_lv(cmd, lv->lvid.s)) {
+ if (!suspend_lv(cmd, lv)) {
log_error("Failed to lock %s", lv->name);
vg_revert(lv->vg);
return 0;
}
if (!vg_commit(lv->vg)) {
- resume_lv(cmd, lv->lvid.s);
+ resume_lv(cmd, lv);
return 0;
}
log_very_verbose("Updating permissions for \"%s\" in kernel", lv->name);
- if (!resume_lv(cmd, lv->lvid.s)) {
+ if (!resume_lv(cmd, lv)) {
log_error("Problem reactivating %s", lv->name);
return 0;
}
active = 1;
}
log_verbose("Ensuring %s is inactive.", lv->name);
- if (!deactivate_lv(cmd, lv->lvid.s)) {
+ if (!deactivate_lv(cmd, lv)) {
log_error("%s: deactivation failed", lv->name);
return 0;
}
if (active) {
log_verbose("Re-activating logical volume \"%s\"",
lv->name);
- if (!activate_lv(cmd, lv->lvid.s)) {
+ if (!activate_lv(cmd, lv)) {
log_error("%s: reactivation failed", lv->name);
return 0;
}
backup(lv->vg);
- if (!suspend_lv(cmd, lv->lvid.s)) {
+ if (!suspend_lv(cmd, lv)) {
log_error("Failed to lock %s", lv->name);
vg_revert(lv->vg);
return 0;
}
if (!vg_commit(lv->vg)) {
- resume_lv(cmd, lv->lvid.s);
+ resume_lv(cmd, lv);
return 0;
}
log_very_verbose("Updating permissions for \"%s\" in kernel", lv->name);
- if (!resume_lv(cmd, lv->lvid.s)) {
+ if (!resume_lv(cmd, lv)) {
log_error("Problem reactivating %s", lv->name);
return 0;
}
backup(lv->vg);
- if (!suspend_lv(cmd, lv->lvid.s)) {
+ if (!suspend_lv(cmd, lv)) {
log_error("Failed to lock %s", lv->name);
vg_revert(lv->vg);
return 0;
}
if (!vg_commit(lv->vg)) {
- resume_lv(cmd, lv->lvid.s);
+ resume_lv(cmd, lv);
return 0;
}
log_very_verbose("Updating \"%s\" in kernel", lv->name);
- if (!resume_lv(cmd, lv->lvid.s)) {
+ if (!resume_lv(cmd, lv)) {
log_error("Problem reactivating %s", lv->name);
return 0;
}
goto error;
}
- if (!activate_lv(cmd, log_lv->lvid.s)) {
+ if (!activate_lv(cmd, log_lv)) {
log_error("Aborting. Failed to activate mirror log. "
"Remove new LVs and retry.");
goto error;
goto error;
}
- if (!deactivate_lv(cmd, log_lv->lvid.s)) {
+ if (!deactivate_lv(cmd, log_lv)) {
log_error("Aborting. Failed to deactivate mirror log. "
"Remove new LV and retry.");
goto error;
return 0;
}
- if (!activate_lv(cmd, lv->lvid.s)) {
+ if (!activate_lv(cmd, lv)) {
if (lp->snapshot)
/* FIXME Remove the failed lv we just added */
log_error("Aborting. Failed to activate snapshot "
/* Reset permission after zeroing */
if (!(lp->permission & LVM_WRITE))
lv->status &= ~LVM_WRITE;
- if (!deactivate_lv(cmd, lv->lvid.s)) {
+ if (!deactivate_lv(cmd, lv)) {
log_err("Couldn't deactivate new snapshot.");
return 0;
}
/* FIXME write/commit/backup sequence issue */
- if (!suspend_lv(cmd, org->lvid.s)) {
+ if (!suspend_lv(cmd, org)) {
log_error("Failed to suspend origin %s", org->name);
return 0;
}
if (!vg_write(vg) || !vg_commit(vg))
return 0;
- if (!resume_lv(cmd, org->lvid.s)) {
+ if (!resume_lv(cmd, org)) {
log_error("Problem reactivating origin %s", org->name);
return 0;
}
if (!archive(vg))
return ECMD_FAILED;
- if (!deactivate_lv(cmd, lv->lvid.s)) {
+ if (!deactivate_lv(cmd, lv)) {
log_error("Unable to deactivate logical volume \"%s\"",
lv->name);
return ECMD_FAILED;
backup(lv->vg);
- if (!suspend_lv(cmd, lv->lvid.s)) {
+ if (!suspend_lv(cmd, lv)) {
stack;
goto error;
}
if (!vg_commit(vg)) {
stack;
- resume_lv(cmd, lv->lvid.s);
+ resume_lv(cmd, lv);
goto error;
}
- resume_lv(cmd, lv->lvid.s);
+ resume_lv(cmd, lv);
unlock_vg(cmd, vg_name);
uint32_t extents_used = 0;
uint32_t size_rest;
alloc_policy_t alloc;
- char *lock_lvid;
+ struct logical_volume *lock_lv;
struct lv_list *lvl;
int consistent = 1;
struct lv_segment *seg;
/* If snapshot, must suspend all associated devices */
if ((snap_seg = find_cow(lv)))
- lock_lvid = snap_seg->origin->lvid.s;
+ lock_lv = snap_seg->origin;
else
- lock_lvid = lv->lvid.s;
+ lock_lv = lv;
- if (!suspend_lv(cmd, lock_lvid)) {
+ if (!suspend_lv(cmd, lock_lv)) {
log_error("Failed to suspend %s", lp->lv_name);
vg_revert(vg);
return ECMD_FAILED;
if (!vg_commit(vg)) {
stack;
- resume_lv(cmd, lock_lvid);
+ resume_lv(cmd, lock_lv);
return ECMD_FAILED;
}
- if (!resume_lv(cmd, lock_lvid)) {
+ if (!resume_lv(cmd, lock_lv)) {
log_error("Problem reactivating %s", lp->lv_name);
return ECMD_FAILED;
}
/* Suspend mirrors on subsequent calls */
if (!first_time) {
- if (!suspend_lv(cmd, lv_mirr->lvid.s)) {
+ if (!suspend_lv(cmd, lv_mirr)) {
stack;
resume_lvs(cmd, lvs_changed);
vg_revert(vg);
if (!vg_commit(vg)) {
log_error("ABORTING: Volume group metadata update failed.");
if (!first_time)
- resume_lv(cmd, lv_mirr->lvid.s);
+ resume_lv(cmd, lv_mirr);
resume_lvs(cmd, lvs_changed);
return 0;
}
/* Only the first mirror segment gets activated as a mirror */
/* FIXME: Add option to use a log */
if (first_time) {
- if (!activate_lv_excl(cmd, lv_mirr->lvid.s)) {
+ if (!activate_lv_excl(cmd, lv_mirr)) {
if (!test_mode())
log_error("ABORTING: Temporary mirror "
"activation failed. "
resume_lvs(cmd, lvs_changed);
return 0;
}
- } else if (!resume_lv(cmd, lv_mirr->lvid.s)) {
+ } else if (!resume_lv(cmd, lv_mirr)) {
log_error("Unable to reactivate logical volume \"%s\"",
lv_mirr->name);
resume_lvs(cmd, lvs_changed);
}
/* Ensure mirror LV is active */
- if (!activate_lv_excl(cmd, lv_mirr->lvid.s)) {
+ if (!activate_lv_excl(cmd, lv_mirr)) {
log_error
("ABORTING: Temporary mirror activation failed.");
unlock_vg(cmd, pv->vg_name);
}
/* Suspend mirror LV to flush pending I/O */
- if (!suspend_lv(cmd, lv_mirr->lvid.s)) {
+ if (!suspend_lv(cmd, lv_mirr)) {
log_error("Suspension of temporary mirror LV failed");
r = 0;
}
log_error("ABORTING: Failed to write new data locations "
"to disk.");
vg_revert(vg);
- resume_lv(cmd, lv_mirr->lvid.s);
+ resume_lv(cmd, lv_mirr);
resume_lvs(cmd, lvs_changed);
return 0;
}
/* Release mirror LV. (No pending I/O because it's been suspended.) */
- if (!resume_lv(cmd, lv_mirr->lvid.s)) {
+ if (!resume_lv(cmd, lv_mirr)) {
log_error("Unable to reactivate logical volume \"%s\"",
lv_mirr->name);
r = 0;
resume_lvs(cmd, lvs_changed);
/* Deactivate mirror LV */
- if (!deactivate_lv(cmd, lv_mirr->lvid.s)) {
+ if (!deactivate_lv(cmd, lv_mirr)) {
log_error("ABORTING: Unable to deactivate temporary logical "
"volume \"%s\"", lv_mirr->name);
r = 0;
continue;
if (activate == CHANGE_AN) {
- if (!deactivate_lv(cmd, lv->lvid.s))
+ if (!deactivate_lv(cmd, lv))
continue;
} else if (activate == CHANGE_ALN) {
- if (!deactivate_lv_local(cmd, lv->lvid.s))
+ if (!deactivate_lv_local(cmd, lv))
continue;
} else if (lv_is_origin(lv) || (activate == CHANGE_AE)) {
- if (!activate_lv_excl(cmd, lv->lvid.s))
+ if (!activate_lv_excl(cmd, lv))
continue;
} else if (activate == CHANGE_ALY) {
- if (!activate_lv_local(cmd, lv->lvid.s))
+ if (!activate_lv_local(cmd, lv))
continue;
- } else if (!activate_lv(cmd, lv->lvid.s))
+ } else if (!activate_lv(cmd, lv))
continue;
if ((lv->status & PVMOVE) &&
log_verbose("Deactivating (if active) logical volume %s",
lv->name);
- if (!deactivate_lv(cmd, lv->lvid.s)) {
+ if (!deactivate_lv(cmd, lv)) {
log_error("Failed to deactivate LV %s", lv->name);
return 0;
}
log_verbose("Deactivating (if active) logical volume %s "
"(origin of %s)", snap_seg->origin->name, lv->name);
- if (!deactivate_lv(cmd, snap_seg->origin->lvid.s)) {
+ if (!deactivate_lv(cmd, snap_seg->origin)) {
log_error("Failed to deactivate LV %s",
snap_seg->origin->name);
return 0;