diff options
author | Theodore Ts'o <tytso@mit.edu> | 2009-11-22 20:52:12 -0500 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2009-11-22 20:52:12 -0500 |
commit | d6797d14b1640d088652c72508b529a3aea479e3 (patch) | |
tree | 2e608c3e362b94439a2e7503b7d97cb3891bb101 /fs/ext4 | |
parent | e3bb52ae2bb9573e84c17b8e3560378d13a5c798 (diff) |
ext4: move ext4_forget() to ext4_jbd2.c
The ext4_forget() function better belongs in ext4_jbd2.c. This will
allow us to do some cleanup of the ext4_journal_revoke() and
ext4_journal_forget() functions, as well as giving us better error
reporting since we can report the caller of ext4_forget() when things
go wrong.
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4')
-rw-r--r-- | fs/ext4/ext4.h | 2 | ||||
-rw-r--r-- | fs/ext4/ext4_jbd2.c | 56 | ||||
-rw-r--r-- | fs/ext4/ext4_jbd2.h | 7 | ||||
-rw-r--r-- | fs/ext4/inode.c | 53 |
4 files changed, 63 insertions, 55 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 05ce38b981cb..57c4e03afa0a 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -1393,8 +1393,6 @@ extern int ext4_mb_get_buddy_cache_lock(struct super_block *, ext4_group_t); | |||
1393 | extern void ext4_mb_put_buddy_cache_lock(struct super_block *, | 1393 | extern void ext4_mb_put_buddy_cache_lock(struct super_block *, |
1394 | ext4_group_t, int); | 1394 | ext4_group_t, int); |
1395 | /* inode.c */ | 1395 | /* inode.c */ |
1396 | int ext4_forget(handle_t *handle, int is_metadata, struct inode *inode, | ||
1397 | struct buffer_head *bh, ext4_fsblk_t blocknr); | ||
1398 | struct buffer_head *ext4_getblk(handle_t *, struct inode *, | 1396 | struct buffer_head *ext4_getblk(handle_t *, struct inode *, |
1399 | ext4_lblk_t, int, int *); | 1397 | ext4_lblk_t, int, int *); |
1400 | struct buffer_head *ext4_bread(handle_t *, struct inode *, | 1398 | struct buffer_head *ext4_bread(handle_t *, struct inode *, |
diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c index 6a9409920dee..913f85715433 100644 --- a/fs/ext4/ext4_jbd2.c +++ b/fs/ext4/ext4_jbd2.c | |||
@@ -4,6 +4,8 @@ | |||
4 | 4 | ||
5 | #include "ext4_jbd2.h" | 5 | #include "ext4_jbd2.h" |
6 | 6 | ||
7 | #include <trace/events/ext4.h> | ||
8 | |||
7 | int __ext4_journal_get_undo_access(const char *where, handle_t *handle, | 9 | int __ext4_journal_get_undo_access(const char *where, handle_t *handle, |
8 | struct buffer_head *bh) | 10 | struct buffer_head *bh) |
9 | { | 11 | { |
@@ -64,6 +66,60 @@ int __ext4_journal_revoke(const char *where, handle_t *handle, | |||
64 | return err; | 66 | return err; |
65 | } | 67 | } |
66 | 68 | ||
69 | /* | ||
70 | * The ext4 forget function must perform a revoke if we are freeing data | ||
71 | * which has been journaled. Metadata (eg. indirect blocks) must be | ||
72 | * revoked in all cases. | ||
73 | * | ||
74 | * "bh" may be NULL: a metadata block may have been freed from memory | ||
75 | * but there may still be a record of it in the journal, and that record | ||
76 | * still needs to be revoked. | ||
77 | * | ||
78 | * If the handle isn't valid we're not journaling, but we still need to | ||
79 | * call into ext4_journal_revoke() to put the buffer head. | ||
80 | */ | ||
81 | int __ext4_forget(const char *where, handle_t *handle, int is_metadata, | ||
82 | struct inode *inode, struct buffer_head *bh, | ||
83 | ext4_fsblk_t blocknr) | ||
84 | { | ||
85 | int err; | ||
86 | |||
87 | might_sleep(); | ||
88 | |||
89 | trace_ext4_forget(inode, is_metadata, blocknr); | ||
90 | BUFFER_TRACE(bh, "enter"); | ||
91 | |||
92 | jbd_debug(4, "forgetting bh %p: is_metadata = %d, mode %o, " | ||
93 | "data mode %x\n", | ||
94 | bh, is_metadata, inode->i_mode, | ||
95 | test_opt(inode->i_sb, DATA_FLAGS)); | ||
96 | |||
97 | /* Never use the revoke function if we are doing full data | ||
98 | * journaling: there is no need to, and a V1 superblock won't | ||
99 | * support it. Otherwise, only skip the revoke on un-journaled | ||
100 | * data blocks. */ | ||
101 | |||
102 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA || | ||
103 | (!is_metadata && !ext4_should_journal_data(inode))) { | ||
104 | if (bh) { | ||
105 | BUFFER_TRACE(bh, "call jbd2_journal_forget"); | ||
106 | return __ext4_journal_forget(where, handle, bh); | ||
107 | } | ||
108 | return 0; | ||
109 | } | ||
110 | |||
111 | /* | ||
112 | * data!=journal && (is_metadata || should_journal_data(inode)) | ||
113 | */ | ||
114 | BUFFER_TRACE(bh, "call ext4_journal_revoke"); | ||
115 | err = __ext4_journal_revoke(where, handle, blocknr, bh); | ||
116 | if (err) | ||
117 | ext4_abort(inode->i_sb, __func__, | ||
118 | "error %d when attempting revoke", err); | ||
119 | BUFFER_TRACE(bh, "exit"); | ||
120 | return err; | ||
121 | } | ||
122 | |||
67 | int __ext4_journal_get_create_access(const char *where, | 123 | int __ext4_journal_get_create_access(const char *where, |
68 | handle_t *handle, struct buffer_head *bh) | 124 | handle_t *handle, struct buffer_head *bh) |
69 | { | 125 | { |
diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h index a2865980342f..dc0b34a903eb 100644 --- a/fs/ext4/ext4_jbd2.h +++ b/fs/ext4/ext4_jbd2.h | |||
@@ -139,6 +139,10 @@ int __ext4_journal_forget(const char *where, handle_t *handle, | |||
139 | int __ext4_journal_revoke(const char *where, handle_t *handle, | 139 | int __ext4_journal_revoke(const char *where, handle_t *handle, |
140 | ext4_fsblk_t blocknr, struct buffer_head *bh); | 140 | ext4_fsblk_t blocknr, struct buffer_head *bh); |
141 | 141 | ||
142 | int __ext4_forget(const char *where, handle_t *handle, int is_metadata, | ||
143 | struct inode *inode, struct buffer_head *bh, | ||
144 | ext4_fsblk_t blocknr); | ||
145 | |||
142 | int __ext4_journal_get_create_access(const char *where, | 146 | int __ext4_journal_get_create_access(const char *where, |
143 | handle_t *handle, struct buffer_head *bh); | 147 | handle_t *handle, struct buffer_head *bh); |
144 | 148 | ||
@@ -151,6 +155,9 @@ int __ext4_handle_dirty_metadata(const char *where, handle_t *handle, | |||
151 | __ext4_journal_get_write_access(__func__, (handle), (bh)) | 155 | __ext4_journal_get_write_access(__func__, (handle), (bh)) |
152 | #define ext4_journal_revoke(handle, blocknr, bh) \ | 156 | #define ext4_journal_revoke(handle, blocknr, bh) \ |
153 | __ext4_journal_revoke(__func__, (handle), (blocknr), (bh)) | 157 | __ext4_journal_revoke(__func__, (handle), (blocknr), (bh)) |
158 | #define ext4_forget(handle, is_metadata, inode, bh, block_nr) \ | ||
159 | __ext4_forget(__func__, (handle), (is_metadata), (inode), (bh),\ | ||
160 | (block_nr)) | ||
154 | #define ext4_journal_get_create_access(handle, bh) \ | 161 | #define ext4_journal_get_create_access(handle, bh) \ |
155 | __ext4_journal_get_create_access(__func__, (handle), (bh)) | 162 | __ext4_journal_get_create_access(__func__, (handle), (bh)) |
156 | #define ext4_journal_forget(handle, bh) \ | 163 | #define ext4_journal_forget(handle, bh) \ |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 3673ec7b1c98..fa37f9504ece 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -71,59 +71,6 @@ static int ext4_inode_is_fast_symlink(struct inode *inode) | |||
71 | } | 71 | } |
72 | 72 | ||
73 | /* | 73 | /* |
74 | * The ext4 forget function must perform a revoke if we are freeing data | ||
75 | * which has been journaled. Metadata (eg. indirect blocks) must be | ||
76 | * revoked in all cases. | ||
77 | * | ||
78 | * "bh" may be NULL: a metadata block may have been freed from memory | ||
79 | * but there may still be a record of it in the journal, and that record | ||
80 | * still needs to be revoked. | ||
81 | * | ||
82 | * If the handle isn't valid we're not journaling, but we still need to | ||
83 | * call into ext4_journal_revoke() to put the buffer head. | ||
84 | */ | ||
85 | int ext4_forget(handle_t *handle, int is_metadata, struct inode *inode, | ||
86 | struct buffer_head *bh, ext4_fsblk_t blocknr) | ||
87 | { | ||
88 | int err; | ||
89 | |||
90 | might_sleep(); | ||
91 | |||
92 | trace_ext4_forget(inode, is_metadata, blocknr); | ||
93 | BUFFER_TRACE(bh, "enter"); | ||
94 | |||
95 | jbd_debug(4, "forgetting bh %p: is_metadata = %d, mode %o, " | ||
96 | "data mode %x\n", | ||
97 | bh, is_metadata, inode->i_mode, | ||
98 | test_opt(inode->i_sb, DATA_FLAGS)); | ||
99 | |||
100 | /* Never use the revoke function if we are doing full data | ||
101 | * journaling: there is no need to, and a V1 superblock won't | ||
102 | * support it. Otherwise, only skip the revoke on un-journaled | ||
103 | * data blocks. */ | ||
104 | |||
105 | if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA || | ||
106 | (!is_metadata && !ext4_should_journal_data(inode))) { | ||
107 | if (bh) { | ||
108 | BUFFER_TRACE(bh, "call jbd2_journal_forget"); | ||
109 | return ext4_journal_forget(handle, bh); | ||
110 | } | ||
111 | return 0; | ||
112 | } | ||
113 | |||
114 | /* | ||
115 | * data!=journal && (is_metadata || should_journal_data(inode)) | ||
116 | */ | ||
117 | BUFFER_TRACE(bh, "call ext4_journal_revoke"); | ||
118 | err = ext4_journal_revoke(handle, blocknr, bh); | ||
119 | if (err) | ||
120 | ext4_abort(inode->i_sb, __func__, | ||
121 | "error %d when attempting revoke", err); | ||
122 | BUFFER_TRACE(bh, "exit"); | ||
123 | return err; | ||
124 | } | ||
125 | |||
126 | /* | ||
127 | * Work out how many blocks we need to proceed with the next chunk of a | 74 | * Work out how many blocks we need to proceed with the next chunk of a |
128 | * truncate transaction. | 75 | * truncate transaction. |
129 | */ | 76 | */ |