On Sun, Feb 15, 2009 at 12:32:06AM -0500, Theodore Tso wrote: > So I was looking at the ext4 code to see how hard it would be to add a > function that would take a struct inode *, and make sure that all of > the pages in the page cache had been allocated a physical block on > disk (but not necessarily writing the I/O to disk). The idea would be > to do this on close if the file had been truncated or opened with > O_TRUNC, and to also call this function if the inode had been renamed > and in the process a destination inode was freed. That way if we have > data=ordered, the blocks would be allocated, and at the next commit, > we would force the data blocks to disk. > > While I was looking at the code, it looks to me like we are currently > only allocating a page at a time; ext4_da_writepages() may end up > allocating a number of pages, but it's doing it one page at a time, > not an extent at a time. So if the filesystem blocksize is 4k (and > the page size is 4k), the only time we will ever call the mballoc with > an allocation request greater than 1 is in the fallocate() system call > handler. This seems... non-optimal. Am I missing something? > Here is how it works. During writepages we loop through the dirty pages and build largest contiguous block extent (mpage_add_bh_to_extent). Then we call mpage_da_map_blocks. mpage_da_map_blocks does the mutli block request. Once we have the blocks allocated we map these blocks to the pages. And then we writeback one page at a time using writepage callback. -aneesh -- 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