|
@@ -2462,7 +2462,8 @@ void jbd2_journal_refile_buffer(journal_t *journal, struct journal_head *jh)
|
|
|
/*
|
|
|
* File inode in the inode list of the handle's transaction
|
|
|
*/
|
|
|
-int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *jinode)
|
|
|
+static int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *jinode,
|
|
|
+ unsigned long flags)
|
|
|
{
|
|
|
transaction_t *transaction = handle->h_transaction;
|
|
|
journal_t *journal;
|
|
@@ -2487,12 +2488,14 @@ int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *jinode)
|
|
|
* and if jinode->i_next_transaction == transaction, commit code
|
|
|
* will only file the inode where we want it.
|
|
|
*/
|
|
|
- if (jinode->i_transaction == transaction ||
|
|
|
- jinode->i_next_transaction == transaction)
|
|
|
+ if ((jinode->i_transaction == transaction ||
|
|
|
+ jinode->i_next_transaction == transaction) &&
|
|
|
+ (jinode->i_flags & flags) == flags)
|
|
|
return 0;
|
|
|
|
|
|
spin_lock(&journal->j_list_lock);
|
|
|
-
|
|
|
+ jinode->i_flags |= flags;
|
|
|
+ /* Is inode already attached where we need it? */
|
|
|
if (jinode->i_transaction == transaction ||
|
|
|
jinode->i_next_transaction == transaction)
|
|
|
goto done;
|
|
@@ -2523,6 +2526,17 @@ done:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int jbd2_journal_inode_add_write(handle_t *handle, struct jbd2_inode *jinode)
|
|
|
+{
|
|
|
+ return jbd2_journal_file_inode(handle, jinode,
|
|
|
+ JI_WRITE_DATA | JI_WAIT_DATA);
|
|
|
+}
|
|
|
+
|
|
|
+int jbd2_journal_inode_add_wait(handle_t *handle, struct jbd2_inode *jinode)
|
|
|
+{
|
|
|
+ return jbd2_journal_file_inode(handle, jinode, JI_WAIT_DATA);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* File truncate and transaction commit interact with each other in a
|
|
|
* non-trivial way. If a transaction writing data block A is
|