blob: 6a9409920deef2f6040b8d7279114cfc0612221d [file] [log] [blame]
Andrew Morton8984d132006-12-06 20:37:15 -08001/*
2 * Interface between ext4 and JBD
3 */
4
Christoph Hellwig3dcf5452008-04-29 18:13:32 -04005#include "ext4_jbd2.h"
Andrew Morton8984d132006-12-06 20:37:15 -08006
7int __ext4_journal_get_undo_access(const char *where, handle_t *handle,
8 struct buffer_head *bh)
9{
Frank Mayhar03901312009-01-07 00:06:22 -050010 int err = 0;
11
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 }
Andrew Morton8984d132006-12-06 20:37:15 -080018 return err;
19}
20
21int __ext4_journal_get_write_access(const char *where, handle_t *handle,
22 struct buffer_head *bh)
23{
Frank Mayhar03901312009-01-07 00:06:22 -050024 int err = 0;
25
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 }
Andrew Morton8984d132006-12-06 20:37:15 -080032 return err;
33}
34
35int __ext4_journal_forget(const char *where, handle_t *handle,
36 struct buffer_head *bh)
37{
Frank Mayhar03901312009-01-07 00:06:22 -050038 int err = 0;
39
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 }
Curt Wohlgemuthe6b5d302009-07-13 09:07:20 -040046 else
Theodore Ts'oc7acb4c2009-09-09 21:32:41 -040047 bforget(bh);
Andrew Morton8984d132006-12-06 20:37:15 -080048 return err;
49}
50
51int __ext4_journal_revoke(const char *where, handle_t *handle,
52 ext4_fsblk_t blocknr, struct buffer_head *bh)
53{
Frank Mayhar03901312009-01-07 00:06:22 -050054 int err = 0;
55
56 if (ext4_handle_valid(handle)) {
57 err = jbd2_journal_revoke(handle, blocknr, bh);
58 if (err)
59 ext4_journal_abort_handle(where, __func__, bh,
60 handle, err);
61 }
Curt Wohlgemuthe6b5d302009-07-13 09:07:20 -040062 else
Theodore Ts'oc7acb4c2009-09-09 21:32:41 -040063 bforget(bh);
Andrew Morton8984d132006-12-06 20:37:15 -080064 return err;
65}
66
67int __ext4_journal_get_create_access(const char *where,
68 handle_t *handle, struct buffer_head *bh)
69{
Frank Mayhar03901312009-01-07 00:06:22 -050070 int err = 0;
71
72 if (ext4_handle_valid(handle)) {
73 err = jbd2_journal_get_create_access(handle, bh);
74 if (err)
75 ext4_journal_abort_handle(where, __func__, bh,
76 handle, err);
77 }
Andrew Morton8984d132006-12-06 20:37:15 -080078 return err;
79}
80
Frank Mayhar03901312009-01-07 00:06:22 -050081int __ext4_handle_dirty_metadata(const char *where, handle_t *handle,
82 struct inode *inode, struct buffer_head *bh)
Andrew Morton8984d132006-12-06 20:37:15 -080083{
Frank Mayhar03901312009-01-07 00:06:22 -050084 int err = 0;
85
86 if (ext4_handle_valid(handle)) {
87 err = jbd2_journal_dirty_metadata(handle, bh);
88 if (err)
89 ext4_journal_abort_handle(where, __func__, bh,
90 handle, err);
91 } else {
Theodore Ts'ofe188c02009-09-12 13:41:55 -040092 if (inode && bh)
93 mark_buffer_dirty_inode(bh, inode);
94 else
95 mark_buffer_dirty(bh);
Frank Mayhar03901312009-01-07 00:06:22 -050096 if (inode && inode_needs_sync(inode)) {
97 sync_dirty_buffer(bh);
98 if (buffer_req(bh) && !buffer_uptodate(bh)) {
99 ext4_error(inode->i_sb, __func__,
100 "IO error syncing inode, "
101 "inode=%lu, block=%llu",
102 inode->i_ino,
103 (unsigned long long) bh->b_blocknr);
104 err = -EIO;
105 }
106 }
107 }
Andrew Morton8984d132006-12-06 20:37:15 -0800108 return err;
109}