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> 19ede86cc4STheodore Ts'o #include <linux/marker.h> 20470decc6SDave Kleikamp #include <linux/errno.h> 21470decc6SDave Kleikamp #include <linux/slab.h> 22470decc6SDave Kleikamp #include <linux/mm.h> 23470decc6SDave Kleikamp #include <linux/pagemap.h> 248e85fb3fSJohann Lombardi #include <linux/jiffies.h> 25818d276cSGirish Shilamkar #include <linux/crc32.h> 26cd1aac32SAneesh Kumar K.V #include <linux/writeback.h> 27cd1aac32SAneesh Kumar K.V #include <linux/backing-dev.h> 28fd98496fSTheodore Ts'o #include <linux/bio.h> 29470decc6SDave Kleikamp 30470decc6SDave Kleikamp /* 31470decc6SDave Kleikamp * Default IO end handler for temporary BJ_IO buffer_heads. 32470decc6SDave Kleikamp */ 33470decc6SDave Kleikamp static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate) 34470decc6SDave Kleikamp { 35470decc6SDave Kleikamp BUFFER_TRACE(bh, ""); 36470decc6SDave Kleikamp if (uptodate) 37470decc6SDave Kleikamp set_buffer_uptodate(bh); 38470decc6SDave Kleikamp else 39470decc6SDave Kleikamp clear_buffer_uptodate(bh); 40470decc6SDave Kleikamp unlock_buffer(bh); 41470decc6SDave Kleikamp } 42470decc6SDave Kleikamp 43470decc6SDave Kleikamp /* 4487c89c23SJan Kara * When an ext4 file is truncated, it is possible that some pages are not 4587c89c23SJan Kara * successfully freed, because they are attached to a committing transaction. 46470decc6SDave Kleikamp * After the transaction commits, these pages are left on the LRU, with no 47470decc6SDave Kleikamp * ->mapping, and with attached buffers. These pages are trivially reclaimable 48470decc6SDave Kleikamp * by the VM, but their apparent absence upsets the VM accounting, and it makes 49470decc6SDave Kleikamp * the numbers in /proc/meminfo look odd. 50470decc6SDave Kleikamp * 51470decc6SDave Kleikamp * So here, we have a buffer which has just come off the forget list. Look to 52470decc6SDave Kleikamp * see if we can strip all buffers from the backing page. 53470decc6SDave Kleikamp * 54470decc6SDave Kleikamp * Called under lock_journal(), and possibly under journal_datalist_lock. The 55470decc6SDave Kleikamp * caller provided us with a ref against the buffer, and we drop that here. 56470decc6SDave Kleikamp */ 57470decc6SDave Kleikamp static void release_buffer_page(struct buffer_head *bh) 58470decc6SDave Kleikamp { 59470decc6SDave Kleikamp struct page *page; 60470decc6SDave Kleikamp 61470decc6SDave Kleikamp if (buffer_dirty(bh)) 62470decc6SDave Kleikamp goto nope; 63470decc6SDave Kleikamp if (atomic_read(&bh->b_count) != 1) 64470decc6SDave Kleikamp goto nope; 65470decc6SDave Kleikamp page = bh->b_page; 66470decc6SDave Kleikamp if (!page) 67470decc6SDave Kleikamp goto nope; 68470decc6SDave Kleikamp if (page->mapping) 69470decc6SDave Kleikamp goto nope; 70470decc6SDave Kleikamp 71470decc6SDave Kleikamp /* OK, it's a truncated page */ 72529ae9aaSNick Piggin if (!trylock_page(page)) 73470decc6SDave Kleikamp goto nope; 74470decc6SDave Kleikamp 75470decc6SDave Kleikamp page_cache_get(page); 76470decc6SDave Kleikamp __brelse(bh); 77470decc6SDave Kleikamp try_to_free_buffers(page); 78470decc6SDave Kleikamp unlock_page(page); 79470decc6SDave Kleikamp page_cache_release(page); 80470decc6SDave Kleikamp return; 81470decc6SDave Kleikamp 82470decc6SDave Kleikamp nope: 83470decc6SDave Kleikamp __brelse(bh); 84470decc6SDave Kleikamp } 85470decc6SDave Kleikamp 86470decc6SDave Kleikamp /* 87818d276cSGirish Shilamkar * Done it all: now submit the commit record. We should have 88470decc6SDave Kleikamp * cleaned up our previous buffers by now, so if we are in abort 89470decc6SDave Kleikamp * mode we can now just skip the rest of the journal write 90470decc6SDave Kleikamp * entirely. 91470decc6SDave Kleikamp * 92470decc6SDave Kleikamp * Returns 1 if the journal needs to be aborted or 0 on success 93470decc6SDave Kleikamp */ 94818d276cSGirish Shilamkar static int journal_submit_commit_record(journal_t *journal, 95818d276cSGirish Shilamkar transaction_t *commit_transaction, 96818d276cSGirish Shilamkar struct buffer_head **cbh, 97818d276cSGirish Shilamkar __u32 crc32_sum) 98470decc6SDave Kleikamp { 99470decc6SDave Kleikamp struct journal_head *descriptor; 100818d276cSGirish Shilamkar struct commit_header *tmp; 101470decc6SDave Kleikamp struct buffer_head *bh; 102818d276cSGirish Shilamkar int ret; 103470decc6SDave Kleikamp int barrier_done = 0; 104736603abSTheodore Ts'o struct timespec now = current_kernel_time(); 105470decc6SDave Kleikamp 106470decc6SDave Kleikamp if (is_journal_aborted(journal)) 107470decc6SDave Kleikamp return 0; 108470decc6SDave Kleikamp 109f7f4bccbSMingming Cao descriptor = jbd2_journal_get_descriptor_buffer(journal); 110470decc6SDave Kleikamp if (!descriptor) 111470decc6SDave Kleikamp return 1; 112470decc6SDave Kleikamp 113470decc6SDave Kleikamp bh = jh2bh(descriptor); 114470decc6SDave Kleikamp 115818d276cSGirish Shilamkar tmp = (struct commit_header *)bh->b_data; 116f7f4bccbSMingming Cao tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER); 117f7f4bccbSMingming Cao tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK); 118470decc6SDave Kleikamp tmp->h_sequence = cpu_to_be32(commit_transaction->t_tid); 119736603abSTheodore Ts'o tmp->h_commit_sec = cpu_to_be64(now.tv_sec); 120736603abSTheodore Ts'o tmp->h_commit_nsec = cpu_to_be32(now.tv_nsec); 121818d276cSGirish Shilamkar 122818d276cSGirish Shilamkar if (JBD2_HAS_COMPAT_FEATURE(journal, 123818d276cSGirish Shilamkar JBD2_FEATURE_COMPAT_CHECKSUM)) { 124818d276cSGirish Shilamkar tmp->h_chksum_type = JBD2_CRC32_CHKSUM; 125818d276cSGirish Shilamkar tmp->h_chksum_size = JBD2_CRC32_CHKSUM_SIZE; 126818d276cSGirish Shilamkar tmp->h_chksum[0] = cpu_to_be32(crc32_sum); 127470decc6SDave Kleikamp } 128470decc6SDave Kleikamp 129818d276cSGirish Shilamkar JBUFFER_TRACE(descriptor, "submit commit block"); 130818d276cSGirish Shilamkar lock_buffer(bh); 13145a90bfdSTheodore Ts'o clear_buffer_dirty(bh); 132818d276cSGirish Shilamkar set_buffer_uptodate(bh); 133818d276cSGirish Shilamkar bh->b_end_io = journal_end_buffer_io_sync; 134818d276cSGirish Shilamkar 135818d276cSGirish Shilamkar if (journal->j_flags & JBD2_BARRIER && 1364d605179SAneesh Kumar K.V !JBD2_HAS_INCOMPAT_FEATURE(journal, 137818d276cSGirish Shilamkar JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { 138470decc6SDave Kleikamp set_buffer_ordered(bh); 139470decc6SDave Kleikamp barrier_done = 1; 140470decc6SDave Kleikamp } 141*40a1984dSTheodore Ts'o ret = submit_bh(WRITE_SYNC, bh); 142c4e35e07SDave Kleikamp if (barrier_done) 143c4e35e07SDave Kleikamp clear_buffer_ordered(bh); 144818d276cSGirish Shilamkar 145470decc6SDave Kleikamp /* is it possible for another commit to fail at roughly 146470decc6SDave Kleikamp * the same time as this one? If so, we don't want to 147470decc6SDave Kleikamp * trust the barrier flag in the super, but instead want 148470decc6SDave Kleikamp * to remember if we sent a barrier request 149470decc6SDave Kleikamp */ 150470decc6SDave Kleikamp if (ret == -EOPNOTSUPP && barrier_done) { 151470decc6SDave Kleikamp printk(KERN_WARNING 152470decc6SDave Kleikamp "JBD: barrier-based sync failed on %s - " 15305496769STheodore Ts'o "disabling barriers\n", journal->j_devname); 154470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 155f7f4bccbSMingming Cao journal->j_flags &= ~JBD2_BARRIER; 156470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 157470decc6SDave Kleikamp 158470decc6SDave Kleikamp /* And try again, without the barrier */ 159034772b0STheodore Ts'o lock_buffer(bh); 160470decc6SDave Kleikamp set_buffer_uptodate(bh); 16145a90bfdSTheodore Ts'o clear_buffer_dirty(bh); 162*40a1984dSTheodore Ts'o ret = submit_bh(WRITE_SYNC, bh); 163470decc6SDave Kleikamp } 164818d276cSGirish Shilamkar *cbh = bh; 165818d276cSGirish Shilamkar return ret; 166818d276cSGirish Shilamkar } 167470decc6SDave Kleikamp 168818d276cSGirish Shilamkar /* 169818d276cSGirish Shilamkar * This function along with journal_submit_commit_record 170818d276cSGirish Shilamkar * allows to write the commit record asynchronously. 171818d276cSGirish Shilamkar */ 172fd98496fSTheodore Ts'o static int journal_wait_on_commit_record(journal_t *journal, 173fd98496fSTheodore Ts'o struct buffer_head *bh) 174818d276cSGirish Shilamkar { 175818d276cSGirish Shilamkar int ret = 0; 176818d276cSGirish Shilamkar 177fd98496fSTheodore Ts'o retry: 178818d276cSGirish Shilamkar clear_buffer_dirty(bh); 179818d276cSGirish Shilamkar wait_on_buffer(bh); 180fd98496fSTheodore Ts'o if (buffer_eopnotsupp(bh) && (journal->j_flags & JBD2_BARRIER)) { 181fd98496fSTheodore Ts'o printk(KERN_WARNING 182fd98496fSTheodore Ts'o "JBD2: wait_on_commit_record: sync failed on %s - " 183fd98496fSTheodore Ts'o "disabling barriers\n", journal->j_devname); 184fd98496fSTheodore Ts'o spin_lock(&journal->j_state_lock); 185fd98496fSTheodore Ts'o journal->j_flags &= ~JBD2_BARRIER; 186fd98496fSTheodore Ts'o spin_unlock(&journal->j_state_lock); 187fd98496fSTheodore Ts'o 188fd98496fSTheodore Ts'o lock_buffer(bh); 189fd98496fSTheodore Ts'o clear_buffer_dirty(bh); 190fd98496fSTheodore Ts'o set_buffer_uptodate(bh); 191fd98496fSTheodore Ts'o bh->b_end_io = journal_end_buffer_io_sync; 192fd98496fSTheodore Ts'o 193fd98496fSTheodore Ts'o ret = submit_bh(WRITE_SYNC, bh); 194fd98496fSTheodore Ts'o if (ret) { 195fd98496fSTheodore Ts'o unlock_buffer(bh); 196fd98496fSTheodore Ts'o return ret; 197fd98496fSTheodore Ts'o } 198fd98496fSTheodore Ts'o goto retry; 199fd98496fSTheodore Ts'o } 200818d276cSGirish Shilamkar 201818d276cSGirish Shilamkar if (unlikely(!buffer_uptodate(bh))) 202818d276cSGirish Shilamkar ret = -EIO; 203818d276cSGirish Shilamkar put_bh(bh); /* One for getblk() */ 204818d276cSGirish Shilamkar jbd2_journal_put_journal_head(bh2jh(bh)); 205818d276cSGirish Shilamkar 206818d276cSGirish Shilamkar return ret; 207818d276cSGirish Shilamkar } 208818d276cSGirish Shilamkar 209818d276cSGirish Shilamkar /* 210cd1aac32SAneesh Kumar K.V * write the filemap data using writepage() address_space_operations. 211cd1aac32SAneesh Kumar K.V * We don't do block allocation here even for delalloc. We don't 212cd1aac32SAneesh Kumar K.V * use writepages() because with dealyed allocation we may be doing 213cd1aac32SAneesh Kumar K.V * block allocation in writepages(). 214cd1aac32SAneesh Kumar K.V */ 215cd1aac32SAneesh Kumar K.V static int journal_submit_inode_data_buffers(struct address_space *mapping) 216cd1aac32SAneesh Kumar K.V { 217cd1aac32SAneesh Kumar K.V int ret; 218cd1aac32SAneesh Kumar K.V struct writeback_control wbc = { 219cd1aac32SAneesh Kumar K.V .sync_mode = WB_SYNC_ALL, 220cd1aac32SAneesh Kumar K.V .nr_to_write = mapping->nrpages * 2, 221cd1aac32SAneesh Kumar K.V .range_start = 0, 222cd1aac32SAneesh Kumar K.V .range_end = i_size_read(mapping->host), 223cd1aac32SAneesh Kumar K.V .for_writepages = 1, 224cd1aac32SAneesh Kumar K.V }; 225cd1aac32SAneesh Kumar K.V 226cd1aac32SAneesh Kumar K.V ret = generic_writepages(mapping, &wbc); 227cd1aac32SAneesh Kumar K.V return ret; 228cd1aac32SAneesh Kumar K.V } 229cd1aac32SAneesh Kumar K.V 230cd1aac32SAneesh Kumar K.V /* 231c851ed54SJan Kara * Submit all the data buffers of inode associated with the transaction to 232c851ed54SJan Kara * disk. 233c851ed54SJan Kara * 234c851ed54SJan Kara * We are in a committing transaction. Therefore no new inode can be added to 235c851ed54SJan Kara * our inode list. We use JI_COMMIT_RUNNING flag to protect inode we currently 236c851ed54SJan Kara * operate on from being released while we write out pages. 237c851ed54SJan Kara */ 238cd1aac32SAneesh Kumar K.V static int journal_submit_data_buffers(journal_t *journal, 239c851ed54SJan Kara transaction_t *commit_transaction) 240c851ed54SJan Kara { 241c851ed54SJan Kara struct jbd2_inode *jinode; 242c851ed54SJan Kara int err, ret = 0; 243c851ed54SJan Kara struct address_space *mapping; 244c851ed54SJan Kara 245c851ed54SJan Kara spin_lock(&journal->j_list_lock); 246c851ed54SJan Kara list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) { 247c851ed54SJan Kara mapping = jinode->i_vfs_inode->i_mapping; 248c851ed54SJan Kara jinode->i_flags |= JI_COMMIT_RUNNING; 249c851ed54SJan Kara spin_unlock(&journal->j_list_lock); 250cd1aac32SAneesh Kumar K.V /* 251cd1aac32SAneesh Kumar K.V * submit the inode data buffers. We use writepage 252cd1aac32SAneesh Kumar K.V * instead of writepages. Because writepages can do 253cd1aac32SAneesh Kumar K.V * block allocation with delalloc. We need to write 254cd1aac32SAneesh Kumar K.V * only allocated blocks here. 255cd1aac32SAneesh Kumar K.V */ 256cd1aac32SAneesh Kumar K.V err = journal_submit_inode_data_buffers(mapping); 257c851ed54SJan Kara if (!ret) 258c851ed54SJan Kara ret = err; 259c851ed54SJan Kara spin_lock(&journal->j_list_lock); 260c851ed54SJan Kara J_ASSERT(jinode->i_transaction == commit_transaction); 261c851ed54SJan Kara jinode->i_flags &= ~JI_COMMIT_RUNNING; 262c851ed54SJan Kara wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING); 263c851ed54SJan Kara } 264c851ed54SJan Kara spin_unlock(&journal->j_list_lock); 265c851ed54SJan Kara return ret; 266c851ed54SJan Kara } 267c851ed54SJan Kara 268c851ed54SJan Kara /* 269c851ed54SJan Kara * Wait for data submitted for writeout, refile inodes to proper 270c851ed54SJan Kara * transaction if needed. 271c851ed54SJan Kara * 272c851ed54SJan Kara */ 273c851ed54SJan Kara static int journal_finish_inode_data_buffers(journal_t *journal, 274c851ed54SJan Kara transaction_t *commit_transaction) 275c851ed54SJan Kara { 276c851ed54SJan Kara struct jbd2_inode *jinode, *next_i; 277c851ed54SJan Kara int err, ret = 0; 278c851ed54SJan Kara 279cd1aac32SAneesh Kumar K.V /* For locking, see the comment in journal_submit_data_buffers() */ 280c851ed54SJan Kara spin_lock(&journal->j_list_lock); 281c851ed54SJan Kara list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) { 282c851ed54SJan Kara jinode->i_flags |= JI_COMMIT_RUNNING; 283c851ed54SJan Kara spin_unlock(&journal->j_list_lock); 284c851ed54SJan Kara err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping); 285e9e34f4eSHidehiro Kawai if (err) { 286e9e34f4eSHidehiro Kawai /* 287e9e34f4eSHidehiro Kawai * Because AS_EIO is cleared by 288e9e34f4eSHidehiro Kawai * wait_on_page_writeback_range(), set it again so 289e9e34f4eSHidehiro Kawai * that user process can get -EIO from fsync(). 290e9e34f4eSHidehiro Kawai */ 291e9e34f4eSHidehiro Kawai set_bit(AS_EIO, 292e9e34f4eSHidehiro Kawai &jinode->i_vfs_inode->i_mapping->flags); 293e9e34f4eSHidehiro Kawai 294c851ed54SJan Kara if (!ret) 295c851ed54SJan Kara ret = err; 296e9e34f4eSHidehiro Kawai } 297c851ed54SJan Kara spin_lock(&journal->j_list_lock); 298c851ed54SJan Kara jinode->i_flags &= ~JI_COMMIT_RUNNING; 299c851ed54SJan Kara wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING); 300c851ed54SJan Kara } 301c851ed54SJan Kara 302c851ed54SJan Kara /* Now refile inode to proper lists */ 303c851ed54SJan Kara list_for_each_entry_safe(jinode, next_i, 304c851ed54SJan Kara &commit_transaction->t_inode_list, i_list) { 305c851ed54SJan Kara list_del(&jinode->i_list); 306c851ed54SJan Kara if (jinode->i_next_transaction) { 307c851ed54SJan Kara jinode->i_transaction = jinode->i_next_transaction; 308c851ed54SJan Kara jinode->i_next_transaction = NULL; 309c851ed54SJan Kara list_add(&jinode->i_list, 310c851ed54SJan Kara &jinode->i_transaction->t_inode_list); 311c851ed54SJan Kara } else { 312c851ed54SJan Kara jinode->i_transaction = NULL; 313c851ed54SJan Kara } 314c851ed54SJan Kara } 315c851ed54SJan Kara spin_unlock(&journal->j_list_lock); 316c851ed54SJan Kara 317c851ed54SJan Kara return ret; 318c851ed54SJan Kara } 319c851ed54SJan Kara 320818d276cSGirish Shilamkar static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh) 321818d276cSGirish Shilamkar { 322818d276cSGirish Shilamkar struct page *page = bh->b_page; 323818d276cSGirish Shilamkar char *addr; 324818d276cSGirish Shilamkar __u32 checksum; 325818d276cSGirish Shilamkar 326818d276cSGirish Shilamkar addr = kmap_atomic(page, KM_USER0); 327818d276cSGirish Shilamkar checksum = crc32_be(crc32_sum, 328818d276cSGirish Shilamkar (void *)(addr + offset_in_page(bh->b_data)), bh->b_size); 329818d276cSGirish Shilamkar kunmap_atomic(addr, KM_USER0); 330818d276cSGirish Shilamkar 331818d276cSGirish Shilamkar return checksum; 332818d276cSGirish Shilamkar } 333818d276cSGirish Shilamkar 334818d276cSGirish Shilamkar static void write_tag_block(int tag_bytes, journal_block_tag_t *tag, 33518eba7aaSMingming Cao unsigned long long block) 336b517bea1SZach Brown { 337b517bea1SZach Brown tag->t_blocknr = cpu_to_be32(block & (u32)~0); 338cd02ff0bSMingming Cao if (tag_bytes > JBD2_TAG_SIZE32) 339b517bea1SZach Brown tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1); 340b517bea1SZach Brown } 341b517bea1SZach Brown 342470decc6SDave Kleikamp /* 343f7f4bccbSMingming Cao * jbd2_journal_commit_transaction 344470decc6SDave Kleikamp * 345470decc6SDave Kleikamp * The primary function for committing a transaction to the log. This 346470decc6SDave Kleikamp * function is called by the journal thread to begin a complete commit. 347470decc6SDave Kleikamp */ 348f7f4bccbSMingming Cao void jbd2_journal_commit_transaction(journal_t *journal) 349470decc6SDave Kleikamp { 3508e85fb3fSJohann Lombardi struct transaction_stats_s stats; 351470decc6SDave Kleikamp transaction_t *commit_transaction; 352470decc6SDave Kleikamp struct journal_head *jh, *new_jh, *descriptor; 353470decc6SDave Kleikamp struct buffer_head **wbuf = journal->j_wbuf; 354470decc6SDave Kleikamp int bufs; 355470decc6SDave Kleikamp int flags; 356470decc6SDave Kleikamp int err; 35718eba7aaSMingming Cao unsigned long long blocknr; 358e07f7183SJosef Bacik ktime_t start_time; 359e07f7183SJosef Bacik u64 commit_time; 360470decc6SDave Kleikamp char *tagp = NULL; 361470decc6SDave Kleikamp journal_header_t *header; 362470decc6SDave Kleikamp journal_block_tag_t *tag = NULL; 363470decc6SDave Kleikamp int space_left = 0; 364470decc6SDave Kleikamp int first_tag = 0; 365470decc6SDave Kleikamp int tag_flag; 366fb68407bSAneesh Kumar K.V int i, to_free = 0; 367b517bea1SZach Brown int tag_bytes = journal_tag_bytes(journal); 368818d276cSGirish Shilamkar struct buffer_head *cbh = NULL; /* For transactional checksums */ 369818d276cSGirish Shilamkar __u32 crc32_sum = ~0; 370470decc6SDave Kleikamp 371470decc6SDave Kleikamp /* 372470decc6SDave Kleikamp * First job: lock down the current transaction and wait for 373470decc6SDave Kleikamp * all outstanding updates to complete. 374470decc6SDave Kleikamp */ 375470decc6SDave Kleikamp 376470decc6SDave Kleikamp #ifdef COMMIT_STATS 377470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 378470decc6SDave Kleikamp summarise_journal_usage(journal); 379470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 380470decc6SDave Kleikamp #endif 381470decc6SDave Kleikamp 382f7f4bccbSMingming Cao /* Do we need to erase the effects of a prior jbd2_journal_flush? */ 383f7f4bccbSMingming Cao if (journal->j_flags & JBD2_FLUSHED) { 384470decc6SDave Kleikamp jbd_debug(3, "super block updated\n"); 385f7f4bccbSMingming Cao jbd2_journal_update_superblock(journal, 1); 386470decc6SDave Kleikamp } else { 387470decc6SDave Kleikamp jbd_debug(3, "superblock not updated\n"); 388470decc6SDave Kleikamp } 389470decc6SDave Kleikamp 390470decc6SDave Kleikamp J_ASSERT(journal->j_running_transaction != NULL); 391470decc6SDave Kleikamp J_ASSERT(journal->j_committing_transaction == NULL); 392470decc6SDave Kleikamp 393470decc6SDave Kleikamp commit_transaction = journal->j_running_transaction; 394470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_state == T_RUNNING); 395470decc6SDave Kleikamp 396ede86cc4STheodore Ts'o trace_mark(jbd2_start_commit, "dev %s transaction %d", 397ede86cc4STheodore Ts'o journal->j_devname, commit_transaction->t_tid); 398470decc6SDave Kleikamp jbd_debug(1, "JBD: starting commit of transaction %d\n", 399470decc6SDave Kleikamp commit_transaction->t_tid); 400470decc6SDave Kleikamp 401470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 402470decc6SDave Kleikamp commit_transaction->t_state = T_LOCKED; 403470decc6SDave Kleikamp 4048e85fb3fSJohann Lombardi stats.u.run.rs_wait = commit_transaction->t_max_wait; 4058e85fb3fSJohann Lombardi stats.u.run.rs_locked = jiffies; 4068e85fb3fSJohann Lombardi stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start, 4078e85fb3fSJohann Lombardi stats.u.run.rs_locked); 4088e85fb3fSJohann Lombardi 409470decc6SDave Kleikamp spin_lock(&commit_transaction->t_handle_lock); 410470decc6SDave Kleikamp while (commit_transaction->t_updates) { 411470decc6SDave Kleikamp DEFINE_WAIT(wait); 412470decc6SDave Kleikamp 413470decc6SDave Kleikamp prepare_to_wait(&journal->j_wait_updates, &wait, 414470decc6SDave Kleikamp TASK_UNINTERRUPTIBLE); 415470decc6SDave Kleikamp if (commit_transaction->t_updates) { 416470decc6SDave Kleikamp spin_unlock(&commit_transaction->t_handle_lock); 417470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 418470decc6SDave Kleikamp schedule(); 419470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 420470decc6SDave Kleikamp spin_lock(&commit_transaction->t_handle_lock); 421470decc6SDave Kleikamp } 422470decc6SDave Kleikamp finish_wait(&journal->j_wait_updates, &wait); 423470decc6SDave Kleikamp } 424470decc6SDave Kleikamp spin_unlock(&commit_transaction->t_handle_lock); 425470decc6SDave Kleikamp 426470decc6SDave Kleikamp J_ASSERT (commit_transaction->t_outstanding_credits <= 427470decc6SDave Kleikamp journal->j_max_transaction_buffers); 428470decc6SDave Kleikamp 429470decc6SDave Kleikamp /* 430470decc6SDave Kleikamp * First thing we are allowed to do is to discard any remaining 431470decc6SDave Kleikamp * BJ_Reserved buffers. Note, it is _not_ permissible to assume 432470decc6SDave Kleikamp * that there are no such buffers: if a large filesystem 433470decc6SDave Kleikamp * operation like a truncate needs to split itself over multiple 434f7f4bccbSMingming Cao * transactions, then it may try to do a jbd2_journal_restart() while 435470decc6SDave Kleikamp * there are still BJ_Reserved buffers outstanding. These must 436470decc6SDave Kleikamp * be released cleanly from the current transaction. 437470decc6SDave Kleikamp * 438470decc6SDave Kleikamp * In this case, the filesystem must still reserve write access 439470decc6SDave Kleikamp * again before modifying the buffer in the new transaction, but 440470decc6SDave Kleikamp * we do not require it to remember exactly which old buffers it 441470decc6SDave Kleikamp * has reserved. This is consistent with the existing behaviour 442f7f4bccbSMingming Cao * that multiple jbd2_journal_get_write_access() calls to the same 443470decc6SDave Kleikamp * buffer are perfectly permissable. 444470decc6SDave Kleikamp */ 445470decc6SDave Kleikamp while (commit_transaction->t_reserved_list) { 446470decc6SDave Kleikamp jh = commit_transaction->t_reserved_list; 447470decc6SDave Kleikamp JBUFFER_TRACE(jh, "reserved, unused: refile"); 448470decc6SDave Kleikamp /* 449f7f4bccbSMingming Cao * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may 450470decc6SDave Kleikamp * leave undo-committed data. 451470decc6SDave Kleikamp */ 452470decc6SDave Kleikamp if (jh->b_committed_data) { 453470decc6SDave Kleikamp struct buffer_head *bh = jh2bh(jh); 454470decc6SDave Kleikamp 455470decc6SDave Kleikamp jbd_lock_bh_state(bh); 456af1e76d6SMingming Cao jbd2_free(jh->b_committed_data, bh->b_size); 457470decc6SDave Kleikamp jh->b_committed_data = NULL; 458470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 459470decc6SDave Kleikamp } 460f7f4bccbSMingming Cao jbd2_journal_refile_buffer(journal, jh); 461470decc6SDave Kleikamp } 462470decc6SDave Kleikamp 463470decc6SDave Kleikamp /* 464470decc6SDave Kleikamp * Now try to drop any written-back buffers from the journal's 465470decc6SDave Kleikamp * checkpoint lists. We do this *before* commit because it potentially 466470decc6SDave Kleikamp * frees some memory 467470decc6SDave Kleikamp */ 468470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 469f7f4bccbSMingming Cao __jbd2_journal_clean_checkpoint_list(journal); 470470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 471470decc6SDave Kleikamp 472470decc6SDave Kleikamp jbd_debug (3, "JBD: commit phase 1\n"); 473470decc6SDave Kleikamp 474470decc6SDave Kleikamp /* 475470decc6SDave Kleikamp * Switch to a new revoke table. 476470decc6SDave Kleikamp */ 477f7f4bccbSMingming Cao jbd2_journal_switch_revoke_table(journal); 478470decc6SDave Kleikamp 4798e85fb3fSJohann Lombardi stats.u.run.rs_flushing = jiffies; 4808e85fb3fSJohann Lombardi stats.u.run.rs_locked = jbd2_time_diff(stats.u.run.rs_locked, 4818e85fb3fSJohann Lombardi stats.u.run.rs_flushing); 4828e85fb3fSJohann Lombardi 483470decc6SDave Kleikamp commit_transaction->t_state = T_FLUSH; 484470decc6SDave Kleikamp journal->j_committing_transaction = commit_transaction; 485470decc6SDave Kleikamp journal->j_running_transaction = NULL; 486e07f7183SJosef Bacik start_time = ktime_get(); 487470decc6SDave Kleikamp commit_transaction->t_log_start = journal->j_head; 488470decc6SDave Kleikamp wake_up(&journal->j_wait_transaction_locked); 489470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 490470decc6SDave Kleikamp 491470decc6SDave Kleikamp jbd_debug (3, "JBD: commit phase 2\n"); 492470decc6SDave Kleikamp 493470decc6SDave Kleikamp /* 494470decc6SDave Kleikamp * Now start flushing things to disk, in the order they appear 495470decc6SDave Kleikamp * on the transaction lists. Data blocks go first. 496470decc6SDave Kleikamp */ 497cd1aac32SAneesh Kumar K.V err = journal_submit_data_buffers(journal, commit_transaction); 498c851ed54SJan Kara if (err) 499c851ed54SJan Kara jbd2_journal_abort(journal, err); 500470decc6SDave Kleikamp 501f7f4bccbSMingming Cao jbd2_journal_write_revoke_records(journal, commit_transaction); 502470decc6SDave Kleikamp 503470decc6SDave Kleikamp jbd_debug(3, "JBD: commit phase 2\n"); 504470decc6SDave Kleikamp 505470decc6SDave Kleikamp /* 506470decc6SDave Kleikamp * Way to go: we have now written out all of the data for a 507470decc6SDave Kleikamp * transaction! Now comes the tricky part: we need to write out 508470decc6SDave Kleikamp * metadata. Loop over the transaction's entire buffer list: 509470decc6SDave Kleikamp */ 51002c471cbSMingming Cao spin_lock(&journal->j_state_lock); 511470decc6SDave Kleikamp commit_transaction->t_state = T_COMMIT; 51202c471cbSMingming Cao spin_unlock(&journal->j_state_lock); 513470decc6SDave Kleikamp 5148e85fb3fSJohann Lombardi stats.u.run.rs_logging = jiffies; 5158e85fb3fSJohann Lombardi stats.u.run.rs_flushing = jbd2_time_diff(stats.u.run.rs_flushing, 5168e85fb3fSJohann Lombardi stats.u.run.rs_logging); 5178e85fb3fSJohann Lombardi stats.u.run.rs_blocks = commit_transaction->t_outstanding_credits; 5188e85fb3fSJohann Lombardi stats.u.run.rs_blocks_logged = 0; 5198e85fb3fSJohann Lombardi 5201dfc3220SJosef Bacik J_ASSERT(commit_transaction->t_nr_buffers <= 5211dfc3220SJosef Bacik commit_transaction->t_outstanding_credits); 5221dfc3220SJosef Bacik 52387c89c23SJan Kara err = 0; 524470decc6SDave Kleikamp descriptor = NULL; 525470decc6SDave Kleikamp bufs = 0; 526470decc6SDave Kleikamp while (commit_transaction->t_buffers) { 527470decc6SDave Kleikamp 528470decc6SDave Kleikamp /* Find the next buffer to be journaled... */ 529470decc6SDave Kleikamp 530470decc6SDave Kleikamp jh = commit_transaction->t_buffers; 531470decc6SDave Kleikamp 532470decc6SDave Kleikamp /* If we're in abort mode, we just un-journal the buffer and 5337ad7445fSHidehiro Kawai release it. */ 534470decc6SDave Kleikamp 535470decc6SDave Kleikamp if (is_journal_aborted(journal)) { 5367ad7445fSHidehiro Kawai clear_buffer_jbddirty(jh2bh(jh)); 537470decc6SDave Kleikamp JBUFFER_TRACE(jh, "journal is aborting: refile"); 538f7f4bccbSMingming Cao jbd2_journal_refile_buffer(journal, jh); 539470decc6SDave Kleikamp /* If that was the last one, we need to clean up 540470decc6SDave Kleikamp * any descriptor buffers which may have been 541470decc6SDave Kleikamp * already allocated, even if we are now 542470decc6SDave Kleikamp * aborting. */ 543470decc6SDave Kleikamp if (!commit_transaction->t_buffers) 544470decc6SDave Kleikamp goto start_journal_io; 545470decc6SDave Kleikamp continue; 546470decc6SDave Kleikamp } 547470decc6SDave Kleikamp 548470decc6SDave Kleikamp /* Make sure we have a descriptor block in which to 549470decc6SDave Kleikamp record the metadata buffer. */ 550470decc6SDave Kleikamp 551470decc6SDave Kleikamp if (!descriptor) { 552470decc6SDave Kleikamp struct buffer_head *bh; 553470decc6SDave Kleikamp 554470decc6SDave Kleikamp J_ASSERT (bufs == 0); 555470decc6SDave Kleikamp 556470decc6SDave Kleikamp jbd_debug(4, "JBD: get descriptor\n"); 557470decc6SDave Kleikamp 558f7f4bccbSMingming Cao descriptor = jbd2_journal_get_descriptor_buffer(journal); 559470decc6SDave Kleikamp if (!descriptor) { 560a7fa2bafSJan Kara jbd2_journal_abort(journal, -EIO); 561470decc6SDave Kleikamp continue; 562470decc6SDave Kleikamp } 563470decc6SDave Kleikamp 564470decc6SDave Kleikamp bh = jh2bh(descriptor); 565470decc6SDave Kleikamp jbd_debug(4, "JBD: got buffer %llu (%p)\n", 566470decc6SDave Kleikamp (unsigned long long)bh->b_blocknr, bh->b_data); 567470decc6SDave Kleikamp header = (journal_header_t *)&bh->b_data[0]; 568f7f4bccbSMingming Cao header->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER); 569f7f4bccbSMingming Cao header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK); 570470decc6SDave Kleikamp header->h_sequence = cpu_to_be32(commit_transaction->t_tid); 571470decc6SDave Kleikamp 572470decc6SDave Kleikamp tagp = &bh->b_data[sizeof(journal_header_t)]; 573470decc6SDave Kleikamp space_left = bh->b_size - sizeof(journal_header_t); 574470decc6SDave Kleikamp first_tag = 1; 575470decc6SDave Kleikamp set_buffer_jwrite(bh); 576470decc6SDave Kleikamp set_buffer_dirty(bh); 577470decc6SDave Kleikamp wbuf[bufs++] = bh; 578470decc6SDave Kleikamp 579470decc6SDave Kleikamp /* Record it so that we can wait for IO 580470decc6SDave Kleikamp completion later */ 581470decc6SDave Kleikamp BUFFER_TRACE(bh, "ph3: file as descriptor"); 582f7f4bccbSMingming Cao jbd2_journal_file_buffer(descriptor, commit_transaction, 583470decc6SDave Kleikamp BJ_LogCtl); 584470decc6SDave Kleikamp } 585470decc6SDave Kleikamp 586470decc6SDave Kleikamp /* Where is the buffer to be written? */ 587470decc6SDave Kleikamp 588f7f4bccbSMingming Cao err = jbd2_journal_next_log_block(journal, &blocknr); 589470decc6SDave Kleikamp /* If the block mapping failed, just abandon the buffer 590470decc6SDave Kleikamp and repeat this loop: we'll fall into the 591470decc6SDave Kleikamp refile-on-abort condition above. */ 592470decc6SDave Kleikamp if (err) { 593a7fa2bafSJan Kara jbd2_journal_abort(journal, err); 594470decc6SDave Kleikamp continue; 595470decc6SDave Kleikamp } 596470decc6SDave Kleikamp 597470decc6SDave Kleikamp /* 598470decc6SDave Kleikamp * start_this_handle() uses t_outstanding_credits to determine 599470decc6SDave Kleikamp * the free space in the log, but this counter is changed 600f7f4bccbSMingming Cao * by jbd2_journal_next_log_block() also. 601470decc6SDave Kleikamp */ 602470decc6SDave Kleikamp commit_transaction->t_outstanding_credits--; 603470decc6SDave Kleikamp 604470decc6SDave Kleikamp /* Bump b_count to prevent truncate from stumbling over 605470decc6SDave Kleikamp the shadowed buffer! @@@ This can go if we ever get 606470decc6SDave Kleikamp rid of the BJ_IO/BJ_Shadow pairing of buffers. */ 607470decc6SDave Kleikamp atomic_inc(&jh2bh(jh)->b_count); 608470decc6SDave Kleikamp 609470decc6SDave Kleikamp /* Make a temporary IO buffer with which to write it out 610470decc6SDave Kleikamp (this will requeue both the metadata buffer and the 611470decc6SDave Kleikamp temporary IO buffer). new_bh goes on BJ_IO*/ 612470decc6SDave Kleikamp 613470decc6SDave Kleikamp set_bit(BH_JWrite, &jh2bh(jh)->b_state); 614470decc6SDave Kleikamp /* 615f7f4bccbSMingming Cao * akpm: jbd2_journal_write_metadata_buffer() sets 616470decc6SDave Kleikamp * new_bh->b_transaction to commit_transaction. 617470decc6SDave Kleikamp * We need to clean this up before we release new_bh 618470decc6SDave Kleikamp * (which is of type BJ_IO) 619470decc6SDave Kleikamp */ 620470decc6SDave Kleikamp JBUFFER_TRACE(jh, "ph3: write metadata"); 621f7f4bccbSMingming Cao flags = jbd2_journal_write_metadata_buffer(commit_transaction, 622470decc6SDave Kleikamp jh, &new_jh, blocknr); 623470decc6SDave Kleikamp set_bit(BH_JWrite, &jh2bh(new_jh)->b_state); 624470decc6SDave Kleikamp wbuf[bufs++] = jh2bh(new_jh); 625470decc6SDave Kleikamp 626470decc6SDave Kleikamp /* Record the new block's tag in the current descriptor 627470decc6SDave Kleikamp buffer */ 628470decc6SDave Kleikamp 629470decc6SDave Kleikamp tag_flag = 0; 630470decc6SDave Kleikamp if (flags & 1) 631f7f4bccbSMingming Cao tag_flag |= JBD2_FLAG_ESCAPE; 632470decc6SDave Kleikamp if (!first_tag) 633f7f4bccbSMingming Cao tag_flag |= JBD2_FLAG_SAME_UUID; 634470decc6SDave Kleikamp 635470decc6SDave Kleikamp tag = (journal_block_tag_t *) tagp; 636b517bea1SZach Brown write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr); 637470decc6SDave Kleikamp tag->t_flags = cpu_to_be32(tag_flag); 638b517bea1SZach Brown tagp += tag_bytes; 639b517bea1SZach Brown space_left -= tag_bytes; 640470decc6SDave Kleikamp 641470decc6SDave Kleikamp if (first_tag) { 642470decc6SDave Kleikamp memcpy (tagp, journal->j_uuid, 16); 643470decc6SDave Kleikamp tagp += 16; 644470decc6SDave Kleikamp space_left -= 16; 645470decc6SDave Kleikamp first_tag = 0; 646470decc6SDave Kleikamp } 647470decc6SDave Kleikamp 648470decc6SDave Kleikamp /* If there's no more to do, or if the descriptor is full, 649470decc6SDave Kleikamp let the IO rip! */ 650470decc6SDave Kleikamp 651470decc6SDave Kleikamp if (bufs == journal->j_wbufsize || 652470decc6SDave Kleikamp commit_transaction->t_buffers == NULL || 653b517bea1SZach Brown space_left < tag_bytes + 16) { 654470decc6SDave Kleikamp 655470decc6SDave Kleikamp jbd_debug(4, "JBD: Submit %d IOs\n", bufs); 656470decc6SDave Kleikamp 657470decc6SDave Kleikamp /* Write an end-of-descriptor marker before 658470decc6SDave Kleikamp submitting the IOs. "tag" still points to 659470decc6SDave Kleikamp the last tag we set up. */ 660470decc6SDave Kleikamp 661f7f4bccbSMingming Cao tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG); 662470decc6SDave Kleikamp 663470decc6SDave Kleikamp start_journal_io: 664470decc6SDave Kleikamp for (i = 0; i < bufs; i++) { 665470decc6SDave Kleikamp struct buffer_head *bh = wbuf[i]; 666818d276cSGirish Shilamkar /* 667818d276cSGirish Shilamkar * Compute checksum. 668818d276cSGirish Shilamkar */ 669818d276cSGirish Shilamkar if (JBD2_HAS_COMPAT_FEATURE(journal, 670818d276cSGirish Shilamkar JBD2_FEATURE_COMPAT_CHECKSUM)) { 671818d276cSGirish Shilamkar crc32_sum = 672818d276cSGirish Shilamkar jbd2_checksum_data(crc32_sum, bh); 673818d276cSGirish Shilamkar } 674818d276cSGirish Shilamkar 675470decc6SDave Kleikamp lock_buffer(bh); 676470decc6SDave Kleikamp clear_buffer_dirty(bh); 677470decc6SDave Kleikamp set_buffer_uptodate(bh); 678470decc6SDave Kleikamp bh->b_end_io = journal_end_buffer_io_sync; 679470decc6SDave Kleikamp submit_bh(WRITE, bh); 680470decc6SDave Kleikamp } 681470decc6SDave Kleikamp cond_resched(); 6828e85fb3fSJohann Lombardi stats.u.run.rs_blocks_logged += bufs; 683470decc6SDave Kleikamp 684470decc6SDave Kleikamp /* Force a new descriptor to be generated next 685470decc6SDave Kleikamp time round the loop. */ 686470decc6SDave Kleikamp descriptor = NULL; 687470decc6SDave Kleikamp bufs = 0; 688470decc6SDave Kleikamp } 689470decc6SDave Kleikamp } 690470decc6SDave Kleikamp 691818d276cSGirish Shilamkar /* Done it all: now write the commit record asynchronously. */ 692818d276cSGirish Shilamkar 693818d276cSGirish Shilamkar if (JBD2_HAS_INCOMPAT_FEATURE(journal, 694818d276cSGirish Shilamkar JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { 695818d276cSGirish Shilamkar err = journal_submit_commit_record(journal, commit_transaction, 696818d276cSGirish Shilamkar &cbh, crc32_sum); 697818d276cSGirish Shilamkar if (err) 698818d276cSGirish Shilamkar __jbd2_journal_abort_hard(journal); 699818d276cSGirish Shilamkar } 700818d276cSGirish Shilamkar 701c851ed54SJan Kara /* 702c851ed54SJan Kara * This is the right place to wait for data buffers both for ASYNC 703c851ed54SJan Kara * and !ASYNC commit. If commit is ASYNC, we need to wait only after 704c851ed54SJan Kara * the commit block went to disk (which happens above). If commit is 705c851ed54SJan Kara * SYNC, we need to wait for data buffers before we start writing 706c851ed54SJan Kara * commit block, which happens below in such setting. 707c851ed54SJan Kara */ 708c851ed54SJan Kara err = journal_finish_inode_data_buffers(journal, commit_transaction); 709e9e34f4eSHidehiro Kawai if (err) { 710e9e34f4eSHidehiro Kawai printk(KERN_WARNING 711e9e34f4eSHidehiro Kawai "JBD2: Detected IO errors while flushing file data " 71205496769STheodore Ts'o "on %s\n", journal->j_devname); 7135bf5683aSHidehiro Kawai if (journal->j_flags & JBD2_ABORT_ON_SYNCDATA_ERR) 7145bf5683aSHidehiro Kawai jbd2_journal_abort(journal, err); 715e9e34f4eSHidehiro Kawai err = 0; 716e9e34f4eSHidehiro Kawai } 717c851ed54SJan Kara 718470decc6SDave Kleikamp /* Lo and behold: we have just managed to send a transaction to 719470decc6SDave Kleikamp the log. Before we can commit it, wait for the IO so far to 720470decc6SDave Kleikamp complete. Control buffers being written are on the 721470decc6SDave Kleikamp transaction's t_log_list queue, and metadata buffers are on 722470decc6SDave Kleikamp the t_iobuf_list queue. 723470decc6SDave Kleikamp 724470decc6SDave Kleikamp Wait for the buffers in reverse order. That way we are 725470decc6SDave Kleikamp less likely to be woken up until all IOs have completed, and 726470decc6SDave Kleikamp so we incur less scheduling load. 727470decc6SDave Kleikamp */ 728470decc6SDave Kleikamp 72987c89c23SJan Kara jbd_debug(3, "JBD: commit phase 3\n"); 730470decc6SDave Kleikamp 731470decc6SDave Kleikamp /* 732470decc6SDave Kleikamp * akpm: these are BJ_IO, and j_list_lock is not needed. 733470decc6SDave Kleikamp * See __journal_try_to_free_buffer. 734470decc6SDave Kleikamp */ 735470decc6SDave Kleikamp wait_for_iobuf: 736470decc6SDave Kleikamp while (commit_transaction->t_iobuf_list != NULL) { 737470decc6SDave Kleikamp struct buffer_head *bh; 738470decc6SDave Kleikamp 739470decc6SDave Kleikamp jh = commit_transaction->t_iobuf_list->b_tprev; 740470decc6SDave Kleikamp bh = jh2bh(jh); 741470decc6SDave Kleikamp if (buffer_locked(bh)) { 742470decc6SDave Kleikamp wait_on_buffer(bh); 743470decc6SDave Kleikamp goto wait_for_iobuf; 744470decc6SDave Kleikamp } 745470decc6SDave Kleikamp if (cond_resched()) 746470decc6SDave Kleikamp goto wait_for_iobuf; 747470decc6SDave Kleikamp 748470decc6SDave Kleikamp if (unlikely(!buffer_uptodate(bh))) 749470decc6SDave Kleikamp err = -EIO; 750470decc6SDave Kleikamp 751470decc6SDave Kleikamp clear_buffer_jwrite(bh); 752470decc6SDave Kleikamp 753470decc6SDave Kleikamp JBUFFER_TRACE(jh, "ph4: unfile after journal write"); 754f7f4bccbSMingming Cao jbd2_journal_unfile_buffer(journal, jh); 755470decc6SDave Kleikamp 756470decc6SDave Kleikamp /* 757470decc6SDave Kleikamp * ->t_iobuf_list should contain only dummy buffer_heads 758f7f4bccbSMingming Cao * which were created by jbd2_journal_write_metadata_buffer(). 759470decc6SDave Kleikamp */ 760470decc6SDave Kleikamp BUFFER_TRACE(bh, "dumping temporary bh"); 761f7f4bccbSMingming Cao jbd2_journal_put_journal_head(jh); 762470decc6SDave Kleikamp __brelse(bh); 763470decc6SDave Kleikamp J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0); 764470decc6SDave Kleikamp free_buffer_head(bh); 765470decc6SDave Kleikamp 766470decc6SDave Kleikamp /* We also have to unlock and free the corresponding 767470decc6SDave Kleikamp shadowed buffer */ 768470decc6SDave Kleikamp jh = commit_transaction->t_shadow_list->b_tprev; 769470decc6SDave Kleikamp bh = jh2bh(jh); 770470decc6SDave Kleikamp clear_bit(BH_JWrite, &bh->b_state); 771470decc6SDave Kleikamp J_ASSERT_BH(bh, buffer_jbddirty(bh)); 772470decc6SDave Kleikamp 773470decc6SDave Kleikamp /* The metadata is now released for reuse, but we need 774470decc6SDave Kleikamp to remember it against this transaction so that when 775470decc6SDave Kleikamp we finally commit, we can do any checkpointing 776470decc6SDave Kleikamp required. */ 777470decc6SDave Kleikamp JBUFFER_TRACE(jh, "file as BJ_Forget"); 778f7f4bccbSMingming Cao jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget); 779470decc6SDave Kleikamp /* Wake up any transactions which were waiting for this 780470decc6SDave Kleikamp IO to complete */ 781470decc6SDave Kleikamp wake_up_bit(&bh->b_state, BH_Unshadow); 782470decc6SDave Kleikamp JBUFFER_TRACE(jh, "brelse shadowed buffer"); 783470decc6SDave Kleikamp __brelse(bh); 784470decc6SDave Kleikamp } 785470decc6SDave Kleikamp 786470decc6SDave Kleikamp J_ASSERT (commit_transaction->t_shadow_list == NULL); 787470decc6SDave Kleikamp 78887c89c23SJan Kara jbd_debug(3, "JBD: commit phase 4\n"); 789470decc6SDave Kleikamp 790470decc6SDave Kleikamp /* Here we wait for the revoke record and descriptor record buffers */ 791470decc6SDave Kleikamp wait_for_ctlbuf: 792470decc6SDave Kleikamp while (commit_transaction->t_log_list != NULL) { 793470decc6SDave Kleikamp struct buffer_head *bh; 794470decc6SDave Kleikamp 795470decc6SDave Kleikamp jh = commit_transaction->t_log_list->b_tprev; 796470decc6SDave Kleikamp bh = jh2bh(jh); 797470decc6SDave Kleikamp if (buffer_locked(bh)) { 798470decc6SDave Kleikamp wait_on_buffer(bh); 799470decc6SDave Kleikamp goto wait_for_ctlbuf; 800470decc6SDave Kleikamp } 801470decc6SDave Kleikamp if (cond_resched()) 802470decc6SDave Kleikamp goto wait_for_ctlbuf; 803470decc6SDave Kleikamp 804470decc6SDave Kleikamp if (unlikely(!buffer_uptodate(bh))) 805470decc6SDave Kleikamp err = -EIO; 806470decc6SDave Kleikamp 807470decc6SDave Kleikamp BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile"); 808470decc6SDave Kleikamp clear_buffer_jwrite(bh); 809f7f4bccbSMingming Cao jbd2_journal_unfile_buffer(journal, jh); 810f7f4bccbSMingming Cao jbd2_journal_put_journal_head(jh); 811470decc6SDave Kleikamp __brelse(bh); /* One for getblk */ 812470decc6SDave Kleikamp /* AKPM: bforget here */ 813470decc6SDave Kleikamp } 814470decc6SDave Kleikamp 81577e841deSHidehiro Kawai if (err) 81677e841deSHidehiro Kawai jbd2_journal_abort(journal, err); 81777e841deSHidehiro Kawai 81887c89c23SJan Kara jbd_debug(3, "JBD: commit phase 5\n"); 819470decc6SDave Kleikamp 820818d276cSGirish Shilamkar if (!JBD2_HAS_INCOMPAT_FEATURE(journal, 821818d276cSGirish Shilamkar JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { 822818d276cSGirish Shilamkar err = journal_submit_commit_record(journal, commit_transaction, 823818d276cSGirish Shilamkar &cbh, crc32_sum); 824818d276cSGirish Shilamkar if (err) 825818d276cSGirish Shilamkar __jbd2_journal_abort_hard(journal); 826818d276cSGirish Shilamkar } 827b048d846SMingming Cao if (!err && !is_journal_aborted(journal)) 828fd98496fSTheodore Ts'o err = journal_wait_on_commit_record(journal, cbh); 829470decc6SDave Kleikamp 830470decc6SDave Kleikamp if (err) 831a7fa2bafSJan Kara jbd2_journal_abort(journal, err); 832470decc6SDave Kleikamp 833470decc6SDave Kleikamp /* End of a transaction! Finally, we can do checkpoint 834470decc6SDave Kleikamp processing: any buffers committed as a result of this 835470decc6SDave Kleikamp transaction can be removed from any checkpoint list it was on 836470decc6SDave Kleikamp before. */ 837470decc6SDave Kleikamp 83887c89c23SJan Kara jbd_debug(3, "JBD: commit phase 6\n"); 839470decc6SDave Kleikamp 840c851ed54SJan Kara J_ASSERT(list_empty(&commit_transaction->t_inode_list)); 841470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_buffers == NULL); 842470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_checkpoint_list == NULL); 843470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_iobuf_list == NULL); 844470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_shadow_list == NULL); 845470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_log_list == NULL); 846470decc6SDave Kleikamp 847470decc6SDave Kleikamp restart_loop: 848470decc6SDave Kleikamp /* 849470decc6SDave Kleikamp * As there are other places (journal_unmap_buffer()) adding buffers 850470decc6SDave Kleikamp * to this list we have to be careful and hold the j_list_lock. 851470decc6SDave Kleikamp */ 852470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 853470decc6SDave Kleikamp while (commit_transaction->t_forget) { 854470decc6SDave Kleikamp transaction_t *cp_transaction; 855470decc6SDave Kleikamp struct buffer_head *bh; 856470decc6SDave Kleikamp 857470decc6SDave Kleikamp jh = commit_transaction->t_forget; 858470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 859470decc6SDave Kleikamp bh = jh2bh(jh); 860470decc6SDave Kleikamp jbd_lock_bh_state(bh); 861470decc6SDave Kleikamp J_ASSERT_JH(jh, jh->b_transaction == commit_transaction || 862470decc6SDave Kleikamp jh->b_transaction == journal->j_running_transaction); 863470decc6SDave Kleikamp 864470decc6SDave Kleikamp /* 865470decc6SDave Kleikamp * If there is undo-protected committed data against 866470decc6SDave Kleikamp * this buffer, then we can remove it now. If it is a 867470decc6SDave Kleikamp * buffer needing such protection, the old frozen_data 868470decc6SDave Kleikamp * field now points to a committed version of the 869470decc6SDave Kleikamp * buffer, so rotate that field to the new committed 870470decc6SDave Kleikamp * data. 871470decc6SDave Kleikamp * 872470decc6SDave Kleikamp * Otherwise, we can just throw away the frozen data now. 873470decc6SDave Kleikamp */ 874470decc6SDave Kleikamp if (jh->b_committed_data) { 875af1e76d6SMingming Cao jbd2_free(jh->b_committed_data, bh->b_size); 876470decc6SDave Kleikamp jh->b_committed_data = NULL; 877470decc6SDave Kleikamp if (jh->b_frozen_data) { 878470decc6SDave Kleikamp jh->b_committed_data = jh->b_frozen_data; 879470decc6SDave Kleikamp jh->b_frozen_data = NULL; 880470decc6SDave Kleikamp } 881470decc6SDave Kleikamp } else if (jh->b_frozen_data) { 882af1e76d6SMingming Cao jbd2_free(jh->b_frozen_data, bh->b_size); 883470decc6SDave Kleikamp jh->b_frozen_data = NULL; 884470decc6SDave Kleikamp } 885470decc6SDave Kleikamp 886470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 887470decc6SDave Kleikamp cp_transaction = jh->b_cp_transaction; 888470decc6SDave Kleikamp if (cp_transaction) { 889470decc6SDave Kleikamp JBUFFER_TRACE(jh, "remove from old cp transaction"); 8908e85fb3fSJohann Lombardi cp_transaction->t_chp_stats.cs_dropped++; 891f7f4bccbSMingming Cao __jbd2_journal_remove_checkpoint(jh); 892470decc6SDave Kleikamp } 893470decc6SDave Kleikamp 894470decc6SDave Kleikamp /* Only re-checkpoint the buffer_head if it is marked 895470decc6SDave Kleikamp * dirty. If the buffer was added to the BJ_Forget list 896f7f4bccbSMingming Cao * by jbd2_journal_forget, it may no longer be dirty and 897470decc6SDave Kleikamp * there's no point in keeping a checkpoint record for 898470decc6SDave Kleikamp * it. */ 899470decc6SDave Kleikamp 900470decc6SDave Kleikamp /* A buffer which has been freed while still being 901470decc6SDave Kleikamp * journaled by a previous transaction may end up still 902470decc6SDave Kleikamp * being dirty here, but we want to avoid writing back 903470decc6SDave Kleikamp * that buffer in the future now that the last use has 904470decc6SDave Kleikamp * been committed. That's not only a performance gain, 905470decc6SDave Kleikamp * it also stops aliasing problems if the buffer is left 906470decc6SDave Kleikamp * behind for writeback and gets reallocated for another 907470decc6SDave Kleikamp * use in a different page. */ 908470decc6SDave Kleikamp if (buffer_freed(bh)) { 909470decc6SDave Kleikamp clear_buffer_freed(bh); 910470decc6SDave Kleikamp clear_buffer_jbddirty(bh); 911470decc6SDave Kleikamp } 912470decc6SDave Kleikamp 913470decc6SDave Kleikamp if (buffer_jbddirty(bh)) { 914470decc6SDave Kleikamp JBUFFER_TRACE(jh, "add to new checkpointing trans"); 915f7f4bccbSMingming Cao __jbd2_journal_insert_checkpoint(jh, commit_transaction); 9167ad7445fSHidehiro Kawai if (is_journal_aborted(journal)) 9177ad7445fSHidehiro Kawai clear_buffer_jbddirty(bh); 918470decc6SDave Kleikamp JBUFFER_TRACE(jh, "refile for checkpoint writeback"); 919f7f4bccbSMingming Cao __jbd2_journal_refile_buffer(jh); 920470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 921470decc6SDave Kleikamp } else { 922470decc6SDave Kleikamp J_ASSERT_BH(bh, !buffer_dirty(bh)); 923470decc6SDave Kleikamp /* The buffer on BJ_Forget list and not jbddirty means 924470decc6SDave Kleikamp * it has been freed by this transaction and hence it 925470decc6SDave Kleikamp * could not have been reallocated until this 926470decc6SDave Kleikamp * transaction has committed. *BUT* it could be 927470decc6SDave Kleikamp * reallocated once we have written all the data to 928470decc6SDave Kleikamp * disk and before we process the buffer on BJ_Forget 929470decc6SDave Kleikamp * list. */ 930470decc6SDave Kleikamp JBUFFER_TRACE(jh, "refile or unfile freed buffer"); 931f7f4bccbSMingming Cao __jbd2_journal_refile_buffer(jh); 932470decc6SDave Kleikamp if (!jh->b_transaction) { 933470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 934470decc6SDave Kleikamp /* needs a brelse */ 935f7f4bccbSMingming Cao jbd2_journal_remove_journal_head(bh); 936470decc6SDave Kleikamp release_buffer_page(bh); 937470decc6SDave Kleikamp } else 938470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 939470decc6SDave Kleikamp } 940470decc6SDave Kleikamp cond_resched_lock(&journal->j_list_lock); 941470decc6SDave Kleikamp } 942470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 943470decc6SDave Kleikamp /* 944f5a7a6b0SJan Kara * This is a bit sleazy. We use j_list_lock to protect transition 945f5a7a6b0SJan Kara * of a transaction into T_FINISHED state and calling 946f5a7a6b0SJan Kara * __jbd2_journal_drop_transaction(). Otherwise we could race with 947f5a7a6b0SJan Kara * other checkpointing code processing the transaction... 948470decc6SDave Kleikamp */ 949470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 950470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 951470decc6SDave Kleikamp /* 952470decc6SDave Kleikamp * Now recheck if some buffers did not get attached to the transaction 953470decc6SDave Kleikamp * while the lock was dropped... 954470decc6SDave Kleikamp */ 955470decc6SDave Kleikamp if (commit_transaction->t_forget) { 956470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 957470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 958470decc6SDave Kleikamp goto restart_loop; 959470decc6SDave Kleikamp } 960470decc6SDave Kleikamp 961470decc6SDave Kleikamp /* Done with this transaction! */ 962470decc6SDave Kleikamp 96387c89c23SJan Kara jbd_debug(3, "JBD: commit phase 7\n"); 964470decc6SDave Kleikamp 965470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_state == T_COMMIT); 966470decc6SDave Kleikamp 9678e85fb3fSJohann Lombardi commit_transaction->t_start = jiffies; 9688e85fb3fSJohann Lombardi stats.u.run.rs_logging = jbd2_time_diff(stats.u.run.rs_logging, 9698e85fb3fSJohann Lombardi commit_transaction->t_start); 9708e85fb3fSJohann Lombardi 9718e85fb3fSJohann Lombardi /* 9728e85fb3fSJohann Lombardi * File the transaction for history 9738e85fb3fSJohann Lombardi */ 9748e85fb3fSJohann Lombardi stats.ts_type = JBD2_STATS_RUN; 9758e85fb3fSJohann Lombardi stats.ts_tid = commit_transaction->t_tid; 9768e85fb3fSJohann Lombardi stats.u.run.rs_handle_count = commit_transaction->t_handle_count; 9778e85fb3fSJohann Lombardi spin_lock(&journal->j_history_lock); 9788e85fb3fSJohann Lombardi memcpy(journal->j_history + journal->j_history_cur, &stats, 9798e85fb3fSJohann Lombardi sizeof(stats)); 9808e85fb3fSJohann Lombardi if (++journal->j_history_cur == journal->j_history_max) 9818e85fb3fSJohann Lombardi journal->j_history_cur = 0; 9828e85fb3fSJohann Lombardi 9838e85fb3fSJohann Lombardi /* 9848e85fb3fSJohann Lombardi * Calculate overall stats 9858e85fb3fSJohann Lombardi */ 9868e85fb3fSJohann Lombardi journal->j_stats.ts_tid++; 9878e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait; 9888e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_running += stats.u.run.rs_running; 9898e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked; 9908e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing; 9918e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging; 9928e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count; 9938e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks; 9948e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_blocks_logged += stats.u.run.rs_blocks_logged; 9958e85fb3fSJohann Lombardi spin_unlock(&journal->j_history_lock); 9968e85fb3fSJohann Lombardi 997470decc6SDave Kleikamp commit_transaction->t_state = T_FINISHED; 998470decc6SDave Kleikamp J_ASSERT(commit_transaction == journal->j_committing_transaction); 999470decc6SDave Kleikamp journal->j_commit_sequence = commit_transaction->t_tid; 1000470decc6SDave Kleikamp journal->j_committing_transaction = NULL; 1001e07f7183SJosef Bacik commit_time = ktime_to_ns(ktime_sub(ktime_get(), start_time)); 1002e07f7183SJosef Bacik 1003e07f7183SJosef Bacik /* 1004e07f7183SJosef Bacik * weight the commit time higher than the average time so we don't 1005e07f7183SJosef Bacik * react too strongly to vast changes in the commit time 1006e07f7183SJosef Bacik */ 1007e07f7183SJosef Bacik if (likely(journal->j_average_commit_time)) 1008e07f7183SJosef Bacik journal->j_average_commit_time = (commit_time + 1009e07f7183SJosef Bacik journal->j_average_commit_time*3) / 4; 1010e07f7183SJosef Bacik else 1011e07f7183SJosef Bacik journal->j_average_commit_time = commit_time; 1012470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 1013470decc6SDave Kleikamp 1014f89b7795SJan Kara if (commit_transaction->t_checkpoint_list == NULL && 1015f89b7795SJan Kara commit_transaction->t_checkpoint_io_list == NULL) { 1016f7f4bccbSMingming Cao __jbd2_journal_drop_transaction(journal, commit_transaction); 1017fb68407bSAneesh Kumar K.V to_free = 1; 1018470decc6SDave Kleikamp } else { 1019470decc6SDave Kleikamp if (journal->j_checkpoint_transactions == NULL) { 1020470decc6SDave Kleikamp journal->j_checkpoint_transactions = commit_transaction; 1021470decc6SDave Kleikamp commit_transaction->t_cpnext = commit_transaction; 1022470decc6SDave Kleikamp commit_transaction->t_cpprev = commit_transaction; 1023470decc6SDave Kleikamp } else { 1024470decc6SDave Kleikamp commit_transaction->t_cpnext = 1025470decc6SDave Kleikamp journal->j_checkpoint_transactions; 1026470decc6SDave Kleikamp commit_transaction->t_cpprev = 1027470decc6SDave Kleikamp commit_transaction->t_cpnext->t_cpprev; 1028470decc6SDave Kleikamp commit_transaction->t_cpnext->t_cpprev = 1029470decc6SDave Kleikamp commit_transaction; 1030470decc6SDave Kleikamp commit_transaction->t_cpprev->t_cpnext = 1031470decc6SDave Kleikamp commit_transaction; 1032470decc6SDave Kleikamp } 1033470decc6SDave Kleikamp } 1034470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 1035470decc6SDave Kleikamp 1036fb68407bSAneesh Kumar K.V if (journal->j_commit_callback) 1037fb68407bSAneesh Kumar K.V journal->j_commit_callback(journal, commit_transaction); 1038fb68407bSAneesh Kumar K.V 1039ede86cc4STheodore Ts'o trace_mark(jbd2_end_commit, "dev %s transaction %d head %d", 1040fb68407bSAneesh Kumar K.V journal->j_devname, commit_transaction->t_tid, 1041ede86cc4STheodore Ts'o journal->j_tail_sequence); 1042470decc6SDave Kleikamp jbd_debug(1, "JBD: commit %d complete, head %d\n", 1043470decc6SDave Kleikamp journal->j_commit_sequence, journal->j_tail_sequence); 1044fb68407bSAneesh Kumar K.V if (to_free) 1045fb68407bSAneesh Kumar K.V kfree(commit_transaction); 1046470decc6SDave Kleikamp 1047470decc6SDave Kleikamp wake_up(&journal->j_wait_done_commit); 1048470decc6SDave Kleikamp } 1049