[DRBD-cvs] svn commit by phil - r2044 - in trunk: . drbd drbd/linux
user - * Removed a bug that was introduced with the big code m
drbd-cvs at lists.linbit.com
drbd-cvs at lists.linbit.com
Sat Jan 7 20:27:28 CET 2006
Author: phil
Date: 2006-01-07 20:27:25 +0100 (Sat, 07 Jan 2006)
New Revision: 2044
Modified:
trunk/ROADMAP
trunk/drbd/drbd_bitmap.c
trunk/drbd/drbd_fs.c
trunk/drbd/drbd_int.h
trunk/drbd/drbd_main.c
trunk/drbd/drbd_receiver.c
trunk/drbd/drbd_strings.c
trunk/drbd/drbd_worker.c
trunk/drbd/linux/drbd.h
trunk/user/Makefile
trunk/user/drbdadm_main.c
trunk/user/drbdsetup.c
Log:
* Removed a bug that was introduced with the big code merge in drbdadm
* Replaced the nummeric error codes of drbd_set_state() with symbolic ones.
* Removed an erronous check of drbd_set_state()
Modified: trunk/ROADMAP
===================================================================
--- trunk/ROADMAP 2005-12-29 21:58:57 UTC (rev 2043)
+++ trunk/ROADMAP 2006-01-07 19:27:25 UTC (rev 2044)
@@ -646,9 +646,7 @@
99% DONE
24 Make it possible to hot-add disk drives == Atomic configuration changes.
- Missing: Rewrite size determination code. It needs to fail in case
- there is already a primary node in the cluster, and the
- to attached device is smaller than the current size.
+ Missing: Think about and test detach/attach of the primary's disk.
80% DONE [ The net and disk config changes are atomic by now ]
Modified: trunk/drbd/drbd_bitmap.c
===================================================================
--- trunk/drbd/drbd_bitmap.c 2005-12-29 21:58:57 UTC (rev 2043)
+++ trunk/drbd/drbd_bitmap.c 2006-01-07 19:27:25 UTC (rev 2044)
@@ -596,7 +596,6 @@
*/
int drbd_bm_read_sect(drbd_dev *mdev,unsigned long enr)
{
-#warning check outcome of addition of sector_t/u64/s32
sector_t on_disk_sector = mdev->bc->md.md_offset + mdev->bc->md.bm_offset + enr;
int bm_words, num_words, offset, err = 0;
Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c 2005-12-29 21:58:57 UTC (rev 2043)
+++ trunk/drbd/drbd_fs.c 2006-01-07 19:27:25 UTC (rev 2044)
@@ -48,6 +48,46 @@
char *drbd_sec_holder = "Secondary DRBD cannot be bd_claimed ;)";
char *drbd_m_holder = "Hands off! this is DRBD's meta data device.";
+
+
+/* initializes the md.*_offset members, so we are able to find
+ * the on disk meta data */
+STATIC void drbd_md_set_sector_offsets(drbd_dev *mdev,
+ struct drbd_backing_dev *bdev)
+{
+ sector_t md_size_sect = 0;
+ switch(bdev->md_index) {
+ default:
+ case DRBD_MD_INDEX_FLEX_EXT:
+ /* just occupy the full device; unit: sectors */
+ bdev->md.md_size_sect = drbd_get_capacity(bdev->md_bdev);
+ bdev->md.md_offset = 0;
+ bdev->md.al_offset = MD_AL_OFFSET;
+ bdev->md.bm_offset = MD_BM_OFFSET;
+ break;
+ case DRBD_MD_INDEX_INTERNAL:
+ case DRBD_MD_INDEX_FLEX_INT:
+ bdev->md.md_offset = drbd_md_ss__(mdev,bdev);
+ /* al size is still fixed */
+ bdev->md.al_offset = -MD_AL_MAX_SIZE;
+ //LGE FIXME max size check missing.
+ /* we need (slightly less than) ~ this much bitmap sectors: */
+ md_size_sect = drbd_get_capacity(bdev->backing_bdev);
+ md_size_sect = ALIGN(md_size_sect,BM_SECT_PER_EXT);
+ md_size_sect = BM_SECT_TO_EXT(md_size_sect);
+ md_size_sect = ALIGN(md_size_sect,8);
+
+ /* plus the "drbd meta data super block",
+ * and the activity log; */
+ md_size_sect += MD_BM_OFFSET;
+
+ bdev->md.md_size_sect = md_size_sect;
+ /* bitmap offset is adjusted by 'super' block size */
+ bdev->md.bm_offset = -md_size_sect + MD_AL_OFFSET;
+ break;
+ }
+}
+
STATIC int do_determin_dev_size(struct Drbd_Conf* mdev);
int drbd_determin_dev_size(struct Drbd_Conf* mdev)
{
@@ -69,7 +109,7 @@
la_size_changed = (la_size != mdev->bc->md.la_size_sect);
-#warning flexible device size!! is this the right thing to test?
+ //LGE: flexible device size!! is this the right thing to test?
md_moved = prev_first_sect != drbd_md_first_sector(mdev->bc)
|| prev_size != mdev->bc->md.md_size_sect;
@@ -390,7 +430,7 @@
goto release_bdev2_fail_ioctl;
}
- if(drbd_request_state(mdev,NS(disk,Attaching)) <= 0 ) {
+ if(drbd_request_state(mdev,NS(disk,Attaching)) < SS_Success ) {
retcode = StateNotAllowed;
goto release_bdev2_fail_ioctl;
}
@@ -475,7 +515,7 @@
nds = Inconsistent;
}
- if(drbd_request_state(mdev,NS(disk,nds)) > 0) {
+ if(drbd_request_state(mdev,NS(disk,nds)) >= SS_Success ) {
drbd_thread_start(&mdev->worker);
}
}
@@ -680,7 +720,7 @@
mdev->cram_hmac_tfm = tfm;
drbd_thread_start(&mdev->worker);
- if( drbd_request_state(mdev,NS(conn,Unconnected)) > 0) {
+ if( drbd_request_state(mdev,NS(conn,Unconnected)) >= SS_Success ) {
drbd_thread_start(&mdev->receiver);
}
@@ -781,7 +821,7 @@
if(nps != disk_mask) rs.pdsk = nps;
r = _drbd_set_state(mdev, rs, 0);
- if ( r == -2 ) {
+ if ( r == SS_NoConsistnetDisk ) {
if ( newstate & DontBlameDrbd && mdev->state.disk<UpToDate) {
rs.disk = UpToDate;
forced = 1;
@@ -792,8 +832,8 @@
ns = mdev->state;
spin_unlock_irq(&mdev->req_lock);
- if ( r == 2 ) { rv = 0; goto fail; }
- if ( r == -7 && nps == disk_mask ) {
+ if ( r == SS_NothingToDo ) { rv = 0; goto fail; }
+ if ( r == SS_PrimaryNOP && nps == disk_mask ) {
nps = drbd_try_outdate_peer(mdev);
if ( newstate & DontBlameDrbd && nps > Outdated ) {
WARN("Forced into split brain situation!\n");
@@ -801,7 +841,7 @@
}
goto retry;
}
- if ( r <= 0 ) {
+ if ( r < SS_Success ) {
print_st_err(mdev,os,rs,r);
*arg = r;
rv = -EIO;
@@ -967,8 +1007,8 @@
ns = mdev->state;
spin_unlock_irq(&mdev->req_lock);
- if( r == 2 ) { return 0; }
- if( r <= 0 ) {
+ if( r == SS_NothingToDo ) { return 0; }
+ if( r < SS_Success ) {
return -ENETRESET;
}
@@ -1007,13 +1047,13 @@
ns = mdev->state;
spin_unlock_irq(&mdev->req_lock);
- if( r == 2 ) return 0;
+ if( r == SS_NothingToDo ) return 0;
if( r == -999 ) {
return -EINVAL;
}
after_state_ch(mdev,os,ns); // TODO decide if neccesarry.
- if( r <= 0 ) {
+ if( r < SS_Success ) {
err = put_user(r, reason);
if(!err) err=-EIO;
return err;
@@ -1062,8 +1102,8 @@
spin_unlock_irq(&mdev->req_lock);
after_state_ch(mdev,os,ns);
- if ( r == 2 ) return 0;
- if ( r == -7 ) {
+ if ( r == SS_NothingToDo ) return 0;
+ if ( r == SS_PrimaryNOP ) {
drbd_send_short_cmd(mdev, OutdateRequest);
wait_event(mdev->cstate_wait,
mdev->state.pdsk <= Outdated ||
@@ -1073,7 +1113,7 @@
r = drbd_request_state(mdev,NS(conn,StandAlone));
}
- if( r <= 0 ) return -ENODATA;
+ if( r < SS_Success ) return -ENODATA;
if ( mdev->cram_hmac_tfm ) {
crypto_free_tfm(mdev->cram_hmac_tfm);
@@ -1292,8 +1332,8 @@
r = drbd_request_state(mdev,NS2(disk,Inconsistent,
conn,WFBitMapT));
- if( r == 2 ) { break; }
- if( r <= 0 ) {
+ if( r == SS_NothingToDo ) { break; }
+ if( r < SS_Success ) {
err = -EINPROGRESS;
break;
}
@@ -1332,8 +1372,8 @@
r = drbd_request_state(mdev,NS2(pdsk,Inconsistent,
conn,WFBitMapS));
- if( r == 2 ) { break; }
- if( r <= 0 ) {
+ if( r == SS_NothingToDo ) { break; }
+ if( r < SS_Success ) {
err = -EINPROGRESS;
break;
}
Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h 2005-12-29 21:58:57 UTC (rev 2043)
+++ trunk/drbd/drbd_int.h 2006-01-07 19:27:25 UTC (rev 2044)
@@ -1310,44 +1310,7 @@
}
}
-/* initializes the md.*_offset members, so we are able to find
- * the on disk meta data */
-static inline void drbd_md_set_sector_offsets(drbd_dev *mdev,
- struct drbd_backing_dev *bdev)
-{
- sector_t md_size_sect = 0;
- bdev->md.md_offset = drbd_md_ss__(mdev,bdev);
- switch(bdev->md_index) {
- default:
- case DRBD_MD_INDEX_FLEX_EXT:
- /* just occupy the full device; unit: sectors */
- bdev->md.md_size_sect = drbd_get_capacity(bdev->md_bdev);
- bdev->md.md_offset = 0;
- bdev->md.al_offset = MD_AL_OFFSET;
- bdev->md.bm_offset = MD_BM_OFFSET;
- break;
- case DRBD_MD_INDEX_INTERNAL:
- case DRBD_MD_INDEX_FLEX_INT:
- /* al size is still fixed */
- bdev->md.al_offset = -MD_AL_MAX_SIZE;
-#warning FIXME max size check missing.
- /* we need (slightly less than) ~ this much bitmap sectors: */
- md_size_sect = drbd_get_capacity(bdev->backing_bdev);
- md_size_sect = ALIGN(md_size_sect,BM_SECT_PER_EXT);
- md_size_sect = BM_SECT_TO_EXT(md_size_sect);
- md_size_sect = ALIGN(md_size_sect,8);
- /* plus the "drbd meta data super block",
- * and the activity log; */
- md_size_sect += MD_BM_OFFSET;
-
- bdev->md.md_size_sect = md_size_sect;
- /* bitmap offset is adjusted by 'super' block size */
- bdev->md.bm_offset = -md_size_sect + MD_AL_OFFSET;
- break;
- }
-}
-
static inline void
_drbd_queue_work(struct drbd_work_queue *q, struct drbd_work *w)
{
Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c 2005-12-29 21:58:57 UTC (rev 2043)
+++ trunk/drbd/drbd_main.c 2006-01-07 19:27:25 UTC (rev 2044)
@@ -563,13 +563,14 @@
/* PRE TODO: Should return ernno numbers from the pre-state-change checks. */
int _drbd_set_state(drbd_dev* mdev, drbd_state_t ns,enum chg_state_flags flags)
{
- MUST_HOLD(&mdev->req_lock);
drbd_state_t os;
- int rv=1,warn_sync_abort=0;
+ int rv=SS_Success, warn_sync_abort=0;
+ MUST_HOLD(&mdev->req_lock);
+
os = mdev->state;
- if( ns.i == os.i ) return 2;
+ if( ns.i == os.i ) return SS_NothingToDo;
/* State sanitising */
if( ns.conn < Connected ) {
@@ -643,40 +644,39 @@
if(inc_net(mdev)) {
if( !mdev->net_conf->two_primaries &&
- ns.role == Primary && ns.peer == Primary ) rv=-1;
+ ns.role == Primary && ns.peer == Primary )
+ rv=SS_TowPrimaries;
dec_net(mdev);
}
if( rv <= 0 ) /* already found a reason to abort */;
else if( ns.role == Primary && ns.conn < Connected &&
- ns.disk <= Outdated ) rv=-2;
+ ns.disk <= Outdated ) rv=SS_NoConsistnetDisk;
else if( test_bit(SPLIT_BRAIN_FIX,&mdev->flags) &&
ns.role == Primary && ns.conn < Connected &&
- ns.pdsk >= DUnknown ) rv=-7;
+ ns.pdsk >= DUnknown ) rv=SS_PrimaryNOP;
else if( ns.role == Primary && ns.disk <= Inconsistent &&
- ns.pdsk <= Inconsistent ) rv=-2;
+ ns.pdsk <= Inconsistent ) rv=SS_NoConsistnetDisk;
- else if( ns.peer == Primary && ns.pdsk <= Inconsistent )
- rv=-3;
-
else if( ns.conn > Connected &&
- ns.disk < UpToDate && ns.pdsk < UpToDate ) rv=-4;
+ ns.disk < UpToDate && ns.pdsk < UpToDate )
+ rv=SS_BothInconsistent;
else if( ns.conn > Connected &&
(ns.disk == Diskless || ns.pdsk == Diskless ) )
- rv=-5;
+ rv=SS_SyncingDiskless;
else if( (ns.conn == Connected ||
ns.conn == SkippedSyncS ||
ns.conn == WFBitMapS ||
ns.conn == SyncSource ||
ns.conn == PausedSyncS) &&
- ns.disk == Outdated ) rv=-6;
+ ns.disk == Outdated ) rv=SS_ConnectedOutdates;
}
- if(rv <= 0) {
+ if(rv < SS_Success) {
if( flags & ChgStateVerbose ) print_st_err(mdev,os,ns,rv);
return rv;
}
@@ -2148,6 +2148,10 @@
printk(KERN_ERR "DRBD_MAX_SECTORS_FLEX = %llu\n",DRBD_MAX_SECTORS_FLEX);
return -EBUSY;
#endif
+#ifdef __arch_um__
+ printk(KERN_INFO "drbd_module = 0x%p core = 0x%p\n",
+ THIS_MODULE,THIS_MODULE->module_core);
+#endif
if (sizeof(Drbd_HandShake_Packet) != 80) {
printk(KERN_ERR DEVICE_NAME
@@ -2383,6 +2387,9 @@
sector_t sector;
int i;
+ if(!mdev->bc) return; // because of drbd_check_al_size(mdev) in
+ // drbd_ioctl_set_disk() should be removed....
+
ERR_IF(!inc_md_only(mdev,Attaching)) return;
down(&mdev->md_io_mutex);
Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c 2005-12-29 21:58:57 UTC (rev 2043)
+++ trunk/drbd/drbd_receiver.c 2006-01-07 19:27:25 UTC (rev 2044)
@@ -635,7 +635,7 @@
D_ASSERT(mdev->state.conn > StandAlone);
D_ASSERT(!mdev->data.socket);
- if(drbd_request_state(mdev,NS(conn,WFConnection)) <= 0 ) return 0;
+ if(drbd_request_state(mdev,NS(conn,WFConnection)) < SS_Success ) return 0;
clear_bit(UNIQUE, &mdev->flags);
while(1) {
@@ -705,7 +705,7 @@
mdev->meta.socket = msock;
mdev->last_received = jiffies;
- if(drbd_request_state(mdev,NS(conn,WFReportParams)) <= 0) return 0;
+ if(drbd_request_state(mdev,NS(conn,WFReportParams)) < SS_Success) return 0;
D_ASSERT(mdev->asender.task == NULL);
h = drbd_do_handshake(mdev);
@@ -1875,7 +1875,7 @@
if(nconn == conn_mask) return FALSE;
- if(drbd_request_state(mdev,NS(conn,nconn)) <= 0) {
+ if(drbd_request_state(mdev,NS(conn,nconn)) < SS_Success) {
drbd_force_state(mdev,NS(conn,StandAlone));
drbd_thread_stop_nowait(&mdev->receiver);
return FALSE;
@@ -1970,7 +1970,7 @@
spin_unlock_irq(&mdev->req_lock);
after_state_ch(mdev,os,ns);
- if(rv <= 0) {
+ if(rv < SS_Success) {
drbd_force_state(mdev,NS(conn,StandAlone));
drbd_thread_stop_nowait(&mdev->receiver);
return FALSE;
@@ -2044,7 +2044,7 @@
ok = drbd_send_bitmap(mdev);
if (!ok) goto out;
ok = drbd_request_state(mdev,NS(conn,WFSyncUUID));
- D_ASSERT( ok == 1 );
+ D_ASSERT( ok == SS_Success );
} else {
ERR("unexpected cstate (%s) in receive_bitmap\n",
conns_to_name(mdev->state.conn));
@@ -2130,9 +2130,9 @@
drbd_bm_set_all(mdev);
drbd_bm_write(mdev);
ok = drbd_request_state(mdev,NS(conn,WFSyncUUID));
- D_ASSERT( ok == 1 );
+ D_ASSERT( ok == SS_Success );
drbd_bm_unlock(mdev);
- return ok == 1 ? TRUE : FALSE;
+ return ok == SS_Success ? TRUE : FALSE;
}
STATIC int receive_BecomeSyncSource(drbd_dev *mdev, Drbd_Header *h)
@@ -2198,7 +2198,7 @@
r = drbd_request_state(mdev,NS2(pdsk,Outdated,conn,TearDown));
WARN("r=%d\n",r);
- D_ASSERT(r >= 0);
+ D_ASSERT(r >= SS_Success);
drbd_md_write(mdev); // because drbd_request_state created a new UUID.
return TRUE;
Modified: trunk/drbd/drbd_strings.c
===================================================================
--- trunk/drbd/drbd_strings.c 2005-12-29 21:58:57 UTC (rev 2043)
+++ trunk/drbd/drbd_strings.c 2006-01-07 19:27:25 UTC (rev 2044)
@@ -61,13 +61,14 @@
};
static const char *drbd_state_sw_errors[] = {
- [1] = "Multiple primaries now allowed by config",
- [2] = "Refusing to be Primary without at least one consistent disk",
- [3] = "Refusing to make peer Primary without disk",
- [4] = "Refusing to be inconsistent on both nodes",
- [5] = "Refusing to be syncing and diskless",
- [6] = "Refusing to be Outdated while Connected",
- [7] = "Refusing to be Primary while peer is not outdated",
+ [-SS_TowPrimaries] = "Multiple primaries now allowed by config",
+ [-SS_NoConsistnetDisk] =
+ "Refusing to be Primary without at least one consistent disk",
+ [-SS_REMOVE_ME] = "Refusing to make peer Primary without disk",
+ [-SS_BothInconsistent] = "Refusing to be inconsistent on both nodes",
+ [-SS_SyncingDiskless] = "Refusing to be syncing and diskless",
+ [-SS_ConnectedOutdates] = "Refusing to be Outdated while Connected",
+ [-SS_PrimaryNOP] = "Refusing to be Primary while peer is not outdated",
};
const char* conns_to_name(drbd_conns_t s) {
@@ -86,8 +87,8 @@
: drbd_disk_s_names[s];
}
-const char* set_st_err_name(int err) {
- return err < -7 ? "TOO_SMALL" :
- err > -1 ? "TOO_LARGE"
+const char* set_st_err_name(set_st_err_t err) {
+ return err < SS_PrimaryNOP ? "TOO_SMALL" :
+ err > SS_TowPrimaries ? "TOO_LARGE"
: drbd_state_sw_errors[-err];
}
Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c 2005-12-29 21:58:57 UTC (rev 2043)
+++ trunk/drbd/drbd_worker.c 2006-01-07 19:27:25 UTC (rev 2044)
@@ -596,7 +596,7 @@
mod_timer(&mdev->resync_timer,jiffies);
}
}
- return r != 2;
+ return r != SS_NothingToDo;
}
/**
@@ -639,7 +639,7 @@
INFO("Resync suspended by %s.\n",reason_txt[reason]);
}
- return r != 2;
+ return r != SS_NothingToDo;
}
STATIC int _drbd_may_sync_now(drbd_dev *mdev)
@@ -794,7 +794,7 @@
r = _drbd_set_state(mdev,ns,ChgStateVerbose);
- if ( r==1 ) {
+ if ( r == SS_Success ) {
mdev->rs_total =
mdev->rs_mark_left = drbd_bm_total_weight(mdev);
mdev->rs_paused = 0;
@@ -804,7 +804,7 @@
}
drbd_global_unlock();
- if ( r==1 ) {
+ if ( r == SS_Success ) {
after_state_ch(mdev,os,ns);
INFO("Began resync as %s (will sync %lu KB [%lu bits set]).\n",
Modified: trunk/drbd/linux/drbd.h
===================================================================
--- trunk/drbd/linux/drbd.h 2005-12-29 21:58:57 UTC (rev 2043)
+++ trunk/drbd/linux/drbd.h 2006-01-07 19:27:25 UTC (rev 2044)
@@ -254,11 +254,24 @@
unsigned int i;
} drbd_state_t;
+typedef enum {
+ SS_NothingToDo=2,
+ SS_Success=1,
+ SS_UnknownError=0,
+ SS_TowPrimaries=-1,
+ SS_NoConsistnetDisk=-2,
+ SS_REMOVE_ME=-3,
+ SS_BothInconsistent=-4,
+ SS_SyncingDiskless=-5,
+ SS_ConnectedOutdates=-6,
+ SS_PrimaryNOP=-7
+} set_st_err_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);
+extern const char* set_st_err_name(set_st_err_t);
#ifndef BDEVNAME_SIZE
# define BDEVNAME_SIZE 32
Modified: trunk/user/Makefile
===================================================================
--- trunk/user/Makefile 2005-12-29 21:58:57 UTC (rev 2043)
+++ trunk/user/Makefile 2006-01-07 19:27:25 UTC (rev 2044)
@@ -17,7 +17,7 @@
# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
#
-CFLAGS = -g -O2 -c -W -Wall -I../drbd -Werror
+CFLAGS = -g -O2 -c -W -Wall -I../drbd
CC = gcc
drbdadm-obj = drbdadm_scanner.o drbdadm_parser.o drbdadm_main.o \
Modified: trunk/user/drbdadm_main.c
===================================================================
--- trunk/user/drbdadm_main.c 2005-12-29 21:58:57 UTC (rev 2043)
+++ trunk/user/drbdadm_main.c 2006-01-07 19:27:25 UTC (rev 2044)
@@ -458,11 +458,6 @@
{
char **path;
- if (drbdsetup) {
- free(drbdsetup);
- drbdsetup = NULL;
- }
-
path=pathes;
while(*path) {
if(access(*path,X_OK)==0) {
@@ -1301,6 +1296,7 @@
struct d_resource *res,*tmp;
char *env_drbd_nodename = NULL;
+ drbdsetup=NULL;
drbdmeta=NULL;
dry_run=0;
yyin=NULL;
Modified: trunk/user/drbdsetup.c
===================================================================
--- trunk/user/drbdsetup.c 2005-12-29 21:58:57 UTC (rev 2043)
+++ trunk/user/drbdsetup.c 2006-01-07 19:27:25 UTC (rev 2044)
@@ -1047,7 +1047,7 @@
if(err==EIO)
{
fprintf(stderr,"%s\n",set_st_err_name(reason));
- if(reason == -2) return 17;
+ if(reason == SS_NoConsistnetDisk) return 17;
}
return 20;
}
More information about the drbd-cvs
mailing list