diff -urN 2.2.18pre19aa1/fs/buffer.c z/fs/buffer.c --- 2.2.18pre19aa1/fs/buffer.c Sat Nov 4 05:50:05 2000 +++ z/fs/buffer.c Sat Nov 4 06:03:26 2000 @@ -482,7 +482,12 @@ static void put_last_free(struct buffer_head * bh) { if (bh) { - struct buffer_head **bhp = &free_list[BUFSIZE_INDEX(bh->b_size)]; + struct buffer_head **bhp; + + if (bh->b_rm_fn) + bh->b_rm_fn(bh); + + bhp = &free_list[BUFSIZE_INDEX(bh->b_size)]; bh->b_count = 0; bh->b_state = 0; @@ -736,6 +741,8 @@ bh->b_blocknr = block; bh->b_end_io = handler; bh->b_dev_id = dev_id; + bh->b_pdata = NULL; + bh->b_rm_fn = NULL; } static void end_buffer_io_sync(struct buffer_head *bh, int uptodate) @@ -1017,6 +1024,9 @@ */ static void put_unused_buffer_head(struct buffer_head * bh) { + if (bh->b_rm_fn != NULL) + bh->b_rm_fn(bh); + if (nr_unused_buffer_heads >= MAX_UNUSED_BUFFERS) { nr_buffer_heads--; kmem_cache_free(bh_cachep, bh); @@ -1148,6 +1158,8 @@ bh->b_data = (char *) (page+offset); bh->b_list = 0; + bh->b_pdata = NULL; + bh->b_rm_fn = NULL; } return head; /* @@ -1931,6 +1943,7 @@ bh = kmem_cache_alloc(bh_cachep, SLAB_ATOMIC); if (!bh) break; + memset(bh, 0, sizeof(*bh)); put_unused_buffer_head(bh); nr_buffer_heads++; } diff -urN 2.2.18pre19aa1/include/linux/fs.h z/include/linux/fs.h --- 2.2.18pre19aa1/include/linux/fs.h Sat Nov 4 05:50:05 2000 +++ z/include/linux/fs.h Sat Nov 4 06:00:56 2000 @@ -227,6 +227,8 @@ */ void (*b_end_io)(struct buffer_head *bh, int uptodate); void *b_dev_id; + void *b_pdata; + void (*b_rm_fn)(struct buffer_head *bh); }; typedef void (bh_end_io_t)(struct buffer_head *bh, int uptodate);