[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);