[DRBD-cvs] drbd by phil; * list_add_tail() <- list_add() for done...
drbd-user@lists.linbit.com
drbd-user@lists.linbit.com
Tue, 4 May 2004 12:26:17 +0200 (CEST)
DRBD CVS committal
Author : phil
Module : drbd
Dir : drbd/drbd
Modified Files:
Tag: rel-0_7-branch
drbd_dsender.c drbd_fs.c drbd_int.h drbd_main.c
drbd_receiver.c
Log Message:
* list_add_tail() <- list_add() for done_ee
* Increasing of a device's sync group was not working right. FIXED.
* Worker runs now as long as we have a backing device or a socket.
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.97
retrieving revision 1.1.2.98
diff -u -3 -r1.1.2.97 -r1.1.2.98
--- drbd_dsender.c 4 May 2004 08:44:15 -0000 1.1.2.97
+++ drbd_dsender.c 4 May 2004 10:26:12 -0000 1.1.2.98
@@ -120,7 +120,7 @@
smp_mb__after_clear_bit();
list_del(&e->w.list);
- list_add(&e->w.list,&mdev->done_ee);
+ list_add_tail(&e->w.list,&mdev->done_ee);
if (waitqueue_active(&mdev->ee_wait) &&
(list_empty(&mdev->active_ee) ||
@@ -253,7 +253,7 @@
spin_lock_irqsave(&mdev->ee_lock,flags);
list_del(&e->w.list);
- list_add(&e->w.list,&mdev->done_ee);
+ list_add_tail(&e->w.list,&mdev->done_ee);
if (waitqueue_active(&mdev->ee_wait) &&
(list_empty(&mdev->active_ee) ||
@@ -700,6 +700,24 @@
return rv;
}
+STATIC int _drbd_resume_lower_sg(drbd_dev *mdev)
+{
+ drbd_dev *odev;
+ int i,rv=0;
+
+ for (i=0; i < minor_count; i++) {
+ odev = drbd_conf + i;
+ if ( odev->sync_conf.group < mdev->sync_conf.group
+ && ( odev->cstate == PausedSyncS ||
+ odev->cstate == PausedSyncT ) ) {
+ _drbd_rs_resume(odev);
+ rv = 1;
+ }
+ }
+
+ return rv;
+}
+
int w_resume_next_sg(drbd_dev* mdev, struct drbd_work* w, int unused)
{
drbd_dev *odev;
@@ -745,7 +763,7 @@
void drbd_alter_sg(drbd_dev *mdev, int ng)
{
- int c = 0;
+ int c = 0, p = 0;
int d = (ng - mdev->sync_conf.group);
drbd_global_lock();
@@ -760,8 +778,9 @@
if( ( mdev->cstate == SyncSource ||
mdev->cstate == SyncTarget ) && ( d > 0 ) ) {
- if(_drbd_lower_sg_running(mdev)) c=1;
- if(c) _drbd_rs_pause(mdev);
+ if(_drbd_resume_lower_sg(mdev)) p=1;
+ else if(_drbd_lower_sg_running(mdev)) p=1;
+ if(p) _drbd_rs_pause(mdev);
}
drbd_global_unlock();
}
@@ -850,7 +869,6 @@
if(0) {
err:
ERR("A work callback returned not ok!\n");
- // ?? drbd_thread_restart_nowait(&mdev->asender);
drbd_thread_restart_nowait(&mdev->receiver);
}
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.82
retrieving revision 1.28.2.83
diff -u -3 -r1.28.2.82 -r1.28.2.83
--- drbd_fs.c 29 Apr 2004 14:43:26 -0000 1.28.2.82
+++ drbd_fs.c 4 May 2004 10:26:12 -0000 1.28.2.83
@@ -364,7 +364,10 @@
drbd_set_blocksize(mdev,INITIAL_BLOCK_SIZE);
- if(mdev->cstate == Unconfigured ) set_cstate(mdev,StandAlone);
+ if(mdev->cstate == Unconfigured ) {
+ drbd_thread_start(&mdev->worker);
+ set_cstate(mdev,StandAlone);
+ }
if(mdev->cstate >= Connected ) {
drbd_send_param(mdev,1);
} else {
@@ -465,7 +468,6 @@
*/
drbd_sync_me(mdev);
- drbd_thread_stop(&mdev->worker);
drbd_thread_stop(&mdev->asender);
drbd_thread_stop(&mdev->receiver);
drbd_free_sock(mdev);
@@ -501,7 +503,8 @@
mdev->send_cnt = 0;
mdev->recv_cnt = 0;
- set_cstate(&drbd_conf[minor],Unconnected);
+ drbd_thread_start(&mdev->worker);
+ set_cstate(mdev,Unconnected);
drbd_thread_start(&mdev->receiver);
return 0;
@@ -775,12 +778,13 @@
/* FIXME what if fsync returns error */
drbd_sync_me(mdev);
set_bit(DO_NOT_INC_CONCNT,&mdev->flags);
- drbd_thread_stop(&mdev->worker);
drbd_thread_stop(&mdev->asender);
drbd_thread_stop(&mdev->receiver);
- if (test_bit(DISKLESS,&mdev->flags)) set_cstate(mdev,Unconfigured);
- else set_cstate(mdev,StandAlone);
+ if (test_bit(DISKLESS,&mdev->flags)) {
+ set_cstate(mdev,Unconfigured);
+ drbd_mdev_cleanup(mdev);
+ } else set_cstate(mdev,StandAlone);
break;
@@ -822,7 +826,10 @@
/* FIXME race with sync start
*/
if (mdev->cstate == Connected) drbd_send_param(mdev,0);
- if (mdev->cstate == StandAlone) set_cstate(mdev,Unconfigured);
+ if (mdev->cstate == StandAlone) {
+ set_cstate(mdev,Unconfigured);
+ drbd_mdev_cleanup(mdev);
+ }
break;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.152
retrieving revision 1.58.2.153
diff -u -3 -r1.58.2.152 -r1.58.2.153
--- drbd_int.h 4 May 2004 08:44:15 -0000 1.58.2.152
+++ drbd_int.h 4 May 2004 10:26:12 -0000 1.58.2.153
@@ -952,8 +952,6 @@
spin_lock_irqsave(&mdev->req_lock,flags);
_set_cstate(mdev,ns);
spin_unlock_irqrestore(&mdev->req_lock,flags);
- if (ns == Unconfigured)
- drbd_mdev_cleanup(mdev);
}
/**
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.159
retrieving revision 1.73.2.160
diff -u -3 -r1.73.2.159 -r1.73.2.160
--- drbd_main.c 4 May 2004 08:44:15 -0000 1.73.2.159
+++ drbd_main.c 4 May 2004 10:26:12 -0000 1.73.2.160
@@ -1189,6 +1189,8 @@
* oldest_barrier
*/
+ drbd_thread_stop(&mdev->worker);
+
if ( mdev->ee_in_use != 0
|| mdev->ee_vacant != 32 /* EE_MININUM */
|| mdev->epoch_size != 0)
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.136
retrieving revision 1.97.2.137
diff -u -3 -r1.97.2.136 -r1.97.2.137
--- drbd_receiver.c 30 Apr 2004 09:46:57 -0000 1.97.2.136
+++ drbd_receiver.c 4 May 2004 10:26:12 -0000 1.97.2.137
@@ -661,7 +661,6 @@
D_ASSERT(mdev->worker.task == NULL);
drbd_thread_start(&mdev->asender);
- drbd_thread_start(&mdev->worker);
drbd_send_param(mdev,0);
@@ -1123,6 +1122,7 @@
if(p_size == 0 && test_bit(DISKLESS,&mdev->flags)) {
ERR("some backing storage is needed\n");
set_cstate(mdev,Unconfigured);
+ drbd_mdev_cleanup(mdev); // FIXME. Is this valid here ?
mdev->receiver.t_state = Exiting;
return FALSE;
}
@@ -1483,6 +1483,7 @@
up(&mdev->data.mutex);
drbd_thread_stop(&mdev->worker);
+ drbd_thread_start(&mdev->worker);
if(mdev->cstate != StandAlone)
set_cstate(mdev,Unconnected);
@@ -1533,12 +1534,6 @@
if (thi->t_state == Exiting) break;
drbdd(mdev);
drbd_disconnect(mdev);
-
- // worker was stopped..., ev. w_resume_next_sg()
- if(mdev->resync_work.cb == w_resume_next_sg) {
- w_resume_next_sg(mdev,&mdev->resync_work,0);
- }
-
if (thi->t_state == Exiting) break;
else {
if (signal_pending(current)) {