diff options
Diffstat (limited to 'fs/jbd/transaction.c')
-rw-r--r-- | fs/jbd/transaction.c | 48 |
1 files changed, 0 insertions, 48 deletions
diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c index ed886e6db399..73242ba7c7b1 100644 --- a/fs/jbd/transaction.c +++ b/fs/jbd/transaction.c | |||
@@ -1686,35 +1686,6 @@ out: | |||
1686 | return; | 1686 | return; |
1687 | } | 1687 | } |
1688 | 1688 | ||
1689 | /* | ||
1690 | * journal_try_to_free_buffers() could race with journal_commit_transaction() | ||
1691 | * The latter might still hold the a count on buffers when inspecting | ||
1692 | * them on t_syncdata_list or t_locked_list. | ||
1693 | * | ||
1694 | * journal_try_to_free_buffers() will call this function to | ||
1695 | * wait for the current transaction to finish syncing data buffers, before | ||
1696 | * tryinf to free that buffer. | ||
1697 | * | ||
1698 | * Called with journal->j_state_lock held. | ||
1699 | */ | ||
1700 | static void journal_wait_for_transaction_sync_data(journal_t *journal) | ||
1701 | { | ||
1702 | transaction_t *transaction = NULL; | ||
1703 | tid_t tid; | ||
1704 | |||
1705 | spin_lock(&journal->j_state_lock); | ||
1706 | transaction = journal->j_committing_transaction; | ||
1707 | |||
1708 | if (!transaction) { | ||
1709 | spin_unlock(&journal->j_state_lock); | ||
1710 | return; | ||
1711 | } | ||
1712 | |||
1713 | tid = transaction->t_tid; | ||
1714 | spin_unlock(&journal->j_state_lock); | ||
1715 | log_wait_commit(journal, tid); | ||
1716 | } | ||
1717 | |||
1718 | /** | 1689 | /** |
1719 | * int journal_try_to_free_buffers() - try to free page buffers. | 1690 | * int journal_try_to_free_buffers() - try to free page buffers. |
1720 | * @journal: journal for operation | 1691 | * @journal: journal for operation |
@@ -1786,25 +1757,6 @@ int journal_try_to_free_buffers(journal_t *journal, | |||
1786 | 1757 | ||
1787 | ret = try_to_free_buffers(page); | 1758 | ret = try_to_free_buffers(page); |
1788 | 1759 | ||
1789 | /* | ||
1790 | * There are a number of places where journal_try_to_free_buffers() | ||
1791 | * could race with journal_commit_transaction(), the later still | ||
1792 | * holds the reference to the buffers to free while processing them. | ||
1793 | * try_to_free_buffers() failed to free those buffers. Some of the | ||
1794 | * caller of releasepage() request page buffers to be dropped, otherwise | ||
1795 | * treat the fail-to-free as errors (such as generic_file_direct_IO()) | ||
1796 | * | ||
1797 | * So, if the caller of try_to_release_page() wants the synchronous | ||
1798 | * behaviour(i.e make sure buffers are dropped upon return), | ||
1799 | * let's wait for the current transaction to finish flush of | ||
1800 | * dirty data buffers, then try to free those buffers again, | ||
1801 | * with the journal locked. | ||
1802 | */ | ||
1803 | if (ret == 0 && (gfp_mask & __GFP_WAIT) && (gfp_mask & __GFP_FS)) { | ||
1804 | journal_wait_for_transaction_sync_data(journal); | ||
1805 | ret = try_to_free_buffers(page); | ||
1806 | } | ||
1807 | |||
1808 | busy: | 1760 | busy: |
1809 | return ret; | 1761 | return ret; |
1810 | } | 1762 | } |