[DRBD-cvs] drbd by phil; [untested] code to handle IO errors on t...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Tue, 27 Apr 2004 16:23:23 +0200 (CEST)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_actlog.c drbd_fs.c drbd_int.h 


Log Message:
[untested] code to handle IO errors on the meta-data device.

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_actlog.c,v
retrieving revision 1.1.2.91
retrieving revision 1.1.2.92
diff -u -3 -r1.1.2.91 -r1.1.2.92
--- drbd_actlog.c	26 Apr 2004 16:13:46 -0000	1.1.2.91
+++ drbd_actlog.c	27 Apr 2004 14:23:18 -0000	1.1.2.92
@@ -41,15 +41,13 @@
 	struct buffer_head bh;
 	struct completion event;
 
-	/* just to play safe: fill it with zeroes. if you want to, you
-	 * could define it away based on "PARANOIA" or something. */
+#ifdef PARANOIA
 	if (rw != WRITE) {
-		/* most often this is already mapped, so don't worry
-		 * about performance loss */
 		void *b = kmap(mdev->md_io_page);
 		memset(b,0,PAGE_SIZE);
 		kunmap(mdev->md_io_page);
 	}
+#endif
 	init_completion(&event);
 	init_buffer(&bh, drbd_md_io_complete, &event);
 	bh.b_rdev = mdev->md_bdev;
@@ -73,15 +71,13 @@
 	struct bio_vec vec;
 	struct completion event;
 
-	/* just to play safe: fill it with zeroes. if you want to, you
-	 * could define it away based on "PARANOIA" or something. */
+#ifdef PARANOIA
 	if (rw != WRITE) {
-		/* most often this is already mapped, so don't worry
-		 * about performance loss */
 		void *b = kmap(mdev->md_io_page);
 		memset(b,0,PAGE_SIZE);
 		kunmap(mdev->md_io_page);
 	}
+#endif
 	bio_init(&bio);
 	bio.bi_io_vec = &vec;
 	vec.bv_page = mdev->md_io_page;
@@ -224,11 +220,6 @@
 	spin_unlock_irqrestore(&mdev->al_lock,flags);
 }
 
-/*
-
-FIXME md_io might fail unnoticed!
-
-*/
 STATIC void
 drbd_al_write_transaction(struct Drbd_Conf *mdev,struct lc_element *updated,
 			  unsigned int new_enr)
@@ -279,8 +270,10 @@
 
 	sector = drbd_md_ss(mdev) + MD_AL_OFFSET + mdev->al_tr_pos ;
 
-	/* FIXME what if this fails ?? */
-	drbd_md_sync_page_io(mdev,sector,WRITE);
+	if(!drbd_md_sync_page_io(mdev,sector,WRITE)) {
+		drbd_chk_io_error(mdev, 1);
+		drbd_io_error(mdev);
+	}
 
 	if( ++mdev->al_tr_pos > div_ceil(mdev->act_log->nr_elements,AL_EXTENTS_PT) ) {
 		mdev->al_tr_pos=0;
@@ -290,11 +283,6 @@
 	up(&mdev->md_io_mutex);
 }
 
-/*
-
-FIXME md_io might fail unnoticed!
-
-*/
 STATIC int drbd_al_read_tr(struct Drbd_Conf *mdev,
 			   struct al_transaction* b,
 			   int index)
@@ -305,8 +293,11 @@
 
 	sector = drbd_md_ss(mdev) + MD_AL_OFFSET + index;
 
-	/* FIXME what if this fails ?? */
-	drbd_md_sync_page_io(mdev,sector,READ);
+	if(!drbd_md_sync_page_io(mdev,sector,READ)) {
+		drbd_chk_io_error(mdev, 1);
+		drbd_io_error(mdev);
+		return 0;
+	}
 
 	rv = ( be32_to_cpu(b->magic) == DRBD_MAGIC );
 
@@ -520,9 +511,6 @@
 
 /**
  * drbd_read_bm: Read the whole bitmap from its on disk location.
-
-FIXME md_io might fail unnoticed!
-
  */
 void drbd_read_bm(struct Drbd_Conf *mdev)
 {
@@ -546,8 +534,12 @@
 		sector = drbd_md_ss(mdev) + MD_BM_OFFSET + so;
 		so++;
 
-		/* FIXME what if this fails ?? */
-		drbd_md_sync_page_io(mdev,sector,READ);
+		if(!drbd_md_sync_page_io(mdev,sector,READ)) {
+			drbd_chk_io_error(mdev, 1);
+			drbd_io_error(mdev);
+			break;
+			//return 0; // FIXME error propagation...
+		}
 
 		for(buf_i=0;buf_i<want;buf_i++) {
 			word = lel_to_cpu(buffer[buf_i]);
@@ -574,9 +566,6 @@
  *       ATTENTION: Based on AL_EXTENT_SIZE, although the chunk
  *                  we write might represent more storage. 
  *                  ( actually AL_EXTENT_SIZE*EXTENTS_PER_SECTOR )
-
-FIXME md_io might fail unnoticed!
-
  */
 STATIC void drbd_update_on_disk_bm(struct Drbd_Conf *mdev,unsigned int enr)
 {
@@ -610,8 +599,10 @@
 
 	sector = drbd_md_ss(mdev) + MD_BM_OFFSET + enr/EXTENTS_PER_SECTOR;
 
-	/* FIXME what if this fails ?? */
-	drbd_md_sync_page_io(mdev,sector,WRITE);
+	if(!drbd_md_sync_page_io(mdev,sector,WRITE)) {
+		drbd_chk_io_error(mdev, 1);
+		drbd_io_error(mdev);
+	}
 	up(&mdev->md_io_mutex);
 
 	mdev->bm_writ_cnt++;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.80
retrieving revision 1.28.2.81
diff -u -3 -r1.28.2.80 -r1.28.2.81
--- drbd_fs.c	24 Apr 2004 16:35:21 -0000	1.28.2.80
+++ drbd_fs.c	27 Apr 2004 14:23:18 -0000	1.28.2.81
@@ -338,9 +338,6 @@
 		bm_fill_bm(mdev->mbds_id,-1);
 		mdev->rs_total = drbd_get_capacity(mdev->this_bdev);
 		drbd_write_bm(mdev);
-
-/* FIXME whipeout on disk activity log area */
-
 	}
 
 	if ( !mdev->act_log ||
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.147
retrieving revision 1.58.2.148
diff -u -3 -r1.58.2.147 -r1.58.2.148
--- drbd_int.h	27 Apr 2004 13:49:23 -0000	1.58.2.147
+++ drbd_int.h	27 Apr 2004 14:23:18 -0000	1.58.2.148
@@ -543,7 +543,6 @@
 // bitfield? enum?
 /* flag bits */
 #define ISSUE_BARRIER      0
-// #define ISSUE_IO_HINT      1		is now drbd_queue_work'ed
 #define SEND_PING          2
 #define WRITER_PRESENT     3
 #define STOP_SYNC_TIMER    4