Commit | Line | Data |
---|---|---|
70a9883c DC |
1 | /* |
2 | * Copyright (c) 2000-2005 Silicon Graphics, Inc. | |
3 | * Copyright (c) 2013 Red Hat, Inc. | |
4 | * All Rights Reserved. | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or | |
7 | * modify it under the terms of the GNU General Public License as | |
8 | * published by the Free Software Foundation. | |
9 | * | |
10 | * This program is distributed in the hope that it would be useful, | |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | * GNU General Public License for more details. | |
14 | * | |
15 | * You should have received a copy of the GNU General Public License | |
16 | * along with this program; if not, write the Free Software Foundation, | |
17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
18 | */ | |
19 | #ifndef __XFS_SHARED_H__ | |
20 | #define __XFS_SHARED_H__ | |
21 | ||
22 | /* | |
23 | * Definitions shared between kernel and userspace that don't fit into any other | |
24 | * header file that is shared with userspace. | |
25 | */ | |
26 | struct xfs_ifork; | |
27 | struct xfs_buf; | |
28 | struct xfs_buf_ops; | |
29 | struct xfs_mount; | |
30 | struct xfs_trans; | |
31 | struct xfs_inode; | |
32 | ||
33 | /* | |
34 | * Buffer verifier operations are widely used, including userspace tools | |
35 | */ | |
36 | extern const struct xfs_buf_ops xfs_agf_buf_ops; | |
37 | extern const struct xfs_buf_ops xfs_agi_buf_ops; | |
38 | extern const struct xfs_buf_ops xfs_agf_buf_ops; | |
39 | extern const struct xfs_buf_ops xfs_agfl_buf_ops; | |
40 | extern const struct xfs_buf_ops xfs_allocbt_buf_ops; | |
41 | extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; | |
42 | extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; | |
43 | extern const struct xfs_buf_ops xfs_bmbt_buf_ops; | |
44 | extern const struct xfs_buf_ops xfs_da3_node_buf_ops; | |
45 | extern const struct xfs_buf_ops xfs_dquot_buf_ops; | |
46 | extern const struct xfs_buf_ops xfs_symlink_buf_ops; | |
47 | extern const struct xfs_buf_ops xfs_agi_buf_ops; | |
48 | extern const struct xfs_buf_ops xfs_inobt_buf_ops; | |
49 | extern const struct xfs_buf_ops xfs_inode_buf_ops; | |
50 | extern const struct xfs_buf_ops xfs_inode_buf_ra_ops; | |
51 | extern const struct xfs_buf_ops xfs_dquot_buf_ops; | |
7d6a13f0 | 52 | extern const struct xfs_buf_ops xfs_dquot_buf_ra_ops; |
70a9883c DC |
53 | extern const struct xfs_buf_ops xfs_sb_buf_ops; |
54 | extern const struct xfs_buf_ops xfs_sb_quiet_buf_ops; | |
55 | extern const struct xfs_buf_ops xfs_symlink_buf_ops; | |
56 | ||
57 | /* | |
58 | * Transaction types. Used to distinguish types of buffers. These never reach | |
59 | * the log. | |
60 | */ | |
61 | #define XFS_TRANS_SETATTR_NOT_SIZE 1 | |
62 | #define XFS_TRANS_SETATTR_SIZE 2 | |
63 | #define XFS_TRANS_INACTIVE 3 | |
64 | #define XFS_TRANS_CREATE 4 | |
65 | #define XFS_TRANS_CREATE_TRUNC 5 | |
66 | #define XFS_TRANS_TRUNCATE_FILE 6 | |
67 | #define XFS_TRANS_REMOVE 7 | |
68 | #define XFS_TRANS_LINK 8 | |
69 | #define XFS_TRANS_RENAME 9 | |
70 | #define XFS_TRANS_MKDIR 10 | |
71 | #define XFS_TRANS_RMDIR 11 | |
72 | #define XFS_TRANS_SYMLINK 12 | |
73 | #define XFS_TRANS_SET_DMATTRS 13 | |
74 | #define XFS_TRANS_GROWFS 14 | |
75 | #define XFS_TRANS_STRAT_WRITE 15 | |
76 | #define XFS_TRANS_DIOSTRAT 16 | |
77 | /* 17 was XFS_TRANS_WRITE_SYNC */ | |
78 | #define XFS_TRANS_WRITEID 18 | |
79 | #define XFS_TRANS_ADDAFORK 19 | |
80 | #define XFS_TRANS_ATTRINVAL 20 | |
81 | #define XFS_TRANS_ATRUNCATE 21 | |
82 | #define XFS_TRANS_ATTR_SET 22 | |
83 | #define XFS_TRANS_ATTR_RM 23 | |
84 | #define XFS_TRANS_ATTR_FLAG 24 | |
85 | #define XFS_TRANS_CLEAR_AGI_BUCKET 25 | |
61e63ecb | 86 | #define XFS_TRANS_SB_CHANGE 26 |
70a9883c DC |
87 | /* |
88 | * Dummy entries since we use the transaction type to index into the | |
89 | * trans_type[] in xlog_recover_print_trans_head() | |
90 | */ | |
91 | #define XFS_TRANS_DUMMY1 27 | |
92 | #define XFS_TRANS_DUMMY2 28 | |
93 | #define XFS_TRANS_QM_QUOTAOFF 29 | |
94 | #define XFS_TRANS_QM_DQALLOC 30 | |
95 | #define XFS_TRANS_QM_SETQLIM 31 | |
96 | #define XFS_TRANS_QM_DQCLUSTER 32 | |
97 | #define XFS_TRANS_QM_QINOCREATE 33 | |
98 | #define XFS_TRANS_QM_QUOTAOFF_END 34 | |
61e63ecb DC |
99 | #define XFS_TRANS_FSYNC_TS 35 |
100 | #define XFS_TRANS_GROWFSRT_ALLOC 36 | |
101 | #define XFS_TRANS_GROWFSRT_ZERO 37 | |
102 | #define XFS_TRANS_GROWFSRT_FREE 38 | |
103 | #define XFS_TRANS_SWAPEXT 39 | |
104 | #define XFS_TRANS_CHECKPOINT 40 | |
105 | #define XFS_TRANS_ICREATE 41 | |
106 | #define XFS_TRANS_CREATE_TMPFILE 42 | |
107 | #define XFS_TRANS_TYPE_MAX 43 | |
70a9883c DC |
108 | /* new transaction types need to be reflected in xfs_logprint(8) */ |
109 | ||
110 | #define XFS_TRANS_TYPES \ | |
111 | { XFS_TRANS_SETATTR_NOT_SIZE, "SETATTR_NOT_SIZE" }, \ | |
112 | { XFS_TRANS_SETATTR_SIZE, "SETATTR_SIZE" }, \ | |
113 | { XFS_TRANS_INACTIVE, "INACTIVE" }, \ | |
114 | { XFS_TRANS_CREATE, "CREATE" }, \ | |
115 | { XFS_TRANS_CREATE_TRUNC, "CREATE_TRUNC" }, \ | |
116 | { XFS_TRANS_TRUNCATE_FILE, "TRUNCATE_FILE" }, \ | |
117 | { XFS_TRANS_REMOVE, "REMOVE" }, \ | |
118 | { XFS_TRANS_LINK, "LINK" }, \ | |
119 | { XFS_TRANS_RENAME, "RENAME" }, \ | |
120 | { XFS_TRANS_MKDIR, "MKDIR" }, \ | |
121 | { XFS_TRANS_RMDIR, "RMDIR" }, \ | |
122 | { XFS_TRANS_SYMLINK, "SYMLINK" }, \ | |
123 | { XFS_TRANS_SET_DMATTRS, "SET_DMATTRS" }, \ | |
124 | { XFS_TRANS_GROWFS, "GROWFS" }, \ | |
125 | { XFS_TRANS_STRAT_WRITE, "STRAT_WRITE" }, \ | |
126 | { XFS_TRANS_DIOSTRAT, "DIOSTRAT" }, \ | |
127 | { XFS_TRANS_WRITEID, "WRITEID" }, \ | |
128 | { XFS_TRANS_ADDAFORK, "ADDAFORK" }, \ | |
129 | { XFS_TRANS_ATTRINVAL, "ATTRINVAL" }, \ | |
130 | { XFS_TRANS_ATRUNCATE, "ATRUNCATE" }, \ | |
131 | { XFS_TRANS_ATTR_SET, "ATTR_SET" }, \ | |
132 | { XFS_TRANS_ATTR_RM, "ATTR_RM" }, \ | |
133 | { XFS_TRANS_ATTR_FLAG, "ATTR_FLAG" }, \ | |
134 | { XFS_TRANS_CLEAR_AGI_BUCKET, "CLEAR_AGI_BUCKET" }, \ | |
61e63ecb DC |
135 | { XFS_TRANS_SB_CHANGE, "SBCHANGE" }, \ |
136 | { XFS_TRANS_DUMMY1, "DUMMY1" }, \ | |
137 | { XFS_TRANS_DUMMY2, "DUMMY2" }, \ | |
70a9883c DC |
138 | { XFS_TRANS_QM_QUOTAOFF, "QM_QUOTAOFF" }, \ |
139 | { XFS_TRANS_QM_DQALLOC, "QM_DQALLOC" }, \ | |
140 | { XFS_TRANS_QM_SETQLIM, "QM_SETQLIM" }, \ | |
141 | { XFS_TRANS_QM_DQCLUSTER, "QM_DQCLUSTER" }, \ | |
142 | { XFS_TRANS_QM_QINOCREATE, "QM_QINOCREATE" }, \ | |
143 | { XFS_TRANS_QM_QUOTAOFF_END, "QM_QOFF_END" }, \ | |
70a9883c DC |
144 | { XFS_TRANS_FSYNC_TS, "FSYNC_TS" }, \ |
145 | { XFS_TRANS_GROWFSRT_ALLOC, "GROWFSRT_ALLOC" }, \ | |
146 | { XFS_TRANS_GROWFSRT_ZERO, "GROWFSRT_ZERO" }, \ | |
147 | { XFS_TRANS_GROWFSRT_FREE, "GROWFSRT_FREE" }, \ | |
148 | { XFS_TRANS_SWAPEXT, "SWAPEXT" }, \ | |
70a9883c | 149 | { XFS_TRANS_CHECKPOINT, "CHECKPOINT" }, \ |
61e63ecb DC |
150 | { XFS_TRANS_ICREATE, "ICREATE" }, \ |
151 | { XFS_TRANS_CREATE_TMPFILE, "CREATE_TMPFILE" }, \ | |
70a9883c DC |
152 | { XLOG_UNMOUNT_REC_TYPE, "UNMOUNT" } |
153 | ||
154 | /* | |
155 | * This structure is used to track log items associated with | |
156 | * a transaction. It points to the log item and keeps some | |
157 | * flags to track the state of the log item. It also tracks | |
158 | * the amount of space needed to log the item it describes | |
159 | * once we get to commit processing (see xfs_trans_commit()). | |
160 | */ | |
161 | struct xfs_log_item_desc { | |
162 | struct xfs_log_item *lid_item; | |
163 | struct list_head lid_trans; | |
164 | unsigned char lid_flags; | |
165 | }; | |
166 | ||
167 | #define XFS_LID_DIRTY 0x1 | |
168 | ||
169 | /* log size calculation functions */ | |
170 | int xfs_log_calc_unit_res(struct xfs_mount *mp, int unit_bytes); | |
171 | int xfs_log_calc_minimum_size(struct xfs_mount *); | |
172 | ||
173 | ||
174 | /* | |
175 | * Values for t_flags. | |
176 | */ | |
177 | #define XFS_TRANS_DIRTY 0x01 /* something needs to be logged */ | |
178 | #define XFS_TRANS_SB_DIRTY 0x02 /* superblock is modified */ | |
179 | #define XFS_TRANS_PERM_LOG_RES 0x04 /* xact took a permanent log res */ | |
180 | #define XFS_TRANS_SYNC 0x08 /* make commit synchronous */ | |
181 | #define XFS_TRANS_DQ_DIRTY 0x10 /* at least one dquot in trx dirty */ | |
182 | #define XFS_TRANS_RESERVE 0x20 /* OK to use reserved data blocks */ | |
183 | #define XFS_TRANS_FREEZE_PROT 0x40 /* Transaction has elevated writer | |
184 | count in superblock */ | |
70a9883c DC |
185 | /* |
186 | * Field values for xfs_trans_mod_sb. | |
187 | */ | |
188 | #define XFS_TRANS_SB_ICOUNT 0x00000001 | |
189 | #define XFS_TRANS_SB_IFREE 0x00000002 | |
190 | #define XFS_TRANS_SB_FDBLOCKS 0x00000004 | |
191 | #define XFS_TRANS_SB_RES_FDBLOCKS 0x00000008 | |
192 | #define XFS_TRANS_SB_FREXTENTS 0x00000010 | |
193 | #define XFS_TRANS_SB_RES_FREXTENTS 0x00000020 | |
194 | #define XFS_TRANS_SB_DBLOCKS 0x00000040 | |
195 | #define XFS_TRANS_SB_AGCOUNT 0x00000080 | |
196 | #define XFS_TRANS_SB_IMAXPCT 0x00000100 | |
197 | #define XFS_TRANS_SB_REXTSIZE 0x00000200 | |
198 | #define XFS_TRANS_SB_RBMBLOCKS 0x00000400 | |
199 | #define XFS_TRANS_SB_RBLOCKS 0x00000800 | |
200 | #define XFS_TRANS_SB_REXTENTS 0x00001000 | |
201 | #define XFS_TRANS_SB_REXTSLOG 0x00002000 | |
202 | ||
203 | /* | |
204 | * Here we centralize the specification of XFS meta-data buffer reference count | |
205 | * values. This determines how hard the buffer cache tries to hold onto the | |
206 | * buffer. | |
207 | */ | |
208 | #define XFS_AGF_REF 4 | |
209 | #define XFS_AGI_REF 4 | |
210 | #define XFS_AGFL_REF 3 | |
211 | #define XFS_INO_BTREE_REF 3 | |
212 | #define XFS_ALLOC_BTREE_REF 2 | |
213 | #define XFS_BMAP_BTREE_REF 2 | |
214 | #define XFS_DIR_BTREE_REF 2 | |
215 | #define XFS_INO_REF 2 | |
216 | #define XFS_ATTR_BTREE_REF 1 | |
217 | #define XFS_DQUOT_REF 1 | |
218 | ||
219 | /* | |
220 | * Flags for xfs_trans_ichgtime(). | |
221 | */ | |
222 | #define XFS_ICHGTIME_MOD 0x1 /* data fork modification timestamp */ | |
223 | #define XFS_ICHGTIME_CHG 0x2 /* inode field change timestamp */ | |
224 | #define XFS_ICHGTIME_CREATE 0x4 /* inode create timestamp */ | |
225 | ||
226 | ||
227 | /* | |
228 | * Symlink decoding/encoding functions | |
229 | */ | |
230 | int xfs_symlink_blocks(struct xfs_mount *mp, int pathlen); | |
231 | int xfs_symlink_hdr_set(struct xfs_mount *mp, xfs_ino_t ino, uint32_t offset, | |
232 | uint32_t size, struct xfs_buf *bp); | |
bda65ef8 | 233 | bool xfs_symlink_hdr_ok(xfs_ino_t ino, uint32_t offset, |
70a9883c DC |
234 | uint32_t size, struct xfs_buf *bp); |
235 | void xfs_symlink_local_to_remote(struct xfs_trans *tp, struct xfs_buf *bp, | |
236 | struct xfs_inode *ip, struct xfs_ifork *ifp); | |
237 | ||
238 | #endif /* __XFS_SHARED_H__ */ |