[DRBD-cvs] r1634 - trunk/drbd
svn at svn.drbd.org
svn at svn.drbd.org
Wed Nov 10 23:13:11 CET 2004
Author: phil
Date: 2004-11-10 23:13:08 +0100 (Wed, 10 Nov 2004)
New Revision: 1634
Modified:
trunk/drbd/drbd_fs.c
trunk/drbd/drbd_int.h
trunk/drbd/drbd_main.c
trunk/drbd/drbd_receiver.c
trunk/drbd/drbd_worker.c
Log:
Now _drbd_set_state() can print state change errors by itself.
-> Because calling print_st_err() correctly was next to impossible.
Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c 2004-11-08 19:46:04 UTC (rev 1633)
+++ trunk/drbd/drbd_fs.c 2004-11-10 22:13:08 UTC (rev 1634)
@@ -434,15 +434,10 @@
drbd_set_blocksize(mdev,INITIAL_BLOCK_SIZE);
- if((i=drbd_request_state(mdev,NS(disk,
- drbd_md_test_flag(mdev,MDF_Consistent)
- ? Consistent : Inconsistent ))) > 0) {
+ if(drbd_request_state(mdev,NS(disk,
+ drbd_md_test_flag(mdev,MDF_Consistent)
+ ? Consistent : Inconsistent )) > 0) {
drbd_thread_start(&mdev->worker);
- } else {
- print_st_err(mdev,
- mdev->state,
- _NS(disk,drbd_md_test_flag(mdev,MDF_Consistent)
- ? Consistent : Inconsistent ),i);
}
// FIXME EXPLAIN:
@@ -569,9 +564,7 @@
mdev->recv_cnt = 0;
drbd_thread_start(&mdev->worker);
- if( (i=drbd_request_state(mdev,NS(conn,Unconnected))) <= 0) {
- print_st_err(mdev,mdev->state,_NS(conn,Unconnected),i);
- } else {
+ if( drbd_request_state(mdev,NS(conn,Unconnected)) > 0) {
drbd_thread_start(&mdev->receiver);
}
@@ -585,6 +578,7 @@
int drbd_set_state(drbd_dev *mdev,drbd_role_t newstate)
{
int r,forced = 0;
+ drbd_state_t os,ns;
D_ASSERT(semaphore_is_locked(&mdev->device_mutex));
@@ -606,7 +600,13 @@
return -EBUSY;
}
- r = drbd_request_state(mdev,NS(role,newstate & 0x3));
+ spin_lock_irq(&mdev->req_lock);
+ os = mdev->state;
+ r = _drbd_set_state(mdev, _NS(role,newstate & 0x3), 0);
+ ns = mdev->state;
+ spin_unlock_irq(&mdev->req_lock);
+ after_state_ch(mdev,os,ns);
+
if ( r == 2 ) { return 0; }
if ( r == -2 ) {
/* request state does not like the new state. */
@@ -619,17 +619,13 @@
WARN("Forcefully set consistent!");
r = drbd_request_state(mdev,NS2(role,newstate & 0x3,
disk,Consistent));
- if(r<=0) {
- print_st_err(mdev,mdev->state,
- _NS2(role,newstate & 0x3,
- disk,Consistent),r);
- return -EIO;
- }
+ if(r<=0) return -EIO;
+
forced = 1;
}
}
if ( r <= 0) {
- print_st_err(mdev,mdev->state,_NS(role,newstate & 0x3),r);
+ print_st_err(mdev,os,ns,r);
return -EACCES;
}
@@ -775,13 +771,12 @@
spin_lock_irq(&mdev->req_lock);
os = mdev->state;
- r = _drbd_set_state(mdev,_NS(disk,Diskless),0);
+ r = _drbd_set_state(mdev,_NS(disk,Diskless),ChgStateVerbose);
ns = mdev->state;
spin_unlock_irq(&mdev->req_lock);
if( r == 2 ) { return 0; }
if( r <= 0 ) {
- print_st_err(mdev,os,ns,r);
return -ENETRESET;
}
@@ -926,7 +921,6 @@
r = drbd_request_state(mdev,NS(conn,StandAlone));
if( r == 2 ) { break; }
if( r <= 0 ) {
- print_st_err(mdev,mdev->state,_NS(conn,StandAlone),r);
err=-ENODATA;
break;
}
@@ -1025,8 +1019,6 @@
if( r == 2 ) { break; }
if( r <= 0 ) {
- print_st_err(mdev,mdev->state,_NS2(disk,Inconsistent,
- conn,WFBitMapT),r);
err = -EINPROGRESS;
break;
}
@@ -1066,8 +1058,6 @@
if( r == 2 ) { break; }
if( r <= 0 ) {
- print_st_err(mdev,mdev->state,_NS2(pdsk,Inconsistent,
- conn,WFBitMapS),r);
err = -EINPROGRESS;
break;
}
Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h 2004-11-08 19:46:04 UTC (rev 1633)
+++ trunk/drbd/drbd_int.h 2004-11-10 22:13:08 UTC (rev 1634)
@@ -743,7 +743,13 @@
*************************/
// drbd_main.c
-extern int _drbd_set_state(drbd_dev* mdev, drbd_state_t ns, int hard);
+
+enum chg_state_flags {
+ ChgStateHard = 1,
+ ChgStateVerbose = 2,
+};
+
+extern int _drbd_set_state(drbd_dev*, drbd_state_t, enum chg_state_flags );
extern void print_st_err(drbd_dev*, drbd_state_t, drbd_state_t, int );
extern void after_state_ch(drbd_dev* mdev, drbd_state_t os, drbd_state_t ns);
extern void drbd_thread_start(struct Drbd_thread *thi);
@@ -1031,38 +1037,34 @@
({drbd_state_t ns; ns.i = mdev->state.i; ns.s.T1 = (S1); \
ns.s.T2 = (S2); ns.s.T3 = (S3); ns;})
-
-static inline void drbd_force_state(drbd_dev* mdev,
+static inline int drbd_change_state(drbd_dev* mdev, enum chg_state_flags f,
drbd_state_t mask, drbd_state_t val)
{
unsigned long flags;
drbd_state_t os,ns;
+ int rv;
spin_lock_irqsave(&mdev->req_lock,flags);
os = mdev->state;
ns.i = (os.i & ~mask.i) | val.i;
- _drbd_set_state(mdev, ns, 1);
+ rv = _drbd_set_state(mdev, ns, f);
ns = mdev->state;
spin_unlock_irqrestore(&mdev->req_lock,flags);
after_state_ch(mdev,os,ns);
+
+ return rv;
}
+static inline void drbd_force_state(drbd_dev* mdev,
+ drbd_state_t mask, drbd_state_t val)
+{
+ drbd_change_state(mdev,ChgStateHard,mask,val);
+}
+
static inline int drbd_request_state(drbd_dev* mdev,
- drbd_state_t mask, drbd_state_t val)
+ drbd_state_t mask, drbd_state_t val)
{
- unsigned long flags;
- drbd_state_t os,ns;
- int rv;
-
- spin_lock_irqsave(&mdev->req_lock,flags);
- os = mdev->state;
- ns.i = (os.i & ~mask.i) | val.i;
- rv = _drbd_set_state(mdev, ns, 0);
- ns = mdev->state;
- spin_unlock_irqrestore(&mdev->req_lock,flags);
- after_state_ch(mdev,os,ns);
-
- return rv;
+ return drbd_change_state(mdev,ChgStateVerbose,mask,val);
}
/**
Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c 2004-11-08 19:46:04 UTC (rev 1633)
+++ trunk/drbd/drbd_main.c 2004-11-10 22:13:08 UTC (rev 1634)
@@ -338,7 +338,7 @@
spin_lock_irqsave(&mdev->req_lock,flags);
if( (send = (mdev->state.s.disk == Failed)) ) {
- _drbd_set_state(mdev,_NS(disk,Diskless),1);
+ _drbd_set_state(mdev,_NS(disk,Diskless),ChgStateHard);
}
D_ASSERT(mdev->state.s.disk <= Failed);
spin_unlock_irqrestore(&mdev->req_lock,flags);
@@ -407,34 +407,34 @@
/* PRE TODO: Should return ernno numbers from the pre-state-change checks. */
-int _drbd_set_state(drbd_dev* mdev, drbd_state_t ns, int hard)
+int _drbd_set_state(drbd_dev* mdev, drbd_state_t ns,enum chg_state_flags flags)
{
drbd_state_t os;
char pb[160], *pbp;
+ int rv=1;
os = mdev->state;
if( ns.i == os.i ) return 2;
- if( !hard ) {
+ if( !(flags & ChgStateHard) ) {
/* 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 ) return -1;
+ ns.s.role == Primary && ns.s.peer == Primary ) rv=-1;
if( ns.s.role == Primary && ns.s.disk <= Inconsistent &&
- ns.s.conn < Connected ) return -2;
+ ns.s.conn < Connected ) rv=-2;
if( ns.s.peer == Primary && ns.s.pdsk <= Inconsistent &&
- ns.s.conn < Connected ) return -3;
+ ns.s.conn < Connected ) rv=-3;
if( ns.s.conn > Connected &&
- ns.s.disk < Consistent && ns.s.pdsk < Consistent )
- return -4;
+ ns.s.disk < Consistent && ns.s.pdsk < Consistent ) rv=-4;
if( ns.s.conn > Connected &&
- (ns.s.disk == Diskless || ns.s.pdsk == Diskless ) )
- return -5;
+ (ns.s.disk == Diskless || ns.s.pdsk == Diskless ) ) rv=-5;
}
/* State sanitising */
@@ -446,6 +446,11 @@
ns.s.conn = Connected;
}
+ if(rv <= 0) {
+ if( flags & ChgStateVerbose ) print_st_err(mdev,os,ns,rv);
+ return rv;
+ }
+
#if DUMP_MD >= 2
pbp = pb;
PSC(role);
@@ -482,7 +487,7 @@
drbd_panic("No access to good data anymore.\n");
}
- return 1;
+ return rv;
}
void after_state_ch(drbd_dev* mdev, drbd_state_t os, drbd_state_t ns)
Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c 2004-11-08 19:46:04 UTC (rev 1633)
+++ trunk/drbd/drbd_receiver.c 2004-11-10 22:13:08 UTC (rev 1634)
@@ -1413,11 +1413,10 @@
ns.s.conn = nconn;
ns.s.peer = be32_to_cpu(p->state);
ns.s.pdsk = npdsk;
- rv = _drbd_set_state(mdev,ns,0);
+ rv = _drbd_set_state(mdev,ns,ChgStateVerbose);
spin_unlock_irq(&mdev->req_lock);
if(rv <= 0) {
- print_st_err(mdev,mdev->state,ns,rv);
drbd_force_state(mdev,NS(conn,StandAlone));
drbd_thread_stop_nowait(&mdev->receiver);
return FALSE;
Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c 2004-11-08 19:46:04 UTC (rev 1633)
+++ trunk/drbd/drbd_worker.c 2004-11-10 22:13:08 UTC (rev 1634)
@@ -545,7 +545,7 @@
INFO("Syncer continues.\n");
mdev->rs_paused += (long)jiffies-(long)mdev->rs_mark_time;
- _drbd_set_state(mdev,_NS(conn,ncs),1);
+ _drbd_set_state(mdev,_NS(conn,ncs),ChgStateHard);
if(mdev->state.s.conn == SyncTarget) {
ERR_IF(test_bit(STOP_SYNC_TIMER,&mdev->flags)) {
@@ -575,7 +575,7 @@
mdev->rs_mark_time = jiffies;
// mdev->rs_mark_left = drbd_bm_total_weight(mdev); // I don't care...
- _drbd_set_state(mdev,_NS(conn,ncs),1);
+ _drbd_set_state(mdev,_NS(conn,ncs),ChgStateHard);
INFO("Syncer waits for sync group.\n");
}
@@ -721,12 +721,7 @@
}
}
- if(r != 1) {
- ERR("%s\n",set_st_err_name(r));
- ERR("Error in drbd_start_resync! (side == %s)\n",
- conns_to_name(side));
- return;
- }
+ if(r != 1) return;
drbd_md_write(mdev);
More information about the drbd-cvs
mailing list