[DRBD-cvs] DRBD CVS: drbd by phil from

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Wed, 14 Jan 2004 14:36:01 +0100 (CET)


DRBD CVS committal

Author  : phil
Host    : 
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_actlog.c drbd_dsender.c drbd_int.h drbd_main.c 


Log Message:
Fixed the list handling in set_cstate.
Moved the set_cstate function into drbd_main.c (no longer static inline)


===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_actlog.c,v
retrieving revision 1.1.2.51
retrieving revision 1.1.2.52
diff -u -3 -r1.1.2.51 -r1.1.2.52
--- drbd_actlog.c	14 Jan 2004 06:42:22 -0000	1.1.2.51
+++ drbd_actlog.c	14 Jan 2004 13:36:01 -0000	1.1.2.52
@@ -437,7 +437,7 @@
 	struct Drbd_Conf *mdev;
 
 	mdev = container_of(bh,struct Drbd_Conf,md_io_bh);
-	BUG_ON(!IS_VALID_MDEV(mdev));
+	PARANOIA_BUG_ON(!IS_VALID_MDEV(mdev));
 
 	mark_buffer_uptodate(bh, uptodate);
 	unlock_buffer(bh);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.43
retrieving revision 1.1.2.44
diff -u -3 -r1.1.2.43 -r1.1.2.44
--- drbd_dsender.c	14 Jan 2004 11:31:38 -0000	1.1.2.43
+++ drbd_dsender.c	14 Jan 2004 13:36:01 -0000	1.1.2.44
@@ -116,7 +116,7 @@
 	return 0;
 }
 
-STATIC void _ds_wait_osg(drbd_dev* odev, struct drbd_hook* dh)
+STATIC int _ds_wait_osg(drbd_dev* odev, struct drbd_hook* dh)
 {
 	// This is a callback, I better not assume that this 
 	// is a context which allows to send something from.
@@ -125,9 +125,6 @@
 	int added=0;
 
 	if(odev->cstate <= Connected) {
-		spin_lock_irqsave(&mdev->req_lock,flags);
-		list_del(&dh->list);
-		spin_unlock_irqrestore(&mdev->req_lock,flags);
 	retry:
 		if( (odev = ds_find_osg(mdev)) ) {
 			spin_lock_irqsave(&odev->req_lock,flags);
@@ -142,7 +139,9 @@
 			wake_up_interruptible(&mdev->dsender_wait);
 			kfree(dh);
 		}
+		return 0; // do not add to this hook again.
 	}
+	return 1; // run again. 
 }
 
 STATIC int drbd_wait_for_other_sync_groups(drbd_dev *mdev)
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.85
retrieving revision 1.58.2.86
diff -u -3 -r1.58.2.85 -r1.58.2.86
--- drbd_int.h	14 Jan 2004 06:42:22 -0000	1.58.2.85
+++ drbd_int.h	14 Jan 2004 13:36:01 -0000	1.58.2.86
@@ -633,7 +633,7 @@
 struct drbd_hook {
 	struct list_head list;
 	void* data;
-	void (*callback) (drbd_dev*, struct drbd_hook* );
+	int (*callback) (drbd_dev*, struct drbd_hook* );
 };
 
 
@@ -728,6 +728,7 @@
  *************************/
 
 // drbd_main.c
+extern void set_cstate(drbd_dev* mdev,Drbd_CState cs);
 extern void drbd_thread_start(struct Drbd_thread *thi);
 extern void _drbd_thread_stop(struct Drbd_thread *thi, int restart, int wait);
 extern void drbd_free_resources(drbd_dev *mdev);
@@ -1015,27 +1016,6 @@
 static inline void drbd_thread_restart_nowait(struct Drbd_thread *thi)
 {
 	_drbd_thread_stop(thi,TRUE,FALSE);
-}
-
-static inline void set_cstate(drbd_dev* mdev,Drbd_CState cs)
-{
-	struct list_head *le;
-	struct drbd_hook *dh;
-	unsigned long flags;
-
-	spin_lock_irqsave(&mdev->req_lock,flags);
-	mdev->cstate = cs;
-
-	while(!list_empty(&mdev->cstate_hook)) {
-		le = mdev->cstate_hook.next;
-		dh = list_entry(le, struct drbd_hook,list);
-		spin_unlock_irqrestore(&mdev->req_lock,flags);
-		dh->callback(mdev,dh);
-		spin_lock_irqsave(&mdev->req_lock,flags);
-	}
-	spin_unlock_irqrestore(&mdev->req_lock,flags);
-
-	wake_up_interruptible(&mdev->cstate_wait);
 }
 
 static inline void inc_pending(drbd_dev* mdev)
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.92
retrieving revision 1.73.2.93
diff -u -3 -r1.73.2.92 -r1.73.2.93
--- drbd_main.c	14 Jan 2004 06:42:22 -0000	1.73.2.92
+++ drbd_main.c	14 Jan 2004 13:36:01 -0000	1.73.2.93
@@ -312,6 +312,35 @@
 }
 #endif
 
+void set_cstate(drbd_dev* mdev,Drbd_CState cs)
+{
+	struct list_head workset;
+	struct list_head *le;
+	struct drbd_hook *dh;
+	unsigned long flags;
+	int run_again;
+
+	INIT_LIST_HEAD(&workset);
+
+	spin_lock_irqsave(&mdev->req_lock,flags);
+	mdev->cstate = cs;
+
+	list_add(&workset,&mdev->cstate_hook);
+	list_del_init(&mdev->cstate_hook);
+
+	while(!list_empty(&workset)) {
+		le = workset.next;
+		dh = list_entry(le, struct drbd_hook,list);
+		list_del(le);
+		spin_unlock_irqrestore(&mdev->req_lock,flags);
+		run_again = dh->callback(mdev,dh);
+		spin_lock_irqsave(&mdev->req_lock,flags);
+		if(run_again) list_add(le,&mdev->cstate_hook);
+	}
+	spin_unlock_irqrestore(&mdev->req_lock,flags);
+
+	wake_up_interruptible(&mdev->cstate_wait);
+}
 
 STATIC int drbd_thread_setup(void* arg)
 {
@@ -1210,7 +1239,7 @@
 		mdev->mbds_id = bm_init(0);
 		if (!mdev->mbds_id) goto Enomem;
 		// no need to lock access, we are still initializing the module.
-		mdev->resync = lc_alloc(7, sizeof(struct bm_extent),mdev);
+		mdev->resync = lc_alloc(13, sizeof(struct bm_extent),mdev);
 		if (!mdev->resync) goto Enomem;
 		mdev->act_log = lc_alloc(mdev->sync_conf.al_extents,
 					 sizeof(struct lc_element), mdev);