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> 238e85fb3fSJohann Lombardi #include <linux/jiffies.h> 24818d276cSGirish Shilamkar #include <linux/crc32.h> 25470decc6SDave Kleikamp 26470decc6SDave Kleikamp /* 27470decc6SDave Kleikamp * Default IO end handler for temporary BJ_IO buffer_heads. 28470decc6SDave Kleikamp */ 29470decc6SDave Kleikamp static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate) 30470decc6SDave Kleikamp { 31470decc6SDave Kleikamp BUFFER_TRACE(bh, ""); 32470decc6SDave Kleikamp if (uptodate) 33470decc6SDave Kleikamp set_buffer_uptodate(bh); 34470decc6SDave Kleikamp else 35470decc6SDave Kleikamp clear_buffer_uptodate(bh); 36470decc6SDave Kleikamp unlock_buffer(bh); 37470decc6SDave Kleikamp } 38470decc6SDave Kleikamp 39470decc6SDave Kleikamp /* 40470decc6SDave Kleikamp * When an ext3-ordered file is truncated, it is possible that many pages are 41470decc6SDave Kleikamp * not sucessfully freed, because they are attached to a committing transaction. 42470decc6SDave Kleikamp * After the transaction commits, these pages are left on the LRU, with no 43470decc6SDave Kleikamp * ->mapping, and with attached buffers. These pages are trivially reclaimable 44470decc6SDave Kleikamp * by the VM, but their apparent absence upsets the VM accounting, and it makes 45470decc6SDave Kleikamp * the numbers in /proc/meminfo look odd. 46470decc6SDave Kleikamp * 47470decc6SDave Kleikamp * So here, we have a buffer which has just come off the forget list. Look to 48470decc6SDave Kleikamp * see if we can strip all buffers from the backing page. 49470decc6SDave Kleikamp * 50470decc6SDave Kleikamp * Called under lock_journal(), and possibly under journal_datalist_lock. The 51470decc6SDave Kleikamp * caller provided us with a ref against the buffer, and we drop that here. 52470decc6SDave Kleikamp */ 53470decc6SDave Kleikamp static void release_buffer_page(struct buffer_head *bh) 54470decc6SDave Kleikamp { 55470decc6SDave Kleikamp struct page *page; 56470decc6SDave Kleikamp 57470decc6SDave Kleikamp if (buffer_dirty(bh)) 58470decc6SDave Kleikamp goto nope; 59470decc6SDave Kleikamp if (atomic_read(&bh->b_count) != 1) 60470decc6SDave Kleikamp goto nope; 61470decc6SDave Kleikamp page = bh->b_page; 62470decc6SDave Kleikamp if (!page) 63470decc6SDave Kleikamp goto nope; 64470decc6SDave Kleikamp if (page->mapping) 65470decc6SDave Kleikamp goto nope; 66470decc6SDave Kleikamp 67470decc6SDave Kleikamp /* OK, it's a truncated page */ 68470decc6SDave Kleikamp if (TestSetPageLocked(page)) 69470decc6SDave Kleikamp goto nope; 70470decc6SDave Kleikamp 71470decc6SDave Kleikamp page_cache_get(page); 72470decc6SDave Kleikamp __brelse(bh); 73470decc6SDave Kleikamp try_to_free_buffers(page); 74470decc6SDave Kleikamp unlock_page(page); 75470decc6SDave Kleikamp page_cache_release(page); 76470decc6SDave Kleikamp return; 77470decc6SDave Kleikamp 78470decc6SDave Kleikamp nope: 79470decc6SDave Kleikamp __brelse(bh); 80470decc6SDave Kleikamp } 81470decc6SDave Kleikamp 82470decc6SDave Kleikamp /* 83470decc6SDave Kleikamp * Try to acquire jbd_lock_bh_state() against the buffer, when j_list_lock is 84470decc6SDave Kleikamp * held. For ranking reasons we must trylock. If we lose, schedule away and 85470decc6SDave Kleikamp * return 0. j_list_lock is dropped in this case. 86470decc6SDave Kleikamp */ 87470decc6SDave Kleikamp static int inverted_lock(journal_t *journal, struct buffer_head *bh) 88470decc6SDave Kleikamp { 89470decc6SDave Kleikamp if (!jbd_trylock_bh_state(bh)) { 90470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 91470decc6SDave Kleikamp schedule(); 92470decc6SDave Kleikamp return 0; 93470decc6SDave Kleikamp } 94470decc6SDave Kleikamp return 1; 95470decc6SDave Kleikamp } 96470decc6SDave Kleikamp 97818d276cSGirish Shilamkar /* 98818d276cSGirish Shilamkar * Done it all: now submit the commit record. We should have 99470decc6SDave Kleikamp * cleaned up our previous buffers by now, so if we are in abort 100470decc6SDave Kleikamp * mode we can now just skip the rest of the journal write 101470decc6SDave Kleikamp * entirely. 102470decc6SDave Kleikamp * 103470decc6SDave Kleikamp * Returns 1 if the journal needs to be aborted or 0 on success 104470decc6SDave Kleikamp */ 105818d276cSGirish Shilamkar static int journal_submit_commit_record(journal_t *journal, 106818d276cSGirish Shilamkar transaction_t *commit_transaction, 107818d276cSGirish Shilamkar struct buffer_head **cbh, 108818d276cSGirish Shilamkar __u32 crc32_sum) 109470decc6SDave Kleikamp { 110470decc6SDave Kleikamp struct journal_head *descriptor; 111818d276cSGirish Shilamkar struct commit_header *tmp; 112470decc6SDave Kleikamp struct buffer_head *bh; 113818d276cSGirish Shilamkar int ret; 114470decc6SDave Kleikamp int barrier_done = 0; 115470decc6SDave Kleikamp 116470decc6SDave Kleikamp if (is_journal_aborted(journal)) 117470decc6SDave Kleikamp return 0; 118470decc6SDave Kleikamp 119f7f4bccbSMingming Cao descriptor = jbd2_journal_get_descriptor_buffer(journal); 120470decc6SDave Kleikamp if (!descriptor) 121470decc6SDave Kleikamp return 1; 122470decc6SDave Kleikamp 123470decc6SDave Kleikamp bh = jh2bh(descriptor); 124470decc6SDave Kleikamp 125818d276cSGirish Shilamkar tmp = (struct commit_header *)bh->b_data; 126f7f4bccbSMingming Cao tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER); 127f7f4bccbSMingming Cao tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK); 128470decc6SDave Kleikamp tmp->h_sequence = cpu_to_be32(commit_transaction->t_tid); 129818d276cSGirish Shilamkar 130818d276cSGirish Shilamkar if (JBD2_HAS_COMPAT_FEATURE(journal, 131818d276cSGirish Shilamkar JBD2_FEATURE_COMPAT_CHECKSUM)) { 132818d276cSGirish Shilamkar tmp->h_chksum_type = JBD2_CRC32_CHKSUM; 133818d276cSGirish Shilamkar tmp->h_chksum_size = JBD2_CRC32_CHKSUM_SIZE; 134818d276cSGirish Shilamkar tmp->h_chksum[0] = cpu_to_be32(crc32_sum); 135470decc6SDave Kleikamp } 136470decc6SDave Kleikamp 137818d276cSGirish Shilamkar JBUFFER_TRACE(descriptor, "submit commit block"); 138818d276cSGirish Shilamkar lock_buffer(bh); 139c4b8e635SAneesh Kumar K.V get_bh(bh); 140470decc6SDave Kleikamp set_buffer_dirty(bh); 141818d276cSGirish Shilamkar set_buffer_uptodate(bh); 142818d276cSGirish Shilamkar bh->b_end_io = journal_end_buffer_io_sync; 143818d276cSGirish Shilamkar 144818d276cSGirish Shilamkar if (journal->j_flags & JBD2_BARRIER && 1454d605179SAneesh Kumar K.V !JBD2_HAS_INCOMPAT_FEATURE(journal, 146818d276cSGirish Shilamkar JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { 147470decc6SDave Kleikamp set_buffer_ordered(bh); 148470decc6SDave Kleikamp barrier_done = 1; 149470decc6SDave Kleikamp } 150818d276cSGirish Shilamkar ret = submit_bh(WRITE, bh); 151*c4e35e07SDave Kleikamp if (barrier_done) 152*c4e35e07SDave Kleikamp clear_buffer_ordered(bh); 153818d276cSGirish Shilamkar 154470decc6SDave Kleikamp /* is it possible for another commit to fail at roughly 155470decc6SDave Kleikamp * the same time as this one? If so, we don't want to 156470decc6SDave Kleikamp * trust the barrier flag in the super, but instead want 157470decc6SDave Kleikamp * to remember if we sent a barrier request 158470decc6SDave Kleikamp */ 159470decc6SDave Kleikamp if (ret == -EOPNOTSUPP && barrier_done) { 160470decc6SDave Kleikamp char b[BDEVNAME_SIZE]; 161470decc6SDave Kleikamp 162470decc6SDave Kleikamp printk(KERN_WARNING 163470decc6SDave Kleikamp "JBD: barrier-based sync failed on %s - " 164470decc6SDave Kleikamp "disabling barriers\n", 165470decc6SDave Kleikamp bdevname(journal->j_dev, b)); 166470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 167f7f4bccbSMingming Cao journal->j_flags &= ~JBD2_BARRIER; 168470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 169470decc6SDave Kleikamp 170470decc6SDave Kleikamp /* And try again, without the barrier */ 171470decc6SDave Kleikamp set_buffer_uptodate(bh); 172470decc6SDave Kleikamp set_buffer_dirty(bh); 173818d276cSGirish Shilamkar ret = submit_bh(WRITE, bh); 174470decc6SDave Kleikamp } 175818d276cSGirish Shilamkar *cbh = bh; 176818d276cSGirish Shilamkar return ret; 177818d276cSGirish Shilamkar } 178470decc6SDave Kleikamp 179818d276cSGirish Shilamkar /* 180818d276cSGirish Shilamkar * This function along with journal_submit_commit_record 181818d276cSGirish Shilamkar * allows to write the commit record asynchronously. 182818d276cSGirish Shilamkar */ 183818d276cSGirish Shilamkar static int journal_wait_on_commit_record(struct buffer_head *bh) 184818d276cSGirish Shilamkar { 185818d276cSGirish Shilamkar int ret = 0; 186818d276cSGirish Shilamkar 187818d276cSGirish Shilamkar clear_buffer_dirty(bh); 188818d276cSGirish Shilamkar wait_on_buffer(bh); 189818d276cSGirish Shilamkar 190818d276cSGirish Shilamkar if (unlikely(!buffer_uptodate(bh))) 191818d276cSGirish Shilamkar ret = -EIO; 192818d276cSGirish Shilamkar put_bh(bh); /* One for getblk() */ 193818d276cSGirish Shilamkar jbd2_journal_put_journal_head(bh2jh(bh)); 194818d276cSGirish Shilamkar 195818d276cSGirish Shilamkar return ret; 196818d276cSGirish Shilamkar } 197818d276cSGirish Shilamkar 198818d276cSGirish Shilamkar /* 199818d276cSGirish Shilamkar * Wait for all submitted IO to complete. 200818d276cSGirish Shilamkar */ 201818d276cSGirish Shilamkar static int journal_wait_on_locked_list(journal_t *journal, 202818d276cSGirish Shilamkar transaction_t *commit_transaction) 203818d276cSGirish Shilamkar { 204818d276cSGirish Shilamkar int ret = 0; 205818d276cSGirish Shilamkar struct journal_head *jh; 206818d276cSGirish Shilamkar 207818d276cSGirish Shilamkar while (commit_transaction->t_locked_list) { 208818d276cSGirish Shilamkar struct buffer_head *bh; 209818d276cSGirish Shilamkar 210818d276cSGirish Shilamkar jh = commit_transaction->t_locked_list->b_tprev; 211818d276cSGirish Shilamkar bh = jh2bh(jh); 212818d276cSGirish Shilamkar get_bh(bh); 213818d276cSGirish Shilamkar if (buffer_locked(bh)) { 214818d276cSGirish Shilamkar spin_unlock(&journal->j_list_lock); 215818d276cSGirish Shilamkar wait_on_buffer(bh); 216818d276cSGirish Shilamkar if (unlikely(!buffer_uptodate(bh))) 217818d276cSGirish Shilamkar ret = -EIO; 218818d276cSGirish Shilamkar spin_lock(&journal->j_list_lock); 219818d276cSGirish Shilamkar } 220818d276cSGirish Shilamkar if (!inverted_lock(journal, bh)) { 221818d276cSGirish Shilamkar put_bh(bh); 222818d276cSGirish Shilamkar spin_lock(&journal->j_list_lock); 223818d276cSGirish Shilamkar continue; 224818d276cSGirish Shilamkar } 225818d276cSGirish Shilamkar if (buffer_jbd(bh) && jh->b_jlist == BJ_Locked) { 226818d276cSGirish Shilamkar __jbd2_journal_unfile_buffer(jh); 227818d276cSGirish Shilamkar jbd_unlock_bh_state(bh); 228818d276cSGirish Shilamkar jbd2_journal_remove_journal_head(bh); 229818d276cSGirish Shilamkar put_bh(bh); 230818d276cSGirish Shilamkar } else { 231818d276cSGirish Shilamkar jbd_unlock_bh_state(bh); 232818d276cSGirish Shilamkar } 233818d276cSGirish Shilamkar put_bh(bh); 234818d276cSGirish Shilamkar cond_resched_lock(&journal->j_list_lock); 235818d276cSGirish Shilamkar } 236818d276cSGirish Shilamkar return ret; 237470decc6SDave Kleikamp } 238470decc6SDave Kleikamp 239470decc6SDave Kleikamp static void journal_do_submit_data(struct buffer_head **wbuf, int bufs) 240470decc6SDave Kleikamp { 241470decc6SDave Kleikamp int i; 242470decc6SDave Kleikamp 243470decc6SDave Kleikamp for (i = 0; i < bufs; i++) { 244470decc6SDave Kleikamp wbuf[i]->b_end_io = end_buffer_write_sync; 245470decc6SDave Kleikamp /* We use-up our safety reference in submit_bh() */ 246470decc6SDave Kleikamp submit_bh(WRITE, wbuf[i]); 247470decc6SDave Kleikamp } 248470decc6SDave Kleikamp } 249470decc6SDave Kleikamp 250470decc6SDave Kleikamp /* 251470decc6SDave Kleikamp * Submit all the data buffers to disk 252470decc6SDave Kleikamp */ 253470decc6SDave Kleikamp static void journal_submit_data_buffers(journal_t *journal, 254470decc6SDave Kleikamp transaction_t *commit_transaction) 255470decc6SDave Kleikamp { 256470decc6SDave Kleikamp struct journal_head *jh; 257470decc6SDave Kleikamp struct buffer_head *bh; 258470decc6SDave Kleikamp int locked; 259470decc6SDave Kleikamp int bufs = 0; 260470decc6SDave Kleikamp struct buffer_head **wbuf = journal->j_wbuf; 261470decc6SDave Kleikamp 262470decc6SDave Kleikamp /* 263470decc6SDave Kleikamp * Whenever we unlock the journal and sleep, things can get added 264470decc6SDave Kleikamp * onto ->t_sync_datalist, so we have to keep looping back to 265470decc6SDave Kleikamp * write_out_data until we *know* that the list is empty. 266470decc6SDave Kleikamp * 267470decc6SDave Kleikamp * Cleanup any flushed data buffers from the data list. Even in 268470decc6SDave Kleikamp * abort mode, we want to flush this out as soon as possible. 269470decc6SDave Kleikamp */ 270470decc6SDave Kleikamp write_out_data: 271470decc6SDave Kleikamp cond_resched(); 272470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 273470decc6SDave Kleikamp 274470decc6SDave Kleikamp while (commit_transaction->t_sync_datalist) { 275470decc6SDave Kleikamp jh = commit_transaction->t_sync_datalist; 276470decc6SDave Kleikamp bh = jh2bh(jh); 277470decc6SDave Kleikamp locked = 0; 278470decc6SDave Kleikamp 279470decc6SDave Kleikamp /* Get reference just to make sure buffer does not disappear 280470decc6SDave Kleikamp * when we are forced to drop various locks */ 281470decc6SDave Kleikamp get_bh(bh); 282470decc6SDave Kleikamp /* If the buffer is dirty, we need to submit IO and hence 283470decc6SDave Kleikamp * we need the buffer lock. We try to lock the buffer without 284470decc6SDave Kleikamp * blocking. If we fail, we need to drop j_list_lock and do 285470decc6SDave Kleikamp * blocking lock_buffer(). 286470decc6SDave Kleikamp */ 287470decc6SDave Kleikamp if (buffer_dirty(bh)) { 288470decc6SDave Kleikamp if (test_set_buffer_locked(bh)) { 289470decc6SDave Kleikamp BUFFER_TRACE(bh, "needs blocking lock"); 290470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 291470decc6SDave Kleikamp /* Write out all data to prevent deadlocks */ 292470decc6SDave Kleikamp journal_do_submit_data(wbuf, bufs); 293470decc6SDave Kleikamp bufs = 0; 294470decc6SDave Kleikamp lock_buffer(bh); 295470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 296470decc6SDave Kleikamp } 297470decc6SDave Kleikamp locked = 1; 298470decc6SDave Kleikamp } 299470decc6SDave Kleikamp /* We have to get bh_state lock. Again out of order, sigh. */ 300470decc6SDave Kleikamp if (!inverted_lock(journal, bh)) { 301470decc6SDave Kleikamp jbd_lock_bh_state(bh); 302470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 303470decc6SDave Kleikamp } 304470decc6SDave Kleikamp /* Someone already cleaned up the buffer? */ 305470decc6SDave Kleikamp if (!buffer_jbd(bh) 306470decc6SDave Kleikamp || jh->b_transaction != commit_transaction 307470decc6SDave Kleikamp || jh->b_jlist != BJ_SyncData) { 308470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 309470decc6SDave Kleikamp if (locked) 310470decc6SDave Kleikamp unlock_buffer(bh); 311470decc6SDave Kleikamp BUFFER_TRACE(bh, "already cleaned up"); 312470decc6SDave Kleikamp put_bh(bh); 313470decc6SDave Kleikamp continue; 314470decc6SDave Kleikamp } 315470decc6SDave Kleikamp if (locked && test_clear_buffer_dirty(bh)) { 316470decc6SDave Kleikamp BUFFER_TRACE(bh, "needs writeout, adding to array"); 317470decc6SDave Kleikamp wbuf[bufs++] = bh; 318f7f4bccbSMingming Cao __jbd2_journal_file_buffer(jh, commit_transaction, 319470decc6SDave Kleikamp BJ_Locked); 320470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 321470decc6SDave Kleikamp if (bufs == journal->j_wbufsize) { 322470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 323470decc6SDave Kleikamp journal_do_submit_data(wbuf, bufs); 324470decc6SDave Kleikamp bufs = 0; 325470decc6SDave Kleikamp goto write_out_data; 326470decc6SDave Kleikamp } 32712603925SHisashi Hifumi } else if (!locked && buffer_locked(bh)) { 32812603925SHisashi Hifumi __jbd2_journal_file_buffer(jh, commit_transaction, 32912603925SHisashi Hifumi BJ_Locked); 33012603925SHisashi Hifumi jbd_unlock_bh_state(bh); 33112603925SHisashi Hifumi put_bh(bh); 33212603925SHisashi Hifumi } else { 333470decc6SDave Kleikamp BUFFER_TRACE(bh, "writeout complete: unfile"); 334f7f4bccbSMingming Cao __jbd2_journal_unfile_buffer(jh); 335470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 336470decc6SDave Kleikamp if (locked) 337470decc6SDave Kleikamp unlock_buffer(bh); 338f7f4bccbSMingming Cao jbd2_journal_remove_journal_head(bh); 339470decc6SDave Kleikamp /* Once for our safety reference, once for 340f7f4bccbSMingming Cao * jbd2_journal_remove_journal_head() */ 341470decc6SDave Kleikamp put_bh(bh); 342470decc6SDave Kleikamp put_bh(bh); 343470decc6SDave Kleikamp } 344470decc6SDave Kleikamp 34595c354feSNick Piggin if (need_resched() || spin_needbreak(&journal->j_list_lock)) { 346470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 347470decc6SDave Kleikamp goto write_out_data; 348470decc6SDave Kleikamp } 349470decc6SDave Kleikamp } 350470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 351470decc6SDave Kleikamp journal_do_submit_data(wbuf, bufs); 352470decc6SDave Kleikamp } 353470decc6SDave Kleikamp 354818d276cSGirish Shilamkar static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh) 355818d276cSGirish Shilamkar { 356818d276cSGirish Shilamkar struct page *page = bh->b_page; 357818d276cSGirish Shilamkar char *addr; 358818d276cSGirish Shilamkar __u32 checksum; 359818d276cSGirish Shilamkar 360818d276cSGirish Shilamkar addr = kmap_atomic(page, KM_USER0); 361818d276cSGirish Shilamkar checksum = crc32_be(crc32_sum, 362818d276cSGirish Shilamkar (void *)(addr + offset_in_page(bh->b_data)), bh->b_size); 363818d276cSGirish Shilamkar kunmap_atomic(addr, KM_USER0); 364818d276cSGirish Shilamkar 365818d276cSGirish Shilamkar return checksum; 366818d276cSGirish Shilamkar } 367818d276cSGirish Shilamkar 368818d276cSGirish Shilamkar static void write_tag_block(int tag_bytes, journal_block_tag_t *tag, 36918eba7aaSMingming Cao unsigned long long block) 370b517bea1SZach Brown { 371b517bea1SZach Brown tag->t_blocknr = cpu_to_be32(block & (u32)~0); 372cd02ff0bSMingming Cao if (tag_bytes > JBD2_TAG_SIZE32) 373b517bea1SZach Brown tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1); 374b517bea1SZach Brown } 375b517bea1SZach Brown 376470decc6SDave Kleikamp /* 377f7f4bccbSMingming Cao * jbd2_journal_commit_transaction 378470decc6SDave Kleikamp * 379470decc6SDave Kleikamp * The primary function for committing a transaction to the log. This 380470decc6SDave Kleikamp * function is called by the journal thread to begin a complete commit. 381470decc6SDave Kleikamp */ 382f7f4bccbSMingming Cao void jbd2_journal_commit_transaction(journal_t *journal) 383470decc6SDave Kleikamp { 3848e85fb3fSJohann Lombardi struct transaction_stats_s stats; 385470decc6SDave Kleikamp transaction_t *commit_transaction; 386470decc6SDave Kleikamp struct journal_head *jh, *new_jh, *descriptor; 387470decc6SDave Kleikamp struct buffer_head **wbuf = journal->j_wbuf; 388470decc6SDave Kleikamp int bufs; 389470decc6SDave Kleikamp int flags; 390470decc6SDave Kleikamp int err; 39118eba7aaSMingming Cao unsigned long long blocknr; 392470decc6SDave Kleikamp char *tagp = NULL; 393470decc6SDave Kleikamp journal_header_t *header; 394470decc6SDave Kleikamp journal_block_tag_t *tag = NULL; 395470decc6SDave Kleikamp int space_left = 0; 396470decc6SDave Kleikamp int first_tag = 0; 397470decc6SDave Kleikamp int tag_flag; 398470decc6SDave Kleikamp int i; 399b517bea1SZach Brown int tag_bytes = journal_tag_bytes(journal); 400818d276cSGirish Shilamkar struct buffer_head *cbh = NULL; /* For transactional checksums */ 401818d276cSGirish Shilamkar __u32 crc32_sum = ~0; 402470decc6SDave Kleikamp 403470decc6SDave Kleikamp /* 404470decc6SDave Kleikamp * First job: lock down the current transaction and wait for 405470decc6SDave Kleikamp * all outstanding updates to complete. 406470decc6SDave Kleikamp */ 407470decc6SDave Kleikamp 408470decc6SDave Kleikamp #ifdef COMMIT_STATS 409470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 410470decc6SDave Kleikamp summarise_journal_usage(journal); 411470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 412470decc6SDave Kleikamp #endif 413470decc6SDave Kleikamp 414f7f4bccbSMingming Cao /* Do we need to erase the effects of a prior jbd2_journal_flush? */ 415f7f4bccbSMingming Cao if (journal->j_flags & JBD2_FLUSHED) { 416470decc6SDave Kleikamp jbd_debug(3, "super block updated\n"); 417f7f4bccbSMingming Cao jbd2_journal_update_superblock(journal, 1); 418470decc6SDave Kleikamp } else { 419470decc6SDave Kleikamp jbd_debug(3, "superblock not updated\n"); 420470decc6SDave Kleikamp } 421470decc6SDave Kleikamp 422470decc6SDave Kleikamp J_ASSERT(journal->j_running_transaction != NULL); 423470decc6SDave Kleikamp J_ASSERT(journal->j_committing_transaction == NULL); 424470decc6SDave Kleikamp 425470decc6SDave Kleikamp commit_transaction = journal->j_running_transaction; 426470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_state == T_RUNNING); 427470decc6SDave Kleikamp 428470decc6SDave Kleikamp jbd_debug(1, "JBD: starting commit of transaction %d\n", 429470decc6SDave Kleikamp commit_transaction->t_tid); 430470decc6SDave Kleikamp 431470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 432470decc6SDave Kleikamp commit_transaction->t_state = T_LOCKED; 433470decc6SDave Kleikamp 4348e85fb3fSJohann Lombardi stats.u.run.rs_wait = commit_transaction->t_max_wait; 4358e85fb3fSJohann Lombardi stats.u.run.rs_locked = jiffies; 4368e85fb3fSJohann Lombardi stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start, 4378e85fb3fSJohann Lombardi stats.u.run.rs_locked); 4388e85fb3fSJohann Lombardi 439470decc6SDave Kleikamp spin_lock(&commit_transaction->t_handle_lock); 440470decc6SDave Kleikamp while (commit_transaction->t_updates) { 441470decc6SDave Kleikamp DEFINE_WAIT(wait); 442470decc6SDave Kleikamp 443470decc6SDave Kleikamp prepare_to_wait(&journal->j_wait_updates, &wait, 444470decc6SDave Kleikamp TASK_UNINTERRUPTIBLE); 445470decc6SDave Kleikamp if (commit_transaction->t_updates) { 446470decc6SDave Kleikamp spin_unlock(&commit_transaction->t_handle_lock); 447470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 448470decc6SDave Kleikamp schedule(); 449470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 450470decc6SDave Kleikamp spin_lock(&commit_transaction->t_handle_lock); 451470decc6SDave Kleikamp } 452470decc6SDave Kleikamp finish_wait(&journal->j_wait_updates, &wait); 453470decc6SDave Kleikamp } 454470decc6SDave Kleikamp spin_unlock(&commit_transaction->t_handle_lock); 455470decc6SDave Kleikamp 456470decc6SDave Kleikamp J_ASSERT (commit_transaction->t_outstanding_credits <= 457470decc6SDave Kleikamp journal->j_max_transaction_buffers); 458470decc6SDave Kleikamp 459470decc6SDave Kleikamp /* 460470decc6SDave Kleikamp * First thing we are allowed to do is to discard any remaining 461470decc6SDave Kleikamp * BJ_Reserved buffers. Note, it is _not_ permissible to assume 462470decc6SDave Kleikamp * that there are no such buffers: if a large filesystem 463470decc6SDave Kleikamp * operation like a truncate needs to split itself over multiple 464f7f4bccbSMingming Cao * transactions, then it may try to do a jbd2_journal_restart() while 465470decc6SDave Kleikamp * there are still BJ_Reserved buffers outstanding. These must 466470decc6SDave Kleikamp * be released cleanly from the current transaction. 467470decc6SDave Kleikamp * 468470decc6SDave Kleikamp * In this case, the filesystem must still reserve write access 469470decc6SDave Kleikamp * again before modifying the buffer in the new transaction, but 470470decc6SDave Kleikamp * we do not require it to remember exactly which old buffers it 471470decc6SDave Kleikamp * has reserved. This is consistent with the existing behaviour 472f7f4bccbSMingming Cao * that multiple jbd2_journal_get_write_access() calls to the same 473470decc6SDave Kleikamp * buffer are perfectly permissable. 474470decc6SDave Kleikamp */ 475470decc6SDave Kleikamp while (commit_transaction->t_reserved_list) { 476470decc6SDave Kleikamp jh = commit_transaction->t_reserved_list; 477470decc6SDave Kleikamp JBUFFER_TRACE(jh, "reserved, unused: refile"); 478470decc6SDave Kleikamp /* 479f7f4bccbSMingming Cao * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may 480470decc6SDave Kleikamp * leave undo-committed data. 481470decc6SDave Kleikamp */ 482470decc6SDave Kleikamp if (jh->b_committed_data) { 483470decc6SDave Kleikamp struct buffer_head *bh = jh2bh(jh); 484470decc6SDave Kleikamp 485470decc6SDave Kleikamp jbd_lock_bh_state(bh); 486af1e76d6SMingming Cao jbd2_free(jh->b_committed_data, bh->b_size); 487470decc6SDave Kleikamp jh->b_committed_data = NULL; 488470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 489470decc6SDave Kleikamp } 490f7f4bccbSMingming Cao jbd2_journal_refile_buffer(journal, jh); 491470decc6SDave Kleikamp } 492470decc6SDave Kleikamp 493470decc6SDave Kleikamp /* 494470decc6SDave Kleikamp * Now try to drop any written-back buffers from the journal's 495470decc6SDave Kleikamp * checkpoint lists. We do this *before* commit because it potentially 496470decc6SDave Kleikamp * frees some memory 497470decc6SDave Kleikamp */ 498470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 499f7f4bccbSMingming Cao __jbd2_journal_clean_checkpoint_list(journal); 500470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 501470decc6SDave Kleikamp 502470decc6SDave Kleikamp jbd_debug (3, "JBD: commit phase 1\n"); 503470decc6SDave Kleikamp 504470decc6SDave Kleikamp /* 505470decc6SDave Kleikamp * Switch to a new revoke table. 506470decc6SDave Kleikamp */ 507f7f4bccbSMingming Cao jbd2_journal_switch_revoke_table(journal); 508470decc6SDave Kleikamp 5098e85fb3fSJohann Lombardi stats.u.run.rs_flushing = jiffies; 5108e85fb3fSJohann Lombardi stats.u.run.rs_locked = jbd2_time_diff(stats.u.run.rs_locked, 5118e85fb3fSJohann Lombardi stats.u.run.rs_flushing); 5128e85fb3fSJohann Lombardi 513470decc6SDave Kleikamp commit_transaction->t_state = T_FLUSH; 514470decc6SDave Kleikamp journal->j_committing_transaction = commit_transaction; 515470decc6SDave Kleikamp journal->j_running_transaction = NULL; 516470decc6SDave Kleikamp commit_transaction->t_log_start = journal->j_head; 517470decc6SDave Kleikamp wake_up(&journal->j_wait_transaction_locked); 518470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 519470decc6SDave Kleikamp 520470decc6SDave Kleikamp jbd_debug (3, "JBD: commit phase 2\n"); 521470decc6SDave Kleikamp 522470decc6SDave Kleikamp /* 523470decc6SDave Kleikamp * First, drop modified flag: all accesses to the buffers 524470decc6SDave Kleikamp * will be tracked for a new trasaction only -bzzz 525470decc6SDave Kleikamp */ 526470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 527470decc6SDave Kleikamp if (commit_transaction->t_buffers) { 528470decc6SDave Kleikamp new_jh = jh = commit_transaction->t_buffers->b_tnext; 529470decc6SDave Kleikamp do { 530470decc6SDave Kleikamp J_ASSERT_JH(new_jh, new_jh->b_modified == 1 || 531470decc6SDave Kleikamp new_jh->b_modified == 0); 532470decc6SDave Kleikamp new_jh->b_modified = 0; 533470decc6SDave Kleikamp new_jh = new_jh->b_tnext; 534470decc6SDave Kleikamp } while (new_jh != jh); 535470decc6SDave Kleikamp } 536470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 537470decc6SDave Kleikamp 538470decc6SDave Kleikamp /* 539470decc6SDave Kleikamp * Now start flushing things to disk, in the order they appear 540470decc6SDave Kleikamp * on the transaction lists. Data blocks go first. 541470decc6SDave Kleikamp */ 542470decc6SDave Kleikamp err = 0; 543470decc6SDave Kleikamp journal_submit_data_buffers(journal, commit_transaction); 544470decc6SDave Kleikamp 545470decc6SDave Kleikamp /* 546818d276cSGirish Shilamkar * Wait for all previously submitted IO to complete if commit 547818d276cSGirish Shilamkar * record is to be written synchronously. 548470decc6SDave Kleikamp */ 549470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 550818d276cSGirish Shilamkar if (!JBD2_HAS_INCOMPAT_FEATURE(journal, 551818d276cSGirish Shilamkar JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) 552818d276cSGirish Shilamkar err = journal_wait_on_locked_list(journal, 553818d276cSGirish Shilamkar commit_transaction); 554470decc6SDave Kleikamp 555470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 556470decc6SDave Kleikamp 557470decc6SDave Kleikamp if (err) 558a7fa2bafSJan Kara jbd2_journal_abort(journal, err); 559470decc6SDave Kleikamp 560f7f4bccbSMingming Cao jbd2_journal_write_revoke_records(journal, commit_transaction); 561470decc6SDave Kleikamp 562470decc6SDave Kleikamp jbd_debug(3, "JBD: commit phase 2\n"); 563470decc6SDave Kleikamp 564470decc6SDave Kleikamp /* 565470decc6SDave Kleikamp * If we found any dirty or locked buffers, then we should have 566470decc6SDave Kleikamp * looped back up to the write_out_data label. If there weren't 567470decc6SDave Kleikamp * any then journal_clean_data_list should have wiped the list 568470decc6SDave Kleikamp * clean by now, so check that it is in fact empty. 569470decc6SDave Kleikamp */ 570470decc6SDave Kleikamp J_ASSERT (commit_transaction->t_sync_datalist == NULL); 571470decc6SDave Kleikamp 572470decc6SDave Kleikamp jbd_debug (3, "JBD: commit phase 3\n"); 573470decc6SDave Kleikamp 574470decc6SDave Kleikamp /* 575470decc6SDave Kleikamp * Way to go: we have now written out all of the data for a 576470decc6SDave Kleikamp * transaction! Now comes the tricky part: we need to write out 577470decc6SDave Kleikamp * metadata. Loop over the transaction's entire buffer list: 578470decc6SDave Kleikamp */ 579470decc6SDave Kleikamp commit_transaction->t_state = T_COMMIT; 580470decc6SDave Kleikamp 5818e85fb3fSJohann Lombardi stats.u.run.rs_logging = jiffies; 5828e85fb3fSJohann Lombardi stats.u.run.rs_flushing = jbd2_time_diff(stats.u.run.rs_flushing, 5838e85fb3fSJohann Lombardi stats.u.run.rs_logging); 5848e85fb3fSJohann Lombardi stats.u.run.rs_blocks = commit_transaction->t_outstanding_credits; 5858e85fb3fSJohann Lombardi stats.u.run.rs_blocks_logged = 0; 5868e85fb3fSJohann Lombardi 587470decc6SDave Kleikamp descriptor = NULL; 588470decc6SDave Kleikamp bufs = 0; 589470decc6SDave Kleikamp while (commit_transaction->t_buffers) { 590470decc6SDave Kleikamp 591470decc6SDave Kleikamp /* Find the next buffer to be journaled... */ 592470decc6SDave Kleikamp 593470decc6SDave Kleikamp jh = commit_transaction->t_buffers; 594470decc6SDave Kleikamp 595470decc6SDave Kleikamp /* If we're in abort mode, we just un-journal the buffer and 596470decc6SDave Kleikamp release it for background writing. */ 597470decc6SDave Kleikamp 598470decc6SDave Kleikamp if (is_journal_aborted(journal)) { 599470decc6SDave Kleikamp JBUFFER_TRACE(jh, "journal is aborting: refile"); 600f7f4bccbSMingming Cao jbd2_journal_refile_buffer(journal, jh); 601470decc6SDave Kleikamp /* If that was the last one, we need to clean up 602470decc6SDave Kleikamp * any descriptor buffers which may have been 603470decc6SDave Kleikamp * already allocated, even if we are now 604470decc6SDave Kleikamp * aborting. */ 605470decc6SDave Kleikamp if (!commit_transaction->t_buffers) 606470decc6SDave Kleikamp goto start_journal_io; 607470decc6SDave Kleikamp continue; 608470decc6SDave Kleikamp } 609470decc6SDave Kleikamp 610470decc6SDave Kleikamp /* Make sure we have a descriptor block in which to 611470decc6SDave Kleikamp record the metadata buffer. */ 612470decc6SDave Kleikamp 613470decc6SDave Kleikamp if (!descriptor) { 614470decc6SDave Kleikamp struct buffer_head *bh; 615470decc6SDave Kleikamp 616470decc6SDave Kleikamp J_ASSERT (bufs == 0); 617470decc6SDave Kleikamp 618470decc6SDave Kleikamp jbd_debug(4, "JBD: get descriptor\n"); 619470decc6SDave Kleikamp 620f7f4bccbSMingming Cao descriptor = jbd2_journal_get_descriptor_buffer(journal); 621470decc6SDave Kleikamp if (!descriptor) { 622a7fa2bafSJan Kara jbd2_journal_abort(journal, -EIO); 623470decc6SDave Kleikamp continue; 624470decc6SDave Kleikamp } 625470decc6SDave Kleikamp 626470decc6SDave Kleikamp bh = jh2bh(descriptor); 627470decc6SDave Kleikamp jbd_debug(4, "JBD: got buffer %llu (%p)\n", 628470decc6SDave Kleikamp (unsigned long long)bh->b_blocknr, bh->b_data); 629470decc6SDave Kleikamp header = (journal_header_t *)&bh->b_data[0]; 630f7f4bccbSMingming Cao header->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER); 631f7f4bccbSMingming Cao header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK); 632470decc6SDave Kleikamp header->h_sequence = cpu_to_be32(commit_transaction->t_tid); 633470decc6SDave Kleikamp 634470decc6SDave Kleikamp tagp = &bh->b_data[sizeof(journal_header_t)]; 635470decc6SDave Kleikamp space_left = bh->b_size - sizeof(journal_header_t); 636470decc6SDave Kleikamp first_tag = 1; 637470decc6SDave Kleikamp set_buffer_jwrite(bh); 638470decc6SDave Kleikamp set_buffer_dirty(bh); 639470decc6SDave Kleikamp wbuf[bufs++] = bh; 640470decc6SDave Kleikamp 641470decc6SDave Kleikamp /* Record it so that we can wait for IO 642470decc6SDave Kleikamp completion later */ 643470decc6SDave Kleikamp BUFFER_TRACE(bh, "ph3: file as descriptor"); 644f7f4bccbSMingming Cao jbd2_journal_file_buffer(descriptor, commit_transaction, 645470decc6SDave Kleikamp BJ_LogCtl); 646470decc6SDave Kleikamp } 647470decc6SDave Kleikamp 648470decc6SDave Kleikamp /* Where is the buffer to be written? */ 649470decc6SDave Kleikamp 650f7f4bccbSMingming Cao err = jbd2_journal_next_log_block(journal, &blocknr); 651470decc6SDave Kleikamp /* If the block mapping failed, just abandon the buffer 652470decc6SDave Kleikamp and repeat this loop: we'll fall into the 653470decc6SDave Kleikamp refile-on-abort condition above. */ 654470decc6SDave Kleikamp if (err) { 655a7fa2bafSJan Kara jbd2_journal_abort(journal, err); 656470decc6SDave Kleikamp continue; 657470decc6SDave Kleikamp } 658470decc6SDave Kleikamp 659470decc6SDave Kleikamp /* 660470decc6SDave Kleikamp * start_this_handle() uses t_outstanding_credits to determine 661470decc6SDave Kleikamp * the free space in the log, but this counter is changed 662f7f4bccbSMingming Cao * by jbd2_journal_next_log_block() also. 663470decc6SDave Kleikamp */ 664470decc6SDave Kleikamp commit_transaction->t_outstanding_credits--; 665470decc6SDave Kleikamp 666470decc6SDave Kleikamp /* Bump b_count to prevent truncate from stumbling over 667470decc6SDave Kleikamp the shadowed buffer! @@@ This can go if we ever get 668470decc6SDave Kleikamp rid of the BJ_IO/BJ_Shadow pairing of buffers. */ 669470decc6SDave Kleikamp atomic_inc(&jh2bh(jh)->b_count); 670470decc6SDave Kleikamp 671470decc6SDave Kleikamp /* Make a temporary IO buffer with which to write it out 672470decc6SDave Kleikamp (this will requeue both the metadata buffer and the 673470decc6SDave Kleikamp temporary IO buffer). new_bh goes on BJ_IO*/ 674470decc6SDave Kleikamp 675470decc6SDave Kleikamp set_bit(BH_JWrite, &jh2bh(jh)->b_state); 676470decc6SDave Kleikamp /* 677f7f4bccbSMingming Cao * akpm: jbd2_journal_write_metadata_buffer() sets 678470decc6SDave Kleikamp * new_bh->b_transaction to commit_transaction. 679470decc6SDave Kleikamp * We need to clean this up before we release new_bh 680470decc6SDave Kleikamp * (which is of type BJ_IO) 681470decc6SDave Kleikamp */ 682470decc6SDave Kleikamp JBUFFER_TRACE(jh, "ph3: write metadata"); 683f7f4bccbSMingming Cao flags = jbd2_journal_write_metadata_buffer(commit_transaction, 684470decc6SDave Kleikamp jh, &new_jh, blocknr); 685470decc6SDave Kleikamp set_bit(BH_JWrite, &jh2bh(new_jh)->b_state); 686470decc6SDave Kleikamp wbuf[bufs++] = jh2bh(new_jh); 687470decc6SDave Kleikamp 688470decc6SDave Kleikamp /* Record the new block's tag in the current descriptor 689470decc6SDave Kleikamp buffer */ 690470decc6SDave Kleikamp 691470decc6SDave Kleikamp tag_flag = 0; 692470decc6SDave Kleikamp if (flags & 1) 693f7f4bccbSMingming Cao tag_flag |= JBD2_FLAG_ESCAPE; 694470decc6SDave Kleikamp if (!first_tag) 695f7f4bccbSMingming Cao tag_flag |= JBD2_FLAG_SAME_UUID; 696470decc6SDave Kleikamp 697470decc6SDave Kleikamp tag = (journal_block_tag_t *) tagp; 698b517bea1SZach Brown write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr); 699470decc6SDave Kleikamp tag->t_flags = cpu_to_be32(tag_flag); 700b517bea1SZach Brown tagp += tag_bytes; 701b517bea1SZach Brown space_left -= tag_bytes; 702470decc6SDave Kleikamp 703470decc6SDave Kleikamp if (first_tag) { 704470decc6SDave Kleikamp memcpy (tagp, journal->j_uuid, 16); 705470decc6SDave Kleikamp tagp += 16; 706470decc6SDave Kleikamp space_left -= 16; 707470decc6SDave Kleikamp first_tag = 0; 708470decc6SDave Kleikamp } 709470decc6SDave Kleikamp 710470decc6SDave Kleikamp /* If there's no more to do, or if the descriptor is full, 711470decc6SDave Kleikamp let the IO rip! */ 712470decc6SDave Kleikamp 713470decc6SDave Kleikamp if (bufs == journal->j_wbufsize || 714470decc6SDave Kleikamp commit_transaction->t_buffers == NULL || 715b517bea1SZach Brown space_left < tag_bytes + 16) { 716470decc6SDave Kleikamp 717470decc6SDave Kleikamp jbd_debug(4, "JBD: Submit %d IOs\n", bufs); 718470decc6SDave Kleikamp 719470decc6SDave Kleikamp /* Write an end-of-descriptor marker before 720470decc6SDave Kleikamp submitting the IOs. "tag" still points to 721470decc6SDave Kleikamp the last tag we set up. */ 722470decc6SDave Kleikamp 723f7f4bccbSMingming Cao tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG); 724470decc6SDave Kleikamp 725470decc6SDave Kleikamp start_journal_io: 726470decc6SDave Kleikamp for (i = 0; i < bufs; i++) { 727470decc6SDave Kleikamp struct buffer_head *bh = wbuf[i]; 728818d276cSGirish Shilamkar /* 729818d276cSGirish Shilamkar * Compute checksum. 730818d276cSGirish Shilamkar */ 731818d276cSGirish Shilamkar if (JBD2_HAS_COMPAT_FEATURE(journal, 732818d276cSGirish Shilamkar JBD2_FEATURE_COMPAT_CHECKSUM)) { 733818d276cSGirish Shilamkar crc32_sum = 734818d276cSGirish Shilamkar jbd2_checksum_data(crc32_sum, bh); 735818d276cSGirish Shilamkar } 736818d276cSGirish Shilamkar 737470decc6SDave Kleikamp lock_buffer(bh); 738470decc6SDave Kleikamp clear_buffer_dirty(bh); 739470decc6SDave Kleikamp set_buffer_uptodate(bh); 740470decc6SDave Kleikamp bh->b_end_io = journal_end_buffer_io_sync; 741470decc6SDave Kleikamp submit_bh(WRITE, bh); 742470decc6SDave Kleikamp } 743470decc6SDave Kleikamp cond_resched(); 7448e85fb3fSJohann Lombardi stats.u.run.rs_blocks_logged += bufs; 745470decc6SDave Kleikamp 746470decc6SDave Kleikamp /* Force a new descriptor to be generated next 747470decc6SDave Kleikamp time round the loop. */ 748470decc6SDave Kleikamp descriptor = NULL; 749470decc6SDave Kleikamp bufs = 0; 750470decc6SDave Kleikamp } 751470decc6SDave Kleikamp } 752470decc6SDave Kleikamp 753818d276cSGirish Shilamkar /* Done it all: now write the commit record asynchronously. */ 754818d276cSGirish Shilamkar 755818d276cSGirish Shilamkar if (JBD2_HAS_INCOMPAT_FEATURE(journal, 756818d276cSGirish Shilamkar JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { 757818d276cSGirish Shilamkar err = journal_submit_commit_record(journal, commit_transaction, 758818d276cSGirish Shilamkar &cbh, crc32_sum); 759818d276cSGirish Shilamkar if (err) 760818d276cSGirish Shilamkar __jbd2_journal_abort_hard(journal); 761818d276cSGirish Shilamkar 762818d276cSGirish Shilamkar spin_lock(&journal->j_list_lock); 763818d276cSGirish Shilamkar err = journal_wait_on_locked_list(journal, 764818d276cSGirish Shilamkar commit_transaction); 765818d276cSGirish Shilamkar spin_unlock(&journal->j_list_lock); 766818d276cSGirish Shilamkar if (err) 767818d276cSGirish Shilamkar __jbd2_journal_abort_hard(journal); 768818d276cSGirish Shilamkar } 769818d276cSGirish Shilamkar 770470decc6SDave Kleikamp /* Lo and behold: we have just managed to send a transaction to 771470decc6SDave Kleikamp the log. Before we can commit it, wait for the IO so far to 772470decc6SDave Kleikamp complete. Control buffers being written are on the 773470decc6SDave Kleikamp transaction's t_log_list queue, and metadata buffers are on 774470decc6SDave Kleikamp the t_iobuf_list queue. 775470decc6SDave Kleikamp 776470decc6SDave Kleikamp Wait for the buffers in reverse order. That way we are 777470decc6SDave Kleikamp less likely to be woken up until all IOs have completed, and 778470decc6SDave Kleikamp so we incur less scheduling load. 779470decc6SDave Kleikamp */ 780470decc6SDave Kleikamp 781470decc6SDave Kleikamp jbd_debug(3, "JBD: commit phase 4\n"); 782470decc6SDave Kleikamp 783470decc6SDave Kleikamp /* 784470decc6SDave Kleikamp * akpm: these are BJ_IO, and j_list_lock is not needed. 785470decc6SDave Kleikamp * See __journal_try_to_free_buffer. 786470decc6SDave Kleikamp */ 787470decc6SDave Kleikamp wait_for_iobuf: 788470decc6SDave Kleikamp while (commit_transaction->t_iobuf_list != NULL) { 789470decc6SDave Kleikamp struct buffer_head *bh; 790470decc6SDave Kleikamp 791470decc6SDave Kleikamp jh = commit_transaction->t_iobuf_list->b_tprev; 792470decc6SDave Kleikamp bh = jh2bh(jh); 793470decc6SDave Kleikamp if (buffer_locked(bh)) { 794470decc6SDave Kleikamp wait_on_buffer(bh); 795470decc6SDave Kleikamp goto wait_for_iobuf; 796470decc6SDave Kleikamp } 797470decc6SDave Kleikamp if (cond_resched()) 798470decc6SDave Kleikamp goto wait_for_iobuf; 799470decc6SDave Kleikamp 800470decc6SDave Kleikamp if (unlikely(!buffer_uptodate(bh))) 801470decc6SDave Kleikamp err = -EIO; 802470decc6SDave Kleikamp 803470decc6SDave Kleikamp clear_buffer_jwrite(bh); 804470decc6SDave Kleikamp 805470decc6SDave Kleikamp JBUFFER_TRACE(jh, "ph4: unfile after journal write"); 806f7f4bccbSMingming Cao jbd2_journal_unfile_buffer(journal, jh); 807470decc6SDave Kleikamp 808470decc6SDave Kleikamp /* 809470decc6SDave Kleikamp * ->t_iobuf_list should contain only dummy buffer_heads 810f7f4bccbSMingming Cao * which were created by jbd2_journal_write_metadata_buffer(). 811470decc6SDave Kleikamp */ 812470decc6SDave Kleikamp BUFFER_TRACE(bh, "dumping temporary bh"); 813f7f4bccbSMingming Cao jbd2_journal_put_journal_head(jh); 814470decc6SDave Kleikamp __brelse(bh); 815470decc6SDave Kleikamp J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0); 816470decc6SDave Kleikamp free_buffer_head(bh); 817470decc6SDave Kleikamp 818470decc6SDave Kleikamp /* We also have to unlock and free the corresponding 819470decc6SDave Kleikamp shadowed buffer */ 820470decc6SDave Kleikamp jh = commit_transaction->t_shadow_list->b_tprev; 821470decc6SDave Kleikamp bh = jh2bh(jh); 822470decc6SDave Kleikamp clear_bit(BH_JWrite, &bh->b_state); 823470decc6SDave Kleikamp J_ASSERT_BH(bh, buffer_jbddirty(bh)); 824470decc6SDave Kleikamp 825470decc6SDave Kleikamp /* The metadata is now released for reuse, but we need 826470decc6SDave Kleikamp to remember it against this transaction so that when 827470decc6SDave Kleikamp we finally commit, we can do any checkpointing 828470decc6SDave Kleikamp required. */ 829470decc6SDave Kleikamp JBUFFER_TRACE(jh, "file as BJ_Forget"); 830f7f4bccbSMingming Cao jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget); 831470decc6SDave Kleikamp /* Wake up any transactions which were waiting for this 832470decc6SDave Kleikamp IO to complete */ 833470decc6SDave Kleikamp wake_up_bit(&bh->b_state, BH_Unshadow); 834470decc6SDave Kleikamp JBUFFER_TRACE(jh, "brelse shadowed buffer"); 835470decc6SDave Kleikamp __brelse(bh); 836470decc6SDave Kleikamp } 837470decc6SDave Kleikamp 838470decc6SDave Kleikamp J_ASSERT (commit_transaction->t_shadow_list == NULL); 839470decc6SDave Kleikamp 840470decc6SDave Kleikamp jbd_debug(3, "JBD: commit phase 5\n"); 841470decc6SDave Kleikamp 842470decc6SDave Kleikamp /* Here we wait for the revoke record and descriptor record buffers */ 843470decc6SDave Kleikamp wait_for_ctlbuf: 844470decc6SDave Kleikamp while (commit_transaction->t_log_list != NULL) { 845470decc6SDave Kleikamp struct buffer_head *bh; 846470decc6SDave Kleikamp 847470decc6SDave Kleikamp jh = commit_transaction->t_log_list->b_tprev; 848470decc6SDave Kleikamp bh = jh2bh(jh); 849470decc6SDave Kleikamp if (buffer_locked(bh)) { 850470decc6SDave Kleikamp wait_on_buffer(bh); 851470decc6SDave Kleikamp goto wait_for_ctlbuf; 852470decc6SDave Kleikamp } 853470decc6SDave Kleikamp if (cond_resched()) 854470decc6SDave Kleikamp goto wait_for_ctlbuf; 855470decc6SDave Kleikamp 856470decc6SDave Kleikamp if (unlikely(!buffer_uptodate(bh))) 857470decc6SDave Kleikamp err = -EIO; 858470decc6SDave Kleikamp 859470decc6SDave Kleikamp BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile"); 860470decc6SDave Kleikamp clear_buffer_jwrite(bh); 861f7f4bccbSMingming Cao jbd2_journal_unfile_buffer(journal, jh); 862f7f4bccbSMingming Cao jbd2_journal_put_journal_head(jh); 863470decc6SDave Kleikamp __brelse(bh); /* One for getblk */ 864470decc6SDave Kleikamp /* AKPM: bforget here */ 865470decc6SDave Kleikamp } 866470decc6SDave Kleikamp 867470decc6SDave Kleikamp jbd_debug(3, "JBD: commit phase 6\n"); 868470decc6SDave Kleikamp 869818d276cSGirish Shilamkar if (!JBD2_HAS_INCOMPAT_FEATURE(journal, 870818d276cSGirish Shilamkar JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { 871818d276cSGirish Shilamkar err = journal_submit_commit_record(journal, commit_transaction, 872818d276cSGirish Shilamkar &cbh, crc32_sum); 873818d276cSGirish Shilamkar if (err) 874818d276cSGirish Shilamkar __jbd2_journal_abort_hard(journal); 875818d276cSGirish Shilamkar } 876b048d846SMingming Cao if (!err && !is_journal_aborted(journal)) 877818d276cSGirish Shilamkar err = journal_wait_on_commit_record(cbh); 878470decc6SDave Kleikamp 879470decc6SDave Kleikamp if (err) 880a7fa2bafSJan Kara jbd2_journal_abort(journal, err); 881470decc6SDave Kleikamp 882470decc6SDave Kleikamp /* End of a transaction! Finally, we can do checkpoint 883470decc6SDave Kleikamp processing: any buffers committed as a result of this 884470decc6SDave Kleikamp transaction can be removed from any checkpoint list it was on 885470decc6SDave Kleikamp before. */ 886470decc6SDave Kleikamp 887470decc6SDave Kleikamp jbd_debug(3, "JBD: commit phase 7\n"); 888470decc6SDave Kleikamp 889470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_sync_datalist == NULL); 890470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_buffers == NULL); 891470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_checkpoint_list == NULL); 892470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_iobuf_list == NULL); 893470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_shadow_list == NULL); 894470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_log_list == NULL); 895470decc6SDave Kleikamp 896470decc6SDave Kleikamp restart_loop: 897470decc6SDave Kleikamp /* 898470decc6SDave Kleikamp * As there are other places (journal_unmap_buffer()) adding buffers 899470decc6SDave Kleikamp * to this list we have to be careful and hold the j_list_lock. 900470decc6SDave Kleikamp */ 901470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 902470decc6SDave Kleikamp while (commit_transaction->t_forget) { 903470decc6SDave Kleikamp transaction_t *cp_transaction; 904470decc6SDave Kleikamp struct buffer_head *bh; 905470decc6SDave Kleikamp 906470decc6SDave Kleikamp jh = commit_transaction->t_forget; 907470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 908470decc6SDave Kleikamp bh = jh2bh(jh); 909470decc6SDave Kleikamp jbd_lock_bh_state(bh); 910470decc6SDave Kleikamp J_ASSERT_JH(jh, jh->b_transaction == commit_transaction || 911470decc6SDave Kleikamp jh->b_transaction == journal->j_running_transaction); 912470decc6SDave Kleikamp 913470decc6SDave Kleikamp /* 914470decc6SDave Kleikamp * If there is undo-protected committed data against 915470decc6SDave Kleikamp * this buffer, then we can remove it now. If it is a 916470decc6SDave Kleikamp * buffer needing such protection, the old frozen_data 917470decc6SDave Kleikamp * field now points to a committed version of the 918470decc6SDave Kleikamp * buffer, so rotate that field to the new committed 919470decc6SDave Kleikamp * data. 920470decc6SDave Kleikamp * 921470decc6SDave Kleikamp * Otherwise, we can just throw away the frozen data now. 922470decc6SDave Kleikamp */ 923470decc6SDave Kleikamp if (jh->b_committed_data) { 924af1e76d6SMingming Cao jbd2_free(jh->b_committed_data, bh->b_size); 925470decc6SDave Kleikamp jh->b_committed_data = NULL; 926470decc6SDave Kleikamp if (jh->b_frozen_data) { 927470decc6SDave Kleikamp jh->b_committed_data = jh->b_frozen_data; 928470decc6SDave Kleikamp jh->b_frozen_data = NULL; 929470decc6SDave Kleikamp } 930470decc6SDave Kleikamp } else if (jh->b_frozen_data) { 931af1e76d6SMingming Cao jbd2_free(jh->b_frozen_data, bh->b_size); 932470decc6SDave Kleikamp jh->b_frozen_data = NULL; 933470decc6SDave Kleikamp } 934470decc6SDave Kleikamp 935470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 936470decc6SDave Kleikamp cp_transaction = jh->b_cp_transaction; 937470decc6SDave Kleikamp if (cp_transaction) { 938470decc6SDave Kleikamp JBUFFER_TRACE(jh, "remove from old cp transaction"); 9398e85fb3fSJohann Lombardi cp_transaction->t_chp_stats.cs_dropped++; 940f7f4bccbSMingming Cao __jbd2_journal_remove_checkpoint(jh); 941470decc6SDave Kleikamp } 942470decc6SDave Kleikamp 943470decc6SDave Kleikamp /* Only re-checkpoint the buffer_head if it is marked 944470decc6SDave Kleikamp * dirty. If the buffer was added to the BJ_Forget list 945f7f4bccbSMingming Cao * by jbd2_journal_forget, it may no longer be dirty and 946470decc6SDave Kleikamp * there's no point in keeping a checkpoint record for 947470decc6SDave Kleikamp * it. */ 948470decc6SDave Kleikamp 949470decc6SDave Kleikamp /* A buffer which has been freed while still being 950470decc6SDave Kleikamp * journaled by a previous transaction may end up still 951470decc6SDave Kleikamp * being dirty here, but we want to avoid writing back 952470decc6SDave Kleikamp * that buffer in the future now that the last use has 953470decc6SDave Kleikamp * been committed. That's not only a performance gain, 954470decc6SDave Kleikamp * it also stops aliasing problems if the buffer is left 955470decc6SDave Kleikamp * behind for writeback and gets reallocated for another 956470decc6SDave Kleikamp * use in a different page. */ 957470decc6SDave Kleikamp if (buffer_freed(bh)) { 958470decc6SDave Kleikamp clear_buffer_freed(bh); 959470decc6SDave Kleikamp clear_buffer_jbddirty(bh); 960470decc6SDave Kleikamp } 961470decc6SDave Kleikamp 962470decc6SDave Kleikamp if (buffer_jbddirty(bh)) { 963470decc6SDave Kleikamp JBUFFER_TRACE(jh, "add to new checkpointing trans"); 964f7f4bccbSMingming Cao __jbd2_journal_insert_checkpoint(jh, commit_transaction); 965470decc6SDave Kleikamp JBUFFER_TRACE(jh, "refile for checkpoint writeback"); 966f7f4bccbSMingming Cao __jbd2_journal_refile_buffer(jh); 967470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 968470decc6SDave Kleikamp } else { 969470decc6SDave Kleikamp J_ASSERT_BH(bh, !buffer_dirty(bh)); 970470decc6SDave Kleikamp /* The buffer on BJ_Forget list and not jbddirty means 971470decc6SDave Kleikamp * it has been freed by this transaction and hence it 972470decc6SDave Kleikamp * could not have been reallocated until this 973470decc6SDave Kleikamp * transaction has committed. *BUT* it could be 974470decc6SDave Kleikamp * reallocated once we have written all the data to 975470decc6SDave Kleikamp * disk and before we process the buffer on BJ_Forget 976470decc6SDave Kleikamp * list. */ 977470decc6SDave Kleikamp JBUFFER_TRACE(jh, "refile or unfile freed buffer"); 978f7f4bccbSMingming Cao __jbd2_journal_refile_buffer(jh); 979470decc6SDave Kleikamp if (!jh->b_transaction) { 980470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 981470decc6SDave Kleikamp /* needs a brelse */ 982f7f4bccbSMingming Cao jbd2_journal_remove_journal_head(bh); 983470decc6SDave Kleikamp release_buffer_page(bh); 984470decc6SDave Kleikamp } else 985470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 986470decc6SDave Kleikamp } 987470decc6SDave Kleikamp cond_resched_lock(&journal->j_list_lock); 988470decc6SDave Kleikamp } 989470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 990470decc6SDave Kleikamp /* 991f5a7a6b0SJan Kara * This is a bit sleazy. We use j_list_lock to protect transition 992f5a7a6b0SJan Kara * of a transaction into T_FINISHED state and calling 993f5a7a6b0SJan Kara * __jbd2_journal_drop_transaction(). Otherwise we could race with 994f5a7a6b0SJan Kara * other checkpointing code processing the transaction... 995470decc6SDave Kleikamp */ 996470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 997470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 998470decc6SDave Kleikamp /* 999470decc6SDave Kleikamp * Now recheck if some buffers did not get attached to the transaction 1000470decc6SDave Kleikamp * while the lock was dropped... 1001470decc6SDave Kleikamp */ 1002470decc6SDave Kleikamp if (commit_transaction->t_forget) { 1003470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 1004470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 1005470decc6SDave Kleikamp goto restart_loop; 1006470decc6SDave Kleikamp } 1007470decc6SDave Kleikamp 1008470decc6SDave Kleikamp /* Done with this transaction! */ 1009470decc6SDave Kleikamp 1010470decc6SDave Kleikamp jbd_debug(3, "JBD: commit phase 8\n"); 1011470decc6SDave Kleikamp 1012470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_state == T_COMMIT); 1013470decc6SDave Kleikamp 10148e85fb3fSJohann Lombardi commit_transaction->t_start = jiffies; 10158e85fb3fSJohann Lombardi stats.u.run.rs_logging = jbd2_time_diff(stats.u.run.rs_logging, 10168e85fb3fSJohann Lombardi commit_transaction->t_start); 10178e85fb3fSJohann Lombardi 10188e85fb3fSJohann Lombardi /* 10198e85fb3fSJohann Lombardi * File the transaction for history 10208e85fb3fSJohann Lombardi */ 10218e85fb3fSJohann Lombardi stats.ts_type = JBD2_STATS_RUN; 10228e85fb3fSJohann Lombardi stats.ts_tid = commit_transaction->t_tid; 10238e85fb3fSJohann Lombardi stats.u.run.rs_handle_count = commit_transaction->t_handle_count; 10248e85fb3fSJohann Lombardi spin_lock(&journal->j_history_lock); 10258e85fb3fSJohann Lombardi memcpy(journal->j_history + journal->j_history_cur, &stats, 10268e85fb3fSJohann Lombardi sizeof(stats)); 10278e85fb3fSJohann Lombardi if (++journal->j_history_cur == journal->j_history_max) 10288e85fb3fSJohann Lombardi journal->j_history_cur = 0; 10298e85fb3fSJohann Lombardi 10308e85fb3fSJohann Lombardi /* 10318e85fb3fSJohann Lombardi * Calculate overall stats 10328e85fb3fSJohann Lombardi */ 10338e85fb3fSJohann Lombardi journal->j_stats.ts_tid++; 10348e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait; 10358e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_running += stats.u.run.rs_running; 10368e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked; 10378e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing; 10388e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging; 10398e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count; 10408e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks; 10418e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_blocks_logged += stats.u.run.rs_blocks_logged; 10428e85fb3fSJohann Lombardi spin_unlock(&journal->j_history_lock); 10438e85fb3fSJohann Lombardi 1044470decc6SDave Kleikamp commit_transaction->t_state = T_FINISHED; 1045470decc6SDave Kleikamp J_ASSERT(commit_transaction == journal->j_committing_transaction); 1046470decc6SDave Kleikamp journal->j_commit_sequence = commit_transaction->t_tid; 1047470decc6SDave Kleikamp journal->j_committing_transaction = NULL; 1048470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 1049470decc6SDave Kleikamp 1050f89b7795SJan Kara if (commit_transaction->t_checkpoint_list == NULL && 1051f89b7795SJan Kara commit_transaction->t_checkpoint_io_list == NULL) { 1052f7f4bccbSMingming Cao __jbd2_journal_drop_transaction(journal, commit_transaction); 1053470decc6SDave Kleikamp } else { 1054470decc6SDave Kleikamp if (journal->j_checkpoint_transactions == NULL) { 1055470decc6SDave Kleikamp journal->j_checkpoint_transactions = commit_transaction; 1056470decc6SDave Kleikamp commit_transaction->t_cpnext = commit_transaction; 1057470decc6SDave Kleikamp commit_transaction->t_cpprev = commit_transaction; 1058470decc6SDave Kleikamp } else { 1059470decc6SDave Kleikamp commit_transaction->t_cpnext = 1060470decc6SDave Kleikamp journal->j_checkpoint_transactions; 1061470decc6SDave Kleikamp commit_transaction->t_cpprev = 1062470decc6SDave Kleikamp commit_transaction->t_cpnext->t_cpprev; 1063470decc6SDave Kleikamp commit_transaction->t_cpnext->t_cpprev = 1064470decc6SDave Kleikamp commit_transaction; 1065470decc6SDave Kleikamp commit_transaction->t_cpprev->t_cpnext = 1066470decc6SDave Kleikamp commit_transaction; 1067470decc6SDave Kleikamp } 1068470decc6SDave Kleikamp } 1069470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 1070470decc6SDave Kleikamp 1071470decc6SDave Kleikamp jbd_debug(1, "JBD: commit %d complete, head %d\n", 1072470decc6SDave Kleikamp journal->j_commit_sequence, journal->j_tail_sequence); 1073470decc6SDave Kleikamp 1074470decc6SDave Kleikamp wake_up(&journal->j_wait_done_commit); 1075470decc6SDave Kleikamp } 1076