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> 25cd1aac32SAneesh Kumar K.V #include <linux/writeback.h> 26cd1aac32SAneesh Kumar K.V #include <linux/backing-dev.h> 27fd98496fSTheodore Ts'o #include <linux/bio.h> 280e3d2a63STheodore Ts'o #include <linux/blkdev.h> 29879c5e6bSTheodore Ts'o #include <trace/events/jbd2.h> 30470decc6SDave Kleikamp 31470decc6SDave Kleikamp /* 32470decc6SDave Kleikamp * Default IO end handler for temporary BJ_IO buffer_heads. 33470decc6SDave Kleikamp */ 34470decc6SDave Kleikamp static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate) 35470decc6SDave Kleikamp { 36470decc6SDave Kleikamp BUFFER_TRACE(bh, ""); 37470decc6SDave Kleikamp if (uptodate) 38470decc6SDave Kleikamp set_buffer_uptodate(bh); 39470decc6SDave Kleikamp else 40470decc6SDave Kleikamp clear_buffer_uptodate(bh); 41470decc6SDave Kleikamp unlock_buffer(bh); 42470decc6SDave Kleikamp } 43470decc6SDave Kleikamp 44470decc6SDave Kleikamp /* 4587c89c23SJan Kara * When an ext4 file is truncated, it is possible that some pages are not 4687c89c23SJan Kara * successfully freed, because they are attached to a committing transaction. 47470decc6SDave Kleikamp * After the transaction commits, these pages are left on the LRU, with no 48470decc6SDave Kleikamp * ->mapping, and with attached buffers. These pages are trivially reclaimable 49470decc6SDave Kleikamp * by the VM, but their apparent absence upsets the VM accounting, and it makes 50470decc6SDave Kleikamp * the numbers in /proc/meminfo look odd. 51470decc6SDave Kleikamp * 52470decc6SDave Kleikamp * So here, we have a buffer which has just come off the forget list. Look to 53470decc6SDave Kleikamp * see if we can strip all buffers from the backing page. 54470decc6SDave Kleikamp * 55470decc6SDave Kleikamp * Called under lock_journal(), and possibly under journal_datalist_lock. The 56470decc6SDave Kleikamp * caller provided us with a ref against the buffer, and we drop that here. 57470decc6SDave Kleikamp */ 58470decc6SDave Kleikamp static void release_buffer_page(struct buffer_head *bh) 59470decc6SDave Kleikamp { 60470decc6SDave Kleikamp struct page *page; 61470decc6SDave Kleikamp 62470decc6SDave Kleikamp if (buffer_dirty(bh)) 63470decc6SDave Kleikamp goto nope; 64470decc6SDave Kleikamp if (atomic_read(&bh->b_count) != 1) 65470decc6SDave Kleikamp goto nope; 66470decc6SDave Kleikamp page = bh->b_page; 67470decc6SDave Kleikamp if (!page) 68470decc6SDave Kleikamp goto nope; 69470decc6SDave Kleikamp if (page->mapping) 70470decc6SDave Kleikamp goto nope; 71470decc6SDave Kleikamp 72470decc6SDave Kleikamp /* OK, it's a truncated page */ 73529ae9aaSNick Piggin if (!trylock_page(page)) 74470decc6SDave Kleikamp goto nope; 75470decc6SDave Kleikamp 76470decc6SDave Kleikamp page_cache_get(page); 77470decc6SDave Kleikamp __brelse(bh); 78470decc6SDave Kleikamp try_to_free_buffers(page); 79470decc6SDave Kleikamp unlock_page(page); 80470decc6SDave Kleikamp page_cache_release(page); 81470decc6SDave Kleikamp return; 82470decc6SDave Kleikamp 83470decc6SDave Kleikamp nope: 84470decc6SDave Kleikamp __brelse(bh); 85470decc6SDave Kleikamp } 86470decc6SDave Kleikamp 87470decc6SDave Kleikamp /* 88818d276cSGirish Shilamkar * Done it all: now submit the commit record. We should have 89470decc6SDave Kleikamp * cleaned up our previous buffers by now, so if we are in abort 90470decc6SDave Kleikamp * mode we can now just skip the rest of the journal write 91470decc6SDave Kleikamp * entirely. 92470decc6SDave Kleikamp * 93470decc6SDave Kleikamp * Returns 1 if the journal needs to be aborted or 0 on success 94470decc6SDave Kleikamp */ 95818d276cSGirish Shilamkar static int journal_submit_commit_record(journal_t *journal, 96818d276cSGirish Shilamkar transaction_t *commit_transaction, 97818d276cSGirish Shilamkar struct buffer_head **cbh, 98818d276cSGirish Shilamkar __u32 crc32_sum) 99470decc6SDave Kleikamp { 100470decc6SDave Kleikamp struct journal_head *descriptor; 101818d276cSGirish Shilamkar struct commit_header *tmp; 102470decc6SDave Kleikamp struct buffer_head *bh; 103818d276cSGirish Shilamkar int ret; 104470decc6SDave Kleikamp int barrier_done = 0; 105736603abSTheodore Ts'o struct timespec now = current_kernel_time(); 106470decc6SDave Kleikamp 107470decc6SDave Kleikamp if (is_journal_aborted(journal)) 108470decc6SDave Kleikamp return 0; 109470decc6SDave Kleikamp 110f7f4bccbSMingming Cao descriptor = jbd2_journal_get_descriptor_buffer(journal); 111470decc6SDave Kleikamp if (!descriptor) 112470decc6SDave Kleikamp return 1; 113470decc6SDave Kleikamp 114470decc6SDave Kleikamp bh = jh2bh(descriptor); 115470decc6SDave Kleikamp 116818d276cSGirish Shilamkar tmp = (struct commit_header *)bh->b_data; 117f7f4bccbSMingming Cao tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER); 118f7f4bccbSMingming Cao tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK); 119470decc6SDave Kleikamp tmp->h_sequence = cpu_to_be32(commit_transaction->t_tid); 120736603abSTheodore Ts'o tmp->h_commit_sec = cpu_to_be64(now.tv_sec); 121736603abSTheodore Ts'o tmp->h_commit_nsec = cpu_to_be32(now.tv_nsec); 122818d276cSGirish Shilamkar 123818d276cSGirish Shilamkar if (JBD2_HAS_COMPAT_FEATURE(journal, 124818d276cSGirish Shilamkar JBD2_FEATURE_COMPAT_CHECKSUM)) { 125818d276cSGirish Shilamkar tmp->h_chksum_type = JBD2_CRC32_CHKSUM; 126818d276cSGirish Shilamkar tmp->h_chksum_size = JBD2_CRC32_CHKSUM_SIZE; 127818d276cSGirish Shilamkar tmp->h_chksum[0] = cpu_to_be32(crc32_sum); 128470decc6SDave Kleikamp } 129470decc6SDave Kleikamp 130818d276cSGirish Shilamkar JBUFFER_TRACE(descriptor, "submit commit block"); 131818d276cSGirish Shilamkar lock_buffer(bh); 13245a90bfdSTheodore Ts'o clear_buffer_dirty(bh); 133818d276cSGirish Shilamkar set_buffer_uptodate(bh); 134818d276cSGirish Shilamkar bh->b_end_io = journal_end_buffer_io_sync; 135818d276cSGirish Shilamkar 136818d276cSGirish Shilamkar if (journal->j_flags & JBD2_BARRIER && 1374d605179SAneesh Kumar K.V !JBD2_HAS_INCOMPAT_FEATURE(journal, 138818d276cSGirish Shilamkar JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { 139470decc6SDave Kleikamp set_buffer_ordered(bh); 140470decc6SDave Kleikamp barrier_done = 1; 141470decc6SDave Kleikamp } 1424194b1eaSJens Axboe ret = submit_bh(WRITE_SYNC_PLUG, bh); 143c4e35e07SDave Kleikamp if (barrier_done) 144c4e35e07SDave Kleikamp clear_buffer_ordered(bh); 145818d276cSGirish Shilamkar 146470decc6SDave Kleikamp /* is it possible for another commit to fail at roughly 147470decc6SDave Kleikamp * the same time as this one? If so, we don't want to 148470decc6SDave Kleikamp * trust the barrier flag in the super, but instead want 149470decc6SDave Kleikamp * to remember if we sent a barrier request 150470decc6SDave Kleikamp */ 151470decc6SDave Kleikamp if (ret == -EOPNOTSUPP && barrier_done) { 152470decc6SDave Kleikamp printk(KERN_WARNING 153470decc6SDave Kleikamp "JBD: barrier-based sync failed on %s - " 15405496769STheodore Ts'o "disabling barriers\n", journal->j_devname); 155470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 156f7f4bccbSMingming Cao journal->j_flags &= ~JBD2_BARRIER; 157470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 158470decc6SDave Kleikamp 159470decc6SDave Kleikamp /* And try again, without the barrier */ 160034772b0STheodore Ts'o lock_buffer(bh); 161470decc6SDave Kleikamp set_buffer_uptodate(bh); 16245a90bfdSTheodore Ts'o clear_buffer_dirty(bh); 1634194b1eaSJens Axboe ret = submit_bh(WRITE_SYNC_PLUG, bh); 164470decc6SDave Kleikamp } 165818d276cSGirish Shilamkar *cbh = bh; 166818d276cSGirish Shilamkar return ret; 167818d276cSGirish Shilamkar } 168470decc6SDave Kleikamp 169818d276cSGirish Shilamkar /* 170818d276cSGirish Shilamkar * This function along with journal_submit_commit_record 171818d276cSGirish Shilamkar * allows to write the commit record asynchronously. 172818d276cSGirish Shilamkar */ 173fd98496fSTheodore Ts'o static int journal_wait_on_commit_record(journal_t *journal, 174fd98496fSTheodore Ts'o struct buffer_head *bh) 175818d276cSGirish Shilamkar { 176818d276cSGirish Shilamkar int ret = 0; 177818d276cSGirish Shilamkar 178fd98496fSTheodore Ts'o retry: 179818d276cSGirish Shilamkar clear_buffer_dirty(bh); 180818d276cSGirish Shilamkar wait_on_buffer(bh); 181fd98496fSTheodore Ts'o if (buffer_eopnotsupp(bh) && (journal->j_flags & JBD2_BARRIER)) { 182fd98496fSTheodore Ts'o printk(KERN_WARNING 183fd98496fSTheodore Ts'o "JBD2: wait_on_commit_record: sync failed on %s - " 184fd98496fSTheodore Ts'o "disabling barriers\n", journal->j_devname); 185fd98496fSTheodore Ts'o spin_lock(&journal->j_state_lock); 186fd98496fSTheodore Ts'o journal->j_flags &= ~JBD2_BARRIER; 187fd98496fSTheodore Ts'o spin_unlock(&journal->j_state_lock); 188fd98496fSTheodore Ts'o 189fd98496fSTheodore Ts'o lock_buffer(bh); 190fd98496fSTheodore Ts'o clear_buffer_dirty(bh); 191fd98496fSTheodore Ts'o set_buffer_uptodate(bh); 192fd98496fSTheodore Ts'o bh->b_end_io = journal_end_buffer_io_sync; 193fd98496fSTheodore Ts'o 1944194b1eaSJens Axboe ret = submit_bh(WRITE_SYNC_PLUG, bh); 195fd98496fSTheodore Ts'o if (ret) { 196fd98496fSTheodore Ts'o unlock_buffer(bh); 197fd98496fSTheodore Ts'o return ret; 198fd98496fSTheodore Ts'o } 199fd98496fSTheodore Ts'o goto retry; 200fd98496fSTheodore Ts'o } 201818d276cSGirish Shilamkar 202818d276cSGirish Shilamkar if (unlikely(!buffer_uptodate(bh))) 203818d276cSGirish Shilamkar ret = -EIO; 204818d276cSGirish Shilamkar put_bh(bh); /* One for getblk() */ 205818d276cSGirish Shilamkar jbd2_journal_put_journal_head(bh2jh(bh)); 206818d276cSGirish Shilamkar 207818d276cSGirish Shilamkar return ret; 208818d276cSGirish Shilamkar } 209818d276cSGirish Shilamkar 210818d276cSGirish Shilamkar /* 211cd1aac32SAneesh Kumar K.V * write the filemap data using writepage() address_space_operations. 212cd1aac32SAneesh Kumar K.V * We don't do block allocation here even for delalloc. We don't 213cd1aac32SAneesh Kumar K.V * use writepages() because with dealyed allocation we may be doing 214cd1aac32SAneesh Kumar K.V * block allocation in writepages(). 215cd1aac32SAneesh Kumar K.V */ 216cd1aac32SAneesh Kumar K.V static int journal_submit_inode_data_buffers(struct address_space *mapping) 217cd1aac32SAneesh Kumar K.V { 218cd1aac32SAneesh Kumar K.V int ret; 219cd1aac32SAneesh Kumar K.V struct writeback_control wbc = { 220cd1aac32SAneesh Kumar K.V .sync_mode = WB_SYNC_ALL, 221cd1aac32SAneesh Kumar K.V .nr_to_write = mapping->nrpages * 2, 222cd1aac32SAneesh Kumar K.V .range_start = 0, 223cd1aac32SAneesh Kumar K.V .range_end = i_size_read(mapping->host), 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 */ 256879c5e6bSTheodore Ts'o trace_jbd2_submit_inode_data(jinode->i_vfs_inode); 257cd1aac32SAneesh Kumar K.V err = journal_submit_inode_data_buffers(mapping); 258c851ed54SJan Kara if (!ret) 259c851ed54SJan Kara ret = err; 260c851ed54SJan Kara spin_lock(&journal->j_list_lock); 261c851ed54SJan Kara J_ASSERT(jinode->i_transaction == commit_transaction); 262c851ed54SJan Kara jinode->i_flags &= ~JI_COMMIT_RUNNING; 263c851ed54SJan Kara wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING); 264c851ed54SJan Kara } 265c851ed54SJan Kara spin_unlock(&journal->j_list_lock); 266c851ed54SJan Kara return ret; 267c851ed54SJan Kara } 268c851ed54SJan Kara 269c851ed54SJan Kara /* 270c851ed54SJan Kara * Wait for data submitted for writeout, refile inodes to proper 271c851ed54SJan Kara * transaction if needed. 272c851ed54SJan Kara * 273c851ed54SJan Kara */ 274c851ed54SJan Kara static int journal_finish_inode_data_buffers(journal_t *journal, 275c851ed54SJan Kara transaction_t *commit_transaction) 276c851ed54SJan Kara { 277c851ed54SJan Kara struct jbd2_inode *jinode, *next_i; 278c851ed54SJan Kara int err, ret = 0; 279c851ed54SJan Kara 280cd1aac32SAneesh Kumar K.V /* For locking, see the comment in journal_submit_data_buffers() */ 281c851ed54SJan Kara spin_lock(&journal->j_list_lock); 282c851ed54SJan Kara list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) { 283c851ed54SJan Kara jinode->i_flags |= JI_COMMIT_RUNNING; 284c851ed54SJan Kara spin_unlock(&journal->j_list_lock); 285c851ed54SJan Kara err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping); 286e9e34f4eSHidehiro Kawai if (err) { 287e9e34f4eSHidehiro Kawai /* 288e9e34f4eSHidehiro Kawai * Because AS_EIO is cleared by 289e9e34f4eSHidehiro Kawai * wait_on_page_writeback_range(), set it again so 290e9e34f4eSHidehiro Kawai * that user process can get -EIO from fsync(). 291e9e34f4eSHidehiro Kawai */ 292e9e34f4eSHidehiro Kawai set_bit(AS_EIO, 293e9e34f4eSHidehiro Kawai &jinode->i_vfs_inode->i_mapping->flags); 294e9e34f4eSHidehiro Kawai 295c851ed54SJan Kara if (!ret) 296c851ed54SJan Kara ret = err; 297e9e34f4eSHidehiro Kawai } 298c851ed54SJan Kara spin_lock(&journal->j_list_lock); 299c851ed54SJan Kara jinode->i_flags &= ~JI_COMMIT_RUNNING; 300c851ed54SJan Kara wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING); 301c851ed54SJan Kara } 302c851ed54SJan Kara 303c851ed54SJan Kara /* Now refile inode to proper lists */ 304c851ed54SJan Kara list_for_each_entry_safe(jinode, next_i, 305c851ed54SJan Kara &commit_transaction->t_inode_list, i_list) { 306c851ed54SJan Kara list_del(&jinode->i_list); 307c851ed54SJan Kara if (jinode->i_next_transaction) { 308c851ed54SJan Kara jinode->i_transaction = jinode->i_next_transaction; 309c851ed54SJan Kara jinode->i_next_transaction = NULL; 310c851ed54SJan Kara list_add(&jinode->i_list, 311c851ed54SJan Kara &jinode->i_transaction->t_inode_list); 312c851ed54SJan Kara } else { 313c851ed54SJan Kara jinode->i_transaction = NULL; 314c851ed54SJan Kara } 315c851ed54SJan Kara } 316c851ed54SJan Kara spin_unlock(&journal->j_list_lock); 317c851ed54SJan Kara 318c851ed54SJan Kara return ret; 319c851ed54SJan Kara } 320c851ed54SJan Kara 321818d276cSGirish Shilamkar static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh) 322818d276cSGirish Shilamkar { 323818d276cSGirish Shilamkar struct page *page = bh->b_page; 324818d276cSGirish Shilamkar char *addr; 325818d276cSGirish Shilamkar __u32 checksum; 326818d276cSGirish Shilamkar 327818d276cSGirish Shilamkar addr = kmap_atomic(page, KM_USER0); 328818d276cSGirish Shilamkar checksum = crc32_be(crc32_sum, 329818d276cSGirish Shilamkar (void *)(addr + offset_in_page(bh->b_data)), bh->b_size); 330818d276cSGirish Shilamkar kunmap_atomic(addr, KM_USER0); 331818d276cSGirish Shilamkar 332818d276cSGirish Shilamkar return checksum; 333818d276cSGirish Shilamkar } 334818d276cSGirish Shilamkar 335818d276cSGirish Shilamkar static void write_tag_block(int tag_bytes, journal_block_tag_t *tag, 33618eba7aaSMingming Cao unsigned long long block) 337b517bea1SZach Brown { 338b517bea1SZach Brown tag->t_blocknr = cpu_to_be32(block & (u32)~0); 339cd02ff0bSMingming Cao if (tag_bytes > JBD2_TAG_SIZE32) 340b517bea1SZach Brown tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1); 341b517bea1SZach Brown } 342b517bea1SZach Brown 343470decc6SDave Kleikamp /* 344f7f4bccbSMingming Cao * jbd2_journal_commit_transaction 345470decc6SDave Kleikamp * 346470decc6SDave Kleikamp * The primary function for committing a transaction to the log. This 347470decc6SDave Kleikamp * function is called by the journal thread to begin a complete commit. 348470decc6SDave Kleikamp */ 349f7f4bccbSMingming Cao void jbd2_journal_commit_transaction(journal_t *journal) 350470decc6SDave Kleikamp { 3518e85fb3fSJohann Lombardi struct transaction_stats_s stats; 352470decc6SDave Kleikamp transaction_t *commit_transaction; 353470decc6SDave Kleikamp struct journal_head *jh, *new_jh, *descriptor; 354470decc6SDave Kleikamp struct buffer_head **wbuf = journal->j_wbuf; 355470decc6SDave Kleikamp int bufs; 356470decc6SDave Kleikamp int flags; 357470decc6SDave Kleikamp int err; 35818eba7aaSMingming Cao unsigned long long blocknr; 359e07f7183SJosef Bacik ktime_t start_time; 360e07f7183SJosef Bacik u64 commit_time; 361470decc6SDave Kleikamp char *tagp = NULL; 362470decc6SDave Kleikamp journal_header_t *header; 363470decc6SDave Kleikamp journal_block_tag_t *tag = NULL; 364470decc6SDave Kleikamp int space_left = 0; 365470decc6SDave Kleikamp int first_tag = 0; 366470decc6SDave Kleikamp int tag_flag; 367fb68407bSAneesh Kumar K.V int i, to_free = 0; 368b517bea1SZach Brown int tag_bytes = journal_tag_bytes(journal); 369818d276cSGirish Shilamkar struct buffer_head *cbh = NULL; /* For transactional checksums */ 370818d276cSGirish Shilamkar __u32 crc32_sum = ~0; 3717058548cSTheodore Ts'o int write_op = WRITE; 372470decc6SDave Kleikamp 373470decc6SDave Kleikamp /* 374470decc6SDave Kleikamp * First job: lock down the current transaction and wait for 375470decc6SDave Kleikamp * all outstanding updates to complete. 376470decc6SDave Kleikamp */ 377470decc6SDave Kleikamp 378470decc6SDave Kleikamp #ifdef COMMIT_STATS 379470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 380470decc6SDave Kleikamp summarise_journal_usage(journal); 381470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 382470decc6SDave Kleikamp #endif 383470decc6SDave Kleikamp 384f7f4bccbSMingming Cao /* Do we need to erase the effects of a prior jbd2_journal_flush? */ 385f7f4bccbSMingming Cao if (journal->j_flags & JBD2_FLUSHED) { 386470decc6SDave Kleikamp jbd_debug(3, "super block updated\n"); 387f7f4bccbSMingming Cao jbd2_journal_update_superblock(journal, 1); 388470decc6SDave Kleikamp } else { 389470decc6SDave Kleikamp jbd_debug(3, "superblock not updated\n"); 390470decc6SDave Kleikamp } 391470decc6SDave Kleikamp 392470decc6SDave Kleikamp J_ASSERT(journal->j_running_transaction != NULL); 393470decc6SDave Kleikamp J_ASSERT(journal->j_committing_transaction == NULL); 394470decc6SDave Kleikamp 395470decc6SDave Kleikamp commit_transaction = journal->j_running_transaction; 396470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_state == T_RUNNING); 397470decc6SDave Kleikamp 398879c5e6bSTheodore Ts'o trace_jbd2_start_commit(journal, commit_transaction); 399470decc6SDave Kleikamp jbd_debug(1, "JBD: starting commit of transaction %d\n", 400470decc6SDave Kleikamp commit_transaction->t_tid); 401470decc6SDave Kleikamp 402470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 403470decc6SDave Kleikamp commit_transaction->t_state = T_LOCKED; 404470decc6SDave Kleikamp 4054194b1eaSJens Axboe /* 4064194b1eaSJens Axboe * Use plugged writes here, since we want to submit several before 4074194b1eaSJens Axboe * we unplug the device. We don't do explicit unplugging in here, 4084194b1eaSJens Axboe * instead we rely on sync_buffer() doing the unplug for us. 4094194b1eaSJens Axboe */ 4107058548cSTheodore Ts'o if (commit_transaction->t_synchronous_commit) 4114194b1eaSJens Axboe write_op = WRITE_SYNC_PLUG; 412879c5e6bSTheodore Ts'o trace_jbd2_commit_locking(journal, commit_transaction); 413bf699327STheodore Ts'o stats.run.rs_wait = commit_transaction->t_max_wait; 414bf699327STheodore Ts'o stats.run.rs_locked = jiffies; 415bf699327STheodore Ts'o stats.run.rs_running = jbd2_time_diff(commit_transaction->t_start, 416bf699327STheodore Ts'o stats.run.rs_locked); 4178e85fb3fSJohann Lombardi 418470decc6SDave Kleikamp spin_lock(&commit_transaction->t_handle_lock); 419470decc6SDave Kleikamp while (commit_transaction->t_updates) { 420470decc6SDave Kleikamp DEFINE_WAIT(wait); 421470decc6SDave Kleikamp 422470decc6SDave Kleikamp prepare_to_wait(&journal->j_wait_updates, &wait, 423470decc6SDave Kleikamp TASK_UNINTERRUPTIBLE); 424470decc6SDave Kleikamp if (commit_transaction->t_updates) { 425470decc6SDave Kleikamp spin_unlock(&commit_transaction->t_handle_lock); 426470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 427470decc6SDave Kleikamp schedule(); 428470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 429470decc6SDave Kleikamp spin_lock(&commit_transaction->t_handle_lock); 430470decc6SDave Kleikamp } 431470decc6SDave Kleikamp finish_wait(&journal->j_wait_updates, &wait); 432470decc6SDave Kleikamp } 433470decc6SDave Kleikamp spin_unlock(&commit_transaction->t_handle_lock); 434470decc6SDave Kleikamp 435470decc6SDave Kleikamp J_ASSERT (commit_transaction->t_outstanding_credits <= 436470decc6SDave Kleikamp journal->j_max_transaction_buffers); 437470decc6SDave Kleikamp 438470decc6SDave Kleikamp /* 439470decc6SDave Kleikamp * First thing we are allowed to do is to discard any remaining 440470decc6SDave Kleikamp * BJ_Reserved buffers. Note, it is _not_ permissible to assume 441470decc6SDave Kleikamp * that there are no such buffers: if a large filesystem 442470decc6SDave Kleikamp * operation like a truncate needs to split itself over multiple 443f7f4bccbSMingming Cao * transactions, then it may try to do a jbd2_journal_restart() while 444470decc6SDave Kleikamp * there are still BJ_Reserved buffers outstanding. These must 445470decc6SDave Kleikamp * be released cleanly from the current transaction. 446470decc6SDave Kleikamp * 447470decc6SDave Kleikamp * In this case, the filesystem must still reserve write access 448470decc6SDave Kleikamp * again before modifying the buffer in the new transaction, but 449470decc6SDave Kleikamp * we do not require it to remember exactly which old buffers it 450470decc6SDave Kleikamp * has reserved. This is consistent with the existing behaviour 451f7f4bccbSMingming Cao * that multiple jbd2_journal_get_write_access() calls to the same 452470decc6SDave Kleikamp * buffer are perfectly permissable. 453470decc6SDave Kleikamp */ 454470decc6SDave Kleikamp while (commit_transaction->t_reserved_list) { 455470decc6SDave Kleikamp jh = commit_transaction->t_reserved_list; 456470decc6SDave Kleikamp JBUFFER_TRACE(jh, "reserved, unused: refile"); 457470decc6SDave Kleikamp /* 458f7f4bccbSMingming Cao * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may 459470decc6SDave Kleikamp * leave undo-committed data. 460470decc6SDave Kleikamp */ 461470decc6SDave Kleikamp if (jh->b_committed_data) { 462470decc6SDave Kleikamp struct buffer_head *bh = jh2bh(jh); 463470decc6SDave Kleikamp 464470decc6SDave Kleikamp jbd_lock_bh_state(bh); 465af1e76d6SMingming Cao jbd2_free(jh->b_committed_data, bh->b_size); 466470decc6SDave Kleikamp jh->b_committed_data = NULL; 467470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 468470decc6SDave Kleikamp } 469f7f4bccbSMingming Cao jbd2_journal_refile_buffer(journal, jh); 470470decc6SDave Kleikamp } 471470decc6SDave Kleikamp 472470decc6SDave Kleikamp /* 473470decc6SDave Kleikamp * Now try to drop any written-back buffers from the journal's 474470decc6SDave Kleikamp * checkpoint lists. We do this *before* commit because it potentially 475470decc6SDave Kleikamp * frees some memory 476470decc6SDave Kleikamp */ 477470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 478f7f4bccbSMingming Cao __jbd2_journal_clean_checkpoint_list(journal); 479470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 480470decc6SDave Kleikamp 481470decc6SDave Kleikamp jbd_debug (3, "JBD: commit phase 1\n"); 482470decc6SDave Kleikamp 483470decc6SDave Kleikamp /* 484470decc6SDave Kleikamp * Switch to a new revoke table. 485470decc6SDave Kleikamp */ 486f7f4bccbSMingming Cao jbd2_journal_switch_revoke_table(journal); 487470decc6SDave Kleikamp 488879c5e6bSTheodore Ts'o trace_jbd2_commit_flushing(journal, commit_transaction); 489bf699327STheodore Ts'o stats.run.rs_flushing = jiffies; 490bf699327STheodore Ts'o stats.run.rs_locked = jbd2_time_diff(stats.run.rs_locked, 491bf699327STheodore Ts'o stats.run.rs_flushing); 4928e85fb3fSJohann Lombardi 493470decc6SDave Kleikamp commit_transaction->t_state = T_FLUSH; 494470decc6SDave Kleikamp journal->j_committing_transaction = commit_transaction; 495470decc6SDave Kleikamp journal->j_running_transaction = NULL; 496e07f7183SJosef Bacik start_time = ktime_get(); 497470decc6SDave Kleikamp commit_transaction->t_log_start = journal->j_head; 498470decc6SDave Kleikamp wake_up(&journal->j_wait_transaction_locked); 499470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 500470decc6SDave Kleikamp 501470decc6SDave Kleikamp jbd_debug (3, "JBD: commit phase 2\n"); 502470decc6SDave Kleikamp 503470decc6SDave Kleikamp /* 504470decc6SDave Kleikamp * Now start flushing things to disk, in the order they appear 505470decc6SDave Kleikamp * on the transaction lists. Data blocks go first. 506470decc6SDave Kleikamp */ 507cd1aac32SAneesh Kumar K.V err = journal_submit_data_buffers(journal, commit_transaction); 508c851ed54SJan Kara if (err) 509c851ed54SJan Kara jbd2_journal_abort(journal, err); 510470decc6SDave Kleikamp 51167c457a8STheodore Ts'o jbd2_journal_write_revoke_records(journal, commit_transaction, 51267c457a8STheodore Ts'o write_op); 513470decc6SDave Kleikamp 514470decc6SDave Kleikamp jbd_debug(3, "JBD: commit phase 2\n"); 515470decc6SDave Kleikamp 516470decc6SDave Kleikamp /* 517470decc6SDave Kleikamp * Way to go: we have now written out all of the data for a 518470decc6SDave Kleikamp * transaction! Now comes the tricky part: we need to write out 519470decc6SDave Kleikamp * metadata. Loop over the transaction's entire buffer list: 520470decc6SDave Kleikamp */ 52102c471cbSMingming Cao spin_lock(&journal->j_state_lock); 522470decc6SDave Kleikamp commit_transaction->t_state = T_COMMIT; 52302c471cbSMingming Cao spin_unlock(&journal->j_state_lock); 524470decc6SDave Kleikamp 525879c5e6bSTheodore Ts'o trace_jbd2_commit_logging(journal, commit_transaction); 526bf699327STheodore Ts'o stats.run.rs_logging = jiffies; 527bf699327STheodore Ts'o stats.run.rs_flushing = jbd2_time_diff(stats.run.rs_flushing, 528bf699327STheodore Ts'o stats.run.rs_logging); 529bf699327STheodore Ts'o stats.run.rs_blocks = commit_transaction->t_outstanding_credits; 530bf699327STheodore Ts'o stats.run.rs_blocks_logged = 0; 5318e85fb3fSJohann Lombardi 5321dfc3220SJosef Bacik J_ASSERT(commit_transaction->t_nr_buffers <= 5331dfc3220SJosef Bacik commit_transaction->t_outstanding_credits); 5341dfc3220SJosef Bacik 53587c89c23SJan Kara err = 0; 536470decc6SDave Kleikamp descriptor = NULL; 537470decc6SDave Kleikamp bufs = 0; 538470decc6SDave Kleikamp while (commit_transaction->t_buffers) { 539470decc6SDave Kleikamp 540470decc6SDave Kleikamp /* Find the next buffer to be journaled... */ 541470decc6SDave Kleikamp 542470decc6SDave Kleikamp jh = commit_transaction->t_buffers; 543470decc6SDave Kleikamp 544470decc6SDave Kleikamp /* If we're in abort mode, we just un-journal the buffer and 5457ad7445fSHidehiro Kawai release it. */ 546470decc6SDave Kleikamp 547470decc6SDave Kleikamp if (is_journal_aborted(journal)) { 5487ad7445fSHidehiro Kawai clear_buffer_jbddirty(jh2bh(jh)); 549470decc6SDave Kleikamp JBUFFER_TRACE(jh, "journal is aborting: refile"); 550e06c8227SJoel Becker jbd2_buffer_abort_trigger(jh, 551e06c8227SJoel Becker jh->b_frozen_data ? 552e06c8227SJoel Becker jh->b_frozen_triggers : 553e06c8227SJoel Becker jh->b_triggers); 554f7f4bccbSMingming Cao jbd2_journal_refile_buffer(journal, jh); 555470decc6SDave Kleikamp /* If that was the last one, we need to clean up 556470decc6SDave Kleikamp * any descriptor buffers which may have been 557470decc6SDave Kleikamp * already allocated, even if we are now 558470decc6SDave Kleikamp * aborting. */ 559470decc6SDave Kleikamp if (!commit_transaction->t_buffers) 560470decc6SDave Kleikamp goto start_journal_io; 561470decc6SDave Kleikamp continue; 562470decc6SDave Kleikamp } 563470decc6SDave Kleikamp 564470decc6SDave Kleikamp /* Make sure we have a descriptor block in which to 565470decc6SDave Kleikamp record the metadata buffer. */ 566470decc6SDave Kleikamp 567470decc6SDave Kleikamp if (!descriptor) { 568470decc6SDave Kleikamp struct buffer_head *bh; 569470decc6SDave Kleikamp 570470decc6SDave Kleikamp J_ASSERT (bufs == 0); 571470decc6SDave Kleikamp 572470decc6SDave Kleikamp jbd_debug(4, "JBD: get descriptor\n"); 573470decc6SDave Kleikamp 574f7f4bccbSMingming Cao descriptor = jbd2_journal_get_descriptor_buffer(journal); 575470decc6SDave Kleikamp if (!descriptor) { 576a7fa2bafSJan Kara jbd2_journal_abort(journal, -EIO); 577470decc6SDave Kleikamp continue; 578470decc6SDave Kleikamp } 579470decc6SDave Kleikamp 580470decc6SDave Kleikamp bh = jh2bh(descriptor); 581470decc6SDave Kleikamp jbd_debug(4, "JBD: got buffer %llu (%p)\n", 582470decc6SDave Kleikamp (unsigned long long)bh->b_blocknr, bh->b_data); 583470decc6SDave Kleikamp header = (journal_header_t *)&bh->b_data[0]; 584f7f4bccbSMingming Cao header->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER); 585f7f4bccbSMingming Cao header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK); 586470decc6SDave Kleikamp header->h_sequence = cpu_to_be32(commit_transaction->t_tid); 587470decc6SDave Kleikamp 588470decc6SDave Kleikamp tagp = &bh->b_data[sizeof(journal_header_t)]; 589470decc6SDave Kleikamp space_left = bh->b_size - sizeof(journal_header_t); 590470decc6SDave Kleikamp first_tag = 1; 591470decc6SDave Kleikamp set_buffer_jwrite(bh); 592470decc6SDave Kleikamp set_buffer_dirty(bh); 593470decc6SDave Kleikamp wbuf[bufs++] = bh; 594470decc6SDave Kleikamp 595470decc6SDave Kleikamp /* Record it so that we can wait for IO 596470decc6SDave Kleikamp completion later */ 597470decc6SDave Kleikamp BUFFER_TRACE(bh, "ph3: file as descriptor"); 598f7f4bccbSMingming Cao jbd2_journal_file_buffer(descriptor, commit_transaction, 599470decc6SDave Kleikamp BJ_LogCtl); 600470decc6SDave Kleikamp } 601470decc6SDave Kleikamp 602470decc6SDave Kleikamp /* Where is the buffer to be written? */ 603470decc6SDave Kleikamp 604f7f4bccbSMingming Cao err = jbd2_journal_next_log_block(journal, &blocknr); 605470decc6SDave Kleikamp /* If the block mapping failed, just abandon the buffer 606470decc6SDave Kleikamp and repeat this loop: we'll fall into the 607470decc6SDave Kleikamp refile-on-abort condition above. */ 608470decc6SDave Kleikamp if (err) { 609a7fa2bafSJan Kara jbd2_journal_abort(journal, err); 610470decc6SDave Kleikamp continue; 611470decc6SDave Kleikamp } 612470decc6SDave Kleikamp 613470decc6SDave Kleikamp /* 614470decc6SDave Kleikamp * start_this_handle() uses t_outstanding_credits to determine 615470decc6SDave Kleikamp * the free space in the log, but this counter is changed 616f7f4bccbSMingming Cao * by jbd2_journal_next_log_block() also. 617470decc6SDave Kleikamp */ 618470decc6SDave Kleikamp commit_transaction->t_outstanding_credits--; 619470decc6SDave Kleikamp 620470decc6SDave Kleikamp /* Bump b_count to prevent truncate from stumbling over 621470decc6SDave Kleikamp the shadowed buffer! @@@ This can go if we ever get 622470decc6SDave Kleikamp rid of the BJ_IO/BJ_Shadow pairing of buffers. */ 623470decc6SDave Kleikamp atomic_inc(&jh2bh(jh)->b_count); 624470decc6SDave Kleikamp 625470decc6SDave Kleikamp /* Make a temporary IO buffer with which to write it out 626470decc6SDave Kleikamp (this will requeue both the metadata buffer and the 627470decc6SDave Kleikamp temporary IO buffer). new_bh goes on BJ_IO*/ 628470decc6SDave Kleikamp 629470decc6SDave Kleikamp set_bit(BH_JWrite, &jh2bh(jh)->b_state); 630470decc6SDave Kleikamp /* 631f7f4bccbSMingming Cao * akpm: jbd2_journal_write_metadata_buffer() sets 632470decc6SDave Kleikamp * new_bh->b_transaction to commit_transaction. 633470decc6SDave Kleikamp * We need to clean this up before we release new_bh 634470decc6SDave Kleikamp * (which is of type BJ_IO) 635470decc6SDave Kleikamp */ 636470decc6SDave Kleikamp JBUFFER_TRACE(jh, "ph3: write metadata"); 637f7f4bccbSMingming Cao flags = jbd2_journal_write_metadata_buffer(commit_transaction, 638470decc6SDave Kleikamp jh, &new_jh, blocknr); 639*e6ec116bSTheodore Ts'o if (flags < 0) { 640*e6ec116bSTheodore Ts'o jbd2_journal_abort(journal, flags); 641*e6ec116bSTheodore Ts'o continue; 642*e6ec116bSTheodore Ts'o } 643470decc6SDave Kleikamp set_bit(BH_JWrite, &jh2bh(new_jh)->b_state); 644470decc6SDave Kleikamp wbuf[bufs++] = jh2bh(new_jh); 645470decc6SDave Kleikamp 646470decc6SDave Kleikamp /* Record the new block's tag in the current descriptor 647470decc6SDave Kleikamp buffer */ 648470decc6SDave Kleikamp 649470decc6SDave Kleikamp tag_flag = 0; 650470decc6SDave Kleikamp if (flags & 1) 651f7f4bccbSMingming Cao tag_flag |= JBD2_FLAG_ESCAPE; 652470decc6SDave Kleikamp if (!first_tag) 653f7f4bccbSMingming Cao tag_flag |= JBD2_FLAG_SAME_UUID; 654470decc6SDave Kleikamp 655470decc6SDave Kleikamp tag = (journal_block_tag_t *) tagp; 656b517bea1SZach Brown write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr); 657470decc6SDave Kleikamp tag->t_flags = cpu_to_be32(tag_flag); 658b517bea1SZach Brown tagp += tag_bytes; 659b517bea1SZach Brown space_left -= tag_bytes; 660470decc6SDave Kleikamp 661470decc6SDave Kleikamp if (first_tag) { 662470decc6SDave Kleikamp memcpy (tagp, journal->j_uuid, 16); 663470decc6SDave Kleikamp tagp += 16; 664470decc6SDave Kleikamp space_left -= 16; 665470decc6SDave Kleikamp first_tag = 0; 666470decc6SDave Kleikamp } 667470decc6SDave Kleikamp 668470decc6SDave Kleikamp /* If there's no more to do, or if the descriptor is full, 669470decc6SDave Kleikamp let the IO rip! */ 670470decc6SDave Kleikamp 671470decc6SDave Kleikamp if (bufs == journal->j_wbufsize || 672470decc6SDave Kleikamp commit_transaction->t_buffers == NULL || 673b517bea1SZach Brown space_left < tag_bytes + 16) { 674470decc6SDave Kleikamp 675470decc6SDave Kleikamp jbd_debug(4, "JBD: Submit %d IOs\n", bufs); 676470decc6SDave Kleikamp 677470decc6SDave Kleikamp /* Write an end-of-descriptor marker before 678470decc6SDave Kleikamp submitting the IOs. "tag" still points to 679470decc6SDave Kleikamp the last tag we set up. */ 680470decc6SDave Kleikamp 681f7f4bccbSMingming Cao tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG); 682470decc6SDave Kleikamp 683470decc6SDave Kleikamp start_journal_io: 684470decc6SDave Kleikamp for (i = 0; i < bufs; i++) { 685470decc6SDave Kleikamp struct buffer_head *bh = wbuf[i]; 686818d276cSGirish Shilamkar /* 687818d276cSGirish Shilamkar * Compute checksum. 688818d276cSGirish Shilamkar */ 689818d276cSGirish Shilamkar if (JBD2_HAS_COMPAT_FEATURE(journal, 690818d276cSGirish Shilamkar JBD2_FEATURE_COMPAT_CHECKSUM)) { 691818d276cSGirish Shilamkar crc32_sum = 692818d276cSGirish Shilamkar jbd2_checksum_data(crc32_sum, bh); 693818d276cSGirish Shilamkar } 694818d276cSGirish Shilamkar 695470decc6SDave Kleikamp lock_buffer(bh); 696470decc6SDave Kleikamp clear_buffer_dirty(bh); 697470decc6SDave Kleikamp set_buffer_uptodate(bh); 698470decc6SDave Kleikamp bh->b_end_io = journal_end_buffer_io_sync; 6997058548cSTheodore Ts'o submit_bh(write_op, bh); 700470decc6SDave Kleikamp } 701470decc6SDave Kleikamp cond_resched(); 702bf699327STheodore Ts'o stats.run.rs_blocks_logged += bufs; 703470decc6SDave Kleikamp 704470decc6SDave Kleikamp /* Force a new descriptor to be generated next 705470decc6SDave Kleikamp time round the loop. */ 706470decc6SDave Kleikamp descriptor = NULL; 707470decc6SDave Kleikamp bufs = 0; 708470decc6SDave Kleikamp } 709470decc6SDave Kleikamp } 710470decc6SDave Kleikamp 711818d276cSGirish Shilamkar /* Done it all: now write the commit record asynchronously. */ 712818d276cSGirish Shilamkar 713818d276cSGirish Shilamkar if (JBD2_HAS_INCOMPAT_FEATURE(journal, 714818d276cSGirish Shilamkar JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { 715818d276cSGirish Shilamkar err = journal_submit_commit_record(journal, commit_transaction, 716818d276cSGirish Shilamkar &cbh, crc32_sum); 717818d276cSGirish Shilamkar if (err) 718818d276cSGirish Shilamkar __jbd2_journal_abort_hard(journal); 7190e3d2a63STheodore Ts'o if (journal->j_flags & JBD2_BARRIER) 7200e3d2a63STheodore Ts'o blkdev_issue_flush(journal->j_dev, NULL); 721818d276cSGirish Shilamkar } 722818d276cSGirish Shilamkar 723c851ed54SJan Kara /* 724c851ed54SJan Kara * This is the right place to wait for data buffers both for ASYNC 725c851ed54SJan Kara * and !ASYNC commit. If commit is ASYNC, we need to wait only after 726c851ed54SJan Kara * the commit block went to disk (which happens above). If commit is 727c851ed54SJan Kara * SYNC, we need to wait for data buffers before we start writing 728c851ed54SJan Kara * commit block, which happens below in such setting. 729c851ed54SJan Kara */ 730c851ed54SJan Kara err = journal_finish_inode_data_buffers(journal, commit_transaction); 731e9e34f4eSHidehiro Kawai if (err) { 732e9e34f4eSHidehiro Kawai printk(KERN_WARNING 733e9e34f4eSHidehiro Kawai "JBD2: Detected IO errors while flushing file data " 73405496769STheodore Ts'o "on %s\n", journal->j_devname); 7355bf5683aSHidehiro Kawai if (journal->j_flags & JBD2_ABORT_ON_SYNCDATA_ERR) 7365bf5683aSHidehiro Kawai jbd2_journal_abort(journal, err); 737e9e34f4eSHidehiro Kawai err = 0; 738e9e34f4eSHidehiro Kawai } 739c851ed54SJan Kara 740470decc6SDave Kleikamp /* Lo and behold: we have just managed to send a transaction to 741470decc6SDave Kleikamp the log. Before we can commit it, wait for the IO so far to 742470decc6SDave Kleikamp complete. Control buffers being written are on the 743470decc6SDave Kleikamp transaction's t_log_list queue, and metadata buffers are on 744470decc6SDave Kleikamp the t_iobuf_list queue. 745470decc6SDave Kleikamp 746470decc6SDave Kleikamp Wait for the buffers in reverse order. That way we are 747470decc6SDave Kleikamp less likely to be woken up until all IOs have completed, and 748470decc6SDave Kleikamp so we incur less scheduling load. 749470decc6SDave Kleikamp */ 750470decc6SDave Kleikamp 75187c89c23SJan Kara jbd_debug(3, "JBD: commit phase 3\n"); 752470decc6SDave Kleikamp 753470decc6SDave Kleikamp /* 754470decc6SDave Kleikamp * akpm: these are BJ_IO, and j_list_lock is not needed. 755470decc6SDave Kleikamp * See __journal_try_to_free_buffer. 756470decc6SDave Kleikamp */ 757470decc6SDave Kleikamp wait_for_iobuf: 758470decc6SDave Kleikamp while (commit_transaction->t_iobuf_list != NULL) { 759470decc6SDave Kleikamp struct buffer_head *bh; 760470decc6SDave Kleikamp 761470decc6SDave Kleikamp jh = commit_transaction->t_iobuf_list->b_tprev; 762470decc6SDave Kleikamp bh = jh2bh(jh); 763470decc6SDave Kleikamp if (buffer_locked(bh)) { 764470decc6SDave Kleikamp wait_on_buffer(bh); 765470decc6SDave Kleikamp goto wait_for_iobuf; 766470decc6SDave Kleikamp } 767470decc6SDave Kleikamp if (cond_resched()) 768470decc6SDave Kleikamp goto wait_for_iobuf; 769470decc6SDave Kleikamp 770470decc6SDave Kleikamp if (unlikely(!buffer_uptodate(bh))) 771470decc6SDave Kleikamp err = -EIO; 772470decc6SDave Kleikamp 773470decc6SDave Kleikamp clear_buffer_jwrite(bh); 774470decc6SDave Kleikamp 775470decc6SDave Kleikamp JBUFFER_TRACE(jh, "ph4: unfile after journal write"); 776f7f4bccbSMingming Cao jbd2_journal_unfile_buffer(journal, jh); 777470decc6SDave Kleikamp 778470decc6SDave Kleikamp /* 779470decc6SDave Kleikamp * ->t_iobuf_list should contain only dummy buffer_heads 780f7f4bccbSMingming Cao * which were created by jbd2_journal_write_metadata_buffer(). 781470decc6SDave Kleikamp */ 782470decc6SDave Kleikamp BUFFER_TRACE(bh, "dumping temporary bh"); 783f7f4bccbSMingming Cao jbd2_journal_put_journal_head(jh); 784470decc6SDave Kleikamp __brelse(bh); 785470decc6SDave Kleikamp J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0); 786470decc6SDave Kleikamp free_buffer_head(bh); 787470decc6SDave Kleikamp 788470decc6SDave Kleikamp /* We also have to unlock and free the corresponding 789470decc6SDave Kleikamp shadowed buffer */ 790470decc6SDave Kleikamp jh = commit_transaction->t_shadow_list->b_tprev; 791470decc6SDave Kleikamp bh = jh2bh(jh); 792470decc6SDave Kleikamp clear_bit(BH_JWrite, &bh->b_state); 793470decc6SDave Kleikamp J_ASSERT_BH(bh, buffer_jbddirty(bh)); 794470decc6SDave Kleikamp 795470decc6SDave Kleikamp /* The metadata is now released for reuse, but we need 796470decc6SDave Kleikamp to remember it against this transaction so that when 797470decc6SDave Kleikamp we finally commit, we can do any checkpointing 798470decc6SDave Kleikamp required. */ 799470decc6SDave Kleikamp JBUFFER_TRACE(jh, "file as BJ_Forget"); 800f7f4bccbSMingming Cao jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget); 801470decc6SDave Kleikamp /* Wake up any transactions which were waiting for this 802470decc6SDave Kleikamp IO to complete */ 803470decc6SDave Kleikamp wake_up_bit(&bh->b_state, BH_Unshadow); 804470decc6SDave Kleikamp JBUFFER_TRACE(jh, "brelse shadowed buffer"); 805470decc6SDave Kleikamp __brelse(bh); 806470decc6SDave Kleikamp } 807470decc6SDave Kleikamp 808470decc6SDave Kleikamp J_ASSERT (commit_transaction->t_shadow_list == NULL); 809470decc6SDave Kleikamp 81087c89c23SJan Kara jbd_debug(3, "JBD: commit phase 4\n"); 811470decc6SDave Kleikamp 812470decc6SDave Kleikamp /* Here we wait for the revoke record and descriptor record buffers */ 813470decc6SDave Kleikamp wait_for_ctlbuf: 814470decc6SDave Kleikamp while (commit_transaction->t_log_list != NULL) { 815470decc6SDave Kleikamp struct buffer_head *bh; 816470decc6SDave Kleikamp 817470decc6SDave Kleikamp jh = commit_transaction->t_log_list->b_tprev; 818470decc6SDave Kleikamp bh = jh2bh(jh); 819470decc6SDave Kleikamp if (buffer_locked(bh)) { 820470decc6SDave Kleikamp wait_on_buffer(bh); 821470decc6SDave Kleikamp goto wait_for_ctlbuf; 822470decc6SDave Kleikamp } 823470decc6SDave Kleikamp if (cond_resched()) 824470decc6SDave Kleikamp goto wait_for_ctlbuf; 825470decc6SDave Kleikamp 826470decc6SDave Kleikamp if (unlikely(!buffer_uptodate(bh))) 827470decc6SDave Kleikamp err = -EIO; 828470decc6SDave Kleikamp 829470decc6SDave Kleikamp BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile"); 830470decc6SDave Kleikamp clear_buffer_jwrite(bh); 831f7f4bccbSMingming Cao jbd2_journal_unfile_buffer(journal, jh); 832f7f4bccbSMingming Cao jbd2_journal_put_journal_head(jh); 833470decc6SDave Kleikamp __brelse(bh); /* One for getblk */ 834470decc6SDave Kleikamp /* AKPM: bforget here */ 835470decc6SDave Kleikamp } 836470decc6SDave Kleikamp 83777e841deSHidehiro Kawai if (err) 83877e841deSHidehiro Kawai jbd2_journal_abort(journal, err); 83977e841deSHidehiro Kawai 84087c89c23SJan Kara jbd_debug(3, "JBD: commit phase 5\n"); 841470decc6SDave Kleikamp 842818d276cSGirish Shilamkar if (!JBD2_HAS_INCOMPAT_FEATURE(journal, 843818d276cSGirish Shilamkar JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { 844818d276cSGirish Shilamkar err = journal_submit_commit_record(journal, commit_transaction, 845818d276cSGirish Shilamkar &cbh, crc32_sum); 846818d276cSGirish Shilamkar if (err) 847818d276cSGirish Shilamkar __jbd2_journal_abort_hard(journal); 848818d276cSGirish Shilamkar } 849b048d846SMingming Cao if (!err && !is_journal_aborted(journal)) 850fd98496fSTheodore Ts'o err = journal_wait_on_commit_record(journal, cbh); 851470decc6SDave Kleikamp 852470decc6SDave Kleikamp if (err) 853a7fa2bafSJan Kara jbd2_journal_abort(journal, err); 854470decc6SDave Kleikamp 855470decc6SDave Kleikamp /* End of a transaction! Finally, we can do checkpoint 856470decc6SDave Kleikamp processing: any buffers committed as a result of this 857470decc6SDave Kleikamp transaction can be removed from any checkpoint list it was on 858470decc6SDave Kleikamp before. */ 859470decc6SDave Kleikamp 86087c89c23SJan Kara jbd_debug(3, "JBD: commit phase 6\n"); 861470decc6SDave Kleikamp 862c851ed54SJan Kara J_ASSERT(list_empty(&commit_transaction->t_inode_list)); 863470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_buffers == NULL); 864470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_checkpoint_list == NULL); 865470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_iobuf_list == NULL); 866470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_shadow_list == NULL); 867470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_log_list == NULL); 868470decc6SDave Kleikamp 869470decc6SDave Kleikamp restart_loop: 870470decc6SDave Kleikamp /* 871470decc6SDave Kleikamp * As there are other places (journal_unmap_buffer()) adding buffers 872470decc6SDave Kleikamp * to this list we have to be careful and hold the j_list_lock. 873470decc6SDave Kleikamp */ 874470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 875470decc6SDave Kleikamp while (commit_transaction->t_forget) { 876470decc6SDave Kleikamp transaction_t *cp_transaction; 877470decc6SDave Kleikamp struct buffer_head *bh; 878470decc6SDave Kleikamp 879470decc6SDave Kleikamp jh = commit_transaction->t_forget; 880470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 881470decc6SDave Kleikamp bh = jh2bh(jh); 882470decc6SDave Kleikamp jbd_lock_bh_state(bh); 883470decc6SDave Kleikamp J_ASSERT_JH(jh, jh->b_transaction == commit_transaction || 884470decc6SDave Kleikamp jh->b_transaction == journal->j_running_transaction); 885470decc6SDave Kleikamp 886470decc6SDave Kleikamp /* 887470decc6SDave Kleikamp * If there is undo-protected committed data against 888470decc6SDave Kleikamp * this buffer, then we can remove it now. If it is a 889470decc6SDave Kleikamp * buffer needing such protection, the old frozen_data 890470decc6SDave Kleikamp * field now points to a committed version of the 891470decc6SDave Kleikamp * buffer, so rotate that field to the new committed 892470decc6SDave Kleikamp * data. 893470decc6SDave Kleikamp * 894470decc6SDave Kleikamp * Otherwise, we can just throw away the frozen data now. 895e06c8227SJoel Becker * 896e06c8227SJoel Becker * We also know that the frozen data has already fired 897e06c8227SJoel Becker * its triggers if they exist, so we can clear that too. 898470decc6SDave Kleikamp */ 899470decc6SDave Kleikamp if (jh->b_committed_data) { 900af1e76d6SMingming Cao jbd2_free(jh->b_committed_data, bh->b_size); 901470decc6SDave Kleikamp jh->b_committed_data = NULL; 902470decc6SDave Kleikamp if (jh->b_frozen_data) { 903470decc6SDave Kleikamp jh->b_committed_data = jh->b_frozen_data; 904470decc6SDave Kleikamp jh->b_frozen_data = NULL; 905e06c8227SJoel Becker jh->b_frozen_triggers = NULL; 906470decc6SDave Kleikamp } 907470decc6SDave Kleikamp } else if (jh->b_frozen_data) { 908af1e76d6SMingming Cao jbd2_free(jh->b_frozen_data, bh->b_size); 909470decc6SDave Kleikamp jh->b_frozen_data = NULL; 910e06c8227SJoel Becker jh->b_frozen_triggers = NULL; 911470decc6SDave Kleikamp } 912470decc6SDave Kleikamp 913470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 914470decc6SDave Kleikamp cp_transaction = jh->b_cp_transaction; 915470decc6SDave Kleikamp if (cp_transaction) { 916470decc6SDave Kleikamp JBUFFER_TRACE(jh, "remove from old cp transaction"); 9178e85fb3fSJohann Lombardi cp_transaction->t_chp_stats.cs_dropped++; 918f7f4bccbSMingming Cao __jbd2_journal_remove_checkpoint(jh); 919470decc6SDave Kleikamp } 920470decc6SDave Kleikamp 921470decc6SDave Kleikamp /* Only re-checkpoint the buffer_head if it is marked 922470decc6SDave Kleikamp * dirty. If the buffer was added to the BJ_Forget list 923f7f4bccbSMingming Cao * by jbd2_journal_forget, it may no longer be dirty and 924470decc6SDave Kleikamp * there's no point in keeping a checkpoint record for 925470decc6SDave Kleikamp * it. */ 926470decc6SDave Kleikamp 927470decc6SDave Kleikamp /* A buffer which has been freed while still being 928470decc6SDave Kleikamp * journaled by a previous transaction may end up still 929470decc6SDave Kleikamp * being dirty here, but we want to avoid writing back 930470decc6SDave Kleikamp * that buffer in the future now that the last use has 931470decc6SDave Kleikamp * been committed. That's not only a performance gain, 932470decc6SDave Kleikamp * it also stops aliasing problems if the buffer is left 933470decc6SDave Kleikamp * behind for writeback and gets reallocated for another 934470decc6SDave Kleikamp * use in a different page. */ 935470decc6SDave Kleikamp if (buffer_freed(bh)) { 936470decc6SDave Kleikamp clear_buffer_freed(bh); 937470decc6SDave Kleikamp clear_buffer_jbddirty(bh); 938470decc6SDave Kleikamp } 939470decc6SDave Kleikamp 940470decc6SDave Kleikamp if (buffer_jbddirty(bh)) { 941470decc6SDave Kleikamp JBUFFER_TRACE(jh, "add to new checkpointing trans"); 942f7f4bccbSMingming Cao __jbd2_journal_insert_checkpoint(jh, commit_transaction); 9437ad7445fSHidehiro Kawai if (is_journal_aborted(journal)) 9447ad7445fSHidehiro Kawai clear_buffer_jbddirty(bh); 945470decc6SDave Kleikamp JBUFFER_TRACE(jh, "refile for checkpoint writeback"); 946f7f4bccbSMingming Cao __jbd2_journal_refile_buffer(jh); 947470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 948470decc6SDave Kleikamp } else { 949470decc6SDave Kleikamp J_ASSERT_BH(bh, !buffer_dirty(bh)); 950470decc6SDave Kleikamp /* The buffer on BJ_Forget list and not jbddirty means 951470decc6SDave Kleikamp * it has been freed by this transaction and hence it 952470decc6SDave Kleikamp * could not have been reallocated until this 953470decc6SDave Kleikamp * transaction has committed. *BUT* it could be 954470decc6SDave Kleikamp * reallocated once we have written all the data to 955470decc6SDave Kleikamp * disk and before we process the buffer on BJ_Forget 956470decc6SDave Kleikamp * list. */ 957470decc6SDave Kleikamp JBUFFER_TRACE(jh, "refile or unfile freed buffer"); 958f7f4bccbSMingming Cao __jbd2_journal_refile_buffer(jh); 959470decc6SDave Kleikamp if (!jh->b_transaction) { 960470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 961470decc6SDave Kleikamp /* needs a brelse */ 962f7f4bccbSMingming Cao jbd2_journal_remove_journal_head(bh); 963470decc6SDave Kleikamp release_buffer_page(bh); 964470decc6SDave Kleikamp } else 965470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 966470decc6SDave Kleikamp } 967470decc6SDave Kleikamp cond_resched_lock(&journal->j_list_lock); 968470decc6SDave Kleikamp } 969470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 970470decc6SDave Kleikamp /* 971f5a7a6b0SJan Kara * This is a bit sleazy. We use j_list_lock to protect transition 972f5a7a6b0SJan Kara * of a transaction into T_FINISHED state and calling 973f5a7a6b0SJan Kara * __jbd2_journal_drop_transaction(). Otherwise we could race with 974f5a7a6b0SJan Kara * other checkpointing code processing the transaction... 975470decc6SDave Kleikamp */ 976470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 977470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 978470decc6SDave Kleikamp /* 979470decc6SDave Kleikamp * Now recheck if some buffers did not get attached to the transaction 980470decc6SDave Kleikamp * while the lock was dropped... 981470decc6SDave Kleikamp */ 982470decc6SDave Kleikamp if (commit_transaction->t_forget) { 983470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 984470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 985470decc6SDave Kleikamp goto restart_loop; 986470decc6SDave Kleikamp } 987470decc6SDave Kleikamp 988470decc6SDave Kleikamp /* Done with this transaction! */ 989470decc6SDave Kleikamp 99087c89c23SJan Kara jbd_debug(3, "JBD: commit phase 7\n"); 991470decc6SDave Kleikamp 992470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_state == T_COMMIT); 993470decc6SDave Kleikamp 9948e85fb3fSJohann Lombardi commit_transaction->t_start = jiffies; 995bf699327STheodore Ts'o stats.run.rs_logging = jbd2_time_diff(stats.run.rs_logging, 9968e85fb3fSJohann Lombardi commit_transaction->t_start); 9978e85fb3fSJohann Lombardi 9988e85fb3fSJohann Lombardi /* 999bf699327STheodore Ts'o * File the transaction statistics 10008e85fb3fSJohann Lombardi */ 10018e85fb3fSJohann Lombardi stats.ts_tid = commit_transaction->t_tid; 1002bf699327STheodore Ts'o stats.run.rs_handle_count = commit_transaction->t_handle_count; 1003bf699327STheodore Ts'o trace_jbd2_run_stats(journal->j_fs_dev->bd_dev, 1004bf699327STheodore Ts'o commit_transaction->t_tid, &stats.run); 10058e85fb3fSJohann Lombardi 10068e85fb3fSJohann Lombardi /* 10078e85fb3fSJohann Lombardi * Calculate overall stats 10088e85fb3fSJohann Lombardi */ 1009bf699327STheodore Ts'o spin_lock(&journal->j_history_lock); 10108e85fb3fSJohann Lombardi journal->j_stats.ts_tid++; 1011bf699327STheodore Ts'o journal->j_stats.run.rs_wait += stats.run.rs_wait; 1012bf699327STheodore Ts'o journal->j_stats.run.rs_running += stats.run.rs_running; 1013bf699327STheodore Ts'o journal->j_stats.run.rs_locked += stats.run.rs_locked; 1014bf699327STheodore Ts'o journal->j_stats.run.rs_flushing += stats.run.rs_flushing; 1015bf699327STheodore Ts'o journal->j_stats.run.rs_logging += stats.run.rs_logging; 1016bf699327STheodore Ts'o journal->j_stats.run.rs_handle_count += stats.run.rs_handle_count; 1017bf699327STheodore Ts'o journal->j_stats.run.rs_blocks += stats.run.rs_blocks; 1018bf699327STheodore Ts'o journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged; 10198e85fb3fSJohann Lombardi spin_unlock(&journal->j_history_lock); 10208e85fb3fSJohann Lombardi 1021470decc6SDave Kleikamp commit_transaction->t_state = T_FINISHED; 1022470decc6SDave Kleikamp J_ASSERT(commit_transaction == journal->j_committing_transaction); 1023470decc6SDave Kleikamp journal->j_commit_sequence = commit_transaction->t_tid; 1024470decc6SDave Kleikamp journal->j_committing_transaction = NULL; 1025e07f7183SJosef Bacik commit_time = ktime_to_ns(ktime_sub(ktime_get(), start_time)); 1026470decc6SDave Kleikamp 1027e07f7183SJosef Bacik /* 1028e07f7183SJosef Bacik * weight the commit time higher than the average time so we don't 1029e07f7183SJosef Bacik * react too strongly to vast changes in the commit time 1030e07f7183SJosef Bacik */ 1031e07f7183SJosef Bacik if (likely(journal->j_average_commit_time)) 1032e07f7183SJosef Bacik journal->j_average_commit_time = (commit_time + 1033e07f7183SJosef Bacik journal->j_average_commit_time*3) / 4; 1034e07f7183SJosef Bacik else 1035e07f7183SJosef Bacik journal->j_average_commit_time = commit_time; 1036470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 10376c20ec85STheodore Ts'o 1038f89b7795SJan Kara if (commit_transaction->t_checkpoint_list == NULL && 1039f89b7795SJan Kara commit_transaction->t_checkpoint_io_list == NULL) { 1040f7f4bccbSMingming Cao __jbd2_journal_drop_transaction(journal, commit_transaction); 1041fb68407bSAneesh Kumar K.V to_free = 1; 1042470decc6SDave Kleikamp } else { 1043470decc6SDave Kleikamp if (journal->j_checkpoint_transactions == NULL) { 1044470decc6SDave Kleikamp journal->j_checkpoint_transactions = commit_transaction; 1045470decc6SDave Kleikamp commit_transaction->t_cpnext = commit_transaction; 1046470decc6SDave Kleikamp commit_transaction->t_cpprev = commit_transaction; 1047470decc6SDave Kleikamp } else { 1048470decc6SDave Kleikamp commit_transaction->t_cpnext = 1049470decc6SDave Kleikamp journal->j_checkpoint_transactions; 1050470decc6SDave Kleikamp commit_transaction->t_cpprev = 1051470decc6SDave Kleikamp commit_transaction->t_cpnext->t_cpprev; 1052470decc6SDave Kleikamp commit_transaction->t_cpnext->t_cpprev = 1053470decc6SDave Kleikamp commit_transaction; 1054470decc6SDave Kleikamp commit_transaction->t_cpprev->t_cpnext = 1055470decc6SDave Kleikamp commit_transaction; 1056470decc6SDave Kleikamp } 1057470decc6SDave Kleikamp } 1058470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 1059470decc6SDave Kleikamp 1060fb68407bSAneesh Kumar K.V if (journal->j_commit_callback) 1061fb68407bSAneesh Kumar K.V journal->j_commit_callback(journal, commit_transaction); 1062fb68407bSAneesh Kumar K.V 1063879c5e6bSTheodore Ts'o trace_jbd2_end_commit(journal, commit_transaction); 1064470decc6SDave Kleikamp jbd_debug(1, "JBD: commit %d complete, head %d\n", 1065470decc6SDave Kleikamp journal->j_commit_sequence, journal->j_tail_sequence); 1066fb68407bSAneesh Kumar K.V if (to_free) 1067fb68407bSAneesh Kumar K.V kfree(commit_transaction); 1068470decc6SDave Kleikamp 1069470decc6SDave Kleikamp wake_up(&journal->j_wait_done_commit); 1070470decc6SDave Kleikamp } 1071