summaryrefslogtreecommitdiff
path: root/daemons/lvmlockd/lvmlockd-core.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemons/lvmlockd/lvmlockd-core.c')
-rw-r--r--daemons/lvmlockd/lvmlockd-core.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/daemons/lvmlockd/lvmlockd-core.c b/daemons/lvmlockd/lvmlockd-core.c
index 6a6d64bd9..7b5dd277c 100644
--- a/daemons/lvmlockd/lvmlockd-core.c
+++ b/daemons/lvmlockd/lvmlockd-core.c
@@ -767,6 +767,10 @@ static const char *op_str(int x)
return "start_wait";
case LD_OP_STOP_ALL:
return "stop_all";
+ case LD_OP_RENAME_BEFORE:
+ return "rename_before";
+ case LD_OP_RENAME_FINAL:
+ return "rename_final";
default:
return "op_unknown";
};
@@ -2145,6 +2149,23 @@ static void *lockspace_thread_main(void *arg_in)
break;
}
+ if (act->op == LD_OP_RENAME_BEFORE && act->rt == LD_RT_VG) {
+ /* vgrename */
+ log_debug("S %s checking for lockspace hosts", ls->name);
+ rv = lm_hosts(ls, 1);
+ if (rv) {
+ log_error("S %s lockspace hosts %d", ls->name, rv);
+ list_del(&act->list);
+ act->result = -EBUSY;
+ add_client_result(act);
+ continue;
+ }
+ ls->thread_work = 0;
+ ls->thread_stop = 1;
+ /* Do we want to check hosts again below like vgremove? */
+ break;
+ }
+
list_del(&act->list);
/* applies to all resources */
@@ -2248,6 +2269,8 @@ out_act:
act->result = 0;
else if (act->op == LD_OP_STOP)
act->result = 0;
+ else if (act->op == LD_OP_RENAME_BEFORE)
+ act->result = 0;
else
act->result = -ENOLS;
list_del(&act->list);
@@ -3371,6 +3394,25 @@ static int work_init_vg(struct action *act)
return rv;
}
+static int work_rename_vg(struct action *act)
+{
+ char ls_name[MAX_NAME+1];
+ int rv = 0;
+
+ memset(ls_name, 0, sizeof(ls_name));
+
+ vg_ls_name(act->vg_name, ls_name);
+
+ if (act->lm_type == LD_LM_SANLOCK)
+ rv = lm_rename_vg_sanlock(ls_name, act->vg_name, act->flags, act->vg_args);
+ else if (act->lm_type == LD_LM_DLM)
+ return 0;
+ else
+ rv = -EINVAL;
+
+ return rv;
+}
+
static void work_test_gl(void)
{
struct lockspace *ls;
@@ -3526,6 +3568,11 @@ static void *worker_thread_main(void *arg_in)
act->result = work_init_lv(act);
add_client_result(act);
+ } else if ((act->op == LD_OP_RENAME_FINAL) && (act->rt == LD_RT_VG)) {
+ log_debug("work rename_vg %s", act->vg_name);
+ act->result = work_rename_vg(act);
+ add_client_result(act);
+
} else if (act->op == LD_OP_UPDATE_LOCAL) {
if (delayed_update_local) {
log_debug("work update_local ignore repeat");
@@ -4124,6 +4171,16 @@ static int str_to_op_rt(const char *req_name, int *op, int *rt)
*op = LD_OP_UPDATE_LOCAL;
return 0;
}
+ if (!strcmp(req_name, "rename_vg_before")) {
+ *op = LD_OP_RENAME_BEFORE;
+ *rt = LD_RT_VG;
+ return 0;
+ }
+ if (!strcmp(req_name, "rename_vg_final")) {
+ *op = LD_OP_RENAME_FINAL;
+ *rt = LD_RT_VG;
+ return 0;
+ }
out:
return -1;
}
@@ -4743,6 +4800,7 @@ static void client_recv_action(struct client *cl)
case LD_OP_UPDATE_LOCAL:
case LD_OP_START_WAIT:
case LD_OP_STOP_ALL:
+ case LD_OP_RENAME_FINAL:
add_work_action(act);
rv = 0;
break;
@@ -4751,6 +4809,7 @@ static void client_recv_action(struct client *cl)
case LD_OP_ENABLE:
case LD_OP_DISABLE:
case LD_OP_FREE:
+ case LD_OP_RENAME_BEFORE:
rv = add_lock_action(act);
break;
case LD_OP_ADD_LOCAL: