0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef _EXT4_JBD2_H
0013 #define _EXT4_JBD2_H
0014
0015 #include <linux/fs.h>
0016 #include <linux/jbd2.h>
0017 #include "ext4.h"
0018
0019 #define EXT4_JOURNAL(inode) (EXT4_SB((inode)->i_sb)->s_journal)
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 #define EXT4_SINGLEDATA_TRANS_BLOCKS(sb) \
0034 (ext4_has_feature_extents(sb) ? 20U : 8U)
0035
0036
0037
0038
0039
0040 #define EXT4_XATTR_TRANS_BLOCKS 6U
0041
0042
0043
0044
0045
0046
0047
0048 #define EXT4_DATA_TRANS_BLOCKS(sb) (EXT4_SINGLEDATA_TRANS_BLOCKS(sb) + \
0049 EXT4_XATTR_TRANS_BLOCKS - 2 + \
0050 EXT4_MAXQUOTAS_TRANS_BLOCKS(sb))
0051
0052
0053
0054
0055
0056
0057 #define EXT4_META_TRANS_BLOCKS(sb) (EXT4_XATTR_TRANS_BLOCKS + \
0058 EXT4_MAXQUOTAS_TRANS_BLOCKS(sb))
0059
0060
0061
0062
0063
0064
0065
0066 #define EXT4_MAX_TRANS_DATA 64U
0067
0068
0069
0070
0071
0072
0073
0074
0075 #define EXT4_RESERVE_TRANS_BLOCKS 12U
0076
0077
0078
0079
0080
0081
0082
0083
0084 #define EXT4_INDEX_EXTRA_TRANS_BLOCKS 12U
0085
0086 #ifdef CONFIG_QUOTA
0087
0088
0089 #define EXT4_QUOTA_TRANS_BLOCKS(sb) ((ext4_quota_capable(sb)) ? 1 : 0)
0090
0091
0092 #define EXT4_QUOTA_INIT_BLOCKS(sb) ((ext4_quota_capable(sb)) ?\
0093 (DQUOT_INIT_ALLOC*(EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)\
0094 +3+DQUOT_INIT_REWRITE) : 0)
0095
0096 #define EXT4_QUOTA_DEL_BLOCKS(sb) ((ext4_quota_capable(sb)) ?\
0097 (DQUOT_DEL_ALLOC*(EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)\
0098 +3+DQUOT_DEL_REWRITE) : 0)
0099 #else
0100 #define EXT4_QUOTA_TRANS_BLOCKS(sb) 0
0101 #define EXT4_QUOTA_INIT_BLOCKS(sb) 0
0102 #define EXT4_QUOTA_DEL_BLOCKS(sb) 0
0103 #endif
0104 #define EXT4_MAXQUOTAS_TRANS_BLOCKS(sb) (EXT4_MAXQUOTAS*EXT4_QUOTA_TRANS_BLOCKS(sb))
0105 #define EXT4_MAXQUOTAS_INIT_BLOCKS(sb) (EXT4_MAXQUOTAS*EXT4_QUOTA_INIT_BLOCKS(sb))
0106 #define EXT4_MAXQUOTAS_DEL_BLOCKS(sb) (EXT4_MAXQUOTAS*EXT4_QUOTA_DEL_BLOCKS(sb))
0107
0108
0109
0110
0111 #define EXT4_HT_MISC 0
0112 #define EXT4_HT_INODE 1
0113 #define EXT4_HT_WRITE_PAGE 2
0114 #define EXT4_HT_MAP_BLOCKS 3
0115 #define EXT4_HT_DIR 4
0116 #define EXT4_HT_TRUNCATE 5
0117 #define EXT4_HT_QUOTA 6
0118 #define EXT4_HT_RESIZE 7
0119 #define EXT4_HT_MIGRATE 8
0120 #define EXT4_HT_MOVE_EXTENTS 9
0121 #define EXT4_HT_XATTR 10
0122 #define EXT4_HT_EXT_CONVERT 11
0123 #define EXT4_HT_MAX 12
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133 struct ext4_journal_cb_entry {
0134
0135 struct list_head jce_list;
0136
0137
0138 void (*jce_func)(struct super_block *sb,
0139 struct ext4_journal_cb_entry *jce, int error);
0140
0141
0142 };
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165 static inline void _ext4_journal_callback_add(handle_t *handle,
0166 struct ext4_journal_cb_entry *jce)
0167 {
0168
0169 list_add_tail(&jce->jce_list, &handle->h_transaction->t_private_list);
0170 }
0171
0172 static inline void ext4_journal_callback_add(handle_t *handle,
0173 void (*func)(struct super_block *sb,
0174 struct ext4_journal_cb_entry *jce,
0175 int rc),
0176 struct ext4_journal_cb_entry *jce)
0177 {
0178 struct ext4_sb_info *sbi =
0179 EXT4_SB(handle->h_transaction->t_journal->j_private);
0180
0181
0182 jce->jce_func = func;
0183 spin_lock(&sbi->s_md_lock);
0184 _ext4_journal_callback_add(handle, jce);
0185 spin_unlock(&sbi->s_md_lock);
0186 }
0187
0188
0189
0190
0191
0192
0193
0194
0195 static inline bool ext4_journal_callback_try_del(handle_t *handle,
0196 struct ext4_journal_cb_entry *jce)
0197 {
0198 bool deleted;
0199 struct ext4_sb_info *sbi =
0200 EXT4_SB(handle->h_transaction->t_journal->j_private);
0201
0202 spin_lock(&sbi->s_md_lock);
0203 deleted = !list_empty(&jce->jce_list);
0204 list_del_init(&jce->jce_list);
0205 spin_unlock(&sbi->s_md_lock);
0206 return deleted;
0207 }
0208
0209 int
0210 ext4_mark_iloc_dirty(handle_t *handle,
0211 struct inode *inode,
0212 struct ext4_iloc *iloc);
0213
0214
0215
0216
0217
0218
0219 int ext4_reserve_inode_write(handle_t *handle, struct inode *inode,
0220 struct ext4_iloc *iloc);
0221
0222 #define ext4_mark_inode_dirty(__h, __i) \
0223 __ext4_mark_inode_dirty((__h), (__i), __func__, __LINE__)
0224 int __ext4_mark_inode_dirty(handle_t *handle, struct inode *inode,
0225 const char *func, unsigned int line);
0226
0227 int ext4_expand_extra_isize(struct inode *inode,
0228 unsigned int new_extra_isize,
0229 struct ext4_iloc *iloc);
0230
0231
0232
0233 int __ext4_journal_get_write_access(const char *where, unsigned int line,
0234 handle_t *handle, struct super_block *sb,
0235 struct buffer_head *bh,
0236 enum ext4_journal_trigger_type trigger_type);
0237
0238 int __ext4_forget(const char *where, unsigned int line, handle_t *handle,
0239 int is_metadata, struct inode *inode,
0240 struct buffer_head *bh, ext4_fsblk_t blocknr);
0241
0242 int __ext4_journal_get_create_access(const char *where, unsigned int line,
0243 handle_t *handle, struct super_block *sb,
0244 struct buffer_head *bh,
0245 enum ext4_journal_trigger_type trigger_type);
0246
0247 int __ext4_handle_dirty_metadata(const char *where, unsigned int line,
0248 handle_t *handle, struct inode *inode,
0249 struct buffer_head *bh);
0250
0251 #define ext4_journal_get_write_access(handle, sb, bh, trigger_type) \
0252 __ext4_journal_get_write_access(__func__, __LINE__, (handle), (sb), \
0253 (bh), (trigger_type))
0254 #define ext4_forget(handle, is_metadata, inode, bh, block_nr) \
0255 __ext4_forget(__func__, __LINE__, (handle), (is_metadata), (inode), \
0256 (bh), (block_nr))
0257 #define ext4_journal_get_create_access(handle, sb, bh, trigger_type) \
0258 __ext4_journal_get_create_access(__func__, __LINE__, (handle), (sb), \
0259 (bh), (trigger_type))
0260 #define ext4_handle_dirty_metadata(handle, inode, bh) \
0261 __ext4_handle_dirty_metadata(__func__, __LINE__, (handle), (inode), \
0262 (bh))
0263
0264 handle_t *__ext4_journal_start_sb(struct super_block *sb, unsigned int line,
0265 int type, int blocks, int rsv_blocks,
0266 int revoke_creds);
0267 int __ext4_journal_stop(const char *where, unsigned int line, handle_t *handle);
0268
0269 #define EXT4_NOJOURNAL_MAX_REF_COUNT ((unsigned long) 4096)
0270
0271
0272
0273 static inline int ext4_handle_valid(handle_t *handle)
0274 {
0275 if ((unsigned long)handle < EXT4_NOJOURNAL_MAX_REF_COUNT)
0276 return 0;
0277 return 1;
0278 }
0279
0280 static inline void ext4_handle_sync(handle_t *handle)
0281 {
0282 if (ext4_handle_valid(handle))
0283 handle->h_sync = 1;
0284 }
0285
0286 static inline int ext4_handle_is_aborted(handle_t *handle)
0287 {
0288 if (ext4_handle_valid(handle))
0289 return is_handle_aborted(handle);
0290 return 0;
0291 }
0292
0293 static inline int ext4_free_metadata_revoke_credits(struct super_block *sb,
0294 int blocks)
0295 {
0296
0297 return blocks * EXT4_SB(sb)->s_cluster_ratio;
0298 }
0299
0300 static inline int ext4_trans_default_revoke_credits(struct super_block *sb)
0301 {
0302 return ext4_free_metadata_revoke_credits(sb, 8);
0303 }
0304
0305 #define ext4_journal_start_sb(sb, type, nblocks) \
0306 __ext4_journal_start_sb((sb), __LINE__, (type), (nblocks), 0, \
0307 ext4_trans_default_revoke_credits(sb))
0308
0309 #define ext4_journal_start(inode, type, nblocks) \
0310 __ext4_journal_start((inode), __LINE__, (type), (nblocks), 0, \
0311 ext4_trans_default_revoke_credits((inode)->i_sb))
0312
0313 #define ext4_journal_start_with_reserve(inode, type, blocks, rsv_blocks)\
0314 __ext4_journal_start((inode), __LINE__, (type), (blocks), (rsv_blocks),\
0315 ext4_trans_default_revoke_credits((inode)->i_sb))
0316
0317 #define ext4_journal_start_with_revoke(inode, type, blocks, revoke_creds) \
0318 __ext4_journal_start((inode), __LINE__, (type), (blocks), 0, \
0319 (revoke_creds))
0320
0321 static inline handle_t *__ext4_journal_start(struct inode *inode,
0322 unsigned int line, int type,
0323 int blocks, int rsv_blocks,
0324 int revoke_creds)
0325 {
0326 return __ext4_journal_start_sb(inode->i_sb, line, type, blocks,
0327 rsv_blocks, revoke_creds);
0328 }
0329
0330 #define ext4_journal_stop(handle) \
0331 __ext4_journal_stop(__func__, __LINE__, (handle))
0332
0333 #define ext4_journal_start_reserved(handle, type) \
0334 __ext4_journal_start_reserved((handle), __LINE__, (type))
0335
0336 handle_t *__ext4_journal_start_reserved(handle_t *handle, unsigned int line,
0337 int type);
0338
0339 static inline handle_t *ext4_journal_current_handle(void)
0340 {
0341 return journal_current_handle();
0342 }
0343
0344 static inline int ext4_journal_extend(handle_t *handle, int nblocks, int revoke)
0345 {
0346 if (ext4_handle_valid(handle))
0347 return jbd2_journal_extend(handle, nblocks, revoke);
0348 return 0;
0349 }
0350
0351 static inline int ext4_journal_restart(handle_t *handle, int nblocks,
0352 int revoke)
0353 {
0354 if (ext4_handle_valid(handle))
0355 return jbd2__journal_restart(handle, nblocks, revoke, GFP_NOFS);
0356 return 0;
0357 }
0358
0359 int __ext4_journal_ensure_credits(handle_t *handle, int check_cred,
0360 int extend_cred, int revoke_cred);
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373 #define ext4_journal_ensure_credits_fn(handle, check_cred, extend_cred, \
0374 revoke_cred, fn) \
0375 ({ \
0376 __label__ __ensure_end; \
0377 int err = __ext4_journal_ensure_credits((handle), (check_cred), \
0378 (extend_cred), (revoke_cred)); \
0379 \
0380 if (err <= 0) \
0381 goto __ensure_end; \
0382 err = (fn); \
0383 if (err < 0) \
0384 goto __ensure_end; \
0385 err = ext4_journal_restart((handle), (extend_cred), (revoke_cred)); \
0386 if (err == 0) \
0387 err = 1; \
0388 __ensure_end: \
0389 err; \
0390 })
0391
0392
0393
0394
0395
0396
0397
0398
0399 static inline int ext4_journal_ensure_credits(handle_t *handle, int credits,
0400 int revoke_creds)
0401 {
0402 return ext4_journal_ensure_credits_fn(handle, credits, credits,
0403 revoke_creds, 0);
0404 }
0405
0406 static inline int ext4_journal_blocks_per_page(struct inode *inode)
0407 {
0408 if (EXT4_JOURNAL(inode) != NULL)
0409 return jbd2_journal_blocks_per_page(inode);
0410 return 0;
0411 }
0412
0413 static inline int ext4_journal_force_commit(journal_t *journal)
0414 {
0415 if (journal)
0416 return jbd2_journal_force_commit(journal);
0417 return 0;
0418 }
0419
0420 static inline int ext4_jbd2_inode_add_write(handle_t *handle,
0421 struct inode *inode, loff_t start_byte, loff_t length)
0422 {
0423 if (ext4_handle_valid(handle))
0424 return jbd2_journal_inode_ranged_write(handle,
0425 EXT4_I(inode)->jinode, start_byte, length);
0426 return 0;
0427 }
0428
0429 static inline int ext4_jbd2_inode_add_wait(handle_t *handle,
0430 struct inode *inode, loff_t start_byte, loff_t length)
0431 {
0432 if (ext4_handle_valid(handle))
0433 return jbd2_journal_inode_ranged_wait(handle,
0434 EXT4_I(inode)->jinode, start_byte, length);
0435 return 0;
0436 }
0437
0438 static inline void ext4_update_inode_fsync_trans(handle_t *handle,
0439 struct inode *inode,
0440 int datasync)
0441 {
0442 struct ext4_inode_info *ei = EXT4_I(inode);
0443
0444 if (ext4_handle_valid(handle) && !is_handle_aborted(handle)) {
0445 ei->i_sync_tid = handle->h_transaction->t_tid;
0446 if (datasync)
0447 ei->i_datasync_tid = handle->h_transaction->t_tid;
0448 }
0449 }
0450
0451
0452 int ext4_force_commit(struct super_block *sb);
0453
0454
0455
0456
0457 #define EXT4_INODE_JOURNAL_DATA_MODE 0x01
0458 #define EXT4_INODE_ORDERED_DATA_MODE 0x02
0459 #define EXT4_INODE_WRITEBACK_DATA_MODE 0x04
0460
0461 int ext4_inode_journal_mode(struct inode *inode);
0462
0463 static inline int ext4_should_journal_data(struct inode *inode)
0464 {
0465 return ext4_inode_journal_mode(inode) & EXT4_INODE_JOURNAL_DATA_MODE;
0466 }
0467
0468 static inline int ext4_should_order_data(struct inode *inode)
0469 {
0470 return ext4_inode_journal_mode(inode) & EXT4_INODE_ORDERED_DATA_MODE;
0471 }
0472
0473 static inline int ext4_should_writeback_data(struct inode *inode)
0474 {
0475 return ext4_inode_journal_mode(inode) & EXT4_INODE_WRITEBACK_DATA_MODE;
0476 }
0477
0478 static inline int ext4_free_data_revoke_credits(struct inode *inode, int blocks)
0479 {
0480 if (test_opt(inode->i_sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA)
0481 return 0;
0482 if (!ext4_should_journal_data(inode))
0483 return 0;
0484
0485
0486
0487
0488 return blocks + 2*(EXT4_SB(inode->i_sb)->s_cluster_ratio - 1);
0489 }
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500 static inline int ext4_should_dioread_nolock(struct inode *inode)
0501 {
0502 if (!test_opt(inode->i_sb, DIOREAD_NOLOCK))
0503 return 0;
0504 if (!S_ISREG(inode->i_mode))
0505 return 0;
0506 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)))
0507 return 0;
0508 if (ext4_should_journal_data(inode))
0509 return 0;
0510
0511 if (!test_opt(inode->i_sb, DELALLOC))
0512 return 0;
0513 return 1;
0514 }
0515
0516 #endif