1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-10-27 18:55:19 +03:00

Try out using LV locking for reactivation.

This commit is contained in:
Alasdair Kergon 2002-02-20 21:30:27 +00:00
parent 14a81c5a03
commit cc8b2cd706
4 changed files with 122 additions and 22 deletions

View File

@ -159,7 +159,7 @@ int lock_resource(const char *resource, int flags)
"%s/V_%s", _lock_dir, resource);
break;
case LCK_LV:
/* No-op for now */
/* No-op: see FIXME below */
return 1;
default:
log_error("Unrecognised lock scope: %d",
@ -173,6 +173,24 @@ int lock_resource(const char *resource, int flags)
return 1;
}
/****** FIXME This is stuck a layer above until activate unit
can take labels and read its own metadata
if ((flags & LCK_SCOPE_MASK) == LCK_LV) {
switch (flags & LCK_TYPE_MASK) {
case LCK_NONE:
if (lv_active_by_id(resource))
lv_resume_by_id(resource);
break;
case LCK_WRITE:
if (lv_active_by_id(resource))
lv_suspend_by_id(resource);
break;
default:
break;
}
}
*******/
int init_file_locking(struct locking_type *locking, struct config_file *cf)
{

View File

@ -120,6 +120,7 @@ void fin_locking(void)
*/
int lock_vol(const void *vol, int flags)
{
struct logical_volume *lv;
char resource[258];
switch (flags & LCK_SCOPE_MASK) {
@ -133,6 +134,13 @@ int lock_vol(const void *vol, int flags)
/*
* Suspends LV if it's active.
*/
lv = (struct logical_volume *) vol;
if (lvm_snprintf(resource, sizeof(resource), "%s/%s",
lv->vg->name, lv->name) < 0) {
log_error("Lock resource name too long: %s", resource);
return 0;
}
break;
default:
log_error("Unrecognised lock scope: %d",
flags & LCK_SCOPE_MASK);
@ -146,6 +154,26 @@ int lock_vol(const void *vol, int flags)
return 0;
}
/****** FIXME
This should move down into lock_resource when the activation calls
can handle struct ids and read their own metadata.
******/
if ((flags & LCK_SCOPE_MASK) == LCK_LV) {
switch (flags & LCK_TYPE_MASK) {
case LCK_NONE:
if (lv_active(lv))
lv_reactivate(lv);
break;
case LCK_WRITE:
if (lv_active(lv))
lv_suspend(lv);
break;
default:
break;
}
}
_update_lock_count(flags);
_enable_signals();

View File

@ -151,15 +151,25 @@ static int lvchange_permission(struct cmd_context *cmd,
lv->name);
}
log_very_verbose("Updating logical volume \"%s\" on disk(s)", lv->name);
if (!cmd->fid->ops->vg_write(cmd->fid, lv->vg))
if (!lock_vol(lv, LCK_LV | LCK_WRITE)) {
log_error("Failed to lock %s", lv->name);
return 0;
}
log_very_verbose("Updating logical volume \"%s\" on disk(s)", lv->name);
if (!cmd->fid->ops->vg_write(cmd->fid, lv->vg)) {
/* FIXME: Attempt reversion? */
lock_vol(lv, LCK_LV | LCK_NONE);
return 0;
}
backup(lv->vg);
log_very_verbose("Updating permissions for \"%s\" in kernel", lv->name);
if (!lv_update_write_access(lv))
return 0;
if (!lock_vol(lv, LCK_LV | LCK_NONE)) {
log_error("Problem reactivating %s", lv->name);
return 0;
}
return 1;
}
@ -254,14 +264,28 @@ static int lvchange_contiguous(struct cmd_context *cmd,
lv->name);
}
log_verbose("Updating logical volume \"%s\" on disk(s)", lv->name);
if (!cmd->fid->ops->vg_write(cmd->fid, lv->vg))
if (!lock_vol(lv, LCK_LV | LCK_WRITE)) {
log_error("Failed to lock %s", lv->name);
return 0;
}
log_very_verbose("Updating logical volume \"%s\" on disk(s)", lv->name);
if (!cmd->fid->ops->vg_write(cmd->fid, lv->vg)) {
/* FIXME: Attempt reversion? */
lock_vol(lv, LCK_LV | LCK_NONE);
return 0;
}
backup(lv->vg);
log_very_verbose("Reactivating \"%s\" in kernel", lv->name);
if (!lock_vol(lv, LCK_LV | LCK_NONE)) {
log_error("Problem reactivating %s", lv->name);
return 0;
}
return 1;
}
static int lvchange_readahead(struct cmd_context *cmd,
@ -285,16 +309,30 @@ static int lvchange_readahead(struct cmd_context *cmd,
}
lv->read_ahead = read_ahead;
log_verbose("Setting read ahead to %u for \"%s\"", read_ahead,
lv->name);
log_verbose("Updating logical volume \"%s\" on disk(s)", lv->name);
if (!cmd->fid->ops->vg_write(cmd->fid, lv->vg))
if (!lock_vol(lv, LCK_LV | LCK_WRITE)) {
log_error("Failed to lock %s", lv->name);
return 0;
}
log_very_verbose("Updating logical volume \"%s\" on disk(s)", lv->name);
if (!cmd->fid->ops->vg_write(cmd->fid, lv->vg)) {
/* FIXME: Attempt reversion? */
lock_vol(lv, LCK_LV | LCK_NONE);
return 0;
}
backup(lv->vg);
log_very_verbose("Reactivating \"%s\" in kernel", lv->name);
if (!lock_vol(lv, LCK_LV | LCK_NONE)) {
log_error("Problem reactivating %s", lv->name);
return 0;
}
return 1;
}
@ -325,12 +363,25 @@ static int lvchange_persistent(struct cmd_context *cmd,
lv->minor, lv->name);
}
log_verbose("Updating logical volume \"%s\" on disk(s)", lv->name);
if (!cmd->fid->ops->vg_write(cmd->fid, lv->vg))
if (!lock_vol(lv, LCK_LV | LCK_WRITE)) {
log_error("Failed to lock %s", lv->name);
return 0;
}
log_very_verbose("Updating logical volume \"%s\" on disk(s)", lv->name);
if (!cmd->fid->ops->vg_write(cmd->fid, lv->vg)) {
/* FIXME: Attempt reversion? */
lock_vol(lv, LCK_LV | LCK_NONE);
return 0;
}
backup(lv->vg);
log_very_verbose("Reactivating \"%s\" in kernel", lv->name);
if (!lock_vol(lv, LCK_LV | LCK_NONE)) {
log_error("Problem reactivating %s", lv->name);
return 0;
}
return 1;
}

View File

@ -37,7 +37,6 @@ int lvresize(struct cmd_context *cmd, int argc, char **argv)
struct list *pvh, *segh;
struct lv_list *lvl;
int opt = 0;
int active;
enum {
LV_ANY = 0,
@ -332,20 +331,24 @@ int lvresize(struct cmd_context *cmd, int argc, char **argv)
goto error;
}
active = lv_active(lv);
/********* FIXME Suspend lv ***********/
if (!lock_vol(lv, LCK_LV | LCK_WRITE)) {
log_error("Can't get lock for %s", lv_name);
goto error;
}
/* store vg on disk(s) */
if (!cmd->fid->ops->vg_write(cmd->fid, vg))
if (!cmd->fid->ops->vg_write(cmd->fid, vg)) {
/* FIXME: Attempt reversion? */
lock_vol(lv, LCK_LV | LCK_NONE);
goto error;
}
backup(vg);
if (active && !lv_reactivate(lv))
if (!lock_vol(lv, LCK_LV | LCK_NONE)) {
log_error("Problem reactivating %s", lv_name);
goto error;
/********* FIXME Resume *********/
}
lock_vol(vg_name, LCK_VG | LCK_NONE);