xref: /openbmc/linux/fs/ext4/ext4_jbd2.c (revision fd589a8f)
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 }
110