[DRBD-cvs] r1721 - in trunk: . drbd scripts user
svn at svn.drbd.org
svn at svn.drbd.org
Fri Jan 14 21:02:27 CET 2005
Author: phil
Date: 2005-01-14 21:02:24 +0100 (Fri, 14 Jan 2005)
New Revision: 1721
Modified:
trunk/
trunk/Makefile
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/scripts/drbd
trunk/user/drbdsetup.c
Log:
svnp run. Investigated 1686 to 1721
r1696 by phil on 2005-01-10 20:50:51 +0100 (Mon, 10 Jan 2005)
Changed paths:
M /branches/drbd-0.7/drbd/drbd_int.h
M /branches/drbd-0.7/drbd/drbd_main.c
M /branches/drbd-0.7/drbd/drbd_receiver.c
M /branches/drbd-0.7/testing/write_gc.pl
* On this brand new dual Xeon system the counting of
epoch_size is broken. Probabely this revision of Xeons
is doing memory access reordering more agressive than
previous versions. Converting epoch size form
int to atomic_t solved the issue.
* When reading from an IBM-ServRaid controller (ips),
we need to call run_disk_queue() from time to time
to get sane performance of it.
* On this RHAT3 box the write_gc.pl program failed
to correctly write DRBD's magic number.
(probabely a bug in the perl version included
with RHAT3.)
r1697 by phil on 2005-01-12 15:34:57 +0100 (Wed, 12 Jan 2005)
Changed paths:
M /branches/drbd-0.7/drbd/drbd_bitmap.c
M /branches/drbd-0.7/drbd/drbd_fs.c
M /branches/drbd-0.7/drbd/drbd_receiver.c
M /branches/drbd-0.7/user/drbdsetup.c
Fixed online resizing
- Allow it on connected devices, as long as one node is primary.
This is necessary to have the right resync after growing.
- Fixed bitmap resizing. Before bm_set was completely wrong when
shrinking the device. bm_set was slightly wrong when growing
the device.
r1698 by phil on 2005-01-12 15:39:35 +0100 (Wed, 12 Jan 2005)
Changed paths:
M /branches/drbd-0.7/drbd/drbd_fs.c
Make it compile...
r1699 by phil on 2005-01-12 16:39:36 +0100 (Wed, 12 Jan 2005)
Changed paths:
M /branches/drbd-0.7/drbd/drbd_bitmap.c
This seems to be the last missing piece of working
online resizing ...
r1710 by phil on 2005-01-13 15:31:17 +0100 (Thu, 13 Jan 2005)
Changed paths:
M /branches/drbd-0.7/scripts/drbd
Abort the init script in case one of the setup commands fails
r1715 by philipp on 2005-01-14 11:22:53 +0100 (Fri, 14 Jan 2005)
Changed paths:
M /branches/drbd-0.7/Makefile
introduce makeflag PRESERVE_DEBIAN=1 to include debian directory in
.filelist (make .filelist PRESERVE_DEBIAN=1 ; make tgz)
Property changes on: trunk
___________________________________________________________________
Name: propagate:at
- 1686
+ 1721
Modified: trunk/Makefile
===================================================================
--- trunk/Makefile 2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/Makefile 2005-01-14 20:02:24 UTC (rev 1721)
@@ -120,7 +120,7 @@
.PHONY: .filelist
.filelist:
@ svn info >/dev/null || { echo "you need a svn checkout to do this." ; false ; }
- @find $$(svn st -v | sed '/^?/d;s/^.\{8\} \+[0-9]\+ \+[0-9]\+ [a-z]\+ *//;/^debian/d' ) \
+ @find $$(svn st -v | sed '/^?/d;s/^.\{8\} \+[0-9]\+ \+[0-9]\+ [a-z]\+ *//;$(if $(PRESERVE_DEBIAN),,/^debian/d)' ) \
\! -type d -maxdepth 0 |\
sed 's:^:drbd-$(DIST_VERSION)/:' > .filelist
@[ -s .filelist ] # assert there is something in .filelist now
Modified: trunk/drbd/drbd_bitmap.c
===================================================================
--- trunk/drbd/drbd_bitmap.c 2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/drbd/drbd_bitmap.c 2005-01-14 20:02:24 UTC (rev 1721)
@@ -274,6 +274,33 @@
return cleared;
}
+STATIC void bm_set_surplus(struct drbd_bitmap * b)
+{
+ const unsigned long mask = (1UL << (b->bm_bits & (BITS_PER_LONG-1))) -1;
+ size_t w = b->bm_bits >> LN2_BPL;
+
+ if ( w < b->bm_words ) {
+ b->bm[w++] |= ~mask;
+ }
+
+ if ( w < b->bm_words ) {
+ b->bm[w++] = ~(0UL);
+ }
+}
+
+STATIC unsigned long bm_count_bits(struct drbd_bitmap * b)
+{
+ unsigned long *bm = b->bm;
+ unsigned long *ep = b->bm + b->bm_words;
+ unsigned long bits = 0;
+
+ while ( bm < ep ) {
+ bits += hweight_long(*bm++);
+ }
+
+ return bits;
+}
+
#define BM_SECTORS_PER_BIT (BM_BLOCK_SIZE/512)
/*
@@ -288,7 +315,7 @@
{
struct drbd_bitmap *b = mdev->bitmap;
unsigned long bits, bytes, words, *nbm, *obm = 0;
- int err = 0;
+ int err = 0, growing;
D_BUG_ON(!b);
MUST_BE_LOCKED();
@@ -349,19 +376,23 @@
obm = b->bm;
// brgs. move several MB within spinlock...
if (obm) {
+ bm_set_surplus(b);
D_ASSERT(b->bm[b->bm_words] == DRBD_MAGIC);
memcpy(nbm,obm,min_t(size_t,b->bm_words,words)*sizeof(long));
}
- if (b->bm_words < words) { // set all newly allocated bits
- memset(nbm,-1,(words - b->bm_words)*sizeof(long));
+ growing = words > b->bm_words;
+ if (growing) { // set all newly allocated bits
+ memset( nbm+b->bm_words, -1,
+ (words - b->bm_words) * sizeof(long) );
+ b->bm_set += bits - b->bm_bits;
}
nbm[words] = DRBD_MAGIC;
b->bm = nbm;
- b->bm_set += bits - b->bm_bits;
b->bm_bits = bits;
b->bm_words = words;
b->bm_dev_capacity = capacity;
bm_clear_surplus(b);
+ if( !growing ) b->bm_set = bm_count_bits(b);
bm_end_info(mdev, __FUNCTION__ );
spin_unlock_irq(&b->bm_lock);
INFO("resync bitmap: bits=%lu words=%lu\n",bits,words);
Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c 2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/drbd/drbd_fs.c 2005-01-14 20:02:24 UTC (rev 1721)
@@ -1001,13 +1001,17 @@
err = -EBUSY;
break;
}
+ if ( mdev->state == Secondary && mdev->o_state == Secondary) {
+ err = -EINPROGRESS;
+ break;
+ }
err=0;
mdev->lo_usize = (unsigned long)arg;
drbd_bm_lock(mdev);
drbd_determin_dev_size(mdev);
drbd_md_write(mdev); // Write mdev->la_size to disk.
drbd_bm_unlock(mdev);
- if (mdev->state.s.conn == Connected) drbd_send_param(mdev,0);
+ if (mdev->state.s.conn == Connected) drbd_send_param(mdev,1);
break;
case DRBD_IOCTL_SET_NET_CONFIG:
Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h 2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/drbd/drbd_int.h 2005-01-14 20:02:24 UTC (rev 1721)
@@ -725,7 +725,7 @@
atomic_t resync_locked; // Number of locked elements in resync LRU
int open_cnt;
u32 gen_cnt[GEN_CNT_SIZE];
- int epoch_size;
+ atomic_t epoch_size;
spinlock_t ee_lock;
struct list_head free_ee; // available
struct list_head active_ee; // IO in progress
Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c 2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/drbd/drbd_main.c 2005-01-14 20:02:24 UTC (rev 1721)
@@ -1562,9 +1562,9 @@
if ( mdev->ee_in_use != 0
|| mdev->ee_vacant != 32 /* EE_MININUM */
- || mdev->epoch_size != 0)
+ || atomic_read(&mdev->epoch_size) != 0)
ERR("ee_in_use:%d ee_vacant:%d epoch_size:%d\n",
- mdev->ee_in_use, mdev->ee_vacant, mdev->epoch_size);
+ mdev->ee_in_use, mdev->ee_vacant, atomic_read(&mdev->epoch_size));
#define ZAP(x) memset(&x,0,sizeof(x))
ZAP(mdev->conf);
ZAP(mdev->sync_conf);
Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c 2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/drbd/drbd_receiver.c 2005-01-14 20:02:24 UTC (rev 1721)
@@ -761,8 +761,8 @@
spin_lock_irq(&mdev->ee_lock);
rv = _drbd_process_ee(mdev,1);
- epoch_size=mdev->epoch_size;
- mdev->epoch_size=0;
+ epoch_size=atomic_read(&mdev->epoch_size);
+ atomic_set(&mdev->epoch_size,0);
spin_unlock_irq(&mdev->ee_lock);
rv &= drbd_send_b_ack(mdev, p->barrier, epoch_size);
@@ -973,7 +973,7 @@
sector_t sector = drbd_ee_get_sector(e);
int ok=1;
- mdev->epoch_size++;
+ atomic_inc(&mdev->epoch_size);
if(mdev->conf.wire_protocol == DRBD_PROT_C) {
if(likely(drbd_bio_uptodate(&e->private_bio))) {
ok=drbd_send_ack(mdev,WriteAck,e);
@@ -1144,7 +1144,11 @@
mdev->read_cnt += size >> 9;
inc_unacked(mdev);
drbd_generic_make_request(READ,&e->private_bio);
+ if (atomic_read(&mdev->local_cnt) >= (mdev->conf.max_epoch_size>>4) ) {
+ drbd_kick_lo(mdev);
+ }
+
return TRUE;
}
@@ -1364,6 +1368,12 @@
set_bit(MD_DIRTY,&mdev->flags); // we are changing state!
+ if( mdev->lo_usize != be64_to_cpu(p->u_size) ) {
+ mdev->lo_usize = be64_to_cpu(p->u_size);
+ INFO("Peer sets u_size to %lu KB\n",
+ (unsigned long)mdev->lo_usize);
+ }
+
/*lge:
* FIXME
* please get the order of tests (re)settings for consider_sync
@@ -1393,12 +1403,6 @@
mdev->sync_conf.group =
min_t(int,mdev->sync_conf.group,be32_to_cpu(p->sync_group));
- if( mdev->lo_usize != be64_to_cpu(p->u_size) ) {
- mdev->lo_usize = be64_to_cpu(p->u_size);
- INFO("Peer sets u_size to %lu KB\n",
- (unsigned long)mdev->lo_usize);
- }
-
if (mdev->state.s.conn == WFReportParams) {
INFO("Connection established.\n");
}
@@ -1709,7 +1713,7 @@
D_ASSERT(list_empty(&mdev->sync_ee)); // done here
D_ASSERT(list_empty(&mdev->done_ee)); // done here
- mdev->epoch_size=0;
+ atomic_set(&mdev->epoch_size,0);
mdev->rs_total=0;
if(atomic_read(&mdev->unacked_cnt)) {
Modified: trunk/scripts/drbd
===================================================================
--- trunk/scripts/drbd 2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/scripts/drbd 2005-01-14 20:02:24 UTC (rev 1721)
@@ -71,7 +71,9 @@
else echo echo -n ".. ";
fi
IFS=$IFS_O
- $CMD
+ $CMD || {
+ echo -e "\ncmd $CMD failed!"; exit 20
+ }
IFS=$NEWLINE
done
echo -n "]"
Modified: trunk/user/drbdsetup.c
===================================================================
--- trunk/user/drbdsetup.c 2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/user/drbdsetup.c 2005-01-14 20:02:24 UTC (rev 1721)
@@ -1098,11 +1098,16 @@
}
}
- fprintf(stderr,"err=ioctl(drbd_fd,DRBD_IOCTL_SET_DISK_SIZE,%lu);\n",u_size);
err=ioctl(drbd_fd,DRBD_IOCTL_SET_DISK_SIZE,u_size);
if(err)
{
PERROR("ioctl(,SET_DISK_SIZE,) failed");
+ if(err==EBUSY) {
+ fprintf(stderr,"Online resizing is not allowed during resync.");
+ }
+ if(err==EINPROGRESS) {
+ fprintf(stderr,"One node must be primary to do online resizing.");
+ }
return 20;
}
More information about the drbd-cvs
mailing list