- 论坛徽章:
- 0
|
kernel 3.0
int block_write_full_page(struct page *page, get_block_t *get_block,
struct writeback_control *wbc)
{
return block_write_full_page_endio(page, get_block, wbc, end_buffer_async_write);
}
....
mark_buffer_async_write_endio(bh, end_buffer_async_write);
end_buffer_async_write() {
.....
first = page_buffers(page);
local_irq_save(flags);
bit_spin_lock(BH_Uptodate_Lock, &first->b_state);
clear_buffer_async_write(bh);
unlock_buffer(bh);
tmp = bh->b_this_page; //这个地方在循环page上所有的bh,有bh还在async write的话,就不会清除page的writeback。
while (tmp != bh) {
if (buffer_async_write(tmp)) {
BUG_ON(!buffer_locked(tmp));
goto still_busy;
}
tmp = tmp->b_this_page;
}
bit_spin_unlock(BH_Uptodate_Lock, &first->b_state);
local_irq_restore(flags);
end_page_writeback(page);
return; |
|