@@ -1982,7 +1982,7 @@ int start_mdmon(char *devnm)
1982
1982
1983
1983
if (check_env ("MDADM_NO_MDMON" ))
1984
1984
return 0 ;
1985
- if (continue_via_systemd (devnm , MDMON_SERVICE , prefix ))
1985
+ if (continue_via_systemd (devnm , MDMON_SERVICE , prefix ) == MDADM_STATUS_SUCCESS )
1986
1986
return 0 ;
1987
1987
1988
1988
/* That failed, try running mdmon directly */
@@ -2299,36 +2299,41 @@ void manage_fork_fds(int close_all)
2299
2299
/* In a systemd/udev world, it is best to get systemd to
2300
2300
* run daemon rather than running in the background.
2301
2301
* Returns:
2302
- * 1 - if systemd service has been started
2303
- * 0 - otherwise
2302
+ * MDADM_STATUS_SUCCESS - if systemd service has been started.
2303
+ * MDADM_STATUS_ERROR - otherwise.
2304
2304
*/
2305
- int continue_via_systemd (char * devnm , char * service_name , char * prefix )
2305
+ mdadm_status_t continue_via_systemd (char * devnm , char * service_name , char * prefix )
2306
2306
{
2307
2307
int pid , status ;
2308
- char pathbuf [1024 ];
2308
+ char pathbuf [PATH_MAX ];
2309
2309
2310
2310
dprintf ("Start %s service\n" , service_name );
2311
2311
/* Simply return that service cannot be started */
2312
2312
if (check_env ("MDADM_NO_SYSTEMCTL" ))
2313
- return 0 ;
2313
+ return MDADM_STATUS_SUCCESS ;
2314
+
2315
+ /* Fork in attempt to start services */
2314
2316
switch (fork ()) {
2315
- case 0 :
2316
- manage_fork_fds (1 );
2317
- snprintf (pathbuf , sizeof (pathbuf ),
2318
- "%s@%s%s.service" , service_name , prefix ?: "" , devnm );
2319
- status = execl ("/usr/bin/systemctl" , "systemctl" , "restart" ,
2320
- pathbuf , NULL );
2321
- status = execl ("/bin/systemctl" , "systemctl" , "restart" ,
2322
- pathbuf , NULL );
2323
- exit (1 );
2324
- case -1 : /* Just do it ourselves. */
2317
+ case -1 : /* Fork failed, just do it ourselves. */
2325
2318
break ;
2326
- default : /* parent - good */
2319
+ case 0 : /* child */
2320
+ manage_fork_fds (1 );
2321
+ snprintf (pathbuf , sizeof (pathbuf ), "%s@%s%s.service" ,
2322
+ service_name , prefix ? prefix : "" , devnm );
2323
+
2324
+ /* Attempt to start service.
2325
+ * On success execl() will "kill" the fork, and return status of systemctl call.
2326
+ */
2327
+ execl ("/usr/bin/systemctl" , "systemctl" , "restart" , pathbuf , NULL );
2328
+ execl ("/bin/systemctl" , "systemctl" , "restart" , pathbuf , NULL );
2329
+ exit (MDADM_STATUS_ERROR );
2330
+ default : /* parent */
2331
+ /* Check if forked process successfully trigered service */
2327
2332
pid = wait (& status );
2328
2333
if (pid >= 0 && status == 0 )
2329
- return 1 ;
2334
+ return MDADM_STATUS_SUCCESS ;
2330
2335
}
2331
- return 0 ;
2336
+ return MDADM_STATUS_ERROR ;
2332
2337
}
2333
2338
2334
2339
int in_initrd (void )
0 commit comments