Index: trunk/user/drbdadm_main.c =================================================================== --- trunk/user/drbdadm_main.c (revision 2864) +++ trunk/user/drbdadm_main.c (working copy) @@ -85,6 +85,7 @@ extern int yydebug; extern FILE* yyin; +int adm_create(struct d_resource* ,const char* ); int adm_attach(struct d_resource* ,const char* ); int adm_connect(struct d_resource* ,const char* ); int adm_generic_s(struct d_resource* ,const char* ); @@ -134,7 +135,7 @@ int soi=0; volatile int alarm_raised; -struct deferred_cmd *deferred_cmds[3] = { NULL, NULL, NULL }; +struct deferred_cmd *deferred_cmds[4] = { NULL, NULL, NULL, NULL }; void schedule_dcmd( int (* function)(struct d_resource*,const char* ), struct d_resource* res, @@ -180,7 +181,8 @@ { return _run_dcmds(deferred_cmds[0]) || _run_dcmds(deferred_cmds[1]) || - _run_dcmds(deferred_cmds[2]); + _run_dcmds(deferred_cmds[2]) || + _run_dcmds(deferred_cmds[3]); } struct option admopt[] = { @@ -194,6 +196,8 @@ struct adm_cmd cmds[] = { /* name, function, show, needs res, verify_ips */ + { "create", adm_create, 1,1,0 }, + { "remove", adm_generic_s, 1,1,0 }, { "attach", adm_attach, 1,1,0 }, { "detach", adm_generic_s, 1,1,0 }, { "connect", adm_connect, 1,1,1 }, @@ -759,6 +763,19 @@ OPT=OPT->next; \ } +int adm_create(struct d_resource* res,const char* unused __attribute((unused))) +{ + char* argv[MAX_ARGS]; + int argc=0; + + argv[NA(argc)]=drbdsetup; + argv[NA(argc)]=res->me->device; + argv[NA(argc)]="create"; + argv[NA(argc)]=0; + + return m_system(argv,SLEEPS_LONG); +} + int adm_attach(struct d_resource* res,const char* unused __attribute((unused))) { char* argv[MAX_ARGS]; @@ -995,9 +1012,10 @@ static int adm_up(struct d_resource* res,const char* unused __attribute((unused))) { - schedule_dcmd(adm_attach,res,NULL,0); - schedule_dcmd(adm_syncer,res,NULL,1); - schedule_dcmd(adm_connect,res,NULL,2); + schedule_dcmd(adm_create,res,NULL,0); + schedule_dcmd(adm_attach,res,NULL,1); + schedule_dcmd(adm_syncer,res,NULL,2); + schedule_dcmd(adm_connect,res,NULL,3); return 0; } Index: trunk/user/drbdsetup.c =================================================================== --- trunk/user/drbdsetup.c (revision 2864) +++ trunk/user/drbdsetup.c (working copy) @@ -347,6 +347,8 @@ wait_cmds_options, w_connected_state } } }, {"wait-sync", 0, F_EVENTS_CMD, { .ep = { wait_cmds_options, w_synced_state } } }, + {"create", P_create, F_CONFIG_CMD, {{NULL, NULL}}}, + {"remove", P_remove, F_CONFIG_CMD, {{NULL, NULL}}}, }; #define EM(C) [ C - RetCodeBase ] @@ -393,7 +395,9 @@ EM(PauseFlagAlreadyClear) = "Sync-pause flag is already cleared", EM(DiskLowerThanOutdated) = "Disk state is lower than outdated", EM(HaveNoDiskConfig) = "Device does not have a disk-config", - EM(ProtocolCRequired) = "Protocol C required" + EM(ProtocolCRequired) = "Protocol C required", + EM(MinorInUse) = "Minor number in use.", + EM(MinorInvalid) = "Minor number invalid." }; #define MAX_ERROR (sizeof(error_messages)/sizeof(*error_messages)) const char * error_to_string(int err_no) @@ -1170,11 +1174,17 @@ cm = find_cmd_by_name("secondary"); rv = cm->function(cm,minor,argc,argv); if( rv ) return rv; + cm = find_cmd_by_name("disconnect"); - cm->function(cm,minor,argc,argv); + rv = cm->function(cm,minor,argc,argv); + if ( rv ) return rv; + cm = find_cmd_by_name("detach"); - rv |= cm->function(cm,minor,argc,argv); + rv = cm->function(cm,minor,argc,argv); + if( rv ) return rv; + cm = find_cmd_by_name("remove"); + rv = cm->function(cm,minor,argc,argv); return rv; }