[DRBD-cvs] r1628 - in trunk: drbd drbd/linux testing

svn at svn.drbd.org svn at svn.drbd.org
Fri Nov 5 12:47:52 CET 2004


Author: phil
Date: 2004-11-05 12:47:50 +0100 (Fri, 05 Nov 2004)
New Revision: 1628

Modified:
   trunk/drbd/drbd_bitmap.c
   trunk/drbd/drbd_fs.c
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_proc.c
   trunk/drbd/drbd_receiver.c
   trunk/drbd/drbd_strings.c
   trunk/drbd/drbd_worker.c
   trunk/drbd/linux/drbd.h
   trunk/testing/ioctl_structs_sizes.c
Log:
Work on the new _drbd_set_state() mechanism:
* Now it is possible to attach a drbd device to a disk again.
* Improved the error reporting, in the future kernel and user-
  land tools will print the same error messages...



Modified: trunk/drbd/drbd_bitmap.c
===================================================================
--- trunk/drbd/drbd_bitmap.c	2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_bitmap.c	2004-11-05 11:47:50 UTC (rev 1628)
@@ -744,7 +744,7 @@
 	                 !(test_bit(DISKLESS,&mdev->flags) ||
 	                   test_bit(PARTNER_DISKLESS,&mdev->flags)) );
 	if (strange_state)
-		ERR("%s in drbd_bm_set_bit\n", cstate_to_name(mdev->cstate));
+		ERR("%s in drbd_bm_set_bit\n", conns_to_name(mdev->cstate));
 */
 
 	spin_lock_irq(&b->bm_lock);
@@ -787,7 +787,7 @@
 	 * strange_state blubber is already in place there ...
 	if (i && mdev->cstate <= Connected)
 		ERR("drbd_bm_clear_bit: cleared a bitnr=%lu while %s\n",
-				bitnr, cstate_to_name(mdev->cstate));
+				bitnr, conns_to_name(mdev->cstate));
 	 */
 
 	return i;

Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c	2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_fs.c	2004-11-05 11:47:50 UTC (rev 1628)
@@ -434,10 +434,12 @@
 
 	drbd_set_blocksize(mdev,INITIAL_BLOCK_SIZE);
 
-	if (drbd_request_state(mdev,NS(disk,
-				       drbd_md_test_flag(mdev,MDF_Consistent) ?
-				       Consistent : Inconsistent ))) {
+	if((i=drbd_request_state(mdev,NS(disk,
+					 drbd_md_test_flag(mdev,MDF_Consistent)
+					 ? Consistent : Inconsistent ))) > 0) {
 		drbd_thread_start(&mdev->worker);
+	} else {
+		ERR("%s\n",set_st_err_name(i));
 	}
 
 // FIXME EXPLAIN:
@@ -564,8 +566,11 @@
 	mdev->recv_cnt = 0;
 
 	drbd_thread_start(&mdev->worker);
-	drbd_request_state(mdev,NS(conn,Unconnected));
-	drbd_thread_start(&mdev->receiver);
+	if( (i=drbd_request_state(mdev,NS(conn,Unconnected))) <= 0) {
+		ERR("%s\n",set_st_err_name(i));
+	} else {
+		drbd_thread_start(&mdev->receiver);
+	}
 
 	return 0;
 
@@ -600,7 +605,7 @@
 
 	r = drbd_request_state(mdev,NS(role,newstate & 0x3));
 	if ( r == 2 ) { return 0; }
-	if ( r == 0 ) {
+	if ( r <= 0 ) {
 		/* request state does not like the new state. */
 		if (! (newstate & DontBlameDrbd)) {
 			return -EIO;
@@ -611,7 +616,10 @@
 			WARN("Forcefully set consistent!");
 			r = drbd_request_state(mdev,NS2(role,newstate & 0x3,
 							disk,Consistent));
-			if(r==0) return -EIO;
+			if(r<=0) {
+				ERR("%s\n",set_st_err_name(r));
+				return -EIO;
+			}
 		}
 	}
 
@@ -756,7 +764,10 @@
 	spin_unlock_irq(&mdev->req_lock);
 
 	if( r == 2 ) { return 0; }
-	if( r == 0 ) { return -ENETRESET; }
+	if( r <= 0 ) { 
+		ERR("%s\n",set_st_err_name(r));
+		return -ENETRESET; 
+	}
 
 	drbd_sync_me(mdev);
 
@@ -898,7 +909,8 @@
 
 		r = drbd_request_state(mdev,NS(conn,StandAlone));
 		if( r == 2 ) { break; }
-		if( r == 0 ) {
+		if( r <= 0 ) {
+			ERR("%s\n",set_st_err_name(r));
 			err=-ENODATA;
 			break;
 		} 
@@ -996,7 +1008,8 @@
 					        conn,WFBitMapT));
 
 		if( r == 2 ) { break; }
-		if( r == 0 ) {
+		if( r <= 0 ) {
+			ERR("%s\n",set_st_err_name(r));
 			err = -EINPROGRESS;
 			break;
 		} 
@@ -1035,7 +1048,8 @@
 					        conn,WFBitMapS));
 
 		if( r == 2 ) { break; }
-		if( r == 0 ) {
+		if( r <= 0 ) {
+			ERR("%s\n",set_st_err_name(r));
 			err = -EINPROGRESS;
 			break;
 		} 

Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_int.h	2004-11-05 11:47:50 UTC (rev 1628)
@@ -980,8 +980,8 @@
 // drbd_proc.c
 extern struct proc_dir_entry *drbd_proc;
 extern int drbd_proc_get_info(char *, char **, off_t, int, int *, void *);
-extern const char* cstate_to_name(drbd_conns_t s);
-extern const char* nodestate_to_name(drbd_role_t s);
+extern const char* conns_to_name(drbd_conns_t s);
+extern const char* roles_to_name(drbd_role_t s);
 
 // drbd_actlog.c
 extern void drbd_al_begin_io(struct Drbd_Conf *mdev, sector_t sector);

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_main.c	2004-11-05 11:47:50 UTC (rev 1628)
@@ -374,14 +374,14 @@
 	return ok;
 }
 
-#define drbd_peer_s_names drbd_role_s_names
-#define drbd_pedi_s_names drbd_disk_s_names
+#define peers_to_name roles_to_name
+#define pedis_to_name disks_to_name
 
 #define PSC(A) \
 	({ if( ns.s.A != os.s.A ) { \
 		pbp += sprintf(pbp, #A "( %s -> %s ) ", \
-		              drbd_##A##_s_names[os.s.A], \
-		              drbd_##A##_s_names[ns.s.A]); \
+		              A##s_to_name(os.s.A), \
+		              A##s_to_name(ns.s.A)); \
 	} })
 
 
@@ -397,34 +397,19 @@
 
 	if( !hard ) {
 		/*  pre-state-change checks ; only look at ns  */
+		/* See drbd_state_sw_errors in drbd_strings.c */
 		if( !ns.s.mult && 
-		    ns.s.role == Primary && ns.s.peer == Primary ) {
-			WARN("Multiple primaries now allowed by config.");
-			return 0;
-		}
+		    ns.s.role == Primary && ns.s.peer == Primary ) return -1;
 
 		if( ns.s.role == Primary && ns.s.disk <= Inconsistent && 
-		    ns.s.conn < Connected ) {
-			WARN("Refusing to be Primary without consistent data");
-			return 0;
-		}
+		    ns.s.conn < Connected ) return -2;
 
 		if( ns.s.peer == Primary && ns.s.pedi <= Inconsistent && 
-		    ns.s.conn < Connected ) {
-			WARN("Refusing to make peer Primary without data");
-			return 0;
-		}
+		    ns.s.conn < Connected ) return -3;
 
-		if( ns.s.disk < Consistent && ns.s.pedi < Consistent ) {
-			WARN("Refusing to be inconsistent on both nodes.");
-			return 0;
-		}
-
 		if( ns.s.conn > Connected && 
-		    (ns.s.disk == Diskless || ns.s.pedi == Diskless ) ) {
-			WARN("Refusing to do resync without two disks.");
-			return 0;
-		}
+		    (ns.s.disk < Consistent || ns.s.pedi < Consistent ) )
+			return -4;
 	}
 
 	/*  State sanitising  */

Modified: trunk/drbd/drbd_proc.c
===================================================================
--- trunk/drbd/drbd_proc.c	2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_proc.c	2004-11-05 11:47:50 UTC (rev 1628)
@@ -146,24 +146,6 @@
 	return sz;
 }
 
-const char* cstate_to_name(drbd_conns_t s) {
-	return s < Unconfigured ? "TO_SMALL" :
-	       s > PausedSyncT  ? "TO_LARGE"
-		                : drbd_conn_s_names[s];
-}
-
-const char* nodestate_to_name(drbd_role_t s) {
-	return s < Unknown    ? "TO_SMALL" :
-	       s > Secondary  ? "TO_LARGE"
-		              : drbd_role_s_names[s];
-}
-
-const char* diskstate_to_name(drbd_disks_t s) {
-	return s < DUnknown    ? "TO_SMALL" :
-	       s > UpToDate    ? "TO_LARGE"
-		              : drbd_disk_s_names[s];
-}
-
 /* FIXME we should use snprintf, we only have guaranteed room for one page...
  * we should eventually use seq_file for this */
 int drbd_proc_get_info(char *buf, char **start, off_t offset,
@@ -189,7 +171,7 @@
 	*/
 
 	for (i = 0; i < minor_count; i++) {
-		sn = cstate_to_name(drbd_conf[i].state.s.conn);
+		sn = conns_to_name(drbd_conf[i].state.s.conn);
 		
 		/* PRE FIXME
 		if(drbd_conf[i].cstate == Connected) {
@@ -209,10 +191,10 @@
 			   "    ns:%u nr:%u dw:%u dr:%u al:%u bm:%u "
 			   "lo:%d pe:%d ua:%d ap:%d\n",
 			   i, sn,
-			   nodestate_to_name(drbd_conf[i].state.s.role),
-			   nodestate_to_name(drbd_conf[i].state.s.peer),
-			   diskstate_to_name(drbd_conf[i].state.s.disk),
-			   diskstate_to_name(drbd_conf[i].state.s.pedi),
+			   roles_to_name(drbd_conf[i].state.s.role),
+			   roles_to_name(drbd_conf[i].state.s.peer),
+			   disks_to_name(drbd_conf[i].state.s.disk),
+			   disks_to_name(drbd_conf[i].state.s.pedi),
 			   drbd_conf[i].send_cnt/2,
 			   drbd_conf[i].recv_cnt/2,
 			   drbd_conf[i].writ_cnt/2,

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_receiver.c	2004-11-05 11:47:50 UTC (rev 1628)
@@ -625,7 +625,7 @@
 	D_ASSERT(mdev->state.s.conn > Unconfigured);
 	D_ASSERT(!mdev->data.socket);
 
-	if(!drbd_request_state(mdev,NS(conn,WFConnection))) return 0;
+	if(drbd_request_state(mdev,NS(conn,WFConnection)) <= 0 ) return 0;
 
 	while(1) {
 		sock=drbd_try_connect(mdev);
@@ -691,7 +691,7 @@
 	mdev->meta.socket = msock;
 	mdev->last_received = jiffies;
 
-	if(!drbd_request_state(mdev,NS(conn,WFReportParams))) return 0;
+	if(drbd_request_state(mdev,NS(conn,WFReportParams)) <= 0) return 0;
 	D_ASSERT(mdev->asender.task == NULL);
 
 	if (!drbd_do_handshake(mdev)) {
@@ -1416,7 +1416,7 @@
 	rv = _drbd_set_state(mdev,ns,0);
 	spin_unlock_irq(&mdev->req_lock);
 
-	if(!rv) {
+	if(rv <= 0) {
 		drbd_force_state(mdev,NS(conn,StandAlone));
 		drbd_thread_stop_nowait(&mdev->receiver);
 		return FALSE;
@@ -1472,7 +1472,7 @@
 		drbd_start_resync(mdev,SyncTarget); // XXX cannot fail ???
 	} else {
 		ERR("unexpected cstate (%s) in receive_bitmap\n",
-		    cstate_to_name(mdev->state.s.conn));
+		    conns_to_name(mdev->state.s.conn));
 	}
 
 	// We just started resync. Now we can be sure that local disk IO is okay.

Modified: trunk/drbd/drbd_strings.c
===================================================================
--- trunk/drbd/drbd_strings.c	2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_strings.c	2004-11-05 11:47:50 UTC (rev 1628)
@@ -22,7 +22,7 @@
 
 #include <linux/drbd.h>
 
-const char *drbd_conn_s_names[] = {
+static const char *drbd_conn_s_names[] = {
 	[Unconfigured]   = "Unconfigured",
 	[StandAlone]     = "StandAlone",
 	[Unconnected]    = "Unconnected",
@@ -42,13 +42,13 @@
 	[PausedSyncT]    = "PausedSyncT",
 };
 
-const char *drbd_role_s_names[] = {
+static const char *drbd_role_s_names[] = {
 	[Primary]   = "Primary",
 	[Secondary] = "Secondary",
 	[Unknown]   = "Unknown"
 };
 
-const char *drbd_disk_s_names[] = {
+static const char *drbd_disk_s_names[] = {
 	[DUnknown]     = "DUnknown",
 	[Diskless]     = "Diskless",
 	[Failed]       = "Failed",
@@ -57,3 +57,34 @@
 	[Consistent]   = "Consistent",
 	[UpToDate]     = "UpToDate",
 };
+
+static const char *drbd_state_sw_errors[] = {
+	[1] = "Multiple primaries now allowed by config",
+	[2] = "Refusing to be Primary without consistent data",
+	[3] = "Refusing to make peer Primary without data",
+	[4] = "Refusing to be inconsistent on both nodes",
+};
+
+const char* conns_to_name(drbd_conns_t s) {
+	return s < Unconfigured ? "TO_SMALL" :
+	       s > PausedSyncT  ? "TO_LARGE"
+		                : drbd_conn_s_names[s];
+}
+
+const char* roles_to_name(drbd_role_t s) {
+	return s < Unknown    ? "TO_SMALL" :
+	       s > Secondary  ? "TO_LARGE"
+		              : drbd_role_s_names[s];
+}
+
+const char* disks_to_name(drbd_disks_t s) {
+	return s < DUnknown    ? "TO_SMALL" :
+	       s > UpToDate    ? "TO_LARGE"
+		               : drbd_disk_s_names[s];
+}
+
+const char* set_st_err_name(int err) {
+	return err < -4 ? "TO_SMALL" :
+	       err > -1 ? "TO_LARGE"
+		        : drbd_state_sw_errors[-err];
+}

Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c	2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_worker.c	2004-11-05 11:47:50 UTC (rev 1628)
@@ -318,7 +318,7 @@
 	}
 
 	if (mdev->state.s.conn != SyncTarget) {
-		ERR("%s in w_make_resync_request\n", cstate_to_name(mdev->state.s.conn));
+		ERR("%s in w_make_resync_request\n", conns_to_name(mdev->state.s.conn));
 	}
 
         number = SLEEP_TIME*mdev->sync_conf.rate / ((BM_BLOCK_SIZE/1024)*HZ);
@@ -722,8 +722,9 @@
 	}
 
 	if(r != 1) {
+		ERR("%s\n",set_st_err_name(r));
 		ERR("Error in drbd_start_resync! (side == %s)\n",
-		    cstate_to_name(side));
+		    conns_to_name(side));
 		return;
 	}
 
@@ -736,7 +737,7 @@
 	mdev->rs_mark_time = jiffies;
 
 	INFO("Resync started as %s (need to sync %lu KB [%lu bits set]).\n",
-	     cstate_to_name(side),
+	     conns_to_name(side),
 	     (unsigned long) mdev->rs_total << (BM_BLOCK_SIZE_B-10),
 	     (unsigned long) mdev->rs_total);
 

Modified: trunk/drbd/linux/drbd.h
===================================================================
--- trunk/drbd/linux/drbd.h	2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/linux/drbd.h	2004-11-05 11:47:50 UTC (rev 1628)
@@ -52,11 +52,6 @@
      divisible by 8.
 */
 
-/* defined in drbd_strings.c */
-extern const char *drbd_conn_s_names[];
-extern const char *drbd_role_s_names[];
-extern const char *drbd_disk_s_names[];
-
 #define MAX_SOCK_ADDR	128	/* 108 for Unix domain -
 				   16 for IP, 16 for IPX,
 				   24 for IPv6,
@@ -228,6 +223,12 @@
 	unsigned int i;
 } drbd_state_t;
 
+/* from drbd_strings.c */
+extern const char* conns_to_name(drbd_conns_t);
+extern const char* roles_to_name(drbd_role_t);
+extern const char* disks_to_name(drbd_disks_t);
+extern const char* set_st_err_name(int);
+
 #ifndef BDEVNAME_SIZE
 # define BDEVNAME_SIZE 32
 #endif

Modified: trunk/testing/ioctl_structs_sizes.c
===================================================================
--- trunk/testing/ioctl_structs_sizes.c	2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/testing/ioctl_structs_sizes.c	2004-11-05 11:47:50 UTC (rev 1628)
@@ -5,7 +5,7 @@
 ({ int _i = sizeof(x); printf("sizeof(" #x ") = %d\n", _i); \
  if( _i % 8 ) printf(" WARN sizeof(" #x ") %% 8 != 0\n"); _i; })
 
-#define DRBD_07_SUM 1184
+#define DRBD_08_SUM 1176
 
 int main()
 {
@@ -20,9 +20,9 @@
 	sum += SZO(struct ioctl_wait);
 	sum += SZO(struct ioctl_get_config);
 
-	printf("sum = %d  DRBD_07_SUM = %d\n",sum,DRBD_07_SUM);
+	printf("sum = %d  DRBD_08_SUM = %d\n",sum,DRBD_08_SUM);
 
-	printf(sum == DRBD_07_SUM ? "OKAY\n" : "FAILED\n" );
+	printf(sum == DRBD_08_SUM ? "OKAY\n" : "FAILED\n" );
 
-	return sum != DRBD_07_SUM; /* if not equal, exit code is non-zero */
+	return sum != DRBD_08_SUM; /* if not equal, exit code is non-zero */
 }



More information about the drbd-cvs mailing list