patch-2.4.0-prerelease linux/drivers/block/ll_rw_blk.c

Next file: linux/drivers/block/loop.c
Previous file: linux/drivers/block/acsi.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test12/linux/drivers/block/ll_rw_blk.c linux/drivers/block/ll_rw_blk.c
@@ -885,6 +885,8 @@
 {
 	int major = MAJOR(bh->b_rdev);
 	request_queue_t *q;
+
+	if (!bh->b_end_io) BUG();
 	if (blk_size[major]) {
 		unsigned long maxsector = (blk_size[major][MINOR(bh->b_rdev)] << 1) + 1;
 		unsigned int sector, count;
@@ -962,6 +964,15 @@
 	bh->b_rsector = bh->b_blocknr * (bh->b_size>>9);
 
 	generic_make_request(rw, bh);
+
+	switch (rw) {
+		case WRITE:
+			kstat.pgpgout++;
+			break;
+		default:
+			kstat.pgpgin++;
+			break;
+	}
 }
 
 /*
@@ -1006,7 +1017,6 @@
 
 void ll_rw_block(int rw, int nr, struct buffer_head * bhs[])
 {
-	struct buffer_head *bh;
 	unsigned int major;
 	int correct_size;
 	int i;
@@ -1023,6 +1033,7 @@
 
 	/* Verify requested block sizes. */
 	for (i = 0; i < nr; i++) {
+		struct buffer_head *bh;
 		bh = bhs[i];
 		if (bh->b_size != correct_size) {
 			printk(KERN_NOTICE "ll_rw_block: device %s: "
@@ -1040,6 +1051,7 @@
 	}
 
 	for (i = 0; i < nr; i++) {
+		struct buffer_head *bh;
 		bh = bhs[i];
 
 		/* Only one thread can actually submit the I/O. */
@@ -1055,7 +1067,6 @@
 				/* Hmmph! Nothing to write */
 				goto end_io;
 			__mark_buffer_clean(bh);
-			kstat.pgpgout++;
 			break;
 
 		case READA:
@@ -1063,7 +1074,6 @@
 			if (buffer_uptodate(bh))
 				/* Hmmph! Already have it */
 				goto end_io;
-			kstat.pgpgin++;
 			break;
 		default:
 			BUG();
@@ -1077,8 +1087,9 @@
 	return;
 
 sorry:
+	/* Make sure we don't get infinite dirty retries.. */
 	for (i = 0; i < nr; i++)
-		buffer_IO_error(bhs[i]);
+		mark_buffer_clean(bhs[i]);
 }
 
 #ifdef CONFIG_STRAM_SWAP

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)