diff options
author | Theodore Ts'o <tytso@mit.edu> | 2009-02-26 01:04:07 -0500 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2009-02-26 01:04:07 -0500 |
commit | ccd2506bd43113659aa904d5bea5d1300605e2a6 (patch) | |
tree | 99a95645b3c2c092427b7c537c5628d502cd9c22 /fs/ext4/inode.c | |
parent | f63e6005bc63acc0a6bc3bdb8f971dcfbd827185 (diff) |
ext4: add EXT4_IOC_ALLOC_DA_BLKS ioctl
Add an ioctl which forces all of the delay allocated blocks to be
allocated. This also provides a function ext4_alloc_da_blocks() which
will be used by the following commits to force files to be fully
allocated to preserve application-expected ext3 behaviour.
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r-- | fs/ext4/inode.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 24d0f9d2b320..8dd3d5de5861 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -2837,6 +2837,48 @@ out: | |||
2837 | return; | 2837 | return; |
2838 | } | 2838 | } |
2839 | 2839 | ||
2840 | /* | ||
2841 | * Force all delayed allocation blocks to be allocated for a given inode. | ||
2842 | */ | ||
2843 | int ext4_alloc_da_blocks(struct inode *inode) | ||
2844 | { | ||
2845 | if (!EXT4_I(inode)->i_reserved_data_blocks && | ||
2846 | !EXT4_I(inode)->i_reserved_meta_blocks) | ||
2847 | return 0; | ||
2848 | |||
2849 | /* | ||
2850 | * We do something simple for now. The filemap_flush() will | ||
2851 | * also start triggering a write of the data blocks, which is | ||
2852 | * not strictly speaking necessary (and for users of | ||
2853 | * laptop_mode, not even desirable). However, to do otherwise | ||
2854 | * would require replicating code paths in: | ||
2855 | * | ||
2856 | * ext4_da_writepages() -> | ||
2857 | * write_cache_pages() ---> (via passed in callback function) | ||
2858 | * __mpage_da_writepage() --> | ||
2859 | * mpage_add_bh_to_extent() | ||
2860 | * mpage_da_map_blocks() | ||
2861 | * | ||
2862 | * The problem is that write_cache_pages(), located in | ||
2863 | * mm/page-writeback.c, marks pages clean in preparation for | ||
2864 | * doing I/O, which is not desirable if we're not planning on | ||
2865 | * doing I/O at all. | ||
2866 | * | ||
2867 | * We could call write_cache_pages(), and then redirty all of | ||
2868 | * the pages by calling redirty_page_for_writeback() but that | ||
2869 | * would be ugly in the extreme. So instead we would need to | ||
2870 | * replicate parts of the code in the above functions, | ||
2871 | * simplifying them becuase we wouldn't actually intend to | ||
2872 | * write out the pages, but rather only collect contiguous | ||
2873 | * logical block extents, call the multi-block allocator, and | ||
2874 | * then update the buffer heads with the block allocations. | ||
2875 | * | ||
2876 | * For now, though, we'll cheat by calling filemap_flush(), | ||
2877 | * which will map the blocks, and start the I/O, but not | ||
2878 | * actually wait for the I/O to complete. | ||
2879 | */ | ||
2880 | return filemap_flush(inode->i_mapping); | ||
2881 | } | ||
2840 | 2882 | ||
2841 | /* | 2883 | /* |
2842 | * bmap() is special. It gets used by applications such as lilo and by | 2884 | * bmap() is special. It gets used by applications such as lilo and by |