|
@@ -2837,6 +2837,48 @@ out:
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Force all delayed allocation blocks to be allocated for a given inode.
|
|
|
+ */
|
|
|
+int ext4_alloc_da_blocks(struct inode *inode)
|
|
|
+{
|
|
|
+ if (!EXT4_I(inode)->i_reserved_data_blocks &&
|
|
|
+ !EXT4_I(inode)->i_reserved_meta_blocks)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We do something simple for now. The filemap_flush() will
|
|
|
+ * also start triggering a write of the data blocks, which is
|
|
|
+ * not strictly speaking necessary (and for users of
|
|
|
+ * laptop_mode, not even desirable). However, to do otherwise
|
|
|
+ * would require replicating code paths in:
|
|
|
+ *
|
|
|
+ * ext4_da_writepages() ->
|
|
|
+ * write_cache_pages() ---> (via passed in callback function)
|
|
|
+ * __mpage_da_writepage() -->
|
|
|
+ * mpage_add_bh_to_extent()
|
|
|
+ * mpage_da_map_blocks()
|
|
|
+ *
|
|
|
+ * The problem is that write_cache_pages(), located in
|
|
|
+ * mm/page-writeback.c, marks pages clean in preparation for
|
|
|
+ * doing I/O, which is not desirable if we're not planning on
|
|
|
+ * doing I/O at all.
|
|
|
+ *
|
|
|
+ * We could call write_cache_pages(), and then redirty all of
|
|
|
+ * the pages by calling redirty_page_for_writeback() but that
|
|
|
+ * would be ugly in the extreme. So instead we would need to
|
|
|
+ * replicate parts of the code in the above functions,
|
|
|
+ * simplifying them becuase we wouldn't actually intend to
|
|
|
+ * write out the pages, but rather only collect contiguous
|
|
|
+ * logical block extents, call the multi-block allocator, and
|
|
|
+ * then update the buffer heads with the block allocations.
|
|
|
+ *
|
|
|
+ * For now, though, we'll cheat by calling filemap_flush(),
|
|
|
+ * which will map the blocks, and start the I/O, but not
|
|
|
+ * actually wait for the I/O to complete.
|
|
|
+ */
|
|
|
+ return filemap_flush(inode->i_mapping);
|
|
|
+}
|
|
|
|
|
|
/*
|
|
|
* bmap() is special. It gets used by applications such as lilo and by
|