diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/ext4/ext4_jbd2.h | 3 | ||||
| -rw-r--r-- | fs/jbd2/commit.c | 4 | ||||
| -rw-r--r-- | fs/jbd2/journal.c | 3 | ||||
| -rw-r--r-- | fs/jbd2/transaction.c | 22 | ||||
| -rw-r--r-- | fs/ocfs2/journal.h | 2 |
5 files changed, 27 insertions, 7 deletions
diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h index 5f5846211095..f1c940b38b30 100644 --- a/fs/ext4/ext4_jbd2.h +++ b/fs/ext4/ext4_jbd2.h | |||
| @@ -362,7 +362,8 @@ static inline int ext4_journal_force_commit(journal_t *journal) | |||
| 362 | static inline int ext4_jbd2_file_inode(handle_t *handle, struct inode *inode) | 362 | static inline int ext4_jbd2_file_inode(handle_t *handle, struct inode *inode) |
| 363 | { | 363 | { |
| 364 | if (ext4_handle_valid(handle)) | 364 | if (ext4_handle_valid(handle)) |
| 365 | return jbd2_journal_file_inode(handle, EXT4_I(inode)->jinode); | 365 | return jbd2_journal_inode_add_write(handle, |
| 366 | EXT4_I(inode)->jinode); | ||
| 366 | return 0; | 367 | return 0; |
| 367 | } | 368 | } |
| 368 | 369 | ||
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index 2ad98d6e19f4..70078096117d 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c | |||
| @@ -219,6 +219,8 @@ static int journal_submit_data_buffers(journal_t *journal, | |||
| 219 | 219 | ||
| 220 | spin_lock(&journal->j_list_lock); | 220 | spin_lock(&journal->j_list_lock); |
| 221 | list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) { | 221 | list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) { |
| 222 | if (!(jinode->i_flags & JI_WRITE_DATA)) | ||
| 223 | continue; | ||
| 222 | mapping = jinode->i_vfs_inode->i_mapping; | 224 | mapping = jinode->i_vfs_inode->i_mapping; |
| 223 | jinode->i_flags |= JI_COMMIT_RUNNING; | 225 | jinode->i_flags |= JI_COMMIT_RUNNING; |
| 224 | spin_unlock(&journal->j_list_lock); | 226 | spin_unlock(&journal->j_list_lock); |
| @@ -256,6 +258,8 @@ static int journal_finish_inode_data_buffers(journal_t *journal, | |||
| 256 | /* For locking, see the comment in journal_submit_data_buffers() */ | 258 | /* For locking, see the comment in journal_submit_data_buffers() */ |
| 257 | spin_lock(&journal->j_list_lock); | 259 | spin_lock(&journal->j_list_lock); |
| 258 | list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) { | 260 | list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) { |
| 261 | if (!(jinode->i_flags & JI_WAIT_DATA)) | ||
| 262 | continue; | ||
| 259 | jinode->i_flags |= JI_COMMIT_RUNNING; | 263 | jinode->i_flags |= JI_COMMIT_RUNNING; |
| 260 | spin_unlock(&journal->j_list_lock); | 264 | spin_unlock(&journal->j_list_lock); |
| 261 | err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping); | 265 | err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping); |
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 435f0b26ac20..b31852f76f46 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c | |||
| @@ -94,7 +94,8 @@ EXPORT_SYMBOL(jbd2_journal_blocks_per_page); | |||
| 94 | EXPORT_SYMBOL(jbd2_journal_invalidatepage); | 94 | EXPORT_SYMBOL(jbd2_journal_invalidatepage); |
| 95 | EXPORT_SYMBOL(jbd2_journal_try_to_free_buffers); | 95 | EXPORT_SYMBOL(jbd2_journal_try_to_free_buffers); |
| 96 | EXPORT_SYMBOL(jbd2_journal_force_commit); | 96 | EXPORT_SYMBOL(jbd2_journal_force_commit); |
| 97 | EXPORT_SYMBOL(jbd2_journal_file_inode); | 97 | EXPORT_SYMBOL(jbd2_journal_inode_add_write); |
| 98 | EXPORT_SYMBOL(jbd2_journal_inode_add_wait); | ||
| 98 | EXPORT_SYMBOL(jbd2_journal_init_jbd_inode); | 99 | EXPORT_SYMBOL(jbd2_journal_init_jbd_inode); |
| 99 | EXPORT_SYMBOL(jbd2_journal_release_jbd_inode); | 100 | EXPORT_SYMBOL(jbd2_journal_release_jbd_inode); |
| 100 | EXPORT_SYMBOL(jbd2_journal_begin_ordered_truncate); | 101 | EXPORT_SYMBOL(jbd2_journal_begin_ordered_truncate); |
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index 67c103867bf8..be56c8ca34c2 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c | |||
| @@ -2462,7 +2462,8 @@ void jbd2_journal_refile_buffer(journal_t *journal, struct journal_head *jh) | |||
| 2462 | /* | 2462 | /* |
| 2463 | * File inode in the inode list of the handle's transaction | 2463 | * File inode in the inode list of the handle's transaction |
| 2464 | */ | 2464 | */ |
| 2465 | int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *jinode) | 2465 | static int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *jinode, |
| 2466 | unsigned long flags) | ||
| 2466 | { | 2467 | { |
| 2467 | transaction_t *transaction = handle->h_transaction; | 2468 | transaction_t *transaction = handle->h_transaction; |
| 2468 | journal_t *journal; | 2469 | journal_t *journal; |
| @@ -2487,12 +2488,14 @@ int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *jinode) | |||
| 2487 | * and if jinode->i_next_transaction == transaction, commit code | 2488 | * and if jinode->i_next_transaction == transaction, commit code |
| 2488 | * will only file the inode where we want it. | 2489 | * will only file the inode where we want it. |
| 2489 | */ | 2490 | */ |
| 2490 | if (jinode->i_transaction == transaction || | 2491 | if ((jinode->i_transaction == transaction || |
| 2491 | jinode->i_next_transaction == transaction) | 2492 | jinode->i_next_transaction == transaction) && |
| 2493 | (jinode->i_flags & flags) == flags) | ||
| 2492 | return 0; | 2494 | return 0; |
| 2493 | 2495 | ||
| 2494 | spin_lock(&journal->j_list_lock); | 2496 | spin_lock(&journal->j_list_lock); |
| 2495 | 2497 | jinode->i_flags |= flags; | |
| 2498 | /* Is inode already attached where we need it? */ | ||
| 2496 | if (jinode->i_transaction == transaction || | 2499 | if (jinode->i_transaction == transaction || |
| 2497 | jinode->i_next_transaction == transaction) | 2500 | jinode->i_next_transaction == transaction) |
| 2498 | goto done; | 2501 | goto done; |
| @@ -2523,6 +2526,17 @@ done: | |||
| 2523 | return 0; | 2526 | return 0; |
| 2524 | } | 2527 | } |
| 2525 | 2528 | ||
| 2529 | int jbd2_journal_inode_add_write(handle_t *handle, struct jbd2_inode *jinode) | ||
| 2530 | { | ||
| 2531 | return jbd2_journal_file_inode(handle, jinode, | ||
| 2532 | JI_WRITE_DATA | JI_WAIT_DATA); | ||
| 2533 | } | ||
| 2534 | |||
| 2535 | int jbd2_journal_inode_add_wait(handle_t *handle, struct jbd2_inode *jinode) | ||
| 2536 | { | ||
| 2537 | return jbd2_journal_file_inode(handle, jinode, JI_WAIT_DATA); | ||
| 2538 | } | ||
| 2539 | |||
| 2526 | /* | 2540 | /* |
| 2527 | * File truncate and transaction commit interact with each other in a | 2541 | * File truncate and transaction commit interact with each other in a |
| 2528 | * non-trivial way. If a transaction writing data block A is | 2542 | * non-trivial way. If a transaction writing data block A is |
diff --git a/fs/ocfs2/journal.h b/fs/ocfs2/journal.h index f4cd3c3e9fb7..497a4171ef61 100644 --- a/fs/ocfs2/journal.h +++ b/fs/ocfs2/journal.h | |||
| @@ -619,7 +619,7 @@ static inline int ocfs2_calc_tree_trunc_credits(struct super_block *sb, | |||
| 619 | 619 | ||
| 620 | static inline int ocfs2_jbd2_file_inode(handle_t *handle, struct inode *inode) | 620 | static inline int ocfs2_jbd2_file_inode(handle_t *handle, struct inode *inode) |
| 621 | { | 621 | { |
| 622 | return jbd2_journal_file_inode(handle, &OCFS2_I(inode)->ip_jinode); | 622 | return jbd2_journal_inode_add_write(handle, &OCFS2_I(inode)->ip_jinode); |
| 623 | } | 623 | } |
| 624 | 624 | ||
| 625 | static inline int ocfs2_begin_ordered_truncate(struct inode *inode, | 625 | static inline int ocfs2_begin_ordered_truncate(struct inode *inode, |
