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 /fs/jbd2/transaction.c | |
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 'fs/jbd2/transaction.c')
-rw-r--r-- | fs/jbd2/transaction.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index 60361c634b5d..f9cd43190b43 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c | |||
@@ -283,12 +283,12 @@ repeat: | |||
283 | * reduce the free space arbitrarily. Be careful to account for | 283 | * reduce the free space arbitrarily. Be careful to account for |
284 | * those buffers when checkpointing. | 284 | * those buffers when checkpointing. |
285 | */ | 285 | */ |
286 | if (__jbd2_log_space_left(journal) < jbd_space_needed(journal)) { | 286 | if (jbd2_log_space_left(journal) < jbd2_space_needed(journal)) { |
287 | jbd_debug(2, "Handle %p waiting for checkpoint...\n", handle); | 287 | jbd_debug(2, "Handle %p waiting for checkpoint...\n", handle); |
288 | atomic_sub(nblocks, &transaction->t_outstanding_credits); | 288 | atomic_sub(nblocks, &transaction->t_outstanding_credits); |
289 | read_unlock(&journal->j_state_lock); | 289 | read_unlock(&journal->j_state_lock); |
290 | write_lock(&journal->j_state_lock); | 290 | write_lock(&journal->j_state_lock); |
291 | if (__jbd2_log_space_left(journal) < jbd_space_needed(journal)) | 291 | if (jbd2_log_space_left(journal) < jbd2_space_needed(journal)) |
292 | __jbd2_log_wait_for_space(journal); | 292 | __jbd2_log_wait_for_space(journal); |
293 | write_unlock(&journal->j_state_lock); | 293 | write_unlock(&journal->j_state_lock); |
294 | goto repeat; | 294 | goto repeat; |
@@ -306,7 +306,7 @@ repeat: | |||
306 | jbd_debug(4, "Handle %p given %d credits (total %d, free %d)\n", | 306 | jbd_debug(4, "Handle %p given %d credits (total %d, free %d)\n", |
307 | handle, nblocks, | 307 | handle, nblocks, |
308 | atomic_read(&transaction->t_outstanding_credits), | 308 | atomic_read(&transaction->t_outstanding_credits), |
309 | __jbd2_log_space_left(journal)); | 309 | jbd2_log_space_left(journal)); |
310 | read_unlock(&journal->j_state_lock); | 310 | read_unlock(&journal->j_state_lock); |
311 | 311 | ||
312 | lock_map_acquire(&handle->h_lockdep_map); | 312 | lock_map_acquire(&handle->h_lockdep_map); |
@@ -441,7 +441,8 @@ int jbd2_journal_extend(handle_t *handle, int nblocks) | |||
441 | goto unlock; | 441 | goto unlock; |
442 | } | 442 | } |
443 | 443 | ||
444 | if (wanted > __jbd2_log_space_left(journal)) { | 444 | if (wanted + (wanted >> JBD2_CONTROL_BLOCKS_SHIFT) > |
445 | jbd2_log_space_left(journal)) { | ||
445 | jbd_debug(3, "denied handle %p %d blocks: " | 446 | jbd_debug(3, "denied handle %p %d blocks: " |
446 | "insufficient log space\n", handle, nblocks); | 447 | "insufficient log space\n", handle, nblocks); |
447 | goto unlock; | 448 | goto unlock; |