On Thu, May 14, 2009 at 11:10:02AM +0530, Aneesh Kumar K.V wrote: > > It should only be set in the !create case. With create == 1, we would > have already converted the uninitialized extent to initialized one and > the buffer_head should not be unwritten at all. My understanding is > unwritten flag is used to indicate the buffer_head state between a > write_begin and write_page phase with delayed allocation. ie, when we > write to fallocate space, since we have delalloc enabled, we just > do a block lookup (get_block with create = 0). The buffer_head returned > in the above case should have unwritten set so that during writepage > we do the actual block allocation (get_block writh create = 1) > looking at the flag. At the moment, ext4_da_get_block_prep(), which is used as a callback function by ext4_da_write_begin(), checks for buffer_unwritten(), and if true, set BH_New and BH_Mapped. So between the time that that write_begin() and the time when the page is actually written out, BH_Unwritten and BH_Mapped will both be set. If we end up bailing due to some error of some kind, such that we don't complete the write(2) operation we *can* have some pages that are simultaneously have BH_Unwritten and BH_Mapped flags set. So this had better be a harmless case, since I think it can happen. What's confusing then is some of the comments which have been made about why BH_Unwritten and BH_Mapped simultaneously are a bad. It may be bad at some points in time, but at other points in time it's completely normal operations. Or am I missing something? - Ted -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html