@@ -704,6 +704,26 @@ static int virCHMonitorValidateEventsJSON(virCHMonitorPtr mon,
704704 return events ;
705705}
706706
707+ /*
708+ * Caller should have locked the Domain
709+ */
710+ static inline int virCHMonitorShutdownVm (virDomainObjPtr vm ,
711+ virDomainShutoffReason reason )
712+ {
713+ virCHDriverPtr driver = CH_DOMAIN_PRIVATE (vm )-> driver ;
714+ g_autoptr (virCHDriverConfig ) cfg = virCHDriverGetConfig (driver );
715+
716+ if (virCHDomainObjBeginJob (vm , CH_JOB_MODIFY ))
717+ return -1 ;
718+
719+ virCHProcessStop (driver , vm , reason );
720+ if (virDomainObjSave (vm , driver -> xmlopt , cfg -> stateDir ))
721+ VIR_WARN ("Failed to persist the domain after shutdown!" );
722+ virCHDomainObjEndJob (vm );
723+
724+ return 0 ;
725+ }
726+
707727/*
708728 * Caller should have reference on Monitor and Domain
709729 */
@@ -750,21 +770,15 @@ static int virCHMonitorProcessEvent(virCHMonitorPtr mon,
750770 case virCHMonitorVmmEventShutdown : // shutdown inside vmm
751771 case virCHMonitorVmEventShutdown :
752772 {
753- g_autoptr (virCHDriverConfig ) cfg = virCHDriverGetConfig (driver );
754773 virDomainState state ;
755774
756775 virObjectLock (vm );
757776 state = virDomainObjGetState (vm , NULL );
758777 if ((ev == virCHMonitorVmmEventShutdown ||
759- state == VIR_DOMAIN_SHUTDOWN ) &&
760- (virCHDomainObjBeginJob (vm , CH_JOB_MODIFY ) == 0 )) {
761-
762- if (virDomainObjSave (vm , driver -> xmlopt , cfg -> stateDir ))
763- VIR_WARN ("Failed to persist the domain after shutdown!" );
764-
765- virCHProcessStop (driver , vm , VIR_DOMAIN_SHUTOFF_SHUTDOWN );
766-
767- virCHDomainObjEndJob (vm );
778+ state == VIR_DOMAIN_SHUTDOWN )) {
779+ if (virCHMonitorShutdownVm (vm , VIR_DOMAIN_SHUTOFF_SHUTDOWN ))
780+ VIR_WARN ("Failed to mark the VM(%s) as SHUTDOWN!" ,
781+ vm -> def -> name );
768782 }
769783 virObjectUnlock (vm );
770784 break ;
@@ -936,10 +950,16 @@ static int virCHMonitorReadProcessEvents(virCHMonitorPtr mon,
936950
937951 ret = read (monitor_fd , buf + sz , max_sz - sz );
938952 if (ret == 0 || (ret < 0 && errno == EINTR )) {
939- if ((virPidFileReadPathIfAlive (priv -> pidfile , & pid , priv -> ch_path )) < 0 || (pid < 0 )) {
940- virCHProcessStop (CH_DOMAIN_PRIVATE (vm )-> driver , vm , VIR_DOMAIN_SHUTOFF_CRASHED );
941- return -1 ;
953+ if (virPidFileReadPathIfAlive (priv -> pidfile , & pid , priv -> ch_path ) < 0 ||
954+ (pid < 0 )) {
955+ virObjectLock (vm );
956+ if (virCHMonitorShutdownVm (vm , VIR_DOMAIN_SHUTOFF_CRASHED ))
957+ VIR_WARN ("Failed to mark the VM(%s) as SHUTDOWN!" ,
958+ vm -> def -> name );
959+ virObjectUnlock (vm );
960+ return 0 ;
942961 }
962+
943963 g_usleep (G_USEC_PER_SEC );
944964 continue ;
945965 } else if (ret < 0 ) {
0 commit comments