/[pkg-src]/trunk/kernel26-magellan/patches-2.6.29-r7/0304-2.6.29-ext4-automatically-allocate-delay-allocated-blocks-on-close.patch |
Contents 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 -
(show 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 | 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; |