Commit 9338e33f authored by Alex Tomas's avatar Alex Tomas Committed by Linus Torvalds

[PATCH] JBD: log space management optimization

during truncate ext3 calls journal_forget() for freed blocks, but before
these blocks go to the transaction and jbd reserves space in log for them
(->t_outstanding_credits).  also, journal_forget() removes these blocks
from the transaction, but doesn't correct log space reservation.  for
example, removal of 500MB file reserves 136 blocks, but only 10 blocks go
to the log.  a commit is expensive and correct reservation allows us to
avoid needless commits.  here is the patch.  tested on UP.
Signed-off-by: default avatarAlex Tomas <alex@clusterfs.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 96761507
...@@ -1187,6 +1187,7 @@ int journal_forget (handle_t *handle, struct buffer_head *bh) ...@@ -1187,6 +1187,7 @@ int journal_forget (handle_t *handle, struct buffer_head *bh)
transaction_t *transaction = handle->h_transaction; transaction_t *transaction = handle->h_transaction;
journal_t *journal = transaction->t_journal; journal_t *journal = transaction->t_journal;
struct journal_head *jh; struct journal_head *jh;
int drop_reserve = 0;
int err = 0; int err = 0;
BUFFER_TRACE(bh, "entry"); BUFFER_TRACE(bh, "entry");
...@@ -1224,6 +1225,7 @@ int journal_forget (handle_t *handle, struct buffer_head *bh) ...@@ -1224,6 +1225,7 @@ int journal_forget (handle_t *handle, struct buffer_head *bh)
JBUFFER_TRACE(jh, "belongs to current transaction: unfile"); JBUFFER_TRACE(jh, "belongs to current transaction: unfile");
__journal_unfile_buffer(jh); __journal_unfile_buffer(jh);
drop_reserve = 1;
/* /*
* We are no longer going to journal this buffer. * We are no longer going to journal this buffer.
...@@ -1246,7 +1248,7 @@ int journal_forget (handle_t *handle, struct buffer_head *bh) ...@@ -1246,7 +1248,7 @@ int journal_forget (handle_t *handle, struct buffer_head *bh)
spin_unlock(&journal->j_list_lock); spin_unlock(&journal->j_list_lock);
jbd_unlock_bh_state(bh); jbd_unlock_bh_state(bh);
__bforget(bh); __bforget(bh);
return 0; goto drop;
} }
} }
} else if (jh->b_transaction) { } else if (jh->b_transaction) {
...@@ -1261,6 +1263,7 @@ int journal_forget (handle_t *handle, struct buffer_head *bh) ...@@ -1261,6 +1263,7 @@ int journal_forget (handle_t *handle, struct buffer_head *bh)
if (jh->b_next_transaction) { if (jh->b_next_transaction) {
J_ASSERT(jh->b_next_transaction == transaction); J_ASSERT(jh->b_next_transaction == transaction);
jh->b_next_transaction = NULL; jh->b_next_transaction = NULL;
drop_reserve = 1;
} }
} }
...@@ -1268,6 +1271,11 @@ int journal_forget (handle_t *handle, struct buffer_head *bh) ...@@ -1268,6 +1271,11 @@ int journal_forget (handle_t *handle, struct buffer_head *bh)
spin_unlock(&journal->j_list_lock); spin_unlock(&journal->j_list_lock);
jbd_unlock_bh_state(bh); jbd_unlock_bh_state(bh);
__brelse(bh); __brelse(bh);
drop:
if (drop_reserve) {
/* no need to reserve log space for this block -bzzz */
handle->h_buffer_credits++;
}
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment