Merge branch 'for-linus' of git://git.open-osd.org/linux-open-osd
[sfrench/cifs-2.6.git] / fs / ext4 / ext4_jbd2.c
1 /*
2  * Interface between ext4 and JBD
3  */
4
5 #include "ext4_jbd2.h"
6
7 int __ext4_journal_get_undo_access(const char *where, handle_t *handle,
8                                 struct buffer_head *bh)
9 {
10         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         }
18         return err;
19 }
20
21 int __ext4_journal_get_write_access(const char *where, handle_t *handle,
22                                 struct buffer_head *bh)
23 {
24         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         }
32         return err;
33 }
34
35 int __ext4_journal_forget(const char *where, handle_t *handle,
36                                 struct buffer_head *bh)
37 {
38         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         }
46         else
47                 bforget(bh);
48         return err;
49 }
50
51 int __ext4_journal_revoke(const char *where, handle_t *handle,
52                                 ext4_fsblk_t blocknr, struct buffer_head *bh)
53 {
54         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         }
62         else
63                 bforget(bh);
64         return err;
65 }
66
67 int __ext4_journal_get_create_access(const char *where,
68                                 handle_t *handle, struct buffer_head *bh)
69 {
70         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         }
78         return err;
79 }
80
81 int __ext4_handle_dirty_metadata(const char *where, handle_t *handle,
82                                  struct inode *inode, struct buffer_head *bh)
83 {
84         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 {
92                 if (inode && bh)
93                         mark_buffer_dirty_inode(bh, inode);
94                 else
95                         mark_buffer_dirty(bh);
96                 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         }
108         return err;
109 }