/[pkg-src]/trunk/kernel26-magellan/patches-2.6.29-r7/0304-2.6.29-ext4-automatically-allocate-delay-allocated-blocks-on-close.patch |
Annotation of /trunk/kernel26-magellan/patches-2.6.29-r7/0304-2.6.29-ext4-automatically-allocate-delay-allocated-blocks-on-close.patch
Parent Directory | Revision Log
Revision 857 -
(hide annotations)
(download)
Tue Jun 30 20:01:52 2009 UTC (15 years, 3 months ago) by niro
File size: 2306 byte(s)
Tue Jun 30 20:01:52 2009 UTC (15 years, 3 months ago) by niro
File size: 2306 byte(s)
-2.6.29-magellan-r7: updated to linux-2.6.29.5
1 | niro | 857 | Added-By: Gordon Malm <gengor@gentoo.org> |
2 | |||
3 | --- | ||
4 | From: Theodore Ts'o <tytso@mit.edu> | ||
5 | Date: Tue, 24 Feb 2009 13:21:14 +0000 (-0500) | ||
6 | Subject: ext4: Automatically allocate delay allocated blocks on close | ||
7 | X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftytso%2Fext4.git;a=commitdiff_plain;h=6645f8c3bc3cdaa7de4aaa3d34d40c2e8e5f09ae | ||
8 | |||
9 | ext4: Automatically allocate delay allocated blocks on close | ||
10 | |||
11 | When closing a file that had been previously truncated, force any | ||
12 | delay allocated blocks that to be allocated so that if the filesystem | ||
13 | is mounted with data=ordered, the data blocks will be pushed out to | ||
14 | disk along with the journal commit. Many application programs expect | ||
15 | this, so we do this to avoid zero length files if the system crashes | ||
16 | unexpectedly. | ||
17 | |||
18 | Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> | ||
19 | --- | ||
20 | |||
21 | diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h | ||
22 | index ea51c89..234c731 100644 | ||
23 | --- a/fs/ext4/ext4.h | ||
24 | +++ b/fs/ext4/ext4.h | ||
25 | @@ -269,6 +269,7 @@ static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags) | ||
26 | #define EXT4_STATE_NEW 0x00000002 /* inode is newly created */ | ||
27 | #define EXT4_STATE_XATTR 0x00000004 /* has in-inode xattrs */ | ||
28 | #define EXT4_STATE_NO_EXPAND 0x00000008 /* No space for expansion */ | ||
29 | +#define EXT4_STATE_DA_ALLOC_CLOSE 0x00000010 /* Alloc DA blks on close */ | ||
30 | |||
31 | /* Used to pass group descriptor data when online resize is done */ | ||
32 | struct ext4_new_group_input { | ||
33 | diff --git a/fs/ext4/file.c b/fs/ext4/file.c | ||
34 | index f731cb5..06df827 100644 | ||
35 | --- a/fs/ext4/file.c | ||
36 | +++ b/fs/ext4/file.c | ||
37 | @@ -33,6 +33,10 @@ | ||
38 | */ | ||
39 | static int ext4_release_file(struct inode *inode, struct file *filp) | ||
40 | { | ||
41 | + if (EXT4_I(inode)->i_state & EXT4_STATE_DA_ALLOC_CLOSE) { | ||
42 | + ext4_alloc_da_blocks(inode); | ||
43 | + EXT4_I(inode)->i_state &= ~EXT4_STATE_DA_ALLOC_CLOSE; | ||
44 | + } | ||
45 | /* if we are the last writer on the inode, drop the block reservation */ | ||
46 | if ((filp->f_mode & FMODE_WRITE) && | ||
47 | (atomic_read(&inode->i_writecount) == 1)) | ||
48 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c | ||
49 | index ead57ab..666caa9 100644 | ||
50 | --- a/fs/ext4/inode.c | ||
51 | +++ b/fs/ext4/inode.c | ||
52 | @@ -3871,6 +3871,9 @@ void ext4_truncate(struct inode *inode) | ||
53 | if (!ext4_can_truncate(inode)) | ||
54 | return; | ||
55 | |||
56 | + if (inode->i_size == 0) | ||
57 | + ei->i_state |= EXT4_STATE_DA_ALLOC_CLOSE; | ||
58 | + | ||
59 | if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) { | ||
60 | ext4_ext_truncate(inode); | ||
61 | return; |