diff options
author | Jan Kara <jack@suse.cz> | 2013-06-04 12:12:57 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2013-06-04 12:12:57 -0400 |
commit | 76c39904561004ac8675f858a290129e439d5168 (patch) | |
tree | 46b2c2800ffbad5dd2ebd4ceb66893414630df2b /include/linux/jbd2.h | |
parent | 2f387f849b6a5be5b4b914c43a8af0406279db11 (diff) |
jbd2: cleanup needed free block estimates when starting a transaction
__jbd2_log_space_left() and jbd_space_needed() were kind of odd.
jbd_space_needed() accounted also credits needed for currently
committing transaction while it didn't account for credits needed for
control blocks. __jbd2_log_space_left() then accounted for control
blocks as a fraction of free space. Since results of these two
functions are always only compared against each other, this works
correct but is somewhat strange. Move the estimates so that
jbd_space_needed() returns number of blocks needed for a transaction
including control blocks and __jbd2_log_space_left() returns free
space in the journal (with the committing transaction already
subtracted). Rename functions to jbd2_log_space_left() and
jbd2_space_needed() while we are changing them.
Reviewed-by: Zheng Liu <wenqing.lz@taobao.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'include/linux/jbd2.h')
-rw-r--r-- | include/linux/jbd2.h | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index e33e84b3d5c8..7a1f6cd864c8 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h | |||
@@ -1220,7 +1220,6 @@ extern void jbd2_clear_buffer_revoked_flags(journal_t *journal); | |||
1220 | * transitions on demand. | 1220 | * transitions on demand. |
1221 | */ | 1221 | */ |
1222 | 1222 | ||
1223 | int __jbd2_log_space_left(journal_t *); /* Called with journal locked */ | ||
1224 | int jbd2_log_start_commit(journal_t *journal, tid_t tid); | 1223 | int jbd2_log_start_commit(journal_t *journal, tid_t tid); |
1225 | int __jbd2_log_start_commit(journal_t *journal, tid_t tid); | 1224 | int __jbd2_log_start_commit(journal_t *journal, tid_t tid); |
1226 | int jbd2_journal_start_commit(journal_t *journal, tid_t *tid); | 1225 | int jbd2_journal_start_commit(journal_t *journal, tid_t *tid); |
@@ -1291,16 +1290,37 @@ extern int jbd2_journal_blocks_per_page(struct inode *inode); | |||
1291 | extern size_t journal_tag_bytes(journal_t *journal); | 1290 | extern size_t journal_tag_bytes(journal_t *journal); |
1292 | 1291 | ||
1293 | /* | 1292 | /* |
1293 | * We reserve t_outstanding_credits >> JBD2_CONTROL_BLOCKS_SHIFT for | ||
1294 | * transaction control blocks. | ||
1295 | */ | ||
1296 | #define JBD2_CONTROL_BLOCKS_SHIFT 5 | ||
1297 | |||
1298 | /* | ||
1294 | * Return the minimum number of blocks which must be free in the journal | 1299 | * Return the minimum number of blocks which must be free in the journal |
1295 | * before a new transaction may be started. Must be called under j_state_lock. | 1300 | * before a new transaction may be started. Must be called under j_state_lock. |
1296 | */ | 1301 | */ |
1297 | static inline int jbd_space_needed(journal_t *journal) | 1302 | static inline int jbd2_space_needed(journal_t *journal) |
1298 | { | 1303 | { |
1299 | int nblocks = journal->j_max_transaction_buffers; | 1304 | int nblocks = journal->j_max_transaction_buffers; |
1300 | if (journal->j_committing_transaction) | 1305 | return nblocks + (nblocks >> JBD2_CONTROL_BLOCKS_SHIFT); |
1301 | nblocks += atomic_read(&journal->j_committing_transaction-> | 1306 | } |
1302 | t_outstanding_credits); | 1307 | |
1303 | return nblocks; | 1308 | /* |
1309 | * Return number of free blocks in the log. Must be called under j_state_lock. | ||
1310 | */ | ||
1311 | static inline unsigned long jbd2_log_space_left(journal_t *journal) | ||
1312 | { | ||
1313 | /* Allow for rounding errors */ | ||
1314 | unsigned long free = journal->j_free - 32; | ||
1315 | |||
1316 | if (journal->j_committing_transaction) { | ||
1317 | unsigned long committing = atomic_read(&journal-> | ||
1318 | j_committing_transaction->t_outstanding_credits); | ||
1319 | |||
1320 | /* Transaction + control blocks */ | ||
1321 | free -= committing + (committing >> JBD2_CONTROL_BLOCKS_SHIFT); | ||
1322 | } | ||
1323 | return free; | ||
1304 | } | 1324 | } |
1305 | 1325 | ||
1306 | /* | 1326 | /* |