PATCH - discard buffer_IO_error

From: Neil Brown (neilb@cse.unsw.edu.au)
Date: Fri Nov 16 2001 - 22:55:20 EST


Linus,
 all current calls to "buffer_IO_error" are in violation of proper
 layering.
 buffer_io_error calls "mark_buffer_clean" which relates to b_list and
 the buffercache. However all calls to it are below "submit_bh" and
 so could involve a buffer that is not part of the buffer cache at
 all. (e.g. could be a md/raid intermediate buffer, or a bounce_io
 buffer, or probably others).

 This patch replaces all calls to buffer_IO_error with calls to
 bh->b_end_io(bh,0) and removes buffer_IO_error.

 Given this, there is no need for md to set b_list for intermediate
 buffers, so that code is now gone.

 There is still the setting of b_list to "-1" in
    highmem.c:create_bounce
 which can probably be fixed, but it's not my code and it doesn't
 really need changing so I didn't.

NeilBrown

--- ./include/linux/fs.h 2001/11/16 03:44:33 1.1
+++ ./include/linux/fs.h 2001/11/16 03:56:09 1.2
@@ -1160,21 +1160,6 @@
                 clear_bit(BH_Async, &bh->b_state);
 }
 
-/*
- * If an error happens during the make_request, this function
- * has to be recalled. It marks the buffer as clean and not
- * uptodate, and it notifys the upper layer about the end
- * of the I/O.
- */
-static inline void buffer_IO_error(struct buffer_head * bh)
-{
- mark_buffer_clean(bh);
- /*
- * b_end_io has to clear the BH_Uptodate bitflag in the error case!
- */
- bh->b_end_io(bh, 0);
-}
-
 extern void buffer_insert_inode_queue(struct buffer_head *, struct inode *);
 static inline void mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode)
 {
--- ./drivers/block/ll_rw_blk.c 2001/11/16 03:44:33 1.1
+++ ./drivers/block/ll_rw_blk.c 2001/11/16 03:56:09 1.2
@@ -867,7 +867,7 @@
                                "generic_make_request: Trying to access "
                                "nonexistent block-device %s (%ld)\n",
                                kdevname(bh->b_rdev), bh->b_rsector);
- buffer_IO_error(bh);
+ bh->b_end_io(bh, 0);
                         break;
                 }
         } while (q->make_request_fn(q, rw, bh));
--- ./drivers/block/loop.c 2001/11/16 03:44:33 1.1
+++ ./drivers/block/loop.c 2001/11/16 03:56:09 1.2
@@ -515,7 +515,7 @@
                 up(&lo->lo_bh_mutex);
         loop_put_buffer(bh);
 out:
- buffer_IO_error(rbh);
+ rbh->b_end_io(rbh,0);
         return 0;
 inactive:
         spin_unlock_irq(&lo->lo_lock);
--- ./drivers/md/md.c 2001/11/16 03:44:33 1.1
+++ ./drivers/md/md.c 2001/11/16 03:56:09 1.2
@@ -179,7 +179,7 @@
         if (mddev && mddev->pers)
                 return mddev->pers->make_request(mddev, rw, bh);
         else {
- buffer_IO_error(bh);
+ bh->b_end_io(bh, 0);
                 return 0;
         }
 }
--- ./drivers/md/raid5.c 2001/11/16 03:44:33 1.1
+++ ./drivers/md/raid5.c 2001/11/16 03:56:09 1.2
@@ -473,7 +473,6 @@
 
         bh->b_state = (1 << BH_Req) | (1 << BH_Mapped);
         bh->b_size = sh->size;
- bh->b_list = BUF_LOCKED;
         return bh;
 }
 
--- ./drivers/md/lvm.c 2001/11/16 03:44:33 1.1
+++ ./drivers/md/lvm.c 2001/11/16 03:56:09 1.2
@@ -1253,7 +1253,7 @@
         return 1;
 
  bad:
- buffer_IO_error(bh);
+ bh->b_end_io(bh, 0);
         up_read(&lv->lv_lock);
         return -1;
 } /* lvm_map() */
--- ./drivers/md/raid1.c 2001/11/16 03:44:33 1.1
+++ ./drivers/md/raid1.c 2001/11/16 03:56:09 1.2
@@ -665,7 +665,6 @@
                  mbh->b_size = bh->b_size;
                  mbh->b_page = bh->b_page;
                  mbh->b_data = bh->b_data;
- mbh->b_list = BUF_LOCKED;
                  mbh->b_end_io = raid1_end_request;
                  mbh->b_private = r1_bh;
 
@@ -1188,7 +1187,6 @@
                                         mbh->b_size = bh->b_size;
                                         mbh->b_page = bh->b_page;
                                         mbh->b_data = bh->b_data;
- mbh->b_list = BUF_LOCKED;
                                         mbh->b_end_io = end_sync_write;
                                         mbh->b_private = r1_bh;
 
@@ -1409,7 +1407,6 @@
                 bsize <<= 1;
         }
         bh->b_size = bsize;
- bh->b_list = BUF_LOCKED;
         bh->b_dev = mirror->dev;
         bh->b_rdev = mirror->dev;
         bh->b_state = (1<<BH_Req) | (1<<BH_Mapped) | (1<<BH_Lock);
--- ./drivers/md/linear.c 2001/11/16 03:51:49 1.1
+++ ./drivers/md/linear.c 2001/11/16 03:56:09 1.2
@@ -134,7 +134,7 @@
                 if (!hash->dev1) {
                         printk ("linear_make_request : hash->dev1==NULL for block %ld\n",
                                                 block);
- buffer_IO_error(bh);
+ bh->b_end_io(bh, 0);
                         return 0;
                 }
                 tmp_dev = hash->dev1;
@@ -144,7 +144,7 @@
         if (block >= (tmp_dev->size + tmp_dev->offset)
                                 || block < tmp_dev->offset) {
                 printk ("linear_make_request: Block %ld out of bounds on dev %s size %ld offset %ld\n", block, kdevname(tmp_dev->dev), tmp_dev->size, tmp_dev->offset);
- buffer_IO_error(bh);
+ bh->b_end_io(bh, 0);
                 return 0;
         }
         bh->b_rdev = tmp_dev->dev;
--- ./drivers/md/raid0.c 2001/11/16 03:52:16 1.1
+++ ./drivers/md/raid0.c 2001/11/16 03:56:09 1.2
@@ -285,7 +285,7 @@
 bad_zone1:
         printk ("raid0_make_request bug: hash->zone1==NULL for block %ld\n", block);
  outerr:
- buffer_IO_error(bh);
+ bh->b_end_io(bh, 0);
         return 0;
 }
                            
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Fri Nov 23 2001 - 21:00:15 EST