Hi, I'd like to hook into the end_io reporting chain by replacing the b_end_io function pointer by an own end_io function that restores the original values and calls the previous end_io function after io. Unfortunatly if the previous function was end_buffer_io_async it unlocks the bh->b_page too early since it checks for the b_end_io == end_buffer_io_async. With the following patch that works but it maybe isn't the best way to do it. Comments are highly welcome... Stefan ------------------------ diff -ruN old/fs/buffer.c new/fs/buffer.c --- old/fs/buffer.c Thu Jun 7 14:25:57 2001 +++ new/fs/buffer.c Thu Jun 7 14:31:00 2001 @@ -807,7 +807,7 @@ atomic_dec(&bh->b_count); tmp = bh->b_this_page; while (tmp != bh) { - if (tmp->b_end_io == end_buffer_io_async && buffer_locked(tmp)) + if (test_bit(BH_Async, &tmp->b_state) && buffer_locked(tmp)) goto still_busy; tmp = tmp->b_this_page; } @@ -839,6 +839,7 @@ void set_buffer_async_io(struct buffer_head *bh) { bh->b_end_io = end_buffer_io_async ; + set_bit(BH_Async, &bh->b_state); } /* @@ -1531,6 +1532,7 @@ do { lock_buffer(bh); bh->b_end_io = end_buffer_io_async; + set_bit(BH_Async, &bh->b_state); atomic_inc(&bh->b_count); set_bit(BH_Uptodate, &bh->b_state); clear_bit(BH_Dirty, &bh->b_state); @@ -1732,6 +1734,7 @@ struct buffer_head * bh = arr[i]; lock_buffer(bh); bh->b_end_io = end_buffer_io_async; + set_bit(BH_Async, &bh->b_state); atomic_inc(&bh->b_count); } @@ -2178,6 +2181,7 @@ bh->b_blocknr = *(b++); set_bit(BH_Mapped, &bh->b_state); bh->b_end_io = end_buffer_io_async; + set_bit(BH_Async, &bh->b_state); atomic_inc(&bh->b_count); bh = bh->b_this_page; } while (bh != head); diff -ruN old/include/linux/fs.h new/include/linux/fs.h --- old/include/linux/fs.h Thu Jun 7 14:26:09 2001 +++ new/include/linux/fs.h Thu Jun 7 14:25:28 2001 @@ -207,6 +207,7 @@ #define BH_Mapped 4 /* 1 if the buffer has a disk mapping */ #define BH_New 5 /* 1 if the buffer is new and not yet written out */ #define BH_Protected 6 /* 1 if the buffer is protected */ +#define BH_Async 7 /* 1 if the buffer is used for asyncronous io */ /* * Try to keep the most commonly used fields in single cache lines (16 ----------------- IBM Development, Boeblingen, Germany Linux for eServer development [EMAIL PROTECTED] ---------------------------------------------------------------------------------- When all other means of communication fail, try words. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/