[DRBD-cvs] svn commit by phil - r2474 - in trunk: . drbd drbd/linux user - * 'drbdsetup /dev/drbd0 resize' crashed on a device wit

drbd-cvs at lists.linbit.com drbd-cvs at lists.linbit.com
Thu Sep 28 11:46:21 CEST 2006


Author: phil
Date: 2006-09-28 11:46:16 +0200 (Thu, 28 Sep 2006)
New Revision: 2474

Modified:
   trunk/ROADMAP
   trunk/drbd/drbd_nl.c
   trunk/drbd/linux/drbd.h
   trunk/user/drbdadm.h
   trunk/user/drbdadm_adjust.c
   trunk/user/drbdadm_main.c
   trunk/user/drbdsetup.c
Log:
* 'drbdsetup /dev/drbd0 resize' crashed on a device without disk.
  Fixed that.
  
* Fixed 'drbdadm adjust rX' to work with the fact that a disk or
  network configuration needs to be removed first, before a 
  now one can be set.
      


Modified: trunk/ROADMAP
===================================================================
--- trunk/ROADMAP	2006-09-28 08:21:24 UTC (rev 2473)
+++ trunk/ROADMAP	2006-09-28 09:46:16 UTC (rev 2474)
@@ -838,6 +838,7 @@
 39 Send mirrored write requests out of the worker context.
    99% DONE
 
+40 Do something with FLUSHBUFS ioctl.
 
 Maybe:
 

Modified: trunk/drbd/drbd_nl.c
===================================================================
--- trunk/drbd/drbd_nl.c	2006-09-28 08:21:24 UTC (rev 2473)
+++ trunk/drbd/drbd_nl.c	2006-09-28 09:46:16 UTC (rev 2474)
@@ -1154,11 +1154,18 @@
 		retcode = APrimaryNodeNeeded;
 		goto fail;
 	}
+
+	if(!inc_local(mdev)) {
+		retcode = HaveNoDiskConfig;
+		goto fail;
+	}
+
 	mdev->bc->dc.disk_size = (sector_t)rs.resize_size;
 	drbd_bm_lock(mdev);
 	drbd_determin_dev_size(mdev);
 	drbd_md_sync(mdev);
 	drbd_bm_unlock(mdev);
+	dec_local(mdev);
 	if (mdev->state.conn == Connected) {
 		drbd_send_uuids(mdev); // to start sync...
 		drbd_send_sizes(mdev);

Modified: trunk/drbd/linux/drbd.h
===================================================================
--- trunk/drbd/linux/drbd.h	2006-09-28 08:21:24 UTC (rev 2473)
+++ trunk/drbd/linux/drbd.h	2006-09-28 09:46:16 UTC (rev 2474)
@@ -105,6 +105,7 @@
 	DiskLowerThanOutdated,
 	FailedToClaimMyself,
 	UnknownNetLinkPacket,
+	HaveNoDiskConfig,
 	AfterLastRetCode,
 };
 

Modified: trunk/user/drbdadm.h
===================================================================
--- trunk/user/drbdadm.h	2006-09-28 08:21:24 UTC (rev 2473)
+++ trunk/user/drbdadm.h	2006-09-28 09:46:16 UTC (rev 2474)
@@ -103,6 +103,7 @@
 extern int adm_connect(struct d_resource* ,const char* );
 extern int adm_resize(struct d_resource* ,const char* );
 extern int adm_syncer(struct d_resource* ,const char* );
+extern int adm_generic_s(struct d_resource* ,const char* );
 extern int _admm_generic(struct d_resource* ,const char*, int flags);
 extern int m_system(char**,int );
 extern struct d_option* find_opt(struct d_option*,char*);
@@ -111,6 +112,7 @@
 extern void verify_ips(struct d_resource* res);
 extern void schedule_dcmd( int (* function)(struct d_resource*,const char* ),
 			   struct d_resource* res,
+			   char* arg,
 			   int order);
 
 extern void uc_node(enum usage_count_type type);

Modified: trunk/user/drbdadm_adjust.c
===================================================================
--- trunk/user/drbdadm_adjust.c	2006-09-28 08:21:24 UTC (rev 2473)
+++ trunk/user/drbdadm_adjust.c	2006-09-28 09:46:16 UTC (rev 2474)
@@ -167,9 +167,8 @@
 	char* argv[20];
 	int pid,argc=0;
 	struct d_resource* running;
-	int do_attach=0;
-	int do_connect=0;
-	int do_syncer=0;
+	int do_attach=0,do_connect=0,do_syncer=0;
+	int have_disk=0,have_net=0;
 	char config_file_dummy[250];
 
 	argv[argc++]=drbdsetup;
@@ -189,17 +188,25 @@
 	if(running->me) {
 		do_attach |= strcmp(res->me->device, running->me->device);
 		do_attach |= !disk_equal(res->me, running->me);
+		have_disk = (running->me->disk != NULL);
 	} else  do_attach |= 1;
 
 	do_connect  = !opts_equal(res->net_options, running->net_options);
 	do_connect |= !addr_equal(res,running);
 	do_connect |= !proto_equal(res,running);
+	have_net = (running->protocol != NULL);
 
 	do_syncer = !opts_equal(res->sync_options, running->sync_options);
 
-	if(do_attach)  schedule_dcmd(adm_attach,res,0);
-	if(do_syncer)  schedule_dcmd(adm_syncer,res,1);
-	if(do_connect) schedule_dcmd(adm_connect,res,2);
+	if(do_attach) {
+		if(have_disk) schedule_dcmd(adm_generic_s,res,"detach",0);
+		schedule_dcmd(adm_attach,res,NULL,0);
+	}
+	if(do_syncer)  schedule_dcmd(adm_syncer,res,NULL,1);
+	if(do_connect) {
+		if(have_net) schedule_dcmd(adm_generic_s,res,"disconnect",0);
+		schedule_dcmd(adm_connect,res,NULL,2);
+	}
 
 	return 0;
 }

Modified: trunk/user/drbdadm_main.c
===================================================================
--- trunk/user/drbdadm_main.c	2006-09-28 08:21:24 UTC (rev 2473)
+++ trunk/user/drbdadm_main.c	2006-09-28 09:46:16 UTC (rev 2474)
@@ -74,6 +74,7 @@
 struct deferred_cmd
 {
   int (* function)(struct d_resource*,const char* );
+  char *arg;
   struct d_resource* res;
   struct deferred_cmd* next;
 };
@@ -134,6 +135,7 @@
 
 void schedule_dcmd( int (* function)(struct d_resource*,const char* ),
 		    struct d_resource* res,
+		    char* arg,
 		    int order)
 {
   struct deferred_cmd *d;
@@ -146,6 +148,7 @@
 
   d->function = function;
   d->res = res;
+  d->arg = arg;
   d->next = deferred_cmds[order];
 
   deferred_cmds[order] = d;
@@ -158,13 +161,13 @@
 
   if(d->next == NULL) 
     {
-      rv = d->function(d->res,NULL);
+      rv = d->function(d->res,d->arg);
       free(d);
       return rv;
     }
 
   rv = _run_dcmds(d->next);
-  if(!rv) rv |= d->function(d->res,NULL);
+  if(!rv) rv |= d->function(d->res,d->arg);
   free(d);
 
   return rv;
@@ -850,9 +853,9 @@
 
 static int adm_up(struct d_resource* res,const char* unused __attribute((unused)))
 {
-  schedule_dcmd(adm_attach,res,0);
-  schedule_dcmd(adm_syncer,res,1);
-  schedule_dcmd(adm_connect,res,2);
+  schedule_dcmd(adm_attach,res,NULL,0);
+  schedule_dcmd(adm_syncer,res,NULL,1);
+  schedule_dcmd(adm_connect,res,NULL,2);
 
   return 0;
 }

Modified: trunk/user/drbdsetup.c
===================================================================
--- trunk/user/drbdsetup.c	2006-09-28 08:21:24 UTC (rev 2473)
+++ trunk/user/drbdsetup.c	2006-09-28 09:46:16 UTC (rev 2474)
@@ -369,6 +369,7 @@
 	EM(PauseFlagAlreadyClear) = "PauseFlagAlreadyClear",
 	EM(DiskLowerThanOutdated) = "DiskLowerThanOutdated",
 	EM(FailedToClaimMyself) = "FailedToClaimMyself",
+	EM(HaveNoDiskConfig) = "HaveNoDiskConfig",
 };
 
 char* cmdname = 0;



More information about the drbd-cvs mailing list