[DRBD-cvs] r1480 - in trunk: . debian drbd
drbd-user@lists.linbit.com
drbd-user@lists.linbit.com
Sat, 31 Jul 2004 16:06:52 +0200 (CEST)
Author: lars
Date: 2004-07-31 16:06:51 +0200 (Sat, 31 Jul 2004)
New Revision: 1480
Modified:
trunk/ChangeLog
trunk/debian/changelog
trunk/drbd.spec.in
trunk/drbd/Makefile
trunk/drbd/drbd_bitmap.c
trunk/drbd/drbd_compat_wrappers.h
trunk/drbd/drbd_int.h
trunk/drbd/drbd_proc.c
trunk/drbd/drbd_receiver.c
trunk/drbd/drbd_req.c
trunk/drbd/drbd_worker.c
Log:
- io_errors on READA are always passed on
- fixed the resync status overflow in drbd_resync_finished,
added missig changelog item for it
- account for sync paused state in syncer statistics
- added dependencies for drbd_buildtag.c in drbd/Makefile
- copy'n'paste error in printk error reporting
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/ChangeLog 2004-07-31 14:06:51 UTC (rev 1480)
@@ -4,6 +4,7 @@
*) Workaround for XFS' IO requests with page count of zero.
*) Handle the human and the timeout count correctly in the new init script.
*) The implementation of the incon-degr-cmd was missing, added.
+ *) Fix for integer overflow in /proc/drbd syncer progress display
*) Longer timeouts in drbdadm for drbdsetup commands witch operate on
meta data.
*) New major number 147 (officially registered at lanana.org).
Modified: trunk/debian/changelog
===================================================================
--- trunk/debian/changelog 2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/debian/changelog 2004-07-31 14:06:51 UTC (rev 1480)
@@ -4,6 +4,7 @@
* Workaround for XFS' IO requests with page count of zero.
* Handle the human and the timeout count correctly in the new init script.
* The implementation of the incon-degr-cmd was missing, added.
+ * Fix for integer overflow in /proc/drbd syncer progress display
* Longer timeouts in drbdadm for drbdsetup commands witch operate on
meta data.
* New major number 147 (officially registered at lanana.org).
Modified: trunk/drbd/Makefile
===================================================================
--- trunk/drbd/Makefile 2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/Makefile 2004-07-31 14:06:51 UTC (rev 1480)
@@ -66,6 +66,12 @@
KDIR := /lib/modules/$(shell uname -r)/build
endif
+ SRC_FILES := $(shell ls 2>/dev/null\
+ linux/drbd_config.h linux/drbd.h drbd_actlog.c drbd_bitmap.c drbd_fs.c \
+ drbd_main.c drbd_proc.c drbd_receiver.c drbd_req.c drbd_worker.c \
+ lru_cache.c drbd_compat_types.h drbd_compat_wrappers.h drbd_int.h \
+ lru_cache.h hlist.h mempool-2.4.c mempool.h)
+
.PHONY: drbd.o default all greeting clean kbuild install dep
drbd.o: greeting kbuild
@@ -81,9 +87,14 @@
endif
@echo ""
- drbd_buildtag.c:
- @echo "you probably need to do a 'make' in DRBDs toplevel directory.";\
- false
+ drbd_buildtag.c: $(SRC_FILES)
+ @if grep ^drbd/drbd_buildtag.c: ../Makefile &>/dev/null; then \
+ $(MAKE) -C .. drbd/drbd_buildtag.c ;\
+ else \
+ echo "drbd_buildtag.c outdated." ;\
+ echo "you probably need to do a 'make' in DRBDs toplevel directory.";\
+ false ;\
+ fi
kbuild: drbd_buildtag.c
@rm -f .kernelrelease*
Modified: trunk/drbd/drbd_bitmap.c
===================================================================
--- trunk/drbd/drbd_bitmap.c 2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/drbd_bitmap.c 2004-07-31 14:06:51 UTC (rev 1480)
@@ -621,7 +621,7 @@
if (!drbd_md_sync_page_io(mdev,on_disk_sector,WRITE)) {
int i;
err = -EIO;
- ERR( "IO ERROR reading bitmap sector %lu "
+ ERR( "IO ERROR writing bitmap sector %lu "
"(meta-disk sector %lu)\n",
enr, (unsigned long)on_disk_sector );
drbd_chk_io_error(mdev, 1);
Modified: trunk/drbd/drbd_compat_wrappers.h
===================================================================
--- trunk/drbd/drbd_compat_wrappers.h 2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/drbd_compat_wrappers.h 2004-07-31 14:06:51 UTC (rev 1480)
@@ -263,7 +263,7 @@
static inline void drbd_generic_make_request(int rw, struct buffer_head *bh)
{
drbd_dev *mdev = drbd_conf -1 ;
-
+
if (!bh->b_rdev) {
if (DRBD_ratelimit(5*HZ,5)) {
printk(KERN_ERR "drbd_generic_make_request: bh->b_rdev == NULL\n");
@@ -571,7 +571,7 @@
static inline void drbd_generic_make_request(int rw, struct bio *bio)
{
drbd_dev *mdev = drbd_conf -1; // for DRBD_ratelimit
- bio->bi_rw = rw; //??
+ bio->bi_rw = rw; // on the receiver side, e->..rw was not yet defined.
if (!bio->bi_bdev) {
if (DRBD_ratelimit(5*HZ,5)) {
Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h 2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/drbd_int.h 2004-07-31 14:06:51 UTC (rev 1480)
@@ -928,6 +928,9 @@
#define BM_BIT_TO_SECT(x) ((x)<<(BM_BLOCK_SIZE_B-9))
#define BM_SECT_PER_BIT BM_BIT_TO_SECT(1)
+/* bit to represented kilo byte conversion */
+#define Bit2KB(bits) ((bits)<<(BM_BLOCK_SIZE_B-10))
+
/* in which _bitmap_ extent (resp. sector) the bit for a certain
* _storage_ sector is located in */
#define BM_SECT_TO_EXT(x) ((x)>>(BM_EXT_SIZE_B-9))
Modified: trunk/drbd/drbd_proc.c
===================================================================
--- trunk/drbd/drbd_proc.c 2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/drbd_proc.c 2004-07-31 14:06:51 UTC (rev 1480)
@@ -48,7 +48,6 @@
* [=====>..............] 33.5% (23456/123456)
* finish: 2:20:20 speed: 6,345 (6,456) K/sec
*/
-#define Bit2KB(bits) ((bits)<<(BM_BLOCK_SIZE_B-10))
STATIC int drbd_syncer_progress(struct Drbd_Conf* mdev,char *buf)
{
int sz = 0;
@@ -121,10 +120,9 @@
sz += sprintf(buf + sz, " speed: %ld", dbdt);
/* mean speed since syncer started
- * FIXME introduce some additional "paused jiffies",
- * so we can account for PausedSync periods */
- dt = (jiffies - mdev->rs_start) / HZ;
- if (!dt) dt++;
+ * we do account for PausedSync periods */
+ dt = (jiffies - mdev->rs_start - mdev->rs_paused) / HZ;
+ if (dt <= 0) dt=1;
db = mdev->rs_total - rs_left;
dbdt = Bit2KB(db/dt);
if (dbdt > 1000)
@@ -176,6 +174,8 @@
: state_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,
int len, int *unused, void *data)
{
Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c 2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/drbd_receiver.c 2004-07-31 14:06:51 UTC (rev 1480)
@@ -1638,7 +1638,8 @@
* otherwise this does not make much sense, no?
* and some other assertion maybe about cstate...
*/
- ERR_IF(mdev->cstate != Secondary) return FALSE;
+ ERR_IF(mdev->state != Secondary || mdev->cstate != Connected)
+ return FALSE;
drbd_bm_lock(mdev);
drbd_bm_set_all(mdev);
Modified: trunk/drbd/drbd_req.c
===================================================================
--- trunk/drbd/drbd_req.c 2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/drbd_req.c 2004-07-31 14:06:51 UTC (rev 1480)
@@ -235,7 +235,7 @@
mdev->cstate > WFBitMapT) );
local = inc_local(mdev);
- // FIXME special case handling of READA ??
+ NOT_IN_26( if (rw == READA) rw=READ );
if (rw == READ || rw == READA) {
if (local) {
if (!drbd_may_do_local_read(mdev,sector,size)) {
@@ -268,6 +268,19 @@
remote = 1;
}
+ /* If we have a disk, but a READA request is mapped to remote,
+ * we are Primary, Inconsistent, SyncTarget.
+ * Just fail that READA request right here.
+ *
+ * THINK: maybe fail all READA when not local?
+ * or make this configurable...
+ * if network is slow, READA won't do any good.
+ */
+ if (rw == READA && !test_bit(DISKLESS,&mdev->flags) && !local) {
+ drbd_bio_IO_error(bio);
+ return 0;
+ }
+
if (rw == WRITE && local)
drbd_al_begin_io(mdev, sector);
@@ -332,6 +345,8 @@
*/
if(rw == WRITE) mdev->writ_cnt += size>>9;
else mdev->read_cnt += size>>9;
+
+ // in 2.4.X, READA are submitted as READ.
drbd_generic_make_request(rw,&req->private_bio);
}
Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c 2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/drbd_worker.c 2004-07-31 14:06:51 UTC (rev 1480)
@@ -160,6 +160,7 @@
req = container_of(bh,struct drbd_request,private_bio);
PARANOIA_BUG_ON(!VALID_POINTER(req));
+ // no special case for READA here, in 2.4.X we submit them as READ.
if (!uptodate) {
// for the panic:
drbd_chk_io_error(mdev,!uptodate); // handle panic and detach.
@@ -302,23 +303,14 @@
ERR_IF (bio->bi_size)
return 1;
-#if 0
- {
- static int ccc=1;
-
- if(ccc++ % 100 == 0) {
- ERR("Injecting IO error.\n");
- error=-5;
- clear_bit(BIO_UPTODATE,&bio->bi_flags);
- }
- }
-#endif
-
PARANOIA_BUG_ON(!IS_VALID_MDEV(mdev));
req = container_of(bio,struct drbd_request,private_bio);
PARANOIA_BUG_ON(!VALID_POINTER(req));
+ /* READAs may fail.
+ * upper layers need to be able to handle that themselves */
+ if (bio_rw(bio) == READA) goto pass_on;
if (error) {
drbd_chk_io_error(mdev,error); // handle panic and detach.
if(mdev->on_io_error == PassOn) goto pass_on;
@@ -529,14 +521,15 @@
int drbd_resync_finished(drbd_dev* mdev)
{
- unsigned long dt;
- sector_t n;
+ unsigned long db,dt,dbdt;
- dt = (jiffies - mdev->rs_start) / HZ + 1;
- n = mdev->rs_total << (BM_BLOCK_SIZE_B-10);
- sector_div(n,dt);
- INFO("Resync done (total %lu sec; %lu K/sec)\n",
- dt,(unsigned long)n);
+ dt = (jiffies - mdev->rs_start - mdev->rs_paused) / HZ;
+ if (dt <= 0) dt=1;
+ db = mdev->rs_total;
+ dbdt = Bit2KB(db/dt);
+ mdev->rs_paused /= HZ;
+ INFO("Resync done (total %lu sec; paused %lu sec; %lu K/sec)\n",
+ dt + mdev->rs_paused, mdev->rs_paused, dbdt);
if (mdev->cstate == SyncTarget || mdev->cstate == PausedSyncT) {
drbd_md_set_flag(mdev,MDF_Consistent);
@@ -553,7 +546,8 @@
// assert that all bit-map parts are cleared.
D_ASSERT(list_empty(&mdev->resync->lru));
D_ASSERT(drbd_bm_total_weight(mdev) == 0);
- mdev->rs_total = 0;
+ mdev->rs_total = 0;
+ mdev->rs_paused = 0;
set_cstate(mdev,Connected);
/* FIXME
@@ -690,6 +684,7 @@
D_ASSERT(ns == SyncSource || ns == SyncTarget);
INFO("Syncer continues.\n");
+ mdev->rs_paused += (long)jiffies-(long)mdev->rs_mark_time;
_set_cstate(mdev,ns);
if(mdev->cstate == SyncTarget) {
@@ -718,6 +713,8 @@
if(mdev->cstate == SyncTarget) set_bit(STOP_SYNC_TIMER,&mdev->flags);
+ mdev->rs_mark_time = jiffies;
+ // mdev->rs_mark_left = drbd_bm_total_weight(mdev); // I don't care...
_set_cstate(mdev,ns);
INFO("Syncer waits for sync group.\n");
}
@@ -867,6 +864,7 @@
set_cstate(mdev,side);
mdev->rs_total =
mdev->rs_mark_left = drbd_bm_total_weight(mdev);
+ mdev->rs_paused = 0;
mdev->rs_start =
mdev->rs_mark_time = jiffies;
Modified: trunk/drbd.spec.in
===================================================================
--- trunk/drbd.spec.in 2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd.spec.in 2004-07-31 14:06:51 UTC (rev 1480)
@@ -183,6 +183,7 @@
* Workaround for XFS' IO requests with page count of zero.
* Handle the human and the timeout count correctly in the new init script.
* The implementation of the incon-degr-cmd was missing, added.
+ * Fix for integer overflow in /proc/drbd syncer progress display
* Longer timeouts in drbdadm for drbdsetup commands witch operate on
meta data.
* New major number 147 (officially registered at lanana.org).