Improve state handling on error paths and fix show state to be compatible with vzctl.
libvzctl only cares if the ve is stopped or it is assummed running - fix this by reporting and updating the states so libvzctl gets what it expects. https://jira.sw.ru/browse/PSBM-144580 Signed-off-by: Alexander Atanasov <alexander.atana...@virtuozzo.com> --- include/linux/ve.h | 4 ---- kernel/ve/ve.c | 6 +++--- 2 files changed, 3 insertions(+), 7 deletions(-) To addresses Pavel's comments. libvzctl only checks for STOPPED and if the state is not stopped it assumes it is running. diff --git a/include/linux/ve.h b/include/linux/ve.h index 8e173628b532..5ce1b3edfa9d 100644 --- a/include/linux/ve.h +++ b/include/linux/ve.h @@ -159,8 +159,6 @@ static inline void ve_set_state(struct ve_struct *ve, int new_state) "Invalid transition to running from %d\n", ve->state); WARN_ONCE(new_state == VE_STATE_STOPPING && ve->state != VE_STATE_RUNNING, "Invalid transition to stopping from %d\n", ve->state); - WARN_ONCE(new_state == VE_STATE_STOPPED && ve->state != VE_STATE_STOPPING, - "Invalid transition to stooped from %d\n", ve->state); ve->state = new_state; } @@ -249,10 +247,8 @@ extern bool is_ve_init_net(const struct net *net); static inline void ve_stop_ns(struct pid_namespace *ns) { } static inline void ve_exit_ns(struct pid_namespace *ns) { } - static inline void ve_set_state(struct ve_struct *ve, int new_state) {} - #define ve_feature_set(ve, f) { true; } static inline bool current_user_ns_initial(void) diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c index 8afef0e631d5..1ff1d77d2ee7 100644 --- a/kernel/ve/ve.c +++ b/kernel/ve/ve.c @@ -787,6 +787,7 @@ static int ve_start_container(struct ve_struct *ve) err_kthreadd: ve_list_del(ve); err_list: + ve_set_state(ve, VE_STATE_STOPPED); ve_drop_context(ve); return err; } @@ -1040,6 +1041,7 @@ static struct cgroup_subsys_state *ve_create(struct cgroup_subsys_state *parent_ err_lat: kmem_cache_free(ve_cachep, ve); err_ve: + ve_set_state(ve, VE_STATE_STOPPED); return ERR_PTR(err); } @@ -1225,10 +1227,8 @@ static int ve_state_show(struct seq_file *sf, void *v) seq_puts(sf, "RUNNING"); else if (ve->state == VE_STATE_STOPPING) seq_puts(sf, "STOPPING"); - else if (ve->state == VE_STATE_STOPPED) + else if (ve->state == VE_STATE_STOPPED || ve->state == VE_STATE_DEAD) seq_puts(sf, "STOPPED"); - else if (ve->state == VE_STATE_DEAD) - seq_puts(sf, "DEAD"); else seq_puts(sf, "UNKNOWN"); seq_putc(sf, '\n'); -- 2.31.1 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel