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/ext4_jbd2.c | |
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/ext4_jbd2.c')
-rw-r--r-- | fs/ext4/ext4_jbd2.c | 56 |
1 files changed, 56 insertions, 0 deletions
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 | { |