[DRBD-cvs] svn commit by phil - r2479 - in trunk: drbd user - * More work on the sync_after code, but it still has ma

drbd-cvs at lists.linbit.com drbd-cvs at lists.linbit.com
Fri Sep 29 22:35:07 CEST 2006


Author: phil
Date: 2006-09-29 22:35:05 +0200 (Fri, 29 Sep 2006)
New Revision: 2479

Modified:
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_nl.c
   trunk/drbd/drbd_receiver.c
   trunk/drbd/drbd_worker.c
   trunk/user/drbdadm_adjust.c
   trunk/user/drbdsetup.c
Log:
* More work on the sync_after code, but it still has major bugs
  in it.
* Fixed bugs in drbdsetup and drbdadm to make 'drbdadm adjust rX'
  work in case only the disk config is not known to the kernel.


Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2006-09-29 13:51:56 UTC (rev 2478)
+++ trunk/drbd/drbd_int.h	2006-09-29 20:35:05 UTC (rev 2479)
@@ -308,8 +308,6 @@
 	ReportSizes,
 	ReportState,
 	ReportSyncUUID,
-	PauseResync,
-	ResumeResync,
 	AuthChallenge,
 	AuthResponse,
 	StateChgRequest,
@@ -356,8 +354,6 @@
 		[ReportSizes]      = "ReportSizes",
 		[ReportState]      = "ReportState",
 		[ReportSyncUUID]   = "ReportSyncUUID",
-		[PauseResync]      = "PauseResync",
-		[ResumeResync]     = "ResumeResync",
 		[AuthChallenge]    = "AuthChallenge",
 		[AuthResponse]     = "AuthResponse",
 		[Ping]             = "Ping",
@@ -1289,7 +1285,7 @@
 extern int is_valid_ar_handle(drbd_request_t *, sector_t);
 
 
-// drbd_fs.c
+// drbd_nl.c
 extern char* ppsize(char* buf, size_t size);
 extern sector_t drbd_new_dev_size(struct Drbd_Conf*, struct drbd_backing_dev*);
 extern int drbd_determin_dev_size(drbd_dev*);
@@ -1302,18 +1298,11 @@
 extern int drbd_khelper(drbd_dev *mdev, char* cmd);
 
 // drbd_worker.c
-enum RSPauseReason {
-	AfterDependency,
-	PeerImposed,
-	UserImposed
-};
-
 extern int drbd_worker(struct Drbd_thread *thi);
 extern void drbd_alter_sa(drbd_dev *mdev, int na);
-extern int drbd_resync_pause(drbd_dev *mdev, enum RSPauseReason);
-extern int drbd_resync_resume(drbd_dev *mdev, enum RSPauseReason);
 extern void drbd_start_resync(drbd_dev *mdev, drbd_conns_t side);
 extern void resume_next_sg(drbd_dev* mdev);
+extern void suspend_other_sg(drbd_dev* mdev);
 extern int drbd_resync_finished(drbd_dev *mdev);
 // maybe rather drbd_main.c ?
 extern int drbd_md_sync_page_io(drbd_dev *mdev, struct drbd_backing_dev *bdev,
@@ -1388,6 +1377,8 @@
 #define peer_mask role_mask
 #define pdsk_mask disk_mask
 #define susp_mask 1
+#define user_isp_mask 1
+#define aftr_isp_mask 1
 
 #define NS(T,S) ({drbd_state_t mask; mask.i=0; mask.T = T##_mask; mask;}), \
                 ({drbd_state_t val; val.i=0; val.T = (S); val;})

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2006-09-29 13:51:56 UTC (rev 2478)
+++ trunk/drbd/drbd_main.c	2006-09-29 20:35:05 UTC (rev 2479)
@@ -647,6 +647,7 @@
 	}
 
 	if( ns.conn < Connected ) {
+		ns.peer_isp = 0;
 		ns.peer = Unknown;
 		if ( ns.pdsk > DUnknown || 
 		     ns.pdsk < Inconsistent ) ns.pdsk = DUnknown;
@@ -957,16 +958,16 @@
 		drbd_send_state(mdev);
 	}
 
-	/* We want to pause resync, tell peer. */
-	if (  ( os.aftr_isp == 0 && ns.aftr_isp == 1 ) ||
-	      ( os.user_isp == 0 && ns.user_isp == 1 ) ) {
-		drbd_send_short_cmd(mdev,PauseResync);
+	/* We want to pause/continue resync, tell peer. */
+	if (  ( os.aftr_isp != ns.aftr_isp ) ||
+	      ( os.user_isp != ns.user_isp ) ) {
+		drbd_send_state(mdev);
 	}
 
-	/* We want to continue resync, tell peer. */
-	if (  ( os.aftr_isp == 1 || os.user_isp == 1 ) &&
-	        ns.aftr_isp == 0 && ns.user_isp == 0   ) {
-		drbd_send_short_cmd(mdev,ResumeResync);
+	/* In case one of the isp bits got set, suspend other devices. */
+	if ( ( !os.aftr_isp && !os.peer_isp && !os.user_isp) &&
+	     ( ns.aftr_isp || ns.peer_isp || ns.user_isp) ) {
+		suspend_other_sg(mdev);
 	}
 
 	/* We are in the progress to start a full sync... */

Modified: trunk/drbd/drbd_nl.c
===================================================================
--- trunk/drbd/drbd_nl.c	2006-09-29 13:51:56 UTC (rev 2478)
+++ trunk/drbd/drbd_nl.c	2006-09-29 20:35:05 UTC (rev 2479)
@@ -1275,8 +1275,10 @@
 			      struct drbd_nl_cfg_reply *reply)
 {
 	int retcode=NoError;
-	
-	if(!drbd_resync_pause(mdev, UserImposed)) retcode = PauseFlagAlreadySet;
+
+	if(drbd_request_state(mdev,NS(user_isp,1)) == SS_NothingToDo)
+		retcode = PauseFlagAlreadySet;
+
 	reply->ret_code = retcode;
 	return 0;
 }
@@ -1286,7 +1288,9 @@
 {
 	int retcode=NoError;
 
-	if(!drbd_resync_resume(mdev, UserImposed)) retcode = PauseFlagAlreadyClear;
+	if(drbd_request_state(mdev,NS(user_isp,0)) == SS_NothingToDo)
+		retcode = PauseFlagAlreadyClear;
+
 	reply->ret_code = retcode;
 	return 0;
 }

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2006-09-29 13:51:56 UTC (rev 2478)
+++ trunk/drbd/drbd_receiver.c	2006-09-29 20:35:05 UTC (rev 2479)
@@ -2305,20 +2305,6 @@
 	return (size == 0);
 }
 
-STATIC int receive_pause_resync(drbd_dev *mdev, Drbd_Header *h)
-{
-	drbd_resync_pause(mdev, PeerImposed);
-	return TRUE;
-
-}
-
-STATIC int receive_resume_resync(drbd_dev *mdev, Drbd_Header *h)
-{
-	drbd_resync_resume(mdev, PeerImposed);
-	return TRUE;
-}
-
-
 STATIC int receive_UnplugRemote(drbd_dev *mdev, Drbd_Header *h)
 {
 	if (mdev->state.disk >= Inconsistent) drbd_kick_lo(mdev);
@@ -2348,8 +2334,6 @@
 	[ReportState]      = receive_state,
 	[StateChgRequest]  = receive_req_state,
 	[ReportSyncUUID]   = receive_sync_uuid,
-	[PauseResync]      = receive_pause_resync,
-	[ResumeResync]     = receive_resume_resync,
 };
 
 static drbd_cmd_handler_f *drbd_cmd_handler = drbd_default_handler;

Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c	2006-09-29 13:51:56 UTC (rev 2478)
+++ trunk/drbd/drbd_worker.c	2006-09-29 20:35:05 UTC (rev 2479)
@@ -641,60 +641,6 @@
 	local_irq_enable();
 }
 
-/** 
- * _drbd_rs_resume:
- * @reason: Name of the flag
- * Clears one of the three reason flags that could cause the suspension
- * of the resynchronisation process. In case all three are cleared it 
- * actually changes the state to SyncSource or SyncTarget.
- * Returns 1 iff the flag got cleared; 0 iff the flag was already cleared.
- */ 
-STATIC int _drbd_rs_resume(drbd_dev *mdev, enum RSPauseReason reason)
-{
-	drbd_state_t ns;
-	int r;
-
-	ns = mdev->state;
-
-	switch(reason) {
-	case AfterDependency:	ns.aftr_isp = 0;	break;
-	case PeerImposed:	ns.peer_isp = 0;	break;
-	case UserImposed:	ns.user_isp = 0;	break;
-	}
-
-	// Call _drbd_set_state() in any way to set the _isp bits.
-	r = _drbd_set_state(mdev,ns,ChgStateHard|ScheduleAfter);
-
-	return r != SS_NothingToDo;
-}
-
-/** 
- * _drbd_rs_pause:
- * @reason: Name of the flag
- * Sets one of the three reason flags that could cause the suspension
- * of the resynchronisation process. In case the state was not alreay
- * PausedSyncT or PausedSyncS it changes the state into one of these.
- * Returns 1 iff the flag got set; 0 iff the flag was already set.
- */ 
-STATIC int _drbd_rs_pause(drbd_dev *mdev, enum RSPauseReason reason)
-{
-	drbd_state_t ns;
-	int r;
-
-	ns = mdev->state;
-
-	switch(reason) {
-	case AfterDependency:	ns.aftr_isp = 1;	break;
-	case PeerImposed:	ns.peer_isp = 1;	break;
-	case UserImposed:	ns.user_isp = 1;	break;
-	}
-
-	// Call _drbd_set_state() in any way to set the _isp bits.
-	r = _drbd_set_state(mdev,ns,ChgStateHard|ScheduleAfter);
-
-	return r != SS_NothingToDo;
-}
-
 STATIC int _drbd_may_sync_now(drbd_dev *mdev)
 {
 	drbd_dev *odev = mdev;
@@ -703,8 +649,10 @@
 		if( odev->sync_conf.after == -1 ) return 1;
 		odev = minor_to_mdev(odev->sync_conf.after);
 		ERR_IF(!odev) return 1;
-		if( odev->state.conn >= SyncSource &&
-		    odev->state.conn <= PausedSyncT ) return 0;
+		if( (odev->state.conn >= SyncSource &&
+		     odev->state.conn <= PausedSyncT) ||
+		    odev->state.aftr_isp || odev->state.peer_isp || 
+		    odev->state.user_isp ) return 0;
 	}
 }
 
@@ -712,7 +660,7 @@
  * _drbd_pause_after:
  * Finds all devices that may not resync now, and causes them to
  * pause their resynchronisation.
- * Called from process context only ( ioctl and receiver ).
+ * Called from process context only ( ioctl and after_state_ch ).
  */ 
 STATIC int _drbd_pause_after(drbd_dev *mdev)
 {
@@ -722,7 +670,9 @@
 	for (i=0; i < minor_count; i++) {
 		if( !(odev = minor_to_mdev(i)) ) continue;
 		if (! _drbd_may_sync_now(odev)) {
-			rv |= _drbd_rs_pause(odev,AfterDependency);
+			rv |= ( _drbd_set_state(odev,_NS(aftr_isp,1),
+						ChgStateHard|ScheduleAfter)
+				!= SS_NothingToDo ) ;
 		}
 	}
 
@@ -742,10 +692,11 @@
 
 	for (i=0; i < minor_count; i++) {
 		if( !(odev = minor_to_mdev(i)) ) continue;
-		if ( odev->state.conn == PausedSyncS ||
-		     odev->state.conn == PausedSyncT ) {
+		if ( odev->state.aftr_isp ) {
 			if (_drbd_may_sync_now(odev)) {
-				rv |= _drbd_rs_resume(odev,AfterDependency);
+				rv |= ( _drbd_set_state(odev,_NS(aftr_isp,0),
+							ChgStateHard|ScheduleAfter)
+					!= SS_NothingToDo ) ;
 			}
 		}
 	}
@@ -759,6 +710,13 @@
 	drbd_global_unlock();
 }
 
+void suspend_other_sg(drbd_dev* mdev)
+{
+	drbd_global_lock();
+	_drbd_pause_after(mdev);
+	drbd_global_unlock();
+}
+
 void drbd_alter_sa(drbd_dev *mdev, int na)
 {
 	int changes;
@@ -774,25 +732,6 @@
 	drbd_global_unlock();
 }
 
-int drbd_resync_pause(drbd_dev *mdev, enum RSPauseReason reason)
-{
-	int rv;
-	drbd_global_lock();
-	rv = _drbd_rs_pause(mdev,reason);
-	drbd_global_unlock();
-	return rv;
-}
-
-int drbd_resync_resume(drbd_dev *mdev, enum RSPauseReason reason)
-{
-	int rv;
-	drbd_global_lock();
-	rv = _drbd_rs_resume(mdev,reason);
-	drbd_global_unlock();
-	return rv;
-}
-
-
 /**
  * drbd_start_resync:
  * @side: Either SyncSource or SyncTarget

Modified: trunk/user/drbdadm_adjust.c
===================================================================
--- trunk/user/drbdadm_adjust.c	2006-09-29 13:51:56 UTC (rev 2478)
+++ trunk/user/drbdadm_adjust.c	2006-09-29 20:35:05 UTC (rev 2479)
@@ -149,6 +149,9 @@
 {
 	int eq = 1;
 
+	if (conf->disk == NULL && running->disk == NULL) return 1;
+	if (conf->disk == NULL || running->disk == NULL) return 0;
+
 	eq &= !strcmp(conf->disk,running->disk);
 	eq &= int_eq(conf->meta_disk,running->meta_disk);
 	if(!strcmp(conf->meta_disk,"internal")) return eq;

Modified: trunk/user/drbdsetup.c
===================================================================
--- trunk/user/drbdsetup.c	2006-09-29 13:51:56 UTC (rev 2478)
+++ trunk/user/drbdsetup.c	2006-09-29 20:35:05 UTC (rev 2479)
@@ -965,7 +965,7 @@
 int show_scmd(struct drbd_cmd *cm, int minor, unsigned short *rtl)
 {
 	int idx;
-	char* str;
+	char *str, *backing_dev, *address;
 	struct sockaddr_in *addr;
 
 	// find all commands that have options and print those...
@@ -977,25 +977,31 @@
 	// start of spagethi code...
 	if(consume_tag_int(T_wire_protocol,rtl,&idx))
 		printf("protocol %c;\n",'A'+idx-1);
-	if(consume_tag_string(T_backing_dev,rtl,&str)) {
+	backing_dev = address = NULL;
+	consume_tag_string(T_backing_dev,rtl,&backing_dev);
+	consume_tag_string(T_my_addr,rtl,&address);
+	if(backing_dev || address) {
 		printf("_this_host {\n");
 		printf("\tdevice\t\t\t\"/dev/drbd%d\";\n",minor);
-		printf("\tdisk\t\t\t\"%s\";\n",str);
-		consume_tag_int(T_meta_dev_idx,rtl,&idx);
-		consume_tag_string(T_meta_dev,rtl,&str);
-		switch(idx) {
-		case DRBD_MD_INDEX_INTERNAL:
-		case DRBD_MD_INDEX_FLEX_INT:
-			printf("\tmeta-disk\t\tinternal;\n");
-			break;
-		case DRBD_MD_INDEX_FLEX_EXT:
-			printf("\tflexible-meta-disk\t\"%s\";\n",str);
-			break;
-		default:
-			printf("\tmeta-disk\t\t\"%s\" [ %d ];\n",str,idx);
+		if(backing_dev) {
+			printf("\tdisk\t\t\t\"%s\";\n",backing_dev);
+			consume_tag_int(T_meta_dev_idx,rtl,&idx);
+			consume_tag_string(T_meta_dev,rtl,&str);
+			switch(idx) {
+			case DRBD_MD_INDEX_INTERNAL:
+			case DRBD_MD_INDEX_FLEX_INT:
+				printf("\tmeta-disk\t\tinternal;\n");
+				break;
+			case DRBD_MD_INDEX_FLEX_EXT:
+				printf("\tflexible-meta-disk\t\"%s\";\n",str);
+				break;
+			default:
+				printf("\tmeta-disk\t\t\"%s\" [ %d ];\n",str,
+				       idx);
+			}
 		}
-		if(consume_tag_string(T_my_addr,rtl,&str)) {
-			addr = (struct sockaddr_in *)str;
+		if(address) {
+			addr = (struct sockaddr_in *)address;
 			printf("\taddress\t\t\t%s:%d;\n",
 			       inet_ntoa(addr->sin_addr),
 			       ntohs(addr->sin_port));



More information about the drbd-cvs mailing list