[DRBD-cvs] r1629 - in trunk/drbd: . linux
svn at svn.drbd.org
svn at svn.drbd.org
Fri Nov 5 13:58:40 CET 2004
Author: phil
Date: 2004-11-05 13:58:36 +0100 (Fri, 05 Nov 2004)
New Revision: 1629
Modified:
trunk/drbd/drbd_fs.c
trunk/drbd/drbd_int.h
trunk/drbd/drbd_main.c
trunk/drbd/drbd_proc.c
trunk/drbd/drbd_receiver.c
trunk/drbd/drbd_req.c
trunk/drbd/drbd_strings.c
trunk/drbd/drbd_worker.c
trunk/drbd/linux/drbd.h
Log:
Basic operations like attach/connect/primary/resync
now seems to work with the new state switching code.
* Improved error reporting a lot.
Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c 2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_fs.c 2004-11-05 12:58:36 UTC (rev 1629)
@@ -439,7 +439,10 @@
? Consistent : Inconsistent ))) > 0) {
drbd_thread_start(&mdev->worker);
} else {
- ERR("%s\n",set_st_err_name(i));
+ print_st_err(mdev,
+ mdev->state,
+ _NS(disk,drbd_md_test_flag(mdev,MDF_Consistent)
+ ? Consistent : Inconsistent ),i);
}
// FIXME EXPLAIN:
@@ -567,7 +570,7 @@
drbd_thread_start(&mdev->worker);
if( (i=drbd_request_state(mdev,NS(conn,Unconnected))) <= 0) {
- ERR("%s\n",set_st_err_name(i));
+ print_st_err(mdev,mdev->state,_NS(conn,Unconnected),i);
} else {
drbd_thread_start(&mdev->receiver);
}
@@ -581,7 +584,7 @@
int drbd_set_state(drbd_dev *mdev,drbd_role_t newstate)
{
- int r;
+ int r,forced = 0;
D_ASSERT(semaphore_is_locked(&mdev->device_mutex));
@@ -605,7 +608,7 @@
r = drbd_request_state(mdev,NS(role,newstate & 0x3));
if ( r == 2 ) { return 0; }
- if ( r <= 0 ) {
+ if ( r == -2 ) {
/* request state does not like the new state. */
if (! (newstate & DontBlameDrbd)) {
return -EIO;
@@ -617,12 +620,20 @@
r = drbd_request_state(mdev,NS2(role,newstate & 0x3,
disk,Consistent));
if(r<=0) {
- ERR("%s\n",set_st_err_name(r));
+ print_st_err(mdev,mdev->state,
+ _NS2(role,newstate & 0x3,
+ disk,Consistent),r);
return -EIO;
}
+ forced = 1;
}
}
+ if ( r <= 0) {
+ print_st_err(mdev,mdev->state,_NS(role,newstate & 0x3),r);
+ return -EACCES;
+ }
+
if (mdev->state.s.conn >= Connected) {
/* do NOT increase the Human count if we are connected,
* and there is no reason for it. See
@@ -687,6 +698,11 @@
/* Primary indicator has changed in any case. */
drbd_md_write(mdev);
+ if (mdev->state.s.conn >= WFReportParams) {
+ /* if this was forced, we should consider sync */
+ drbd_send_param(mdev,forced);
+ }
+
return 0;
}
@@ -765,7 +781,7 @@
if( r == 2 ) { return 0; }
if( r <= 0 ) {
- ERR("%s\n",set_st_err_name(r));
+ print_st_err(mdev,os,ns,r);
return -ENETRESET;
}
@@ -910,7 +926,7 @@
r = drbd_request_state(mdev,NS(conn,StandAlone));
if( r == 2 ) { break; }
if( r <= 0 ) {
- ERR("%s\n",set_st_err_name(r));
+ print_st_err(mdev,mdev->state,_NS(conn,StandAlone),r);
err=-ENODATA;
break;
}
@@ -1009,7 +1025,8 @@
if( r == 2 ) { break; }
if( r <= 0 ) {
- ERR("%s\n",set_st_err_name(r));
+ print_st_err(mdev,mdev->state,_NS2(disk,Inconsistent,
+ conn,WFBitMapT),r);
err = -EINPROGRESS;
break;
}
@@ -1044,12 +1061,13 @@
/* PRE TODO disallow invalidate if we peer is primary */
/* remove EINVAL from error output... */
- r = drbd_request_state(mdev,NS2(pedi,Inconsistent,
+ r = drbd_request_state(mdev,NS2(pdsk,Inconsistent,
conn,WFBitMapS));
if( r == 2 ) { break; }
if( r <= 0 ) {
- ERR("%s\n",set_st_err_name(r));
+ 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-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_int.h 2004-11-05 12:58:36 UTC (rev 1629)
@@ -744,6 +744,7 @@
// drbd_main.c
extern int _drbd_set_state(drbd_dev* mdev, drbd_state_t ns, int hard);
+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);
extern void _drbd_thread_stop(struct Drbd_thread *thi, int restart, int wait);
@@ -1007,7 +1008,7 @@
#include "drbd_compat_wrappers.h"
#define peer_mask role_mask
-#define pedi_mask disk_mask
+#define pdsk_mask disk_mask
#define NS(T,S) ({drbd_state_t mask; mask.i=0; mask.s.T = T##_mask; mask;}), \
({drbd_state_t val; val.i=0; val.s.T = (S); val;})
@@ -1023,7 +1024,14 @@
val.s.T2 = (S2); val.s.T3 = (S3); val;})
#define _NS(T,S) ({drbd_state_t ns; ns.i = mdev->state.i; ns.s.T = (S); ns;})
+#define _NS2(T1,S1,T2,S2) \
+ ({drbd_state_t ns; ns.i = mdev->state.i; ns.s.T1 = (S1); \
+ ns.s.T2 = (S2); ns;})
+#define _NS3(T1,S1,T2,S2,T3,S3) \
+ ({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,
drbd_state_t mask, drbd_state_t val)
{
Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c 2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_main.c 2004-11-05 12:58:36 UTC (rev 1629)
@@ -374,8 +374,29 @@
return ok;
}
+
+static void print_st(drbd_dev* mdev, char *name, drbd_state_t ns)
+{
+ ERR(" %s = { cs:%s st:%s/%s ds:%s/%s m:%d }\n",
+ name,
+ conns_to_name(ns.s.conn),
+ roles_to_name(ns.s.role),
+ roles_to_name(ns.s.peer),
+ disks_to_name(ns.s.disk),
+ disks_to_name(ns.s.pdsk),
+ ns.s.mult);
+}
+
+void print_st_err(drbd_dev* mdev, drbd_state_t os, drbd_state_t ns, int err)
+{
+ ERR("State change failed: %s\n",set_st_err_name(err));
+ print_st(mdev," state",os);
+ print_st(mdev,"wanted",ns);
+}
+
+
#define peers_to_name roles_to_name
-#define pedis_to_name disks_to_name
+#define pdsks_to_name disks_to_name
#define PSC(A) \
({ if( ns.s.A != os.s.A ) { \
@@ -404,17 +425,21 @@
if( ns.s.role == Primary && ns.s.disk <= Inconsistent &&
ns.s.conn < Connected ) return -2;
- if( ns.s.peer == Primary && ns.s.pedi <= Inconsistent &&
+ if( ns.s.peer == Primary && ns.s.pdsk <= Inconsistent &&
ns.s.conn < Connected ) return -3;
if( ns.s.conn > Connected &&
- (ns.s.disk < Consistent || ns.s.pedi < Consistent ) )
+ ns.s.disk < Consistent && ns.s.pdsk < Consistent )
return -4;
+
+ if( ns.s.conn > Connected &&
+ (ns.s.disk == Diskless || ns.s.pdsk == Diskless ) )
+ return -5;
}
/* State sanitising */
if( ns.s.conn < Connected ) ns.s.peer = Unknown;
- if( ns.s.conn < Connected ) ns.s.pedi = DUnknown;
+ if( ns.s.conn < Connected ) ns.s.pdsk = DUnknown;
if( ns.s.disk <= Failed && ns.s.conn > Connected) {
WARN("Resync aborted.\n");
@@ -427,7 +452,7 @@
PSC(peer);
PSC(conn);
PSC(disk);
- PSC(pedi);
+ PSC(pdsk);
if( ns.s.mult != os.s.mult ) {
sprintf(pbp, "mult( %d -> %d)", os.s.mult,ns.s.mult);
}
@@ -1304,7 +1329,7 @@
/* only if connected */
spin_lock_irq(&mdev->req_lock);
- if (mdev->state.s.pedi >= Inconsistent) /* implies cs >= Connected */ {
+ if (mdev->state.s.pdsk >= Inconsistent) /* implies cs >= Connected */ {
D_ASSERT(mdev->state.s.role == Primary);
if (test_and_clear_bit(UNPLUG_REMOTE,&mdev->flags)) {
/* add to the front of the data.work queue,
Modified: trunk/drbd/drbd_proc.c
===================================================================
--- trunk/drbd/drbd_proc.c 2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_proc.c 2004-11-05 12:58:36 UTC (rev 1629)
@@ -194,7 +194,7 @@
roles_to_name(drbd_conf[i].state.s.role),
roles_to_name(drbd_conf[i].state.s.peer),
disks_to_name(drbd_conf[i].state.s.disk),
- disks_to_name(drbd_conf[i].state.s.pedi),
+ disks_to_name(drbd_conf[i].state.s.pdsk),
drbd_conf[i].send_cnt/2,
drbd_conf[i].recv_cnt/2,
drbd_conf[i].writ_cnt/2,
Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c 2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_receiver.c 2004-11-05 12:58:36 UTC (rev 1629)
@@ -843,7 +843,7 @@
drbd_rs_complete_io(mdev,sector); // before set_in_sync() !
if (likely( drbd_bio_uptodate(&e->private_bio) )) {
ok = mdev->state.s.disk >= Inconsistent &&
- mdev->state.s.pedi >= Inconsistent;
+ mdev->state.s.pdsk >= Inconsistent;
if (likely( ok )) {
drbd_set_in_sync(mdev, sector, drbd_ee_get_size(e));
/* THINK maybe don't send ack either
@@ -1290,7 +1290,7 @@
{
Drbd_Parameter_Packet *p = (Drbd_Parameter_Packet*)h;
drbd_conns_t nconn;
- drbd_disks_t npedi;
+ drbd_disks_t npdsk;
drbd_state_t ns;
int consider_sync,rv;
sector_t p_size;
@@ -1390,12 +1390,12 @@
if(p_size ) {
- npedi = Inconsistent;
+ npdsk = Inconsistent;
if (be32_to_cpu(p->gen_cnt[Flags]) & MDF_Consistent) {
- npedi = Consistent;
+ npdsk = Consistent;
}
} else {
- npedi = Diskless;
+ npdsk = Diskless;
}
if (mdev->state.s.conn == WFReportParams) {
@@ -1412,11 +1412,12 @@
ns.i = mdev->state.i;
ns.s.conn = nconn;
ns.s.peer = be32_to_cpu(p->state);
- ns.s.pedi = npedi;
+ ns.s.pdsk = npdsk;
rv = _drbd_set_state(mdev,ns,0);
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;
@@ -1485,7 +1486,7 @@
* *doing* it here masks a logic bug elsewhere, I think.
*/
D_ASSERT(mdev->state.s.disk >= Inconsistent);
- D_ASSERT(mdev->state.s.pedi >= Inconsistent);
+ D_ASSERT(mdev->state.s.pdsk >= Inconsistent);
// EXPLAIN:
clear_bit(MD_IO_ALLOWED,&mdev->flags);
@@ -1909,7 +1910,7 @@
int blksize = be32_to_cpu(p->blksize);
smp_rmb();
- if(likely(mdev->state.s.pedi >= Inconsistent )) {
+ if(likely(mdev->state.s.pdsk >= Inconsistent )) {
// test_bit(PARTNER_DISKLESS,&mdev->flags)
// This happens if one a few IO requests on the peer
// failed, and some subsequest completed sucessfull
@@ -2005,7 +2006,7 @@
Drbd_BarrierAck_Packet *p = (Drbd_BarrierAck_Packet*)h;
smp_rmb();
- if(unlikely(mdev->state.s.pedi <= Diskless)) return TRUE;
+ if(unlikely(mdev->state.s.pdsk <= Diskless)) return TRUE;
tl_release(mdev,p->barrier,be32_to_cpu(p->set_size));
dec_ap_pending(mdev);
Modified: trunk/drbd/drbd_req.c
===================================================================
--- trunk/drbd/drbd_req.c 2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_req.c 2004-11-05 12:58:36 UTC (rev 1629)
@@ -255,7 +255,7 @@
dec_local(mdev);
}
}
- remote = !local && mdev->state.s.pedi >= Consistent;
+ remote = !local && mdev->state.s.pdsk >= Consistent;
} else {
remote = 1;
}
@@ -276,7 +276,7 @@
if (rw == WRITE && local)
drbd_al_begin_io(mdev, sector);
- remote = remote && (mdev->state.s.pedi >= Inconsistent);
+ remote = remote && (mdev->state.s.pdsk >= Inconsistent);
if (!(local || remote)) {
ERR("IO ERROR: neither local nor remote disk\n");
Modified: trunk/drbd/drbd_strings.c
===================================================================
--- trunk/drbd/drbd_strings.c 2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_strings.c 2004-11-05 12:58:36 UTC (rev 1629)
@@ -63,6 +63,7 @@
[2] = "Refusing to be Primary without consistent data",
[3] = "Refusing to make peer Primary without data",
[4] = "Refusing to be inconsistent on both nodes",
+ [5] = "Refusing to be syncing and diskless",
};
const char* conns_to_name(drbd_conns_t s) {
Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c 2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_worker.c 2004-11-05 12:58:36 UTC (rev 1629)
@@ -229,7 +229,7 @@
smp_rmb();
if ( cancel ||
mdev->state.s.conn < Connected ||
- mdev->state.s.pedi < Consistent ) {
+ mdev->state.s.pdsk < Consistent ) {
drbd_panic("WE ARE LOST. Local IO failure, no peer.\n");
// does not make much sense, but anyways...
@@ -402,7 +402,7 @@
drbd_request_state(mdev,NS3(conn,Connected,
disk,Consistent,
- pedi,Consistent));
+ pdsk,Consistent));
drbd_md_write(mdev);
@@ -465,7 +465,7 @@
drbd_rs_complete_io(mdev,drbd_ee_get_sector(e));
if(likely(drbd_bio_uptodate(&e->private_bio))) {
- if (likely( mdev->state.s.pedi >= Inconsistent )) {
+ if (likely( mdev->state.s.pdsk >= Inconsistent )) {
inc_rs_pending(mdev);
ok=drbd_send_block(mdev, RSDataReply, e);
} else {
@@ -710,7 +710,7 @@
disk,Inconsistent));
} else if (side == SyncSource) {
r = drbd_request_state(mdev,NS2(conn,SyncSource,
- pedi,Inconsistent));
+ pdsk,Inconsistent));
/* If we are SyncSource we must be consistent.
* FIXME this should be an assertion only,
* otherwise it masks a logic bug somewhere else...
Modified: trunk/drbd/linux/drbd.h
===================================================================
--- trunk/drbd/linux/drbd.h 2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/linux/drbd.h 2004-11-05 12:58:36 UTC (rev 1629)
@@ -216,7 +216,7 @@
unsigned peer : 2 ; // 3/3 primary/secondary/unknown
unsigned conn : 5 ; // 17/32 cstates
unsigned disk : 3 ; // 7/7 from DUnknown to UpToDate
- unsigned pedi : 3 ; // 7/7 from DUnknown to UpToDate
+ unsigned pdsk : 3 ; // 7/7 from DUnknown to UpToDate
unsigned mult : 1 ; // 2/2 multiple primaries allowed
unsigned _pad : 16; // 0 unused
} s;
More information about the drbd-cvs
mailing list