-
Andrew Morton authored
Fix bug in block_truncate_page(). When buffers are attached to an uptodate page, they are marked as being uptodate. To preserve buffer/page state coherency. Dirtiness is handled in the same way. But block_truncate_page() assumes that a buffer which is unmapped and uptodate is over a hole. That's not the case, and the net effect is that block_truncate_page() is failing to zero the block outside the truncation point. This only happens if the page has a disk mapping but has no attached buffers on entry to block_truncate_page(). That's never the case in current kernels, so the problem does not exhibit (it _does_ exhibit with direct-to-BIO bypass-the-buffers I/O). There are actually three possible states of buffer mappedness: - Buffer has a disk mapping (buffer_mapped(bh) == true) - buffer is over a hole (buffer_mapped(bh) == false) - don't know. Need to run get_block() (buffer_mapped(bh) == false) This ambiguity could be resolved by added another buffer state bit (BH_mapping_state_known?) but given that we already elide the get_block calls for the common case (buffer outside i_size) it is unlikely that the complexity is worthwhile.
9ff5178d