[DRBD-cvs] r1628 - in trunk: drbd drbd/linux testing
svn at svn.drbd.org
svn at svn.drbd.org
Fri Nov 5 12:47:52 CET 2004
Author: phil
Date: 2004-11-05 12:47:50 +0100 (Fri, 05 Nov 2004)
New Revision: 1628
Modified:
trunk/drbd/drbd_bitmap.c
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_strings.c
trunk/drbd/drbd_worker.c
trunk/drbd/linux/drbd.h
trunk/testing/ioctl_structs_sizes.c
Log:
Work on the new _drbd_set_state() mechanism:
* Now it is possible to attach a drbd device to a disk again.
* Improved the error reporting, in the future kernel and user-
land tools will print the same error messages...
Modified: trunk/drbd/drbd_bitmap.c
===================================================================
--- trunk/drbd/drbd_bitmap.c 2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_bitmap.c 2004-11-05 11:47:50 UTC (rev 1628)
@@ -744,7 +744,7 @@
!(test_bit(DISKLESS,&mdev->flags) ||
test_bit(PARTNER_DISKLESS,&mdev->flags)) );
if (strange_state)
- ERR("%s in drbd_bm_set_bit\n", cstate_to_name(mdev->cstate));
+ ERR("%s in drbd_bm_set_bit\n", conns_to_name(mdev->cstate));
*/
spin_lock_irq(&b->bm_lock);
@@ -787,7 +787,7 @@
* strange_state blubber is already in place there ...
if (i && mdev->cstate <= Connected)
ERR("drbd_bm_clear_bit: cleared a bitnr=%lu while %s\n",
- bitnr, cstate_to_name(mdev->cstate));
+ bitnr, conns_to_name(mdev->cstate));
*/
return i;
Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c 2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_fs.c 2004-11-05 11:47:50 UTC (rev 1628)
@@ -434,10 +434,12 @@
drbd_set_blocksize(mdev,INITIAL_BLOCK_SIZE);
- if (drbd_request_state(mdev,NS(disk,
- drbd_md_test_flag(mdev,MDF_Consistent) ?
- Consistent : Inconsistent ))) {
+ if((i=drbd_request_state(mdev,NS(disk,
+ drbd_md_test_flag(mdev,MDF_Consistent)
+ ? Consistent : Inconsistent ))) > 0) {
drbd_thread_start(&mdev->worker);
+ } else {
+ ERR("%s\n",set_st_err_name(i));
}
// FIXME EXPLAIN:
@@ -564,8 +566,11 @@
mdev->recv_cnt = 0;
drbd_thread_start(&mdev->worker);
- drbd_request_state(mdev,NS(conn,Unconnected));
- drbd_thread_start(&mdev->receiver);
+ if( (i=drbd_request_state(mdev,NS(conn,Unconnected))) <= 0) {
+ ERR("%s\n",set_st_err_name(i));
+ } else {
+ drbd_thread_start(&mdev->receiver);
+ }
return 0;
@@ -600,7 +605,7 @@
r = drbd_request_state(mdev,NS(role,newstate & 0x3));
if ( r == 2 ) { return 0; }
- if ( r == 0 ) {
+ if ( r <= 0 ) {
/* request state does not like the new state. */
if (! (newstate & DontBlameDrbd)) {
return -EIO;
@@ -611,7 +616,10 @@
WARN("Forcefully set consistent!");
r = drbd_request_state(mdev,NS2(role,newstate & 0x3,
disk,Consistent));
- if(r==0) return -EIO;
+ if(r<=0) {
+ ERR("%s\n",set_st_err_name(r));
+ return -EIO;
+ }
}
}
@@ -756,7 +764,10 @@
spin_unlock_irq(&mdev->req_lock);
if( r == 2 ) { return 0; }
- if( r == 0 ) { return -ENETRESET; }
+ if( r <= 0 ) {
+ ERR("%s\n",set_st_err_name(r));
+ return -ENETRESET;
+ }
drbd_sync_me(mdev);
@@ -898,7 +909,8 @@
r = drbd_request_state(mdev,NS(conn,StandAlone));
if( r == 2 ) { break; }
- if( r == 0 ) {
+ if( r <= 0 ) {
+ ERR("%s\n",set_st_err_name(r));
err=-ENODATA;
break;
}
@@ -996,7 +1008,8 @@
conn,WFBitMapT));
if( r == 2 ) { break; }
- if( r == 0 ) {
+ if( r <= 0 ) {
+ ERR("%s\n",set_st_err_name(r));
err = -EINPROGRESS;
break;
}
@@ -1035,7 +1048,8 @@
conn,WFBitMapS));
if( r == 2 ) { break; }
- if( r == 0 ) {
+ if( r <= 0 ) {
+ ERR("%s\n",set_st_err_name(r));
err = -EINPROGRESS;
break;
}
Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h 2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_int.h 2004-11-05 11:47:50 UTC (rev 1628)
@@ -980,8 +980,8 @@
// drbd_proc.c
extern struct proc_dir_entry *drbd_proc;
extern int drbd_proc_get_info(char *, char **, off_t, int, int *, void *);
-extern const char* cstate_to_name(drbd_conns_t s);
-extern const char* nodestate_to_name(drbd_role_t s);
+extern const char* conns_to_name(drbd_conns_t s);
+extern const char* roles_to_name(drbd_role_t s);
// drbd_actlog.c
extern void drbd_al_begin_io(struct Drbd_Conf *mdev, sector_t sector);
Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c 2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_main.c 2004-11-05 11:47:50 UTC (rev 1628)
@@ -374,14 +374,14 @@
return ok;
}
-#define drbd_peer_s_names drbd_role_s_names
-#define drbd_pedi_s_names drbd_disk_s_names
+#define peers_to_name roles_to_name
+#define pedis_to_name disks_to_name
#define PSC(A) \
({ if( ns.s.A != os.s.A ) { \
pbp += sprintf(pbp, #A "( %s -> %s ) ", \
- drbd_##A##_s_names[os.s.A], \
- drbd_##A##_s_names[ns.s.A]); \
+ A##s_to_name(os.s.A), \
+ A##s_to_name(ns.s.A)); \
} })
@@ -397,34 +397,19 @@
if( !hard ) {
/* 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 ) {
- WARN("Multiple primaries now allowed by config.");
- return 0;
- }
+ ns.s.role == Primary && ns.s.peer == Primary ) return -1;
if( ns.s.role == Primary && ns.s.disk <= Inconsistent &&
- ns.s.conn < Connected ) {
- WARN("Refusing to be Primary without consistent data");
- return 0;
- }
+ ns.s.conn < Connected ) return -2;
if( ns.s.peer == Primary && ns.s.pedi <= Inconsistent &&
- ns.s.conn < Connected ) {
- WARN("Refusing to make peer Primary without data");
- return 0;
- }
+ ns.s.conn < Connected ) return -3;
- if( ns.s.disk < Consistent && ns.s.pedi < Consistent ) {
- WARN("Refusing to be inconsistent on both nodes.");
- return 0;
- }
-
if( ns.s.conn > Connected &&
- (ns.s.disk == Diskless || ns.s.pedi == Diskless ) ) {
- WARN("Refusing to do resync without two disks.");
- return 0;
- }
+ (ns.s.disk < Consistent || ns.s.pedi < Consistent ) )
+ return -4;
}
/* State sanitising */
Modified: trunk/drbd/drbd_proc.c
===================================================================
--- trunk/drbd/drbd_proc.c 2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_proc.c 2004-11-05 11:47:50 UTC (rev 1628)
@@ -146,24 +146,6 @@
return sz;
}
-const char* cstate_to_name(drbd_conns_t s) {
- return s < Unconfigured ? "TO_SMALL" :
- s > PausedSyncT ? "TO_LARGE"
- : drbd_conn_s_names[s];
-}
-
-const char* nodestate_to_name(drbd_role_t s) {
- return s < Unknown ? "TO_SMALL" :
- s > Secondary ? "TO_LARGE"
- : drbd_role_s_names[s];
-}
-
-const char* diskstate_to_name(drbd_disks_t s) {
- return s < DUnknown ? "TO_SMALL" :
- s > UpToDate ? "TO_LARGE"
- : drbd_disk_s_names[s];
-}
-
/* FIXME we should use snprintf, we only have guaranteed room for one page...
* we should eventually use seq_file for this */
int drbd_proc_get_info(char *buf, char **start, off_t offset,
@@ -189,7 +171,7 @@
*/
for (i = 0; i < minor_count; i++) {
- sn = cstate_to_name(drbd_conf[i].state.s.conn);
+ sn = conns_to_name(drbd_conf[i].state.s.conn);
/* PRE FIXME
if(drbd_conf[i].cstate == Connected) {
@@ -209,10 +191,10 @@
" ns:%u nr:%u dw:%u dr:%u al:%u bm:%u "
"lo:%d pe:%d ua:%d ap:%d\n",
i, sn,
- nodestate_to_name(drbd_conf[i].state.s.role),
- nodestate_to_name(drbd_conf[i].state.s.peer),
- diskstate_to_name(drbd_conf[i].state.s.disk),
- diskstate_to_name(drbd_conf[i].state.s.pedi),
+ 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),
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-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_receiver.c 2004-11-05 11:47:50 UTC (rev 1628)
@@ -625,7 +625,7 @@
D_ASSERT(mdev->state.s.conn > Unconfigured);
D_ASSERT(!mdev->data.socket);
- if(!drbd_request_state(mdev,NS(conn,WFConnection))) return 0;
+ if(drbd_request_state(mdev,NS(conn,WFConnection)) <= 0 ) return 0;
while(1) {
sock=drbd_try_connect(mdev);
@@ -691,7 +691,7 @@
mdev->meta.socket = msock;
mdev->last_received = jiffies;
- if(!drbd_request_state(mdev,NS(conn,WFReportParams))) return 0;
+ if(drbd_request_state(mdev,NS(conn,WFReportParams)) <= 0) return 0;
D_ASSERT(mdev->asender.task == NULL);
if (!drbd_do_handshake(mdev)) {
@@ -1416,7 +1416,7 @@
rv = _drbd_set_state(mdev,ns,0);
spin_unlock_irq(&mdev->req_lock);
- if(!rv) {
+ if(rv <= 0) {
drbd_force_state(mdev,NS(conn,StandAlone));
drbd_thread_stop_nowait(&mdev->receiver);
return FALSE;
@@ -1472,7 +1472,7 @@
drbd_start_resync(mdev,SyncTarget); // XXX cannot fail ???
} else {
ERR("unexpected cstate (%s) in receive_bitmap\n",
- cstate_to_name(mdev->state.s.conn));
+ conns_to_name(mdev->state.s.conn));
}
// We just started resync. Now we can be sure that local disk IO is okay.
Modified: trunk/drbd/drbd_strings.c
===================================================================
--- trunk/drbd/drbd_strings.c 2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_strings.c 2004-11-05 11:47:50 UTC (rev 1628)
@@ -22,7 +22,7 @@
#include <linux/drbd.h>
-const char *drbd_conn_s_names[] = {
+static const char *drbd_conn_s_names[] = {
[Unconfigured] = "Unconfigured",
[StandAlone] = "StandAlone",
[Unconnected] = "Unconnected",
@@ -42,13 +42,13 @@
[PausedSyncT] = "PausedSyncT",
};
-const char *drbd_role_s_names[] = {
+static const char *drbd_role_s_names[] = {
[Primary] = "Primary",
[Secondary] = "Secondary",
[Unknown] = "Unknown"
};
-const char *drbd_disk_s_names[] = {
+static const char *drbd_disk_s_names[] = {
[DUnknown] = "DUnknown",
[Diskless] = "Diskless",
[Failed] = "Failed",
@@ -57,3 +57,34 @@
[Consistent] = "Consistent",
[UpToDate] = "UpToDate",
};
+
+static const char *drbd_state_sw_errors[] = {
+ [1] = "Multiple primaries now allowed by config",
+ [2] = "Refusing to be Primary without consistent data",
+ [3] = "Refusing to make peer Primary without data",
+ [4] = "Refusing to be inconsistent on both nodes",
+};
+
+const char* conns_to_name(drbd_conns_t s) {
+ return s < Unconfigured ? "TO_SMALL" :
+ s > PausedSyncT ? "TO_LARGE"
+ : drbd_conn_s_names[s];
+}
+
+const char* roles_to_name(drbd_role_t s) {
+ return s < Unknown ? "TO_SMALL" :
+ s > Secondary ? "TO_LARGE"
+ : drbd_role_s_names[s];
+}
+
+const char* disks_to_name(drbd_disks_t s) {
+ return s < DUnknown ? "TO_SMALL" :
+ s > UpToDate ? "TO_LARGE"
+ : drbd_disk_s_names[s];
+}
+
+const char* set_st_err_name(int err) {
+ return err < -4 ? "TO_SMALL" :
+ err > -1 ? "TO_LARGE"
+ : drbd_state_sw_errors[-err];
+}
Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c 2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/drbd_worker.c 2004-11-05 11:47:50 UTC (rev 1628)
@@ -318,7 +318,7 @@
}
if (mdev->state.s.conn != SyncTarget) {
- ERR("%s in w_make_resync_request\n", cstate_to_name(mdev->state.s.conn));
+ ERR("%s in w_make_resync_request\n", conns_to_name(mdev->state.s.conn));
}
number = SLEEP_TIME*mdev->sync_conf.rate / ((BM_BLOCK_SIZE/1024)*HZ);
@@ -722,8 +722,9 @@
}
if(r != 1) {
+ ERR("%s\n",set_st_err_name(r));
ERR("Error in drbd_start_resync! (side == %s)\n",
- cstate_to_name(side));
+ conns_to_name(side));
return;
}
@@ -736,7 +737,7 @@
mdev->rs_mark_time = jiffies;
INFO("Resync started as %s (need to sync %lu KB [%lu bits set]).\n",
- cstate_to_name(side),
+ conns_to_name(side),
(unsigned long) mdev->rs_total << (BM_BLOCK_SIZE_B-10),
(unsigned long) mdev->rs_total);
Modified: trunk/drbd/linux/drbd.h
===================================================================
--- trunk/drbd/linux/drbd.h 2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/drbd/linux/drbd.h 2004-11-05 11:47:50 UTC (rev 1628)
@@ -52,11 +52,6 @@
divisible by 8.
*/
-/* defined in drbd_strings.c */
-extern const char *drbd_conn_s_names[];
-extern const char *drbd_role_s_names[];
-extern const char *drbd_disk_s_names[];
-
#define MAX_SOCK_ADDR 128 /* 108 for Unix domain -
16 for IP, 16 for IPX,
24 for IPv6,
@@ -228,6 +223,12 @@
unsigned int i;
} drbd_state_t;
+/* from drbd_strings.c */
+extern const char* conns_to_name(drbd_conns_t);
+extern const char* roles_to_name(drbd_role_t);
+extern const char* disks_to_name(drbd_disks_t);
+extern const char* set_st_err_name(int);
+
#ifndef BDEVNAME_SIZE
# define BDEVNAME_SIZE 32
#endif
Modified: trunk/testing/ioctl_structs_sizes.c
===================================================================
--- trunk/testing/ioctl_structs_sizes.c 2004-11-03 22:49:44 UTC (rev 1627)
+++ trunk/testing/ioctl_structs_sizes.c 2004-11-05 11:47:50 UTC (rev 1628)
@@ -5,7 +5,7 @@
({ int _i = sizeof(x); printf("sizeof(" #x ") = %d\n", _i); \
if( _i % 8 ) printf(" WARN sizeof(" #x ") %% 8 != 0\n"); _i; })
-#define DRBD_07_SUM 1184
+#define DRBD_08_SUM 1176
int main()
{
@@ -20,9 +20,9 @@
sum += SZO(struct ioctl_wait);
sum += SZO(struct ioctl_get_config);
- printf("sum = %d DRBD_07_SUM = %d\n",sum,DRBD_07_SUM);
+ printf("sum = %d DRBD_08_SUM = %d\n",sum,DRBD_08_SUM);
- printf(sum == DRBD_07_SUM ? "OKAY\n" : "FAILED\n" );
+ printf(sum == DRBD_08_SUM ? "OKAY\n" : "FAILED\n" );
- return sum != DRBD_07_SUM; /* if not equal, exit code is non-zero */
+ return sum != DRBD_08_SUM; /* if not equal, exit code is non-zero */
}
More information about the drbd-cvs
mailing list