diff options
Diffstat (limited to 'fs/ext4/ext4_jbd2.c')
-rw-r--r-- | fs/ext4/ext4_jbd2.c | 83 |
1 files changed, 63 insertions, 20 deletions
diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c index c75384b34f2c..ad13a84644e1 100644 --- a/fs/ext4/ext4_jbd2.c +++ b/fs/ext4/ext4_jbd2.c | |||
@@ -7,53 +7,96 @@ | |||
7 | int __ext4_journal_get_undo_access(const char *where, handle_t *handle, | 7 | int __ext4_journal_get_undo_access(const char *where, handle_t *handle, |
8 | struct buffer_head *bh) | 8 | struct buffer_head *bh) |
9 | { | 9 | { |
10 | int err = jbd2_journal_get_undo_access(handle, bh); | 10 | int err = 0; |
11 | if (err) | 11 | |
12 | ext4_journal_abort_handle(where, __func__, bh, handle, err); | 12 | if (ext4_handle_valid(handle)) { |
13 | err = jbd2_journal_get_undo_access(handle, bh); | ||
14 | if (err) | ||
15 | ext4_journal_abort_handle(where, __func__, bh, | ||
16 | handle, err); | ||
17 | } | ||
13 | return err; | 18 | return err; |
14 | } | 19 | } |
15 | 20 | ||
16 | int __ext4_journal_get_write_access(const char *where, handle_t *handle, | 21 | int __ext4_journal_get_write_access(const char *where, handle_t *handle, |
17 | struct buffer_head *bh) | 22 | struct buffer_head *bh) |
18 | { | 23 | { |
19 | int err = jbd2_journal_get_write_access(handle, bh); | 24 | int err = 0; |
20 | if (err) | 25 | |
21 | ext4_journal_abort_handle(where, __func__, bh, handle, err); | 26 | if (ext4_handle_valid(handle)) { |
27 | err = jbd2_journal_get_write_access(handle, bh); | ||
28 | if (err) | ||
29 | ext4_journal_abort_handle(where, __func__, bh, | ||
30 | handle, err); | ||
31 | } | ||
22 | return err; | 32 | return err; |
23 | } | 33 | } |
24 | 34 | ||
25 | int __ext4_journal_forget(const char *where, handle_t *handle, | 35 | int __ext4_journal_forget(const char *where, handle_t *handle, |
26 | struct buffer_head *bh) | 36 | struct buffer_head *bh) |
27 | { | 37 | { |
28 | int err = jbd2_journal_forget(handle, bh); | 38 | int err = 0; |
29 | if (err) | 39 | |
30 | ext4_journal_abort_handle(where, __func__, bh, handle, err); | 40 | if (ext4_handle_valid(handle)) { |
41 | err = jbd2_journal_forget(handle, bh); | ||
42 | if (err) | ||
43 | ext4_journal_abort_handle(where, __func__, bh, | ||
44 | handle, err); | ||
45 | } | ||
31 | return err; | 46 | return err; |
32 | } | 47 | } |
33 | 48 | ||
34 | int __ext4_journal_revoke(const char *where, handle_t *handle, | 49 | int __ext4_journal_revoke(const char *where, handle_t *handle, |
35 | ext4_fsblk_t blocknr, struct buffer_head *bh) | 50 | ext4_fsblk_t blocknr, struct buffer_head *bh) |
36 | { | 51 | { |
37 | int err = jbd2_journal_revoke(handle, blocknr, bh); | 52 | int err = 0; |
38 | if (err) | 53 | |
39 | ext4_journal_abort_handle(where, __func__, bh, handle, err); | 54 | if (ext4_handle_valid(handle)) { |
55 | err = jbd2_journal_revoke(handle, blocknr, bh); | ||
56 | if (err) | ||
57 | ext4_journal_abort_handle(where, __func__, bh, | ||
58 | handle, err); | ||
59 | } | ||
40 | return err; | 60 | return err; |
41 | } | 61 | } |
42 | 62 | ||
43 | int __ext4_journal_get_create_access(const char *where, | 63 | int __ext4_journal_get_create_access(const char *where, |
44 | handle_t *handle, struct buffer_head *bh) | 64 | handle_t *handle, struct buffer_head *bh) |
45 | { | 65 | { |
46 | int err = jbd2_journal_get_create_access(handle, bh); | 66 | int err = 0; |
47 | if (err) | 67 | |
48 | ext4_journal_abort_handle(where, __func__, bh, handle, err); | 68 | if (ext4_handle_valid(handle)) { |
69 | err = jbd2_journal_get_create_access(handle, bh); | ||
70 | if (err) | ||
71 | ext4_journal_abort_handle(where, __func__, bh, | ||
72 | handle, err); | ||
73 | } | ||
49 | return err; | 74 | return err; |
50 | } | 75 | } |
51 | 76 | ||
52 | int __ext4_journal_dirty_metadata(const char *where, | 77 | int __ext4_handle_dirty_metadata(const char *where, handle_t *handle, |
53 | handle_t *handle, struct buffer_head *bh) | 78 | struct inode *inode, struct buffer_head *bh) |
54 | { | 79 | { |
55 | int err = jbd2_journal_dirty_metadata(handle, bh); | 80 | int err = 0; |
56 | if (err) | 81 | |
57 | ext4_journal_abort_handle(where, __func__, bh, handle, err); | 82 | if (ext4_handle_valid(handle)) { |
83 | err = jbd2_journal_dirty_metadata(handle, bh); | ||
84 | if (err) | ||
85 | ext4_journal_abort_handle(where, __func__, bh, | ||
86 | handle, err); | ||
87 | } else { | ||
88 | mark_buffer_dirty(bh); | ||
89 | if (inode && inode_needs_sync(inode)) { | ||
90 | sync_dirty_buffer(bh); | ||
91 | if (buffer_req(bh) && !buffer_uptodate(bh)) { | ||
92 | ext4_error(inode->i_sb, __func__, | ||
93 | "IO error syncing inode, " | ||
94 | "inode=%lu, block=%llu", | ||
95 | inode->i_ino, | ||
96 | (unsigned long long) bh->b_blocknr); | ||
97 | err = -EIO; | ||
98 | } | ||
99 | } | ||
100 | } | ||
58 | return err; | 101 | return err; |
59 | } | 102 | } |