Skip to content

Commit

Permalink
jbd: clean up journal_try_to_free_buffers()
Browse files Browse the repository at this point in the history
I delete the following patch
"commit 3f31fdd
Author: Mingming Cao <cmm@us.ibm.com>
Date:   Fri Jul 25 01:46:22 2008 -0700

    jbd: fix race between free buffer and commit transaction

This patch is no longer needed because if race between freeing buffer and
committing transaction functionality occurs and dio gets error, currently
dio falls back to buffered IO by the following patch.

	commit 6ccfa80
	Author: Hisashi Hifumi <hifumi.hisashi@oss.ntt.co.jp>
	Date:   Tue Sep 2 14:35:40 2008 -0700

   	VFS: fix dio write returning EIO when try_to_release_page fails

Signed-off-by: Hisashi Hifumi <hifumi.hisashi@oss.ntt.co.jp>
Cc: Theodore Tso <tytso@mit.edu>
Cc: Mingming Cao <cmm@us.ibm.com>
Acked-by: Jan Kara <jack@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Hisashi Hifumi authored and Linus Torvalds committed Jun 18, 2009
1 parent e8ef7aa commit 6f3f1cb
Showing 1 changed file with 0 additions and 48 deletions.
48 changes: 0 additions & 48 deletions fs/jbd/transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -1686,35 +1686,6 @@ __journal_try_to_free_buffer(journal_t *journal, struct buffer_head *bh)
return;
}

/*
* journal_try_to_free_buffers() could race with journal_commit_transaction()
* The latter might still hold the a count on buffers when inspecting
* them on t_syncdata_list or t_locked_list.
*
* journal_try_to_free_buffers() will call this function to
* wait for the current transaction to finish syncing data buffers, before
* tryinf to free that buffer.
*
* Called with journal->j_state_lock held.
*/
static void journal_wait_for_transaction_sync_data(journal_t *journal)
{
transaction_t *transaction = NULL;
tid_t tid;

spin_lock(&journal->j_state_lock);
transaction = journal->j_committing_transaction;

if (!transaction) {
spin_unlock(&journal->j_state_lock);
return;
}

tid = transaction->t_tid;
spin_unlock(&journal->j_state_lock);
log_wait_commit(journal, tid);
}

/**
* int journal_try_to_free_buffers() - try to free page buffers.
* @journal: journal for operation
Expand Down Expand Up @@ -1786,25 +1757,6 @@ int journal_try_to_free_buffers(journal_t *journal,

ret = try_to_free_buffers(page);

/*
* There are a number of places where journal_try_to_free_buffers()
* could race with journal_commit_transaction(), the later still
* holds the reference to the buffers to free while processing them.
* try_to_free_buffers() failed to free those buffers. Some of the
* caller of releasepage() request page buffers to be dropped, otherwise
* treat the fail-to-free as errors (such as generic_file_direct_IO())
*
* So, if the caller of try_to_release_page() wants the synchronous
* behaviour(i.e make sure buffers are dropped upon return),
* let's wait for the current transaction to finish flush of
* dirty data buffers, then try to free those buffers again,
* with the journal locked.
*/
if (ret == 0 && (gfp_mask & __GFP_WAIT) && (gfp_mask & __GFP_FS)) {
journal_wait_for_transaction_sync_data(journal);
ret = try_to_free_buffers(page);
}

busy:
return ret;
}
Expand Down

0 comments on commit 6f3f1cb

Please sign in to comment.