aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2011-06-27 19:16:04 -0400
committerTheodore Ts'o <tytso@mit.edu>2011-06-27 19:16:04 -0400
commit9f125d641beb898f5bf2fe69583192c18043517a (patch)
tree02259a4f538fbca0cbd6a9f0c4a9f96c82d738d6 /fs
parent1f7d1e77419050831a905353683807fa69a26625 (diff)
ext4: move common truncate functions to header file
Move two functions that will be needed by the indirect functions to be moved to indirect.c as well as inode.c to truncate.h as inline functions, so that we can avoid having duplicate copies of the function (which can be a maintenance problem) without having to expose them as globally functions. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs')
-rw-r--r--fs/ext4/inode.c48
-rw-r--r--fs/ext4/truncate.h43
2 files changed, 49 insertions, 42 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 3dca5264ccff..9b82ac7b0f55 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -47,6 +47,7 @@
47#include "xattr.h" 47#include "xattr.h"
48#include "acl.h" 48#include "acl.h"
49#include "ext4_extents.h" 49#include "ext4_extents.h"
50#include "truncate.h"
50 51
51#include <trace/events/ext4.h> 52#include <trace/events/ext4.h>
52 53
@@ -89,33 +90,6 @@ static int ext4_inode_is_fast_symlink(struct inode *inode)
89} 90}
90 91
91/* 92/*
92 * Work out how many blocks we need to proceed with the next chunk of a
93 * truncate transaction.
94 */
95static unsigned long blocks_for_truncate(struct inode *inode)
96{
97 ext4_lblk_t needed;
98
99 needed = inode->i_blocks >> (inode->i_sb->s_blocksize_bits - 9);
100
101 /* Give ourselves just enough room to cope with inodes in which
102 * i_blocks is corrupt: we've seen disk corruptions in the past
103 * which resulted in random data in an inode which looked enough
104 * like a regular file for ext4 to try to delete it. Things
105 * will go a bit crazy if that happens, but at least we should
106 * try not to panic the whole kernel. */
107 if (needed < 2)
108 needed = 2;
109
110 /* But we need to bound the transaction so we don't overflow the
111 * journal. */
112 if (needed > EXT4_MAX_TRANS_DATA)
113 needed = EXT4_MAX_TRANS_DATA;
114
115 return EXT4_DATA_TRANS_BLOCKS(inode->i_sb) + needed;
116}
117
118/*
119 * Truncate transactions can be complex and absolutely huge. So we need to 93 * Truncate transactions can be complex and absolutely huge. So we need to
120 * be able to restart the transaction at a conventient checkpoint to make 94 * be able to restart the transaction at a conventient checkpoint to make
121 * sure we don't overflow the journal. 95 * sure we don't overflow the journal.
@@ -129,7 +103,7 @@ static handle_t *start_transaction(struct inode *inode)
129{ 103{
130 handle_t *result; 104 handle_t *result;
131 105
132 result = ext4_journal_start(inode, blocks_for_truncate(inode)); 106 result = ext4_journal_start(inode, ext4_blocks_for_truncate(inode));
133 if (!IS_ERR(result)) 107 if (!IS_ERR(result))
134 return result; 108 return result;
135 109
@@ -149,7 +123,7 @@ static int try_to_extend_transaction(handle_t *handle, struct inode *inode)
149 return 0; 123 return 0;
150 if (ext4_handle_has_enough_credits(handle, EXT4_RESERVE_TRANS_BLOCKS+1)) 124 if (ext4_handle_has_enough_credits(handle, EXT4_RESERVE_TRANS_BLOCKS+1))
151 return 0; 125 return 0;
152 if (!ext4_journal_extend(handle, blocks_for_truncate(inode))) 126 if (!ext4_journal_extend(handle, ext4_blocks_for_truncate(inode)))
153 return 0; 127 return 0;
154 return 1; 128 return 1;
155} 129}
@@ -204,7 +178,7 @@ void ext4_evict_inode(struct inode *inode)
204 if (is_bad_inode(inode)) 178 if (is_bad_inode(inode))
205 goto no_delete; 179 goto no_delete;
206 180
207 handle = ext4_journal_start(inode, blocks_for_truncate(inode)+3); 181 handle = ext4_journal_start(inode, ext4_blocks_for_truncate(inode)+3);
208 if (IS_ERR(handle)) { 182 if (IS_ERR(handle)) {
209 ext4_std_error(inode->i_sb, PTR_ERR(handle)); 183 ext4_std_error(inode->i_sb, PTR_ERR(handle));
210 /* 184 /*
@@ -1555,16 +1529,6 @@ static int do_journal_get_write_access(handle_t *handle,
1555 return ret; 1529 return ret;
1556} 1530}
1557 1531
1558/*
1559 * Truncate blocks that were not used by write. We have to truncate the
1560 * pagecache as well so that corresponding buffers get properly unmapped.
1561 */
1562static void ext4_truncate_failed_write(struct inode *inode)
1563{
1564 truncate_inode_pages(inode->i_mapping, inode->i_size);
1565 ext4_truncate(inode);
1566}
1567
1568static int ext4_get_block_write(struct inode *inode, sector_t iblock, 1532static int ext4_get_block_write(struct inode *inode, sector_t iblock,
1569 struct buffer_head *bh_result, int create); 1533 struct buffer_head *bh_result, int create);
1570static int ext4_write_begin(struct file *file, struct address_space *mapping, 1534static int ext4_write_begin(struct file *file, struct address_space *mapping,
@@ -4134,7 +4098,7 @@ static int ext4_clear_blocks(handle_t *handle, struct inode *inode,
4134 if (unlikely(err)) 4098 if (unlikely(err))
4135 goto out_err; 4099 goto out_err;
4136 err = ext4_truncate_restart_trans(handle, inode, 4100 err = ext4_truncate_restart_trans(handle, inode,
4137 blocks_for_truncate(inode)); 4101 ext4_blocks_for_truncate(inode));
4138 if (unlikely(err)) 4102 if (unlikely(err))
4139 goto out_err; 4103 goto out_err;
4140 if (bh) { 4104 if (bh) {
@@ -4329,7 +4293,7 @@ static void ext4_free_branches(handle_t *handle, struct inode *inode,
4329 if (try_to_extend_transaction(handle, inode)) { 4293 if (try_to_extend_transaction(handle, inode)) {
4330 ext4_mark_inode_dirty(handle, inode); 4294 ext4_mark_inode_dirty(handle, inode);
4331 ext4_truncate_restart_trans(handle, inode, 4295 ext4_truncate_restart_trans(handle, inode,
4332 blocks_for_truncate(inode)); 4296 ext4_blocks_for_truncate(inode));
4333 } 4297 }
4334 4298
4335 /* 4299 /*
diff --git a/fs/ext4/truncate.h b/fs/ext4/truncate.h
new file mode 100644
index 000000000000..011ba6670d99
--- /dev/null
+++ b/fs/ext4/truncate.h
@@ -0,0 +1,43 @@
1/*
2 * linux/fs/ext4/truncate.h
3 *
4 * Common inline functions needed for truncate support
5 */
6
7/*
8 * Truncate blocks that were not used by write. We have to truncate the
9 * pagecache as well so that corresponding buffers get properly unmapped.
10 */
11static inline void ext4_truncate_failed_write(struct inode *inode)
12{
13 truncate_inode_pages(inode->i_mapping, inode->i_size);
14 ext4_truncate(inode);
15}
16
17/*
18 * Work out how many blocks we need to proceed with the next chunk of a
19 * truncate transaction.
20 */
21static inline unsigned long ext4_blocks_for_truncate(struct inode *inode)
22{
23 ext4_lblk_t needed;
24
25 needed = inode->i_blocks >> (inode->i_sb->s_blocksize_bits - 9);
26
27 /* Give ourselves just enough room to cope with inodes in which
28 * i_blocks is corrupt: we've seen disk corruptions in the past
29 * which resulted in random data in an inode which looked enough
30 * like a regular file for ext4 to try to delete it. Things
31 * will go a bit crazy if that happens, but at least we should
32 * try not to panic the whole kernel. */
33 if (needed < 2)
34 needed = 2;
35
36 /* But we need to bound the transaction so we don't overflow the
37 * journal. */
38 if (needed > EXT4_MAX_TRANS_DATA)
39 needed = EXT4_MAX_TRANS_DATA;
40
41 return EXT4_DATA_TRANS_BLOCKS(inode->i_sb) + needed;
42}
43