Commit 88fe1acb authored by Theodore Ts'o's avatar Theodore Ts'o

jbd2: fold __wait_cp_io into jbd2_log_do_checkpoint()

__wait_cp_io() is only called by jbd2_log_do_checkpoint().  Fold it in
to make it a bit easier to understand.
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent be1158cc
...@@ -183,58 +183,6 @@ void __jbd2_log_wait_for_space(journal_t *journal) ...@@ -183,58 +183,6 @@ void __jbd2_log_wait_for_space(journal_t *journal)
} }
} }
/*
* Clean up transaction's list of buffers submitted for io.
* We wait for any pending IO to complete and remove any clean
* buffers. Note that we take the buffers in the opposite ordering
* from the one in which they were submitted for IO.
*
* Return 0 on success, and return <0 if some buffers have failed
* to be written out.
*
* Called with j_list_lock held.
*/
static int __wait_cp_io(journal_t *journal, transaction_t *transaction)
{
struct journal_head *jh;
struct buffer_head *bh;
tid_t this_tid;
int released = 0;
int ret = 0;
this_tid = transaction->t_tid;
restart:
/* Did somebody clean up the transaction in the meanwhile? */
if (journal->j_checkpoint_transactions != transaction ||
transaction->t_tid != this_tid)
return ret;
while (!released && transaction->t_checkpoint_io_list) {
jh = transaction->t_checkpoint_io_list;
bh = jh2bh(jh);
get_bh(bh);
if (buffer_locked(bh)) {
spin_unlock(&journal->j_list_lock);
wait_on_buffer(bh);
/* the journal_head may have gone by now */
BUFFER_TRACE(bh, "brelse");
__brelse(bh);
spin_lock(&journal->j_list_lock);
goto restart;
}
if (unlikely(buffer_write_io_error(bh)))
ret = -EIO;
/*
* Now in whatever state the buffer currently is, we know that
* it has been written out and so we can drop it from the list
*/
released = __jbd2_journal_remove_checkpoint(jh);
__brelse(bh);
}
return ret;
}
static void static void
__flush_batch(journal_t *journal, int *batch_count) __flush_batch(journal_t *journal, int *batch_count)
{ {
...@@ -268,7 +216,7 @@ int jbd2_log_do_checkpoint(journal_t *journal) ...@@ -268,7 +216,7 @@ int jbd2_log_do_checkpoint(journal_t *journal)
struct buffer_head *bh; struct buffer_head *bh;
transaction_t *transaction; transaction_t *transaction;
tid_t this_tid; tid_t this_tid;
int err, result, batch_count = 0; int result, batch_count = 0, done = 0;
jbd_debug(1, "Start checkpoint\n"); jbd_debug(1, "Start checkpoint\n");
...@@ -384,9 +332,36 @@ int jbd2_log_do_checkpoint(journal_t *journal) ...@@ -384,9 +332,36 @@ int jbd2_log_do_checkpoint(journal_t *journal)
* Now we issued all of the transaction's buffers, let's deal * Now we issued all of the transaction's buffers, let's deal
* with the buffers that are out for I/O. * with the buffers that are out for I/O.
*/ */
err = __wait_cp_io(journal, transaction); restart2:
if (!result) /* Did somebody clean up the transaction in the meanwhile? */
result = err; if (journal->j_checkpoint_transactions != transaction ||
transaction->t_tid != this_tid)
goto out;
while (!done && transaction->t_checkpoint_io_list) {
jh = transaction->t_checkpoint_io_list;
bh = jh2bh(jh);
get_bh(bh);
if (buffer_locked(bh)) {
spin_unlock(&journal->j_list_lock);
wait_on_buffer(bh);
/* the journal_head may have gone by now */
BUFFER_TRACE(bh, "brelse");
__brelse(bh);
spin_lock(&journal->j_list_lock);
goto restart2;
}
if (unlikely(buffer_write_io_error(bh)) && !result)
result = -EIO;
/*
* Now in whatever state the buffer currently is, we
* know that it has been written out and so we can
* drop it from the list
*/
done = __jbd2_journal_remove_checkpoint(jh);
__brelse(bh);
}
out: out:
spin_unlock(&journal->j_list_lock); spin_unlock(&journal->j_list_lock);
if (result < 0) if (result < 0)
......
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