diff options
Diffstat (limited to 'fs/jbd2/journal.c')
-rw-r--r-- | fs/jbd2/journal.c | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 2e24567c4a79..b26c6d9fe6ae 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c | |||
@@ -50,7 +50,6 @@ EXPORT_SYMBOL(jbd2_journal_unlock_updates); | |||
50 | EXPORT_SYMBOL(jbd2_journal_get_write_access); | 50 | EXPORT_SYMBOL(jbd2_journal_get_write_access); |
51 | EXPORT_SYMBOL(jbd2_journal_get_create_access); | 51 | EXPORT_SYMBOL(jbd2_journal_get_create_access); |
52 | EXPORT_SYMBOL(jbd2_journal_get_undo_access); | 52 | EXPORT_SYMBOL(jbd2_journal_get_undo_access); |
53 | EXPORT_SYMBOL(jbd2_journal_dirty_data); | ||
54 | EXPORT_SYMBOL(jbd2_journal_dirty_metadata); | 53 | EXPORT_SYMBOL(jbd2_journal_dirty_metadata); |
55 | EXPORT_SYMBOL(jbd2_journal_release_buffer); | 54 | EXPORT_SYMBOL(jbd2_journal_release_buffer); |
56 | EXPORT_SYMBOL(jbd2_journal_forget); | 55 | EXPORT_SYMBOL(jbd2_journal_forget); |
@@ -82,6 +81,10 @@ EXPORT_SYMBOL(jbd2_journal_blocks_per_page); | |||
82 | EXPORT_SYMBOL(jbd2_journal_invalidatepage); | 81 | EXPORT_SYMBOL(jbd2_journal_invalidatepage); |
83 | EXPORT_SYMBOL(jbd2_journal_try_to_free_buffers); | 82 | EXPORT_SYMBOL(jbd2_journal_try_to_free_buffers); |
84 | EXPORT_SYMBOL(jbd2_journal_force_commit); | 83 | EXPORT_SYMBOL(jbd2_journal_force_commit); |
84 | EXPORT_SYMBOL(jbd2_journal_file_inode); | ||
85 | EXPORT_SYMBOL(jbd2_journal_init_jbd_inode); | ||
86 | EXPORT_SYMBOL(jbd2_journal_release_jbd_inode); | ||
87 | EXPORT_SYMBOL(jbd2_journal_begin_ordered_truncate); | ||
85 | 88 | ||
86 | static int journal_convert_superblock_v1(journal_t *, journal_superblock_t *); | 89 | static int journal_convert_superblock_v1(journal_t *, journal_superblock_t *); |
87 | static void __journal_abort_soft (journal_t *journal, int errno); | 90 | static void __journal_abort_soft (journal_t *journal, int errno); |
@@ -2195,6 +2198,54 @@ void jbd2_journal_put_journal_head(struct journal_head *jh) | |||
2195 | } | 2198 | } |
2196 | 2199 | ||
2197 | /* | 2200 | /* |
2201 | * Initialize jbd inode head | ||
2202 | */ | ||
2203 | void jbd2_journal_init_jbd_inode(struct jbd2_inode *jinode, struct inode *inode) | ||
2204 | { | ||
2205 | jinode->i_transaction = NULL; | ||
2206 | jinode->i_next_transaction = NULL; | ||
2207 | jinode->i_vfs_inode = inode; | ||
2208 | jinode->i_flags = 0; | ||
2209 | INIT_LIST_HEAD(&jinode->i_list); | ||
2210 | } | ||
2211 | |||
2212 | /* | ||
2213 | * Function to be called before we start removing inode from memory (i.e., | ||
2214 | * clear_inode() is a fine place to be called from). It removes inode from | ||
2215 | * transaction's lists. | ||
2216 | */ | ||
2217 | void jbd2_journal_release_jbd_inode(journal_t *journal, | ||
2218 | struct jbd2_inode *jinode) | ||
2219 | { | ||
2220 | int writeout = 0; | ||
2221 | |||
2222 | if (!journal) | ||
2223 | return; | ||
2224 | restart: | ||
2225 | spin_lock(&journal->j_list_lock); | ||
2226 | /* Is commit writing out inode - we have to wait */ | ||
2227 | if (jinode->i_flags & JI_COMMIT_RUNNING) { | ||
2228 | wait_queue_head_t *wq; | ||
2229 | DEFINE_WAIT_BIT(wait, &jinode->i_flags, __JI_COMMIT_RUNNING); | ||
2230 | wq = bit_waitqueue(&jinode->i_flags, __JI_COMMIT_RUNNING); | ||
2231 | prepare_to_wait(wq, &wait.wait, TASK_UNINTERRUPTIBLE); | ||
2232 | spin_unlock(&journal->j_list_lock); | ||
2233 | schedule(); | ||
2234 | finish_wait(wq, &wait.wait); | ||
2235 | goto restart; | ||
2236 | } | ||
2237 | |||
2238 | /* Do we need to wait for data writeback? */ | ||
2239 | if (journal->j_committing_transaction == jinode->i_transaction) | ||
2240 | writeout = 1; | ||
2241 | if (jinode->i_transaction) { | ||
2242 | list_del(&jinode->i_list); | ||
2243 | jinode->i_transaction = NULL; | ||
2244 | } | ||
2245 | spin_unlock(&journal->j_list_lock); | ||
2246 | } | ||
2247 | |||
2248 | /* | ||
2198 | * debugfs tunables | 2249 | * debugfs tunables |
2199 | */ | 2250 | */ |
2200 | #ifdef CONFIG_JBD2_DEBUG | 2251 | #ifdef CONFIG_JBD2_DEBUG |