1470decc6SDave Kleikamp /* 2f7f4bccbSMingming Cao * linux/fs/jbd2/commit.c 3470decc6SDave Kleikamp * 4470decc6SDave Kleikamp * Written by Stephen C. Tweedie <[email protected]>, 1998 5470decc6SDave Kleikamp * 6470decc6SDave Kleikamp * Copyright 1998 Red Hat corp --- All Rights Reserved 7470decc6SDave Kleikamp * 8470decc6SDave Kleikamp * This file is part of the Linux kernel and is made available under 9470decc6SDave Kleikamp * the terms of the GNU General Public License, version 2, or at your 10470decc6SDave Kleikamp * option, any later version, incorporated herein by reference. 11470decc6SDave Kleikamp * 12470decc6SDave Kleikamp * Journal commit routines for the generic filesystem journaling code; 13470decc6SDave Kleikamp * part of the ext2fs journaling system. 14470decc6SDave Kleikamp */ 15470decc6SDave Kleikamp 16470decc6SDave Kleikamp #include <linux/time.h> 17470decc6SDave Kleikamp #include <linux/fs.h> 18f7f4bccbSMingming Cao #include <linux/jbd2.h> 19470decc6SDave Kleikamp #include <linux/errno.h> 20470decc6SDave Kleikamp #include <linux/slab.h> 21470decc6SDave Kleikamp #include <linux/mm.h> 22470decc6SDave Kleikamp #include <linux/pagemap.h> 23470decc6SDave Kleikamp #include <linux/smp_lock.h> 24470decc6SDave Kleikamp 25470decc6SDave Kleikamp /* 26470decc6SDave Kleikamp * Default IO end handler for temporary BJ_IO buffer_heads. 27470decc6SDave Kleikamp */ 28470decc6SDave Kleikamp static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate) 29470decc6SDave Kleikamp { 30470decc6SDave Kleikamp BUFFER_TRACE(bh, ""); 31470decc6SDave Kleikamp if (uptodate) 32470decc6SDave Kleikamp set_buffer_uptodate(bh); 33470decc6SDave Kleikamp else 34470decc6SDave Kleikamp clear_buffer_uptodate(bh); 35470decc6SDave Kleikamp unlock_buffer(bh); 36470decc6SDave Kleikamp } 37470decc6SDave Kleikamp 38470decc6SDave Kleikamp /* 39470decc6SDave Kleikamp * When an ext3-ordered file is truncated, it is possible that many pages are 40470decc6SDave Kleikamp * not sucessfully freed, because they are attached to a committing transaction. 41470decc6SDave Kleikamp * After the transaction commits, these pages are left on the LRU, with no 42470decc6SDave Kleikamp * ->mapping, and with attached buffers. These pages are trivially reclaimable 43470decc6SDave Kleikamp * by the VM, but their apparent absence upsets the VM accounting, and it makes 44470decc6SDave Kleikamp * the numbers in /proc/meminfo look odd. 45470decc6SDave Kleikamp * 46470decc6SDave Kleikamp * So here, we have a buffer which has just come off the forget list. Look to 47470decc6SDave Kleikamp * see if we can strip all buffers from the backing page. 48470decc6SDave Kleikamp * 49470decc6SDave Kleikamp * Called under lock_journal(), and possibly under journal_datalist_lock. The 50470decc6SDave Kleikamp * caller provided us with a ref against the buffer, and we drop that here. 51470decc6SDave Kleikamp */ 52470decc6SDave Kleikamp static void release_buffer_page(struct buffer_head *bh) 53470decc6SDave Kleikamp { 54470decc6SDave Kleikamp struct page *page; 55470decc6SDave Kleikamp 56470decc6SDave Kleikamp if (buffer_dirty(bh)) 57470decc6SDave Kleikamp goto nope; 58470decc6SDave Kleikamp if (atomic_read(&bh->b_count) != 1) 59470decc6SDave Kleikamp goto nope; 60470decc6SDave Kleikamp page = bh->b_page; 61470decc6SDave Kleikamp if (!page) 62470decc6SDave Kleikamp goto nope; 63470decc6SDave Kleikamp if (page->mapping) 64470decc6SDave Kleikamp goto nope; 65470decc6SDave Kleikamp 66470decc6SDave Kleikamp /* OK, it's a truncated page */ 67470decc6SDave Kleikamp if (TestSetPageLocked(page)) 68470decc6SDave Kleikamp goto nope; 69470decc6SDave Kleikamp 70470decc6SDave Kleikamp page_cache_get(page); 71470decc6SDave Kleikamp __brelse(bh); 72470decc6SDave Kleikamp try_to_free_buffers(page); 73470decc6SDave Kleikamp unlock_page(page); 74470decc6SDave Kleikamp page_cache_release(page); 75470decc6SDave Kleikamp return; 76470decc6SDave Kleikamp 77470decc6SDave Kleikamp nope: 78470decc6SDave Kleikamp __brelse(bh); 79470decc6SDave Kleikamp } 80470decc6SDave Kleikamp 81470decc6SDave Kleikamp /* 82470decc6SDave Kleikamp * Try to acquire jbd_lock_bh_state() against the buffer, when j_list_lock is 83470decc6SDave Kleikamp * held. For ranking reasons we must trylock. If we lose, schedule away and 84470decc6SDave Kleikamp * return 0. j_list_lock is dropped in this case. 85470decc6SDave Kleikamp */ 86470decc6SDave Kleikamp static int inverted_lock(journal_t *journal, struct buffer_head *bh) 87470decc6SDave Kleikamp { 88470decc6SDave Kleikamp if (!jbd_trylock_bh_state(bh)) { 89470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 90470decc6SDave Kleikamp schedule(); 91470decc6SDave Kleikamp return 0; 92470decc6SDave Kleikamp } 93470decc6SDave Kleikamp return 1; 94470decc6SDave Kleikamp } 95470decc6SDave Kleikamp 96470decc6SDave Kleikamp /* Done it all: now write the commit record. We should have 97470decc6SDave Kleikamp * cleaned up our previous buffers by now, so if we are in abort 98470decc6SDave Kleikamp * mode we can now just skip the rest of the journal write 99470decc6SDave Kleikamp * entirely. 100470decc6SDave Kleikamp * 101470decc6SDave Kleikamp * Returns 1 if the journal needs to be aborted or 0 on success 102470decc6SDave Kleikamp */ 103470decc6SDave Kleikamp static int journal_write_commit_record(journal_t *journal, 104470decc6SDave Kleikamp transaction_t *commit_transaction) 105470decc6SDave Kleikamp { 106470decc6SDave Kleikamp struct journal_head *descriptor; 107470decc6SDave Kleikamp struct buffer_head *bh; 108470decc6SDave Kleikamp int i, ret; 109470decc6SDave Kleikamp int barrier_done = 0; 110470decc6SDave Kleikamp 111470decc6SDave Kleikamp if (is_journal_aborted(journal)) 112470decc6SDave Kleikamp return 0; 113470decc6SDave Kleikamp 114f7f4bccbSMingming Cao descriptor = jbd2_journal_get_descriptor_buffer(journal); 115470decc6SDave Kleikamp if (!descriptor) 116470decc6SDave Kleikamp return 1; 117470decc6SDave Kleikamp 118470decc6SDave Kleikamp bh = jh2bh(descriptor); 119470decc6SDave Kleikamp 120470decc6SDave Kleikamp /* AKPM: buglet - add `i' to tmp! */ 121470decc6SDave Kleikamp for (i = 0; i < bh->b_size; i += 512) { 122470decc6SDave Kleikamp journal_header_t *tmp = (journal_header_t*)bh->b_data; 123f7f4bccbSMingming Cao tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER); 124f7f4bccbSMingming Cao tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK); 125470decc6SDave Kleikamp tmp->h_sequence = cpu_to_be32(commit_transaction->t_tid); 126470decc6SDave Kleikamp } 127470decc6SDave Kleikamp 128470decc6SDave Kleikamp JBUFFER_TRACE(descriptor, "write commit block"); 129470decc6SDave Kleikamp set_buffer_dirty(bh); 130f7f4bccbSMingming Cao if (journal->j_flags & JBD2_BARRIER) { 131470decc6SDave Kleikamp set_buffer_ordered(bh); 132470decc6SDave Kleikamp barrier_done = 1; 133470decc6SDave Kleikamp } 134470decc6SDave Kleikamp ret = sync_dirty_buffer(bh); 135470decc6SDave Kleikamp /* is it possible for another commit to fail at roughly 136470decc6SDave Kleikamp * the same time as this one? If so, we don't want to 137470decc6SDave Kleikamp * trust the barrier flag in the super, but instead want 138470decc6SDave Kleikamp * to remember if we sent a barrier request 139470decc6SDave Kleikamp */ 140470decc6SDave Kleikamp if (ret == -EOPNOTSUPP && barrier_done) { 141470decc6SDave Kleikamp char b[BDEVNAME_SIZE]; 142470decc6SDave Kleikamp 143470decc6SDave Kleikamp printk(KERN_WARNING 144470decc6SDave Kleikamp "JBD: barrier-based sync failed on %s - " 145470decc6SDave Kleikamp "disabling barriers\n", 146470decc6SDave Kleikamp bdevname(journal->j_dev, b)); 147470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 148f7f4bccbSMingming Cao journal->j_flags &= ~JBD2_BARRIER; 149470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 150470decc6SDave Kleikamp 151470decc6SDave Kleikamp /* And try again, without the barrier */ 152470decc6SDave Kleikamp clear_buffer_ordered(bh); 153470decc6SDave Kleikamp set_buffer_uptodate(bh); 154470decc6SDave Kleikamp set_buffer_dirty(bh); 155470decc6SDave Kleikamp ret = sync_dirty_buffer(bh); 156470decc6SDave Kleikamp } 157470decc6SDave Kleikamp put_bh(bh); /* One for getblk() */ 158f7f4bccbSMingming Cao jbd2_journal_put_journal_head(descriptor); 159470decc6SDave Kleikamp 160470decc6SDave Kleikamp return (ret == -EIO); 161470decc6SDave Kleikamp } 162470decc6SDave Kleikamp 163470decc6SDave Kleikamp static void journal_do_submit_data(struct buffer_head **wbuf, int bufs) 164470decc6SDave Kleikamp { 165470decc6SDave Kleikamp int i; 166470decc6SDave Kleikamp 167470decc6SDave Kleikamp for (i = 0; i < bufs; i++) { 168470decc6SDave Kleikamp wbuf[i]->b_end_io = end_buffer_write_sync; 169470decc6SDave Kleikamp /* We use-up our safety reference in submit_bh() */ 170470decc6SDave Kleikamp submit_bh(WRITE, wbuf[i]); 171470decc6SDave Kleikamp } 172470decc6SDave Kleikamp } 173470decc6SDave Kleikamp 174470decc6SDave Kleikamp /* 175470decc6SDave Kleikamp * Submit all the data buffers to disk 176470decc6SDave Kleikamp */ 177470decc6SDave Kleikamp static void journal_submit_data_buffers(journal_t *journal, 178470decc6SDave Kleikamp transaction_t *commit_transaction) 179470decc6SDave Kleikamp { 180470decc6SDave Kleikamp struct journal_head *jh; 181470decc6SDave Kleikamp struct buffer_head *bh; 182470decc6SDave Kleikamp int locked; 183470decc6SDave Kleikamp int bufs = 0; 184470decc6SDave Kleikamp struct buffer_head **wbuf = journal->j_wbuf; 185470decc6SDave Kleikamp 186470decc6SDave Kleikamp /* 187470decc6SDave Kleikamp * Whenever we unlock the journal and sleep, things can get added 188470decc6SDave Kleikamp * onto ->t_sync_datalist, so we have to keep looping back to 189470decc6SDave Kleikamp * write_out_data until we *know* that the list is empty. 190470decc6SDave Kleikamp * 191470decc6SDave Kleikamp * Cleanup any flushed data buffers from the data list. Even in 192470decc6SDave Kleikamp * abort mode, we want to flush this out as soon as possible. 193470decc6SDave Kleikamp */ 194470decc6SDave Kleikamp write_out_data: 195470decc6SDave Kleikamp cond_resched(); 196470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 197470decc6SDave Kleikamp 198470decc6SDave Kleikamp while (commit_transaction->t_sync_datalist) { 199470decc6SDave Kleikamp jh = commit_transaction->t_sync_datalist; 200470decc6SDave Kleikamp bh = jh2bh(jh); 201470decc6SDave Kleikamp locked = 0; 202470decc6SDave Kleikamp 203470decc6SDave Kleikamp /* Get reference just to make sure buffer does not disappear 204470decc6SDave Kleikamp * when we are forced to drop various locks */ 205470decc6SDave Kleikamp get_bh(bh); 206470decc6SDave Kleikamp /* If the buffer is dirty, we need to submit IO and hence 207470decc6SDave Kleikamp * we need the buffer lock. We try to lock the buffer without 208470decc6SDave Kleikamp * blocking. If we fail, we need to drop j_list_lock and do 209470decc6SDave Kleikamp * blocking lock_buffer(). 210470decc6SDave Kleikamp */ 211470decc6SDave Kleikamp if (buffer_dirty(bh)) { 212470decc6SDave Kleikamp if (test_set_buffer_locked(bh)) { 213470decc6SDave Kleikamp BUFFER_TRACE(bh, "needs blocking lock"); 214470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 215470decc6SDave Kleikamp /* Write out all data to prevent deadlocks */ 216470decc6SDave Kleikamp journal_do_submit_data(wbuf, bufs); 217470decc6SDave Kleikamp bufs = 0; 218470decc6SDave Kleikamp lock_buffer(bh); 219470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 220470decc6SDave Kleikamp } 221470decc6SDave Kleikamp locked = 1; 222470decc6SDave Kleikamp } 223470decc6SDave Kleikamp /* We have to get bh_state lock. Again out of order, sigh. */ 224470decc6SDave Kleikamp if (!inverted_lock(journal, bh)) { 225470decc6SDave Kleikamp jbd_lock_bh_state(bh); 226470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 227470decc6SDave Kleikamp } 228470decc6SDave Kleikamp /* Someone already cleaned up the buffer? */ 229470decc6SDave Kleikamp if (!buffer_jbd(bh) 230470decc6SDave Kleikamp || jh->b_transaction != commit_transaction 231470decc6SDave Kleikamp || jh->b_jlist != BJ_SyncData) { 232470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 233470decc6SDave Kleikamp if (locked) 234470decc6SDave Kleikamp unlock_buffer(bh); 235470decc6SDave Kleikamp BUFFER_TRACE(bh, "already cleaned up"); 236470decc6SDave Kleikamp put_bh(bh); 237470decc6SDave Kleikamp continue; 238470decc6SDave Kleikamp } 239470decc6SDave Kleikamp if (locked && test_clear_buffer_dirty(bh)) { 240470decc6SDave Kleikamp BUFFER_TRACE(bh, "needs writeout, adding to array"); 241470decc6SDave Kleikamp wbuf[bufs++] = bh; 242f7f4bccbSMingming Cao __jbd2_journal_file_buffer(jh, commit_transaction, 243470decc6SDave Kleikamp BJ_Locked); 244470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 245470decc6SDave Kleikamp if (bufs == journal->j_wbufsize) { 246470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 247470decc6SDave Kleikamp journal_do_submit_data(wbuf, bufs); 248470decc6SDave Kleikamp bufs = 0; 249470decc6SDave Kleikamp goto write_out_data; 250470decc6SDave Kleikamp } 251*12603925SHisashi Hifumi } else if (!locked && buffer_locked(bh)) { 252*12603925SHisashi Hifumi __jbd2_journal_file_buffer(jh, commit_transaction, 253*12603925SHisashi Hifumi BJ_Locked); 254*12603925SHisashi Hifumi jbd_unlock_bh_state(bh); 255*12603925SHisashi Hifumi put_bh(bh); 256*12603925SHisashi Hifumi } else { 257470decc6SDave Kleikamp BUFFER_TRACE(bh, "writeout complete: unfile"); 258f7f4bccbSMingming Cao __jbd2_journal_unfile_buffer(jh); 259470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 260470decc6SDave Kleikamp if (locked) 261470decc6SDave Kleikamp unlock_buffer(bh); 262f7f4bccbSMingming Cao jbd2_journal_remove_journal_head(bh); 263470decc6SDave Kleikamp /* Once for our safety reference, once for 264f7f4bccbSMingming Cao * jbd2_journal_remove_journal_head() */ 265470decc6SDave Kleikamp put_bh(bh); 266470decc6SDave Kleikamp put_bh(bh); 267470decc6SDave Kleikamp } 268470decc6SDave Kleikamp 269470decc6SDave Kleikamp if (lock_need_resched(&journal->j_list_lock)) { 270470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 271470decc6SDave Kleikamp goto write_out_data; 272470decc6SDave Kleikamp } 273470decc6SDave Kleikamp } 274470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 275470decc6SDave Kleikamp journal_do_submit_data(wbuf, bufs); 276470decc6SDave Kleikamp } 277470decc6SDave Kleikamp 278b517bea1SZach Brown static inline void write_tag_block(int tag_bytes, journal_block_tag_t *tag, 27918eba7aaSMingming Cao unsigned long long block) 280b517bea1SZach Brown { 281b517bea1SZach Brown tag->t_blocknr = cpu_to_be32(block & (u32)~0); 282b517bea1SZach Brown if (tag_bytes > JBD_TAG_SIZE32) 283b517bea1SZach Brown tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1); 284b517bea1SZach Brown } 285b517bea1SZach Brown 286470decc6SDave Kleikamp /* 287f7f4bccbSMingming Cao * jbd2_journal_commit_transaction 288470decc6SDave Kleikamp * 289470decc6SDave Kleikamp * The primary function for committing a transaction to the log. This 290470decc6SDave Kleikamp * function is called by the journal thread to begin a complete commit. 291470decc6SDave Kleikamp */ 292f7f4bccbSMingming Cao void jbd2_journal_commit_transaction(journal_t *journal) 293470decc6SDave Kleikamp { 294470decc6SDave Kleikamp transaction_t *commit_transaction; 295470decc6SDave Kleikamp struct journal_head *jh, *new_jh, *descriptor; 296470decc6SDave Kleikamp struct buffer_head **wbuf = journal->j_wbuf; 297470decc6SDave Kleikamp int bufs; 298470decc6SDave Kleikamp int flags; 299470decc6SDave Kleikamp int err; 30018eba7aaSMingming Cao unsigned long long blocknr; 301470decc6SDave Kleikamp char *tagp = NULL; 302470decc6SDave Kleikamp journal_header_t *header; 303470decc6SDave Kleikamp journal_block_tag_t *tag = NULL; 304470decc6SDave Kleikamp int space_left = 0; 305470decc6SDave Kleikamp int first_tag = 0; 306470decc6SDave Kleikamp int tag_flag; 307470decc6SDave Kleikamp int i; 308b517bea1SZach Brown int tag_bytes = journal_tag_bytes(journal); 309470decc6SDave Kleikamp 310470decc6SDave Kleikamp /* 311470decc6SDave Kleikamp * First job: lock down the current transaction and wait for 312470decc6SDave Kleikamp * all outstanding updates to complete. 313470decc6SDave Kleikamp */ 314470decc6SDave Kleikamp 315470decc6SDave Kleikamp #ifdef COMMIT_STATS 316470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 317470decc6SDave Kleikamp summarise_journal_usage(journal); 318470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 319470decc6SDave Kleikamp #endif 320470decc6SDave Kleikamp 321f7f4bccbSMingming Cao /* Do we need to erase the effects of a prior jbd2_journal_flush? */ 322f7f4bccbSMingming Cao if (journal->j_flags & JBD2_FLUSHED) { 323470decc6SDave Kleikamp jbd_debug(3, "super block updated\n"); 324f7f4bccbSMingming Cao jbd2_journal_update_superblock(journal, 1); 325470decc6SDave Kleikamp } else { 326470decc6SDave Kleikamp jbd_debug(3, "superblock not updated\n"); 327470decc6SDave Kleikamp } 328470decc6SDave Kleikamp 329470decc6SDave Kleikamp J_ASSERT(journal->j_running_transaction != NULL); 330470decc6SDave Kleikamp J_ASSERT(journal->j_committing_transaction == NULL); 331470decc6SDave Kleikamp 332470decc6SDave Kleikamp commit_transaction = journal->j_running_transaction; 333470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_state == T_RUNNING); 334470decc6SDave Kleikamp 335470decc6SDave Kleikamp jbd_debug(1, "JBD: starting commit of transaction %d\n", 336470decc6SDave Kleikamp commit_transaction->t_tid); 337470decc6SDave Kleikamp 338470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 339470decc6SDave Kleikamp commit_transaction->t_state = T_LOCKED; 340470decc6SDave Kleikamp 341470decc6SDave Kleikamp spin_lock(&commit_transaction->t_handle_lock); 342470decc6SDave Kleikamp while (commit_transaction->t_updates) { 343470decc6SDave Kleikamp DEFINE_WAIT(wait); 344470decc6SDave Kleikamp 345470decc6SDave Kleikamp prepare_to_wait(&journal->j_wait_updates, &wait, 346470decc6SDave Kleikamp TASK_UNINTERRUPTIBLE); 347470decc6SDave Kleikamp if (commit_transaction->t_updates) { 348470decc6SDave Kleikamp spin_unlock(&commit_transaction->t_handle_lock); 349470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 350470decc6SDave Kleikamp schedule(); 351470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 352470decc6SDave Kleikamp spin_lock(&commit_transaction->t_handle_lock); 353470decc6SDave Kleikamp } 354470decc6SDave Kleikamp finish_wait(&journal->j_wait_updates, &wait); 355470decc6SDave Kleikamp } 356470decc6SDave Kleikamp spin_unlock(&commit_transaction->t_handle_lock); 357470decc6SDave Kleikamp 358470decc6SDave Kleikamp J_ASSERT (commit_transaction->t_outstanding_credits <= 359470decc6SDave Kleikamp journal->j_max_transaction_buffers); 360470decc6SDave Kleikamp 361470decc6SDave Kleikamp /* 362470decc6SDave Kleikamp * First thing we are allowed to do is to discard any remaining 363470decc6SDave Kleikamp * BJ_Reserved buffers. Note, it is _not_ permissible to assume 364470decc6SDave Kleikamp * that there are no such buffers: if a large filesystem 365470decc6SDave Kleikamp * operation like a truncate needs to split itself over multiple 366f7f4bccbSMingming Cao * transactions, then it may try to do a jbd2_journal_restart() while 367470decc6SDave Kleikamp * there are still BJ_Reserved buffers outstanding. These must 368470decc6SDave Kleikamp * be released cleanly from the current transaction. 369470decc6SDave Kleikamp * 370470decc6SDave Kleikamp * In this case, the filesystem must still reserve write access 371470decc6SDave Kleikamp * again before modifying the buffer in the new transaction, but 372470decc6SDave Kleikamp * we do not require it to remember exactly which old buffers it 373470decc6SDave Kleikamp * has reserved. This is consistent with the existing behaviour 374f7f4bccbSMingming Cao * that multiple jbd2_journal_get_write_access() calls to the same 375470decc6SDave Kleikamp * buffer are perfectly permissable. 376470decc6SDave Kleikamp */ 377470decc6SDave Kleikamp while (commit_transaction->t_reserved_list) { 378470decc6SDave Kleikamp jh = commit_transaction->t_reserved_list; 379470decc6SDave Kleikamp JBUFFER_TRACE(jh, "reserved, unused: refile"); 380470decc6SDave Kleikamp /* 381f7f4bccbSMingming Cao * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may 382470decc6SDave Kleikamp * leave undo-committed data. 383470decc6SDave Kleikamp */ 384470decc6SDave Kleikamp if (jh->b_committed_data) { 385470decc6SDave Kleikamp struct buffer_head *bh = jh2bh(jh); 386470decc6SDave Kleikamp 387470decc6SDave Kleikamp jbd_lock_bh_state(bh); 388f7f4bccbSMingming Cao jbd2_slab_free(jh->b_committed_data, bh->b_size); 389470decc6SDave Kleikamp jh->b_committed_data = NULL; 390470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 391470decc6SDave Kleikamp } 392f7f4bccbSMingming Cao jbd2_journal_refile_buffer(journal, jh); 393470decc6SDave Kleikamp } 394470decc6SDave Kleikamp 395470decc6SDave Kleikamp /* 396470decc6SDave Kleikamp * Now try to drop any written-back buffers from the journal's 397470decc6SDave Kleikamp * checkpoint lists. We do this *before* commit because it potentially 398470decc6SDave Kleikamp * frees some memory 399470decc6SDave Kleikamp */ 400470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 401f7f4bccbSMingming Cao __jbd2_journal_clean_checkpoint_list(journal); 402470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 403470decc6SDave Kleikamp 404470decc6SDave Kleikamp jbd_debug (3, "JBD: commit phase 1\n"); 405470decc6SDave Kleikamp 406470decc6SDave Kleikamp /* 407470decc6SDave Kleikamp * Switch to a new revoke table. 408470decc6SDave Kleikamp */ 409f7f4bccbSMingming Cao jbd2_journal_switch_revoke_table(journal); 410470decc6SDave Kleikamp 411470decc6SDave Kleikamp commit_transaction->t_state = T_FLUSH; 412470decc6SDave Kleikamp journal->j_committing_transaction = commit_transaction; 413470decc6SDave Kleikamp journal->j_running_transaction = NULL; 414470decc6SDave Kleikamp commit_transaction->t_log_start = journal->j_head; 415470decc6SDave Kleikamp wake_up(&journal->j_wait_transaction_locked); 416470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 417470decc6SDave Kleikamp 418470decc6SDave Kleikamp jbd_debug (3, "JBD: commit phase 2\n"); 419470decc6SDave Kleikamp 420470decc6SDave Kleikamp /* 421470decc6SDave Kleikamp * First, drop modified flag: all accesses to the buffers 422470decc6SDave Kleikamp * will be tracked for a new trasaction only -bzzz 423470decc6SDave Kleikamp */ 424470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 425470decc6SDave Kleikamp if (commit_transaction->t_buffers) { 426470decc6SDave Kleikamp new_jh = jh = commit_transaction->t_buffers->b_tnext; 427470decc6SDave Kleikamp do { 428470decc6SDave Kleikamp J_ASSERT_JH(new_jh, new_jh->b_modified == 1 || 429470decc6SDave Kleikamp new_jh->b_modified == 0); 430470decc6SDave Kleikamp new_jh->b_modified = 0; 431470decc6SDave Kleikamp new_jh = new_jh->b_tnext; 432470decc6SDave Kleikamp } while (new_jh != jh); 433470decc6SDave Kleikamp } 434470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 435470decc6SDave Kleikamp 436470decc6SDave Kleikamp /* 437470decc6SDave Kleikamp * Now start flushing things to disk, in the order they appear 438470decc6SDave Kleikamp * on the transaction lists. Data blocks go first. 439470decc6SDave Kleikamp */ 440470decc6SDave Kleikamp err = 0; 441470decc6SDave Kleikamp journal_submit_data_buffers(journal, commit_transaction); 442470decc6SDave Kleikamp 443470decc6SDave Kleikamp /* 444470decc6SDave Kleikamp * Wait for all previously submitted IO to complete. 445470decc6SDave Kleikamp */ 446470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 447470decc6SDave Kleikamp while (commit_transaction->t_locked_list) { 448470decc6SDave Kleikamp struct buffer_head *bh; 449470decc6SDave Kleikamp 450470decc6SDave Kleikamp jh = commit_transaction->t_locked_list->b_tprev; 451470decc6SDave Kleikamp bh = jh2bh(jh); 452470decc6SDave Kleikamp get_bh(bh); 453470decc6SDave Kleikamp if (buffer_locked(bh)) { 454470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 455470decc6SDave Kleikamp wait_on_buffer(bh); 456470decc6SDave Kleikamp if (unlikely(!buffer_uptodate(bh))) 457470decc6SDave Kleikamp err = -EIO; 458470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 459470decc6SDave Kleikamp } 460470decc6SDave Kleikamp if (!inverted_lock(journal, bh)) { 461470decc6SDave Kleikamp put_bh(bh); 462470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 463470decc6SDave Kleikamp continue; 464470decc6SDave Kleikamp } 465470decc6SDave Kleikamp if (buffer_jbd(bh) && jh->b_jlist == BJ_Locked) { 466f7f4bccbSMingming Cao __jbd2_journal_unfile_buffer(jh); 467470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 468f7f4bccbSMingming Cao jbd2_journal_remove_journal_head(bh); 469470decc6SDave Kleikamp put_bh(bh); 470470decc6SDave Kleikamp } else { 471470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 472470decc6SDave Kleikamp } 473470decc6SDave Kleikamp put_bh(bh); 474470decc6SDave Kleikamp cond_resched_lock(&journal->j_list_lock); 475470decc6SDave Kleikamp } 476470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 477470decc6SDave Kleikamp 478470decc6SDave Kleikamp if (err) 479f7f4bccbSMingming Cao __jbd2_journal_abort_hard(journal); 480470decc6SDave Kleikamp 481f7f4bccbSMingming Cao jbd2_journal_write_revoke_records(journal, commit_transaction); 482470decc6SDave Kleikamp 483470decc6SDave Kleikamp jbd_debug(3, "JBD: commit phase 2\n"); 484470decc6SDave Kleikamp 485470decc6SDave Kleikamp /* 486470decc6SDave Kleikamp * If we found any dirty or locked buffers, then we should have 487470decc6SDave Kleikamp * looped back up to the write_out_data label. If there weren't 488470decc6SDave Kleikamp * any then journal_clean_data_list should have wiped the list 489470decc6SDave Kleikamp * clean by now, so check that it is in fact empty. 490470decc6SDave Kleikamp */ 491470decc6SDave Kleikamp J_ASSERT (commit_transaction->t_sync_datalist == NULL); 492470decc6SDave Kleikamp 493470decc6SDave Kleikamp jbd_debug (3, "JBD: commit phase 3\n"); 494470decc6SDave Kleikamp 495470decc6SDave Kleikamp /* 496470decc6SDave Kleikamp * Way to go: we have now written out all of the data for a 497470decc6SDave Kleikamp * transaction! Now comes the tricky part: we need to write out 498470decc6SDave Kleikamp * metadata. Loop over the transaction's entire buffer list: 499470decc6SDave Kleikamp */ 500470decc6SDave Kleikamp commit_transaction->t_state = T_COMMIT; 501470decc6SDave Kleikamp 502470decc6SDave Kleikamp descriptor = NULL; 503470decc6SDave Kleikamp bufs = 0; 504470decc6SDave Kleikamp while (commit_transaction->t_buffers) { 505470decc6SDave Kleikamp 506470decc6SDave Kleikamp /* Find the next buffer to be journaled... */ 507470decc6SDave Kleikamp 508470decc6SDave Kleikamp jh = commit_transaction->t_buffers; 509470decc6SDave Kleikamp 510470decc6SDave Kleikamp /* If we're in abort mode, we just un-journal the buffer and 511470decc6SDave Kleikamp release it for background writing. */ 512470decc6SDave Kleikamp 513470decc6SDave Kleikamp if (is_journal_aborted(journal)) { 514470decc6SDave Kleikamp JBUFFER_TRACE(jh, "journal is aborting: refile"); 515f7f4bccbSMingming Cao jbd2_journal_refile_buffer(journal, jh); 516470decc6SDave Kleikamp /* If that was the last one, we need to clean up 517470decc6SDave Kleikamp * any descriptor buffers which may have been 518470decc6SDave Kleikamp * already allocated, even if we are now 519470decc6SDave Kleikamp * aborting. */ 520470decc6SDave Kleikamp if (!commit_transaction->t_buffers) 521470decc6SDave Kleikamp goto start_journal_io; 522470decc6SDave Kleikamp continue; 523470decc6SDave Kleikamp } 524470decc6SDave Kleikamp 525470decc6SDave Kleikamp /* Make sure we have a descriptor block in which to 526470decc6SDave Kleikamp record the metadata buffer. */ 527470decc6SDave Kleikamp 528470decc6SDave Kleikamp if (!descriptor) { 529470decc6SDave Kleikamp struct buffer_head *bh; 530470decc6SDave Kleikamp 531470decc6SDave Kleikamp J_ASSERT (bufs == 0); 532470decc6SDave Kleikamp 533470decc6SDave Kleikamp jbd_debug(4, "JBD: get descriptor\n"); 534470decc6SDave Kleikamp 535f7f4bccbSMingming Cao descriptor = jbd2_journal_get_descriptor_buffer(journal); 536470decc6SDave Kleikamp if (!descriptor) { 537f7f4bccbSMingming Cao __jbd2_journal_abort_hard(journal); 538470decc6SDave Kleikamp continue; 539470decc6SDave Kleikamp } 540470decc6SDave Kleikamp 541470decc6SDave Kleikamp bh = jh2bh(descriptor); 542470decc6SDave Kleikamp jbd_debug(4, "JBD: got buffer %llu (%p)\n", 543470decc6SDave Kleikamp (unsigned long long)bh->b_blocknr, bh->b_data); 544470decc6SDave Kleikamp header = (journal_header_t *)&bh->b_data[0]; 545f7f4bccbSMingming Cao header->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER); 546f7f4bccbSMingming Cao header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK); 547470decc6SDave Kleikamp header->h_sequence = cpu_to_be32(commit_transaction->t_tid); 548470decc6SDave Kleikamp 549470decc6SDave Kleikamp tagp = &bh->b_data[sizeof(journal_header_t)]; 550470decc6SDave Kleikamp space_left = bh->b_size - sizeof(journal_header_t); 551470decc6SDave Kleikamp first_tag = 1; 552470decc6SDave Kleikamp set_buffer_jwrite(bh); 553470decc6SDave Kleikamp set_buffer_dirty(bh); 554470decc6SDave Kleikamp wbuf[bufs++] = bh; 555470decc6SDave Kleikamp 556470decc6SDave Kleikamp /* Record it so that we can wait for IO 557470decc6SDave Kleikamp completion later */ 558470decc6SDave Kleikamp BUFFER_TRACE(bh, "ph3: file as descriptor"); 559f7f4bccbSMingming Cao jbd2_journal_file_buffer(descriptor, commit_transaction, 560470decc6SDave Kleikamp BJ_LogCtl); 561470decc6SDave Kleikamp } 562470decc6SDave Kleikamp 563470decc6SDave Kleikamp /* Where is the buffer to be written? */ 564470decc6SDave Kleikamp 565f7f4bccbSMingming Cao err = jbd2_journal_next_log_block(journal, &blocknr); 566470decc6SDave Kleikamp /* If the block mapping failed, just abandon the buffer 567470decc6SDave Kleikamp and repeat this loop: we'll fall into the 568470decc6SDave Kleikamp refile-on-abort condition above. */ 569470decc6SDave Kleikamp if (err) { 570f7f4bccbSMingming Cao __jbd2_journal_abort_hard(journal); 571470decc6SDave Kleikamp continue; 572470decc6SDave Kleikamp } 573470decc6SDave Kleikamp 574470decc6SDave Kleikamp /* 575470decc6SDave Kleikamp * start_this_handle() uses t_outstanding_credits to determine 576470decc6SDave Kleikamp * the free space in the log, but this counter is changed 577f7f4bccbSMingming Cao * by jbd2_journal_next_log_block() also. 578470decc6SDave Kleikamp */ 579470decc6SDave Kleikamp commit_transaction->t_outstanding_credits--; 580470decc6SDave Kleikamp 581470decc6SDave Kleikamp /* Bump b_count to prevent truncate from stumbling over 582470decc6SDave Kleikamp the shadowed buffer! @@@ This can go if we ever get 583470decc6SDave Kleikamp rid of the BJ_IO/BJ_Shadow pairing of buffers. */ 584470decc6SDave Kleikamp atomic_inc(&jh2bh(jh)->b_count); 585470decc6SDave Kleikamp 586470decc6SDave Kleikamp /* Make a temporary IO buffer with which to write it out 587470decc6SDave Kleikamp (this will requeue both the metadata buffer and the 588470decc6SDave Kleikamp temporary IO buffer). new_bh goes on BJ_IO*/ 589470decc6SDave Kleikamp 590470decc6SDave Kleikamp set_bit(BH_JWrite, &jh2bh(jh)->b_state); 591470decc6SDave Kleikamp /* 592f7f4bccbSMingming Cao * akpm: jbd2_journal_write_metadata_buffer() sets 593470decc6SDave Kleikamp * new_bh->b_transaction to commit_transaction. 594470decc6SDave Kleikamp * We need to clean this up before we release new_bh 595470decc6SDave Kleikamp * (which is of type BJ_IO) 596470decc6SDave Kleikamp */ 597470decc6SDave Kleikamp JBUFFER_TRACE(jh, "ph3: write metadata"); 598f7f4bccbSMingming Cao flags = jbd2_journal_write_metadata_buffer(commit_transaction, 599470decc6SDave Kleikamp jh, &new_jh, blocknr); 600470decc6SDave Kleikamp set_bit(BH_JWrite, &jh2bh(new_jh)->b_state); 601470decc6SDave Kleikamp wbuf[bufs++] = jh2bh(new_jh); 602470decc6SDave Kleikamp 603470decc6SDave Kleikamp /* Record the new block's tag in the current descriptor 604470decc6SDave Kleikamp buffer */ 605470decc6SDave Kleikamp 606470decc6SDave Kleikamp tag_flag = 0; 607470decc6SDave Kleikamp if (flags & 1) 608f7f4bccbSMingming Cao tag_flag |= JBD2_FLAG_ESCAPE; 609470decc6SDave Kleikamp if (!first_tag) 610f7f4bccbSMingming Cao tag_flag |= JBD2_FLAG_SAME_UUID; 611470decc6SDave Kleikamp 612470decc6SDave Kleikamp tag = (journal_block_tag_t *) tagp; 613b517bea1SZach Brown write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr); 614470decc6SDave Kleikamp tag->t_flags = cpu_to_be32(tag_flag); 615b517bea1SZach Brown tagp += tag_bytes; 616b517bea1SZach Brown space_left -= tag_bytes; 617470decc6SDave Kleikamp 618470decc6SDave Kleikamp if (first_tag) { 619470decc6SDave Kleikamp memcpy (tagp, journal->j_uuid, 16); 620470decc6SDave Kleikamp tagp += 16; 621470decc6SDave Kleikamp space_left -= 16; 622470decc6SDave Kleikamp first_tag = 0; 623470decc6SDave Kleikamp } 624470decc6SDave Kleikamp 625470decc6SDave Kleikamp /* If there's no more to do, or if the descriptor is full, 626470decc6SDave Kleikamp let the IO rip! */ 627470decc6SDave Kleikamp 628470decc6SDave Kleikamp if (bufs == journal->j_wbufsize || 629470decc6SDave Kleikamp commit_transaction->t_buffers == NULL || 630b517bea1SZach Brown space_left < tag_bytes + 16) { 631470decc6SDave Kleikamp 632470decc6SDave Kleikamp jbd_debug(4, "JBD: Submit %d IOs\n", bufs); 633470decc6SDave Kleikamp 634470decc6SDave Kleikamp /* Write an end-of-descriptor marker before 635470decc6SDave Kleikamp submitting the IOs. "tag" still points to 636470decc6SDave Kleikamp the last tag we set up. */ 637470decc6SDave Kleikamp 638f7f4bccbSMingming Cao tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG); 639470decc6SDave Kleikamp 640470decc6SDave Kleikamp start_journal_io: 641470decc6SDave Kleikamp for (i = 0; i < bufs; i++) { 642470decc6SDave Kleikamp struct buffer_head *bh = wbuf[i]; 643470decc6SDave Kleikamp lock_buffer(bh); 644470decc6SDave Kleikamp clear_buffer_dirty(bh); 645470decc6SDave Kleikamp set_buffer_uptodate(bh); 646470decc6SDave Kleikamp bh->b_end_io = journal_end_buffer_io_sync; 647470decc6SDave Kleikamp submit_bh(WRITE, bh); 648470decc6SDave Kleikamp } 649470decc6SDave Kleikamp cond_resched(); 650470decc6SDave Kleikamp 651470decc6SDave Kleikamp /* Force a new descriptor to be generated next 652470decc6SDave Kleikamp time round the loop. */ 653470decc6SDave Kleikamp descriptor = NULL; 654470decc6SDave Kleikamp bufs = 0; 655470decc6SDave Kleikamp } 656470decc6SDave Kleikamp } 657470decc6SDave Kleikamp 658470decc6SDave Kleikamp /* Lo and behold: we have just managed to send a transaction to 659470decc6SDave Kleikamp the log. Before we can commit it, wait for the IO so far to 660470decc6SDave Kleikamp complete. Control buffers being written are on the 661470decc6SDave Kleikamp transaction's t_log_list queue, and metadata buffers are on 662470decc6SDave Kleikamp the t_iobuf_list queue. 663470decc6SDave Kleikamp 664470decc6SDave Kleikamp Wait for the buffers in reverse order. That way we are 665470decc6SDave Kleikamp less likely to be woken up until all IOs have completed, and 666470decc6SDave Kleikamp so we incur less scheduling load. 667470decc6SDave Kleikamp */ 668470decc6SDave Kleikamp 669470decc6SDave Kleikamp jbd_debug(3, "JBD: commit phase 4\n"); 670470decc6SDave Kleikamp 671470decc6SDave Kleikamp /* 672470decc6SDave Kleikamp * akpm: these are BJ_IO, and j_list_lock is not needed. 673470decc6SDave Kleikamp * See __journal_try_to_free_buffer. 674470decc6SDave Kleikamp */ 675470decc6SDave Kleikamp wait_for_iobuf: 676470decc6SDave Kleikamp while (commit_transaction->t_iobuf_list != NULL) { 677470decc6SDave Kleikamp struct buffer_head *bh; 678470decc6SDave Kleikamp 679470decc6SDave Kleikamp jh = commit_transaction->t_iobuf_list->b_tprev; 680470decc6SDave Kleikamp bh = jh2bh(jh); 681470decc6SDave Kleikamp if (buffer_locked(bh)) { 682470decc6SDave Kleikamp wait_on_buffer(bh); 683470decc6SDave Kleikamp goto wait_for_iobuf; 684470decc6SDave Kleikamp } 685470decc6SDave Kleikamp if (cond_resched()) 686470decc6SDave Kleikamp goto wait_for_iobuf; 687470decc6SDave Kleikamp 688470decc6SDave Kleikamp if (unlikely(!buffer_uptodate(bh))) 689470decc6SDave Kleikamp err = -EIO; 690470decc6SDave Kleikamp 691470decc6SDave Kleikamp clear_buffer_jwrite(bh); 692470decc6SDave Kleikamp 693470decc6SDave Kleikamp JBUFFER_TRACE(jh, "ph4: unfile after journal write"); 694f7f4bccbSMingming Cao jbd2_journal_unfile_buffer(journal, jh); 695470decc6SDave Kleikamp 696470decc6SDave Kleikamp /* 697470decc6SDave Kleikamp * ->t_iobuf_list should contain only dummy buffer_heads 698f7f4bccbSMingming Cao * which were created by jbd2_journal_write_metadata_buffer(). 699470decc6SDave Kleikamp */ 700470decc6SDave Kleikamp BUFFER_TRACE(bh, "dumping temporary bh"); 701f7f4bccbSMingming Cao jbd2_journal_put_journal_head(jh); 702470decc6SDave Kleikamp __brelse(bh); 703470decc6SDave Kleikamp J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0); 704470decc6SDave Kleikamp free_buffer_head(bh); 705470decc6SDave Kleikamp 706470decc6SDave Kleikamp /* We also have to unlock and free the corresponding 707470decc6SDave Kleikamp shadowed buffer */ 708470decc6SDave Kleikamp jh = commit_transaction->t_shadow_list->b_tprev; 709470decc6SDave Kleikamp bh = jh2bh(jh); 710470decc6SDave Kleikamp clear_bit(BH_JWrite, &bh->b_state); 711470decc6SDave Kleikamp J_ASSERT_BH(bh, buffer_jbddirty(bh)); 712470decc6SDave Kleikamp 713470decc6SDave Kleikamp /* The metadata is now released for reuse, but we need 714470decc6SDave Kleikamp to remember it against this transaction so that when 715470decc6SDave Kleikamp we finally commit, we can do any checkpointing 716470decc6SDave Kleikamp required. */ 717470decc6SDave Kleikamp JBUFFER_TRACE(jh, "file as BJ_Forget"); 718f7f4bccbSMingming Cao jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget); 719470decc6SDave Kleikamp /* Wake up any transactions which were waiting for this 720470decc6SDave Kleikamp IO to complete */ 721470decc6SDave Kleikamp wake_up_bit(&bh->b_state, BH_Unshadow); 722470decc6SDave Kleikamp JBUFFER_TRACE(jh, "brelse shadowed buffer"); 723470decc6SDave Kleikamp __brelse(bh); 724470decc6SDave Kleikamp } 725470decc6SDave Kleikamp 726470decc6SDave Kleikamp J_ASSERT (commit_transaction->t_shadow_list == NULL); 727470decc6SDave Kleikamp 728470decc6SDave Kleikamp jbd_debug(3, "JBD: commit phase 5\n"); 729470decc6SDave Kleikamp 730470decc6SDave Kleikamp /* Here we wait for the revoke record and descriptor record buffers */ 731470decc6SDave Kleikamp wait_for_ctlbuf: 732470decc6SDave Kleikamp while (commit_transaction->t_log_list != NULL) { 733470decc6SDave Kleikamp struct buffer_head *bh; 734470decc6SDave Kleikamp 735470decc6SDave Kleikamp jh = commit_transaction->t_log_list->b_tprev; 736470decc6SDave Kleikamp bh = jh2bh(jh); 737470decc6SDave Kleikamp if (buffer_locked(bh)) { 738470decc6SDave Kleikamp wait_on_buffer(bh); 739470decc6SDave Kleikamp goto wait_for_ctlbuf; 740470decc6SDave Kleikamp } 741470decc6SDave Kleikamp if (cond_resched()) 742470decc6SDave Kleikamp goto wait_for_ctlbuf; 743470decc6SDave Kleikamp 744470decc6SDave Kleikamp if (unlikely(!buffer_uptodate(bh))) 745470decc6SDave Kleikamp err = -EIO; 746470decc6SDave Kleikamp 747470decc6SDave Kleikamp BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile"); 748470decc6SDave Kleikamp clear_buffer_jwrite(bh); 749f7f4bccbSMingming Cao jbd2_journal_unfile_buffer(journal, jh); 750f7f4bccbSMingming Cao jbd2_journal_put_journal_head(jh); 751470decc6SDave Kleikamp __brelse(bh); /* One for getblk */ 752470decc6SDave Kleikamp /* AKPM: bforget here */ 753470decc6SDave Kleikamp } 754470decc6SDave Kleikamp 755470decc6SDave Kleikamp jbd_debug(3, "JBD: commit phase 6\n"); 756470decc6SDave Kleikamp 757470decc6SDave Kleikamp if (journal_write_commit_record(journal, commit_transaction)) 758470decc6SDave Kleikamp err = -EIO; 759470decc6SDave Kleikamp 760470decc6SDave Kleikamp if (err) 761f7f4bccbSMingming Cao __jbd2_journal_abort_hard(journal); 762470decc6SDave Kleikamp 763470decc6SDave Kleikamp /* End of a transaction! Finally, we can do checkpoint 764470decc6SDave Kleikamp processing: any buffers committed as a result of this 765470decc6SDave Kleikamp transaction can be removed from any checkpoint list it was on 766470decc6SDave Kleikamp before. */ 767470decc6SDave Kleikamp 768470decc6SDave Kleikamp jbd_debug(3, "JBD: commit phase 7\n"); 769470decc6SDave Kleikamp 770470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_sync_datalist == NULL); 771470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_buffers == NULL); 772470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_checkpoint_list == NULL); 773470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_iobuf_list == NULL); 774470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_shadow_list == NULL); 775470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_log_list == NULL); 776470decc6SDave Kleikamp 777470decc6SDave Kleikamp restart_loop: 778470decc6SDave Kleikamp /* 779470decc6SDave Kleikamp * As there are other places (journal_unmap_buffer()) adding buffers 780470decc6SDave Kleikamp * to this list we have to be careful and hold the j_list_lock. 781470decc6SDave Kleikamp */ 782470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 783470decc6SDave Kleikamp while (commit_transaction->t_forget) { 784470decc6SDave Kleikamp transaction_t *cp_transaction; 785470decc6SDave Kleikamp struct buffer_head *bh; 786470decc6SDave Kleikamp 787470decc6SDave Kleikamp jh = commit_transaction->t_forget; 788470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 789470decc6SDave Kleikamp bh = jh2bh(jh); 790470decc6SDave Kleikamp jbd_lock_bh_state(bh); 791470decc6SDave Kleikamp J_ASSERT_JH(jh, jh->b_transaction == commit_transaction || 792470decc6SDave Kleikamp jh->b_transaction == journal->j_running_transaction); 793470decc6SDave Kleikamp 794470decc6SDave Kleikamp /* 795470decc6SDave Kleikamp * If there is undo-protected committed data against 796470decc6SDave Kleikamp * this buffer, then we can remove it now. If it is a 797470decc6SDave Kleikamp * buffer needing such protection, the old frozen_data 798470decc6SDave Kleikamp * field now points to a committed version of the 799470decc6SDave Kleikamp * buffer, so rotate that field to the new committed 800470decc6SDave Kleikamp * data. 801470decc6SDave Kleikamp * 802470decc6SDave Kleikamp * Otherwise, we can just throw away the frozen data now. 803470decc6SDave Kleikamp */ 804470decc6SDave Kleikamp if (jh->b_committed_data) { 805f7f4bccbSMingming Cao jbd2_slab_free(jh->b_committed_data, bh->b_size); 806470decc6SDave Kleikamp jh->b_committed_data = NULL; 807470decc6SDave Kleikamp if (jh->b_frozen_data) { 808470decc6SDave Kleikamp jh->b_committed_data = jh->b_frozen_data; 809470decc6SDave Kleikamp jh->b_frozen_data = NULL; 810470decc6SDave Kleikamp } 811470decc6SDave Kleikamp } else if (jh->b_frozen_data) { 812f7f4bccbSMingming Cao jbd2_slab_free(jh->b_frozen_data, bh->b_size); 813470decc6SDave Kleikamp jh->b_frozen_data = NULL; 814470decc6SDave Kleikamp } 815470decc6SDave Kleikamp 816470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 817470decc6SDave Kleikamp cp_transaction = jh->b_cp_transaction; 818470decc6SDave Kleikamp if (cp_transaction) { 819470decc6SDave Kleikamp JBUFFER_TRACE(jh, "remove from old cp transaction"); 820f7f4bccbSMingming Cao __jbd2_journal_remove_checkpoint(jh); 821470decc6SDave Kleikamp } 822470decc6SDave Kleikamp 823470decc6SDave Kleikamp /* Only re-checkpoint the buffer_head if it is marked 824470decc6SDave Kleikamp * dirty. If the buffer was added to the BJ_Forget list 825f7f4bccbSMingming Cao * by jbd2_journal_forget, it may no longer be dirty and 826470decc6SDave Kleikamp * there's no point in keeping a checkpoint record for 827470decc6SDave Kleikamp * it. */ 828470decc6SDave Kleikamp 829470decc6SDave Kleikamp /* A buffer which has been freed while still being 830470decc6SDave Kleikamp * journaled by a previous transaction may end up still 831470decc6SDave Kleikamp * being dirty here, but we want to avoid writing back 832470decc6SDave Kleikamp * that buffer in the future now that the last use has 833470decc6SDave Kleikamp * been committed. That's not only a performance gain, 834470decc6SDave Kleikamp * it also stops aliasing problems if the buffer is left 835470decc6SDave Kleikamp * behind for writeback and gets reallocated for another 836470decc6SDave Kleikamp * use in a different page. */ 837470decc6SDave Kleikamp if (buffer_freed(bh)) { 838470decc6SDave Kleikamp clear_buffer_freed(bh); 839470decc6SDave Kleikamp clear_buffer_jbddirty(bh); 840470decc6SDave Kleikamp } 841470decc6SDave Kleikamp 842470decc6SDave Kleikamp if (buffer_jbddirty(bh)) { 843470decc6SDave Kleikamp JBUFFER_TRACE(jh, "add to new checkpointing trans"); 844f7f4bccbSMingming Cao __jbd2_journal_insert_checkpoint(jh, commit_transaction); 845470decc6SDave Kleikamp JBUFFER_TRACE(jh, "refile for checkpoint writeback"); 846f7f4bccbSMingming Cao __jbd2_journal_refile_buffer(jh); 847470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 848470decc6SDave Kleikamp } else { 849470decc6SDave Kleikamp J_ASSERT_BH(bh, !buffer_dirty(bh)); 850470decc6SDave Kleikamp /* The buffer on BJ_Forget list and not jbddirty means 851470decc6SDave Kleikamp * it has been freed by this transaction and hence it 852470decc6SDave Kleikamp * could not have been reallocated until this 853470decc6SDave Kleikamp * transaction has committed. *BUT* it could be 854470decc6SDave Kleikamp * reallocated once we have written all the data to 855470decc6SDave Kleikamp * disk and before we process the buffer on BJ_Forget 856470decc6SDave Kleikamp * list. */ 857470decc6SDave Kleikamp JBUFFER_TRACE(jh, "refile or unfile freed buffer"); 858f7f4bccbSMingming Cao __jbd2_journal_refile_buffer(jh); 859470decc6SDave Kleikamp if (!jh->b_transaction) { 860470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 861470decc6SDave Kleikamp /* needs a brelse */ 862f7f4bccbSMingming Cao jbd2_journal_remove_journal_head(bh); 863470decc6SDave Kleikamp release_buffer_page(bh); 864470decc6SDave Kleikamp } else 865470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 866470decc6SDave Kleikamp } 867470decc6SDave Kleikamp cond_resched_lock(&journal->j_list_lock); 868470decc6SDave Kleikamp } 869470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 870470decc6SDave Kleikamp /* 871470decc6SDave Kleikamp * This is a bit sleazy. We borrow j_list_lock to protect 872f7f4bccbSMingming Cao * journal->j_committing_transaction in __jbd2_journal_remove_checkpoint. 873f7f4bccbSMingming Cao * Really, __jbd2_journal_remove_checkpoint should be using j_state_lock but 874f7f4bccbSMingming Cao * it's a bit hassle to hold that across __jbd2_journal_remove_checkpoint 875470decc6SDave Kleikamp */ 876470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 877470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 878470decc6SDave Kleikamp /* 879470decc6SDave Kleikamp * Now recheck if some buffers did not get attached to the transaction 880470decc6SDave Kleikamp * while the lock was dropped... 881470decc6SDave Kleikamp */ 882470decc6SDave Kleikamp if (commit_transaction->t_forget) { 883470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 884470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 885470decc6SDave Kleikamp goto restart_loop; 886470decc6SDave Kleikamp } 887470decc6SDave Kleikamp 888470decc6SDave Kleikamp /* Done with this transaction! */ 889470decc6SDave Kleikamp 890470decc6SDave Kleikamp jbd_debug(3, "JBD: commit phase 8\n"); 891470decc6SDave Kleikamp 892470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_state == T_COMMIT); 893470decc6SDave Kleikamp 894470decc6SDave Kleikamp commit_transaction->t_state = T_FINISHED; 895470decc6SDave Kleikamp J_ASSERT(commit_transaction == journal->j_committing_transaction); 896470decc6SDave Kleikamp journal->j_commit_sequence = commit_transaction->t_tid; 897470decc6SDave Kleikamp journal->j_committing_transaction = NULL; 898470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 899470decc6SDave Kleikamp 900470decc6SDave Kleikamp if (commit_transaction->t_checkpoint_list == NULL) { 901f7f4bccbSMingming Cao __jbd2_journal_drop_transaction(journal, commit_transaction); 902470decc6SDave Kleikamp } else { 903470decc6SDave Kleikamp if (journal->j_checkpoint_transactions == NULL) { 904470decc6SDave Kleikamp journal->j_checkpoint_transactions = commit_transaction; 905470decc6SDave Kleikamp commit_transaction->t_cpnext = commit_transaction; 906470decc6SDave Kleikamp commit_transaction->t_cpprev = commit_transaction; 907470decc6SDave Kleikamp } else { 908470decc6SDave Kleikamp commit_transaction->t_cpnext = 909470decc6SDave Kleikamp journal->j_checkpoint_transactions; 910470decc6SDave Kleikamp commit_transaction->t_cpprev = 911470decc6SDave Kleikamp commit_transaction->t_cpnext->t_cpprev; 912470decc6SDave Kleikamp commit_transaction->t_cpnext->t_cpprev = 913470decc6SDave Kleikamp commit_transaction; 914470decc6SDave Kleikamp commit_transaction->t_cpprev->t_cpnext = 915470decc6SDave Kleikamp commit_transaction; 916470decc6SDave Kleikamp } 917470decc6SDave Kleikamp } 918470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 919470decc6SDave Kleikamp 920470decc6SDave Kleikamp jbd_debug(1, "JBD: commit %d complete, head %d\n", 921470decc6SDave Kleikamp journal->j_commit_sequence, journal->j_tail_sequence); 922470decc6SDave Kleikamp 923470decc6SDave Kleikamp wake_up(&journal->j_wait_done_commit); 924470decc6SDave Kleikamp } 925