Messages in this thread | | | Date | Sat, 16 Dec 2000 18:21:11 -0600 | From | Russell Cattelan <> | Subject | Re: Test12 ll_rw_block error. |
| |
Linus Torvalds wrote:
> On Thu, 14 Dec 2000, Russell Cattelan wrote: > > > > Ok one more wrinkle. > > sync_buffers calls ll_rw_block, this is going to have the same problem as > > calling ll_rw_block directly. > > Good point. > > This actually looks fairly nasty to fix. The obvious fix would be to not > put such buffers on the dirty list at all, and instead rely on the VM > layer calling "writepage()" when it wants to push out the pages. > That would be the nice behaviour from a VM standpoint. > > However, that assumes that you don't have any "anonymous" buffers, which > is probably an unrealistic assumption. > > The problem is that we don't have any per-buffer "writebuffer()" function, > the way we have them per-page. It was never needed for any of the normal > filesystems, and XFS just happened to be able to take advantage of the > b_end_io behaviour. > > Suggestions welcome. > > Linus
Ok after a bit of trial and error I do have something working. I wouldn't call it the most elegant solution but it does work and it isn't very intrusive.
#define BH_End_io 7 /* End io function defined don't remap it */
/* don't change the callback if somebody explicitly set it */
if(!test_bit(BH_End_io, &bh->b_state)){ bh->b_end_io = end_buffer_io_sync; } What I've done is in the XFS set buffer_head setup functions is set the initial value of b_state to BH_Locked and BH_End_io set the callback function and the rest of the relevant fields and then unlock the buffer.
The only other quick fix that comes to mind is to change sync_buffers to use submit_bh rather than ll_rw_block.
-- Russell Cattelan cattelan@thebarn.com
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/
| |