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> 28470decc6SDave Kleikamp 29470decc6SDave Kleikamp /* 30470decc6SDave Kleikamp * Default IO end handler for temporary BJ_IO buffer_heads. 31470decc6SDave Kleikamp */ 32470decc6SDave Kleikamp static void journal_end_buffer_io_sync(struct buffer_head *bh, int uptodate) 33470decc6SDave Kleikamp { 34470decc6SDave Kleikamp BUFFER_TRACE(bh, ""); 35470decc6SDave Kleikamp if (uptodate) 36470decc6SDave Kleikamp set_buffer_uptodate(bh); 37470decc6SDave Kleikamp else 38470decc6SDave Kleikamp clear_buffer_uptodate(bh); 39470decc6SDave Kleikamp unlock_buffer(bh); 40470decc6SDave Kleikamp } 41470decc6SDave Kleikamp 42470decc6SDave Kleikamp /* 4387c89c23SJan Kara * When an ext4 file is truncated, it is possible that some pages are not 4487c89c23SJan Kara * successfully freed, because they are attached to a committing transaction. 45470decc6SDave Kleikamp * After the transaction commits, these pages are left on the LRU, with no 46470decc6SDave Kleikamp * ->mapping, and with attached buffers. These pages are trivially reclaimable 47470decc6SDave Kleikamp * by the VM, but their apparent absence upsets the VM accounting, and it makes 48470decc6SDave Kleikamp * the numbers in /proc/meminfo look odd. 49470decc6SDave Kleikamp * 50470decc6SDave Kleikamp * So here, we have a buffer which has just come off the forget list. Look to 51470decc6SDave Kleikamp * see if we can strip all buffers from the backing page. 52470decc6SDave Kleikamp * 53470decc6SDave Kleikamp * Called under lock_journal(), and possibly under journal_datalist_lock. The 54470decc6SDave Kleikamp * caller provided us with a ref against the buffer, and we drop that here. 55470decc6SDave Kleikamp */ 56470decc6SDave Kleikamp static void release_buffer_page(struct buffer_head *bh) 57470decc6SDave Kleikamp { 58470decc6SDave Kleikamp struct page *page; 59470decc6SDave Kleikamp 60470decc6SDave Kleikamp if (buffer_dirty(bh)) 61470decc6SDave Kleikamp goto nope; 62470decc6SDave Kleikamp if (atomic_read(&bh->b_count) != 1) 63470decc6SDave Kleikamp goto nope; 64470decc6SDave Kleikamp page = bh->b_page; 65470decc6SDave Kleikamp if (!page) 66470decc6SDave Kleikamp goto nope; 67470decc6SDave Kleikamp if (page->mapping) 68470decc6SDave Kleikamp goto nope; 69470decc6SDave Kleikamp 70470decc6SDave Kleikamp /* OK, it's a truncated page */ 71529ae9aaSNick Piggin if (!trylock_page(page)) 72470decc6SDave Kleikamp goto nope; 73470decc6SDave Kleikamp 74470decc6SDave Kleikamp page_cache_get(page); 75470decc6SDave Kleikamp __brelse(bh); 76470decc6SDave Kleikamp try_to_free_buffers(page); 77470decc6SDave Kleikamp unlock_page(page); 78470decc6SDave Kleikamp page_cache_release(page); 79470decc6SDave Kleikamp return; 80470decc6SDave Kleikamp 81470decc6SDave Kleikamp nope: 82470decc6SDave Kleikamp __brelse(bh); 83470decc6SDave Kleikamp } 84470decc6SDave Kleikamp 85470decc6SDave Kleikamp /* 86818d276cSGirish Shilamkar * Done it all: now submit the commit record. We should have 87470decc6SDave Kleikamp * cleaned up our previous buffers by now, so if we are in abort 88470decc6SDave Kleikamp * mode we can now just skip the rest of the journal write 89470decc6SDave Kleikamp * entirely. 90470decc6SDave Kleikamp * 91470decc6SDave Kleikamp * Returns 1 if the journal needs to be aborted or 0 on success 92470decc6SDave Kleikamp */ 93818d276cSGirish Shilamkar static int journal_submit_commit_record(journal_t *journal, 94818d276cSGirish Shilamkar transaction_t *commit_transaction, 95818d276cSGirish Shilamkar struct buffer_head **cbh, 96818d276cSGirish Shilamkar __u32 crc32_sum) 97470decc6SDave Kleikamp { 98470decc6SDave Kleikamp struct journal_head *descriptor; 99818d276cSGirish Shilamkar struct commit_header *tmp; 100470decc6SDave Kleikamp struct buffer_head *bh; 101818d276cSGirish Shilamkar int ret; 102470decc6SDave Kleikamp int barrier_done = 0; 103736603abSTheodore Ts'o struct timespec now = current_kernel_time(); 104470decc6SDave Kleikamp 105470decc6SDave Kleikamp if (is_journal_aborted(journal)) 106470decc6SDave Kleikamp return 0; 107470decc6SDave Kleikamp 108f7f4bccbSMingming Cao descriptor = jbd2_journal_get_descriptor_buffer(journal); 109470decc6SDave Kleikamp if (!descriptor) 110470decc6SDave Kleikamp return 1; 111470decc6SDave Kleikamp 112470decc6SDave Kleikamp bh = jh2bh(descriptor); 113470decc6SDave Kleikamp 114818d276cSGirish Shilamkar tmp = (struct commit_header *)bh->b_data; 115f7f4bccbSMingming Cao tmp->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER); 116f7f4bccbSMingming Cao tmp->h_blocktype = cpu_to_be32(JBD2_COMMIT_BLOCK); 117470decc6SDave Kleikamp tmp->h_sequence = cpu_to_be32(commit_transaction->t_tid); 118736603abSTheodore Ts'o tmp->h_commit_sec = cpu_to_be64(now.tv_sec); 119736603abSTheodore Ts'o tmp->h_commit_nsec = cpu_to_be32(now.tv_nsec); 120818d276cSGirish Shilamkar 121818d276cSGirish Shilamkar if (JBD2_HAS_COMPAT_FEATURE(journal, 122818d276cSGirish Shilamkar JBD2_FEATURE_COMPAT_CHECKSUM)) { 123818d276cSGirish Shilamkar tmp->h_chksum_type = JBD2_CRC32_CHKSUM; 124818d276cSGirish Shilamkar tmp->h_chksum_size = JBD2_CRC32_CHKSUM_SIZE; 125818d276cSGirish Shilamkar tmp->h_chksum[0] = cpu_to_be32(crc32_sum); 126470decc6SDave Kleikamp } 127470decc6SDave Kleikamp 128818d276cSGirish Shilamkar JBUFFER_TRACE(descriptor, "submit commit block"); 129818d276cSGirish Shilamkar lock_buffer(bh); 13045a90bfdSTheodore Ts'o clear_buffer_dirty(bh); 131818d276cSGirish Shilamkar set_buffer_uptodate(bh); 132818d276cSGirish Shilamkar bh->b_end_io = journal_end_buffer_io_sync; 133818d276cSGirish Shilamkar 134818d276cSGirish Shilamkar if (journal->j_flags & JBD2_BARRIER && 1354d605179SAneesh Kumar K.V !JBD2_HAS_INCOMPAT_FEATURE(journal, 136818d276cSGirish Shilamkar JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { 137470decc6SDave Kleikamp set_buffer_ordered(bh); 138470decc6SDave Kleikamp barrier_done = 1; 139470decc6SDave Kleikamp } 140818d276cSGirish Shilamkar ret = submit_bh(WRITE, bh); 141c4e35e07SDave Kleikamp if (barrier_done) 142c4e35e07SDave Kleikamp clear_buffer_ordered(bh); 143818d276cSGirish Shilamkar 144470decc6SDave Kleikamp /* is it possible for another commit to fail at roughly 145470decc6SDave Kleikamp * the same time as this one? If so, we don't want to 146470decc6SDave Kleikamp * trust the barrier flag in the super, but instead want 147470decc6SDave Kleikamp * to remember if we sent a barrier request 148470decc6SDave Kleikamp */ 149470decc6SDave Kleikamp if (ret == -EOPNOTSUPP && barrier_done) { 150470decc6SDave Kleikamp printk(KERN_WARNING 151470decc6SDave Kleikamp "JBD: barrier-based sync failed on %s - " 15205496769STheodore Ts'o "disabling barriers\n", journal->j_devname); 153470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 154f7f4bccbSMingming Cao journal->j_flags &= ~JBD2_BARRIER; 155470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 156470decc6SDave Kleikamp 157470decc6SDave Kleikamp /* And try again, without the barrier */ 158034772b0STheodore Ts'o lock_buffer(bh); 159470decc6SDave Kleikamp set_buffer_uptodate(bh); 16045a90bfdSTheodore Ts'o clear_buffer_dirty(bh); 161818d276cSGirish Shilamkar ret = submit_bh(WRITE, bh); 162470decc6SDave Kleikamp } 163818d276cSGirish Shilamkar *cbh = bh; 164818d276cSGirish Shilamkar return ret; 165818d276cSGirish Shilamkar } 166470decc6SDave Kleikamp 167818d276cSGirish Shilamkar /* 168818d276cSGirish Shilamkar * This function along with journal_submit_commit_record 169818d276cSGirish Shilamkar * allows to write the commit record asynchronously. 170818d276cSGirish Shilamkar */ 171818d276cSGirish Shilamkar static int journal_wait_on_commit_record(struct buffer_head *bh) 172818d276cSGirish Shilamkar { 173818d276cSGirish Shilamkar int ret = 0; 174818d276cSGirish Shilamkar 175818d276cSGirish Shilamkar clear_buffer_dirty(bh); 176818d276cSGirish Shilamkar wait_on_buffer(bh); 177818d276cSGirish Shilamkar 178818d276cSGirish Shilamkar if (unlikely(!buffer_uptodate(bh))) 179818d276cSGirish Shilamkar ret = -EIO; 180818d276cSGirish Shilamkar put_bh(bh); /* One for getblk() */ 181818d276cSGirish Shilamkar jbd2_journal_put_journal_head(bh2jh(bh)); 182818d276cSGirish Shilamkar 183818d276cSGirish Shilamkar return ret; 184818d276cSGirish Shilamkar } 185818d276cSGirish Shilamkar 186818d276cSGirish Shilamkar /* 187cd1aac32SAneesh Kumar K.V * write the filemap data using writepage() address_space_operations. 188cd1aac32SAneesh Kumar K.V * We don't do block allocation here even for delalloc. We don't 189cd1aac32SAneesh Kumar K.V * use writepages() because with dealyed allocation we may be doing 190cd1aac32SAneesh Kumar K.V * block allocation in writepages(). 191cd1aac32SAneesh Kumar K.V */ 192cd1aac32SAneesh Kumar K.V static int journal_submit_inode_data_buffers(struct address_space *mapping) 193cd1aac32SAneesh Kumar K.V { 194cd1aac32SAneesh Kumar K.V int ret; 195cd1aac32SAneesh Kumar K.V struct writeback_control wbc = { 196cd1aac32SAneesh Kumar K.V .sync_mode = WB_SYNC_ALL, 197cd1aac32SAneesh Kumar K.V .nr_to_write = mapping->nrpages * 2, 198cd1aac32SAneesh Kumar K.V .range_start = 0, 199cd1aac32SAneesh Kumar K.V .range_end = i_size_read(mapping->host), 200cd1aac32SAneesh Kumar K.V .for_writepages = 1, 201cd1aac32SAneesh Kumar K.V }; 202cd1aac32SAneesh Kumar K.V 203cd1aac32SAneesh Kumar K.V ret = generic_writepages(mapping, &wbc); 204cd1aac32SAneesh Kumar K.V return ret; 205cd1aac32SAneesh Kumar K.V } 206cd1aac32SAneesh Kumar K.V 207cd1aac32SAneesh Kumar K.V /* 208c851ed54SJan Kara * Submit all the data buffers of inode associated with the transaction to 209c851ed54SJan Kara * disk. 210c851ed54SJan Kara * 211c851ed54SJan Kara * We are in a committing transaction. Therefore no new inode can be added to 212c851ed54SJan Kara * our inode list. We use JI_COMMIT_RUNNING flag to protect inode we currently 213c851ed54SJan Kara * operate on from being released while we write out pages. 214c851ed54SJan Kara */ 215cd1aac32SAneesh Kumar K.V static int journal_submit_data_buffers(journal_t *journal, 216c851ed54SJan Kara transaction_t *commit_transaction) 217c851ed54SJan Kara { 218c851ed54SJan Kara struct jbd2_inode *jinode; 219c851ed54SJan Kara int err, ret = 0; 220c851ed54SJan Kara struct address_space *mapping; 221c851ed54SJan Kara 222c851ed54SJan Kara spin_lock(&journal->j_list_lock); 223c851ed54SJan Kara list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) { 224c851ed54SJan Kara mapping = jinode->i_vfs_inode->i_mapping; 225c851ed54SJan Kara jinode->i_flags |= JI_COMMIT_RUNNING; 226c851ed54SJan Kara spin_unlock(&journal->j_list_lock); 227cd1aac32SAneesh Kumar K.V /* 228cd1aac32SAneesh Kumar K.V * submit the inode data buffers. We use writepage 229cd1aac32SAneesh Kumar K.V * instead of writepages. Because writepages can do 230cd1aac32SAneesh Kumar K.V * block allocation with delalloc. We need to write 231cd1aac32SAneesh Kumar K.V * only allocated blocks here. 232cd1aac32SAneesh Kumar K.V */ 233cd1aac32SAneesh Kumar K.V err = journal_submit_inode_data_buffers(mapping); 234c851ed54SJan Kara if (!ret) 235c851ed54SJan Kara ret = err; 236c851ed54SJan Kara spin_lock(&journal->j_list_lock); 237c851ed54SJan Kara J_ASSERT(jinode->i_transaction == commit_transaction); 238c851ed54SJan Kara jinode->i_flags &= ~JI_COMMIT_RUNNING; 239c851ed54SJan Kara wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING); 240c851ed54SJan Kara } 241c851ed54SJan Kara spin_unlock(&journal->j_list_lock); 242c851ed54SJan Kara return ret; 243c851ed54SJan Kara } 244c851ed54SJan Kara 245c851ed54SJan Kara /* 246c851ed54SJan Kara * Wait for data submitted for writeout, refile inodes to proper 247c851ed54SJan Kara * transaction if needed. 248c851ed54SJan Kara * 249c851ed54SJan Kara */ 250c851ed54SJan Kara static int journal_finish_inode_data_buffers(journal_t *journal, 251c851ed54SJan Kara transaction_t *commit_transaction) 252c851ed54SJan Kara { 253c851ed54SJan Kara struct jbd2_inode *jinode, *next_i; 254c851ed54SJan Kara int err, ret = 0; 255c851ed54SJan Kara 256cd1aac32SAneesh Kumar K.V /* For locking, see the comment in journal_submit_data_buffers() */ 257c851ed54SJan Kara spin_lock(&journal->j_list_lock); 258c851ed54SJan Kara list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) { 259c851ed54SJan Kara jinode->i_flags |= JI_COMMIT_RUNNING; 260c851ed54SJan Kara spin_unlock(&journal->j_list_lock); 261c851ed54SJan Kara err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping); 262e9e34f4eSHidehiro Kawai if (err) { 263e9e34f4eSHidehiro Kawai /* 264e9e34f4eSHidehiro Kawai * Because AS_EIO is cleared by 265e9e34f4eSHidehiro Kawai * wait_on_page_writeback_range(), set it again so 266e9e34f4eSHidehiro Kawai * that user process can get -EIO from fsync(). 267e9e34f4eSHidehiro Kawai */ 268e9e34f4eSHidehiro Kawai set_bit(AS_EIO, 269e9e34f4eSHidehiro Kawai &jinode->i_vfs_inode->i_mapping->flags); 270e9e34f4eSHidehiro Kawai 271c851ed54SJan Kara if (!ret) 272c851ed54SJan Kara ret = err; 273e9e34f4eSHidehiro Kawai } 274c851ed54SJan Kara spin_lock(&journal->j_list_lock); 275c851ed54SJan Kara jinode->i_flags &= ~JI_COMMIT_RUNNING; 276c851ed54SJan Kara wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING); 277c851ed54SJan Kara } 278c851ed54SJan Kara 279c851ed54SJan Kara /* Now refile inode to proper lists */ 280c851ed54SJan Kara list_for_each_entry_safe(jinode, next_i, 281c851ed54SJan Kara &commit_transaction->t_inode_list, i_list) { 282c851ed54SJan Kara list_del(&jinode->i_list); 283c851ed54SJan Kara if (jinode->i_next_transaction) { 284c851ed54SJan Kara jinode->i_transaction = jinode->i_next_transaction; 285c851ed54SJan Kara jinode->i_next_transaction = NULL; 286c851ed54SJan Kara list_add(&jinode->i_list, 287c851ed54SJan Kara &jinode->i_transaction->t_inode_list); 288c851ed54SJan Kara } else { 289c851ed54SJan Kara jinode->i_transaction = NULL; 290c851ed54SJan Kara } 291c851ed54SJan Kara } 292c851ed54SJan Kara spin_unlock(&journal->j_list_lock); 293c851ed54SJan Kara 294c851ed54SJan Kara return ret; 295c851ed54SJan Kara } 296c851ed54SJan Kara 297818d276cSGirish Shilamkar static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh) 298818d276cSGirish Shilamkar { 299818d276cSGirish Shilamkar struct page *page = bh->b_page; 300818d276cSGirish Shilamkar char *addr; 301818d276cSGirish Shilamkar __u32 checksum; 302818d276cSGirish Shilamkar 303818d276cSGirish Shilamkar addr = kmap_atomic(page, KM_USER0); 304818d276cSGirish Shilamkar checksum = crc32_be(crc32_sum, 305818d276cSGirish Shilamkar (void *)(addr + offset_in_page(bh->b_data)), bh->b_size); 306818d276cSGirish Shilamkar kunmap_atomic(addr, KM_USER0); 307818d276cSGirish Shilamkar 308818d276cSGirish Shilamkar return checksum; 309818d276cSGirish Shilamkar } 310818d276cSGirish Shilamkar 311818d276cSGirish Shilamkar static void write_tag_block(int tag_bytes, journal_block_tag_t *tag, 31218eba7aaSMingming Cao unsigned long long block) 313b517bea1SZach Brown { 314b517bea1SZach Brown tag->t_blocknr = cpu_to_be32(block & (u32)~0); 315cd02ff0bSMingming Cao if (tag_bytes > JBD2_TAG_SIZE32) 316b517bea1SZach Brown tag->t_blocknr_high = cpu_to_be32((block >> 31) >> 1); 317b517bea1SZach Brown } 318b517bea1SZach Brown 319470decc6SDave Kleikamp /* 320f7f4bccbSMingming Cao * jbd2_journal_commit_transaction 321470decc6SDave Kleikamp * 322470decc6SDave Kleikamp * The primary function for committing a transaction to the log. This 323470decc6SDave Kleikamp * function is called by the journal thread to begin a complete commit. 324470decc6SDave Kleikamp */ 325f7f4bccbSMingming Cao void jbd2_journal_commit_transaction(journal_t *journal) 326470decc6SDave Kleikamp { 3278e85fb3fSJohann Lombardi struct transaction_stats_s stats; 328470decc6SDave Kleikamp transaction_t *commit_transaction; 329470decc6SDave Kleikamp struct journal_head *jh, *new_jh, *descriptor; 330470decc6SDave Kleikamp struct buffer_head **wbuf = journal->j_wbuf; 331470decc6SDave Kleikamp int bufs; 332470decc6SDave Kleikamp int flags; 333470decc6SDave Kleikamp int err; 33418eba7aaSMingming Cao unsigned long long blocknr; 335470decc6SDave Kleikamp char *tagp = NULL; 336470decc6SDave Kleikamp journal_header_t *header; 337470decc6SDave Kleikamp journal_block_tag_t *tag = NULL; 338470decc6SDave Kleikamp int space_left = 0; 339470decc6SDave Kleikamp int first_tag = 0; 340470decc6SDave Kleikamp int tag_flag; 341470decc6SDave Kleikamp int i; 342b517bea1SZach Brown int tag_bytes = journal_tag_bytes(journal); 343818d276cSGirish Shilamkar struct buffer_head *cbh = NULL; /* For transactional checksums */ 344818d276cSGirish Shilamkar __u32 crc32_sum = ~0; 345470decc6SDave Kleikamp 346470decc6SDave Kleikamp /* 347470decc6SDave Kleikamp * First job: lock down the current transaction and wait for 348470decc6SDave Kleikamp * all outstanding updates to complete. 349470decc6SDave Kleikamp */ 350470decc6SDave Kleikamp 351470decc6SDave Kleikamp #ifdef COMMIT_STATS 352470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 353470decc6SDave Kleikamp summarise_journal_usage(journal); 354470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 355470decc6SDave Kleikamp #endif 356470decc6SDave Kleikamp 357f7f4bccbSMingming Cao /* Do we need to erase the effects of a prior jbd2_journal_flush? */ 358f7f4bccbSMingming Cao if (journal->j_flags & JBD2_FLUSHED) { 359470decc6SDave Kleikamp jbd_debug(3, "super block updated\n"); 360f7f4bccbSMingming Cao jbd2_journal_update_superblock(journal, 1); 361470decc6SDave Kleikamp } else { 362470decc6SDave Kleikamp jbd_debug(3, "superblock not updated\n"); 363470decc6SDave Kleikamp } 364470decc6SDave Kleikamp 365470decc6SDave Kleikamp J_ASSERT(journal->j_running_transaction != NULL); 366470decc6SDave Kleikamp J_ASSERT(journal->j_committing_transaction == NULL); 367470decc6SDave Kleikamp 368470decc6SDave Kleikamp commit_transaction = journal->j_running_transaction; 369470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_state == T_RUNNING); 370470decc6SDave Kleikamp 371ede86cc4STheodore Ts'o trace_mark(jbd2_start_commit, "dev %s transaction %d", 372ede86cc4STheodore Ts'o journal->j_devname, commit_transaction->t_tid); 373470decc6SDave Kleikamp jbd_debug(1, "JBD: starting commit of transaction %d\n", 374470decc6SDave Kleikamp commit_transaction->t_tid); 375470decc6SDave Kleikamp 376470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 377470decc6SDave Kleikamp commit_transaction->t_state = T_LOCKED; 378470decc6SDave Kleikamp 3798e85fb3fSJohann Lombardi stats.u.run.rs_wait = commit_transaction->t_max_wait; 3808e85fb3fSJohann Lombardi stats.u.run.rs_locked = jiffies; 3818e85fb3fSJohann Lombardi stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start, 3828e85fb3fSJohann Lombardi stats.u.run.rs_locked); 3838e85fb3fSJohann Lombardi 384470decc6SDave Kleikamp spin_lock(&commit_transaction->t_handle_lock); 385470decc6SDave Kleikamp while (commit_transaction->t_updates) { 386470decc6SDave Kleikamp DEFINE_WAIT(wait); 387470decc6SDave Kleikamp 388470decc6SDave Kleikamp prepare_to_wait(&journal->j_wait_updates, &wait, 389470decc6SDave Kleikamp TASK_UNINTERRUPTIBLE); 390470decc6SDave Kleikamp if (commit_transaction->t_updates) { 391470decc6SDave Kleikamp spin_unlock(&commit_transaction->t_handle_lock); 392470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 393470decc6SDave Kleikamp schedule(); 394470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 395470decc6SDave Kleikamp spin_lock(&commit_transaction->t_handle_lock); 396470decc6SDave Kleikamp } 397470decc6SDave Kleikamp finish_wait(&journal->j_wait_updates, &wait); 398470decc6SDave Kleikamp } 399470decc6SDave Kleikamp spin_unlock(&commit_transaction->t_handle_lock); 400470decc6SDave Kleikamp 401470decc6SDave Kleikamp J_ASSERT (commit_transaction->t_outstanding_credits <= 402470decc6SDave Kleikamp journal->j_max_transaction_buffers); 403470decc6SDave Kleikamp 404470decc6SDave Kleikamp /* 405470decc6SDave Kleikamp * First thing we are allowed to do is to discard any remaining 406470decc6SDave Kleikamp * BJ_Reserved buffers. Note, it is _not_ permissible to assume 407470decc6SDave Kleikamp * that there are no such buffers: if a large filesystem 408470decc6SDave Kleikamp * operation like a truncate needs to split itself over multiple 409f7f4bccbSMingming Cao * transactions, then it may try to do a jbd2_journal_restart() while 410470decc6SDave Kleikamp * there are still BJ_Reserved buffers outstanding. These must 411470decc6SDave Kleikamp * be released cleanly from the current transaction. 412470decc6SDave Kleikamp * 413470decc6SDave Kleikamp * In this case, the filesystem must still reserve write access 414470decc6SDave Kleikamp * again before modifying the buffer in the new transaction, but 415470decc6SDave Kleikamp * we do not require it to remember exactly which old buffers it 416470decc6SDave Kleikamp * has reserved. This is consistent with the existing behaviour 417f7f4bccbSMingming Cao * that multiple jbd2_journal_get_write_access() calls to the same 418470decc6SDave Kleikamp * buffer are perfectly permissable. 419470decc6SDave Kleikamp */ 420470decc6SDave Kleikamp while (commit_transaction->t_reserved_list) { 421470decc6SDave Kleikamp jh = commit_transaction->t_reserved_list; 422470decc6SDave Kleikamp JBUFFER_TRACE(jh, "reserved, unused: refile"); 423470decc6SDave Kleikamp /* 424f7f4bccbSMingming Cao * A jbd2_journal_get_undo_access()+jbd2_journal_release_buffer() may 425470decc6SDave Kleikamp * leave undo-committed data. 426470decc6SDave Kleikamp */ 427470decc6SDave Kleikamp if (jh->b_committed_data) { 428470decc6SDave Kleikamp struct buffer_head *bh = jh2bh(jh); 429470decc6SDave Kleikamp 430470decc6SDave Kleikamp jbd_lock_bh_state(bh); 431af1e76d6SMingming Cao jbd2_free(jh->b_committed_data, bh->b_size); 432470decc6SDave Kleikamp jh->b_committed_data = NULL; 433470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 434470decc6SDave Kleikamp } 435f7f4bccbSMingming Cao jbd2_journal_refile_buffer(journal, jh); 436470decc6SDave Kleikamp } 437470decc6SDave Kleikamp 438470decc6SDave Kleikamp /* 439470decc6SDave Kleikamp * Now try to drop any written-back buffers from the journal's 440470decc6SDave Kleikamp * checkpoint lists. We do this *before* commit because it potentially 441470decc6SDave Kleikamp * frees some memory 442470decc6SDave Kleikamp */ 443470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 444f7f4bccbSMingming Cao __jbd2_journal_clean_checkpoint_list(journal); 445470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 446470decc6SDave Kleikamp 447470decc6SDave Kleikamp jbd_debug (3, "JBD: commit phase 1\n"); 448470decc6SDave Kleikamp 449470decc6SDave Kleikamp /* 450470decc6SDave Kleikamp * Switch to a new revoke table. 451470decc6SDave Kleikamp */ 452f7f4bccbSMingming Cao jbd2_journal_switch_revoke_table(journal); 453470decc6SDave Kleikamp 4548e85fb3fSJohann Lombardi stats.u.run.rs_flushing = jiffies; 4558e85fb3fSJohann Lombardi stats.u.run.rs_locked = jbd2_time_diff(stats.u.run.rs_locked, 4568e85fb3fSJohann Lombardi stats.u.run.rs_flushing); 4578e85fb3fSJohann Lombardi 458470decc6SDave Kleikamp commit_transaction->t_state = T_FLUSH; 459470decc6SDave Kleikamp journal->j_committing_transaction = commit_transaction; 460470decc6SDave Kleikamp journal->j_running_transaction = NULL; 461470decc6SDave Kleikamp commit_transaction->t_log_start = journal->j_head; 462470decc6SDave Kleikamp wake_up(&journal->j_wait_transaction_locked); 463470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 464470decc6SDave Kleikamp 465470decc6SDave Kleikamp jbd_debug (3, "JBD: commit phase 2\n"); 466470decc6SDave Kleikamp 467470decc6SDave Kleikamp /* 468470decc6SDave Kleikamp * Now start flushing things to disk, in the order they appear 469470decc6SDave Kleikamp * on the transaction lists. Data blocks go first. 470470decc6SDave Kleikamp */ 471cd1aac32SAneesh Kumar K.V err = journal_submit_data_buffers(journal, commit_transaction); 472c851ed54SJan Kara if (err) 473c851ed54SJan Kara jbd2_journal_abort(journal, err); 474470decc6SDave Kleikamp 475f7f4bccbSMingming Cao jbd2_journal_write_revoke_records(journal, commit_transaction); 476470decc6SDave Kleikamp 477470decc6SDave Kleikamp jbd_debug(3, "JBD: commit phase 2\n"); 478470decc6SDave Kleikamp 479470decc6SDave Kleikamp /* 480470decc6SDave Kleikamp * Way to go: we have now written out all of the data for a 481470decc6SDave Kleikamp * transaction! Now comes the tricky part: we need to write out 482470decc6SDave Kleikamp * metadata. Loop over the transaction's entire buffer list: 483470decc6SDave Kleikamp */ 48402c471cbSMingming Cao spin_lock(&journal->j_state_lock); 485470decc6SDave Kleikamp commit_transaction->t_state = T_COMMIT; 48602c471cbSMingming Cao spin_unlock(&journal->j_state_lock); 487470decc6SDave Kleikamp 4888e85fb3fSJohann Lombardi stats.u.run.rs_logging = jiffies; 4898e85fb3fSJohann Lombardi stats.u.run.rs_flushing = jbd2_time_diff(stats.u.run.rs_flushing, 4908e85fb3fSJohann Lombardi stats.u.run.rs_logging); 4918e85fb3fSJohann Lombardi stats.u.run.rs_blocks = commit_transaction->t_outstanding_credits; 4928e85fb3fSJohann Lombardi stats.u.run.rs_blocks_logged = 0; 4938e85fb3fSJohann Lombardi 4941dfc3220SJosef Bacik J_ASSERT(commit_transaction->t_nr_buffers <= 4951dfc3220SJosef Bacik commit_transaction->t_outstanding_credits); 4961dfc3220SJosef Bacik 49787c89c23SJan Kara err = 0; 498470decc6SDave Kleikamp descriptor = NULL; 499470decc6SDave Kleikamp bufs = 0; 500470decc6SDave Kleikamp while (commit_transaction->t_buffers) { 501470decc6SDave Kleikamp 502470decc6SDave Kleikamp /* Find the next buffer to be journaled... */ 503470decc6SDave Kleikamp 504470decc6SDave Kleikamp jh = commit_transaction->t_buffers; 505470decc6SDave Kleikamp 506470decc6SDave Kleikamp /* If we're in abort mode, we just un-journal the buffer and 5077ad7445fSHidehiro Kawai release it. */ 508470decc6SDave Kleikamp 509470decc6SDave Kleikamp if (is_journal_aborted(journal)) { 5107ad7445fSHidehiro Kawai clear_buffer_jbddirty(jh2bh(jh)); 511470decc6SDave Kleikamp JBUFFER_TRACE(jh, "journal is aborting: refile"); 512f7f4bccbSMingming Cao jbd2_journal_refile_buffer(journal, jh); 513470decc6SDave Kleikamp /* If that was the last one, we need to clean up 514470decc6SDave Kleikamp * any descriptor buffers which may have been 515470decc6SDave Kleikamp * already allocated, even if we are now 516470decc6SDave Kleikamp * aborting. */ 517470decc6SDave Kleikamp if (!commit_transaction->t_buffers) 518470decc6SDave Kleikamp goto start_journal_io; 519470decc6SDave Kleikamp continue; 520470decc6SDave Kleikamp } 521470decc6SDave Kleikamp 522470decc6SDave Kleikamp /* Make sure we have a descriptor block in which to 523470decc6SDave Kleikamp record the metadata buffer. */ 524470decc6SDave Kleikamp 525470decc6SDave Kleikamp if (!descriptor) { 526470decc6SDave Kleikamp struct buffer_head *bh; 527470decc6SDave Kleikamp 528470decc6SDave Kleikamp J_ASSERT (bufs == 0); 529470decc6SDave Kleikamp 530470decc6SDave Kleikamp jbd_debug(4, "JBD: get descriptor\n"); 531470decc6SDave Kleikamp 532f7f4bccbSMingming Cao descriptor = jbd2_journal_get_descriptor_buffer(journal); 533470decc6SDave Kleikamp if (!descriptor) { 534a7fa2bafSJan Kara jbd2_journal_abort(journal, -EIO); 535470decc6SDave Kleikamp continue; 536470decc6SDave Kleikamp } 537470decc6SDave Kleikamp 538470decc6SDave Kleikamp bh = jh2bh(descriptor); 539470decc6SDave Kleikamp jbd_debug(4, "JBD: got buffer %llu (%p)\n", 540470decc6SDave Kleikamp (unsigned long long)bh->b_blocknr, bh->b_data); 541470decc6SDave Kleikamp header = (journal_header_t *)&bh->b_data[0]; 542f7f4bccbSMingming Cao header->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER); 543f7f4bccbSMingming Cao header->h_blocktype = cpu_to_be32(JBD2_DESCRIPTOR_BLOCK); 544470decc6SDave Kleikamp header->h_sequence = cpu_to_be32(commit_transaction->t_tid); 545470decc6SDave Kleikamp 546470decc6SDave Kleikamp tagp = &bh->b_data[sizeof(journal_header_t)]; 547470decc6SDave Kleikamp space_left = bh->b_size - sizeof(journal_header_t); 548470decc6SDave Kleikamp first_tag = 1; 549470decc6SDave Kleikamp set_buffer_jwrite(bh); 550470decc6SDave Kleikamp set_buffer_dirty(bh); 551470decc6SDave Kleikamp wbuf[bufs++] = bh; 552470decc6SDave Kleikamp 553470decc6SDave Kleikamp /* Record it so that we can wait for IO 554470decc6SDave Kleikamp completion later */ 555470decc6SDave Kleikamp BUFFER_TRACE(bh, "ph3: file as descriptor"); 556f7f4bccbSMingming Cao jbd2_journal_file_buffer(descriptor, commit_transaction, 557470decc6SDave Kleikamp BJ_LogCtl); 558470decc6SDave Kleikamp } 559470decc6SDave Kleikamp 560470decc6SDave Kleikamp /* Where is the buffer to be written? */ 561470decc6SDave Kleikamp 562f7f4bccbSMingming Cao err = jbd2_journal_next_log_block(journal, &blocknr); 563470decc6SDave Kleikamp /* If the block mapping failed, just abandon the buffer 564470decc6SDave Kleikamp and repeat this loop: we'll fall into the 565470decc6SDave Kleikamp refile-on-abort condition above. */ 566470decc6SDave Kleikamp if (err) { 567a7fa2bafSJan Kara jbd2_journal_abort(journal, err); 568470decc6SDave Kleikamp continue; 569470decc6SDave Kleikamp } 570470decc6SDave Kleikamp 571470decc6SDave Kleikamp /* 572470decc6SDave Kleikamp * start_this_handle() uses t_outstanding_credits to determine 573470decc6SDave Kleikamp * the free space in the log, but this counter is changed 574f7f4bccbSMingming Cao * by jbd2_journal_next_log_block() also. 575470decc6SDave Kleikamp */ 576470decc6SDave Kleikamp commit_transaction->t_outstanding_credits--; 577470decc6SDave Kleikamp 578470decc6SDave Kleikamp /* Bump b_count to prevent truncate from stumbling over 579470decc6SDave Kleikamp the shadowed buffer! @@@ This can go if we ever get 580470decc6SDave Kleikamp rid of the BJ_IO/BJ_Shadow pairing of buffers. */ 581470decc6SDave Kleikamp atomic_inc(&jh2bh(jh)->b_count); 582470decc6SDave Kleikamp 583470decc6SDave Kleikamp /* Make a temporary IO buffer with which to write it out 584470decc6SDave Kleikamp (this will requeue both the metadata buffer and the 585470decc6SDave Kleikamp temporary IO buffer). new_bh goes on BJ_IO*/ 586470decc6SDave Kleikamp 587470decc6SDave Kleikamp set_bit(BH_JWrite, &jh2bh(jh)->b_state); 588470decc6SDave Kleikamp /* 589f7f4bccbSMingming Cao * akpm: jbd2_journal_write_metadata_buffer() sets 590470decc6SDave Kleikamp * new_bh->b_transaction to commit_transaction. 591470decc6SDave Kleikamp * We need to clean this up before we release new_bh 592470decc6SDave Kleikamp * (which is of type BJ_IO) 593470decc6SDave Kleikamp */ 594470decc6SDave Kleikamp JBUFFER_TRACE(jh, "ph3: write metadata"); 595f7f4bccbSMingming Cao flags = jbd2_journal_write_metadata_buffer(commit_transaction, 596470decc6SDave Kleikamp jh, &new_jh, blocknr); 597470decc6SDave Kleikamp set_bit(BH_JWrite, &jh2bh(new_jh)->b_state); 598470decc6SDave Kleikamp wbuf[bufs++] = jh2bh(new_jh); 599470decc6SDave Kleikamp 600470decc6SDave Kleikamp /* Record the new block's tag in the current descriptor 601470decc6SDave Kleikamp buffer */ 602470decc6SDave Kleikamp 603470decc6SDave Kleikamp tag_flag = 0; 604470decc6SDave Kleikamp if (flags & 1) 605f7f4bccbSMingming Cao tag_flag |= JBD2_FLAG_ESCAPE; 606470decc6SDave Kleikamp if (!first_tag) 607f7f4bccbSMingming Cao tag_flag |= JBD2_FLAG_SAME_UUID; 608470decc6SDave Kleikamp 609470decc6SDave Kleikamp tag = (journal_block_tag_t *) tagp; 610b517bea1SZach Brown write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr); 611470decc6SDave Kleikamp tag->t_flags = cpu_to_be32(tag_flag); 612b517bea1SZach Brown tagp += tag_bytes; 613b517bea1SZach Brown space_left -= tag_bytes; 614470decc6SDave Kleikamp 615470decc6SDave Kleikamp if (first_tag) { 616470decc6SDave Kleikamp memcpy (tagp, journal->j_uuid, 16); 617470decc6SDave Kleikamp tagp += 16; 618470decc6SDave Kleikamp space_left -= 16; 619470decc6SDave Kleikamp first_tag = 0; 620470decc6SDave Kleikamp } 621470decc6SDave Kleikamp 622470decc6SDave Kleikamp /* If there's no more to do, or if the descriptor is full, 623470decc6SDave Kleikamp let the IO rip! */ 624470decc6SDave Kleikamp 625470decc6SDave Kleikamp if (bufs == journal->j_wbufsize || 626470decc6SDave Kleikamp commit_transaction->t_buffers == NULL || 627b517bea1SZach Brown space_left < tag_bytes + 16) { 628470decc6SDave Kleikamp 629470decc6SDave Kleikamp jbd_debug(4, "JBD: Submit %d IOs\n", bufs); 630470decc6SDave Kleikamp 631470decc6SDave Kleikamp /* Write an end-of-descriptor marker before 632470decc6SDave Kleikamp submitting the IOs. "tag" still points to 633470decc6SDave Kleikamp the last tag we set up. */ 634470decc6SDave Kleikamp 635f7f4bccbSMingming Cao tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG); 636470decc6SDave Kleikamp 637470decc6SDave Kleikamp start_journal_io: 638470decc6SDave Kleikamp for (i = 0; i < bufs; i++) { 639470decc6SDave Kleikamp struct buffer_head *bh = wbuf[i]; 640818d276cSGirish Shilamkar /* 641818d276cSGirish Shilamkar * Compute checksum. 642818d276cSGirish Shilamkar */ 643818d276cSGirish Shilamkar if (JBD2_HAS_COMPAT_FEATURE(journal, 644818d276cSGirish Shilamkar JBD2_FEATURE_COMPAT_CHECKSUM)) { 645818d276cSGirish Shilamkar crc32_sum = 646818d276cSGirish Shilamkar jbd2_checksum_data(crc32_sum, bh); 647818d276cSGirish Shilamkar } 648818d276cSGirish Shilamkar 649470decc6SDave Kleikamp lock_buffer(bh); 650470decc6SDave Kleikamp clear_buffer_dirty(bh); 651470decc6SDave Kleikamp set_buffer_uptodate(bh); 652470decc6SDave Kleikamp bh->b_end_io = journal_end_buffer_io_sync; 653470decc6SDave Kleikamp submit_bh(WRITE, bh); 654470decc6SDave Kleikamp } 655470decc6SDave Kleikamp cond_resched(); 6568e85fb3fSJohann Lombardi stats.u.run.rs_blocks_logged += bufs; 657470decc6SDave Kleikamp 658470decc6SDave Kleikamp /* Force a new descriptor to be generated next 659470decc6SDave Kleikamp time round the loop. */ 660470decc6SDave Kleikamp descriptor = NULL; 661470decc6SDave Kleikamp bufs = 0; 662470decc6SDave Kleikamp } 663470decc6SDave Kleikamp } 664470decc6SDave Kleikamp 665818d276cSGirish Shilamkar /* Done it all: now write the commit record asynchronously. */ 666818d276cSGirish Shilamkar 667818d276cSGirish Shilamkar if (JBD2_HAS_INCOMPAT_FEATURE(journal, 668818d276cSGirish Shilamkar JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { 669818d276cSGirish Shilamkar err = journal_submit_commit_record(journal, commit_transaction, 670818d276cSGirish Shilamkar &cbh, crc32_sum); 671818d276cSGirish Shilamkar if (err) 672818d276cSGirish Shilamkar __jbd2_journal_abort_hard(journal); 673818d276cSGirish Shilamkar } 674818d276cSGirish Shilamkar 675c851ed54SJan Kara /* 676c851ed54SJan Kara * This is the right place to wait for data buffers both for ASYNC 677c851ed54SJan Kara * and !ASYNC commit. If commit is ASYNC, we need to wait only after 678c851ed54SJan Kara * the commit block went to disk (which happens above). If commit is 679c851ed54SJan Kara * SYNC, we need to wait for data buffers before we start writing 680c851ed54SJan Kara * commit block, which happens below in such setting. 681c851ed54SJan Kara */ 682c851ed54SJan Kara err = journal_finish_inode_data_buffers(journal, commit_transaction); 683e9e34f4eSHidehiro Kawai if (err) { 684e9e34f4eSHidehiro Kawai printk(KERN_WARNING 685e9e34f4eSHidehiro Kawai "JBD2: Detected IO errors while flushing file data " 68605496769STheodore Ts'o "on %s\n", journal->j_devname); 687*5bf5683aSHidehiro Kawai if (journal->j_flags & JBD2_ABORT_ON_SYNCDATA_ERR) 688*5bf5683aSHidehiro Kawai jbd2_journal_abort(journal, err); 689e9e34f4eSHidehiro Kawai err = 0; 690e9e34f4eSHidehiro Kawai } 691c851ed54SJan Kara 692470decc6SDave Kleikamp /* Lo and behold: we have just managed to send a transaction to 693470decc6SDave Kleikamp the log. Before we can commit it, wait for the IO so far to 694470decc6SDave Kleikamp complete. Control buffers being written are on the 695470decc6SDave Kleikamp transaction's t_log_list queue, and metadata buffers are on 696470decc6SDave Kleikamp the t_iobuf_list queue. 697470decc6SDave Kleikamp 698470decc6SDave Kleikamp Wait for the buffers in reverse order. That way we are 699470decc6SDave Kleikamp less likely to be woken up until all IOs have completed, and 700470decc6SDave Kleikamp so we incur less scheduling load. 701470decc6SDave Kleikamp */ 702470decc6SDave Kleikamp 70387c89c23SJan Kara jbd_debug(3, "JBD: commit phase 3\n"); 704470decc6SDave Kleikamp 705470decc6SDave Kleikamp /* 706470decc6SDave Kleikamp * akpm: these are BJ_IO, and j_list_lock is not needed. 707470decc6SDave Kleikamp * See __journal_try_to_free_buffer. 708470decc6SDave Kleikamp */ 709470decc6SDave Kleikamp wait_for_iobuf: 710470decc6SDave Kleikamp while (commit_transaction->t_iobuf_list != NULL) { 711470decc6SDave Kleikamp struct buffer_head *bh; 712470decc6SDave Kleikamp 713470decc6SDave Kleikamp jh = commit_transaction->t_iobuf_list->b_tprev; 714470decc6SDave Kleikamp bh = jh2bh(jh); 715470decc6SDave Kleikamp if (buffer_locked(bh)) { 716470decc6SDave Kleikamp wait_on_buffer(bh); 717470decc6SDave Kleikamp goto wait_for_iobuf; 718470decc6SDave Kleikamp } 719470decc6SDave Kleikamp if (cond_resched()) 720470decc6SDave Kleikamp goto wait_for_iobuf; 721470decc6SDave Kleikamp 722470decc6SDave Kleikamp if (unlikely(!buffer_uptodate(bh))) 723470decc6SDave Kleikamp err = -EIO; 724470decc6SDave Kleikamp 725470decc6SDave Kleikamp clear_buffer_jwrite(bh); 726470decc6SDave Kleikamp 727470decc6SDave Kleikamp JBUFFER_TRACE(jh, "ph4: unfile after journal write"); 728f7f4bccbSMingming Cao jbd2_journal_unfile_buffer(journal, jh); 729470decc6SDave Kleikamp 730470decc6SDave Kleikamp /* 731470decc6SDave Kleikamp * ->t_iobuf_list should contain only dummy buffer_heads 732f7f4bccbSMingming Cao * which were created by jbd2_journal_write_metadata_buffer(). 733470decc6SDave Kleikamp */ 734470decc6SDave Kleikamp BUFFER_TRACE(bh, "dumping temporary bh"); 735f7f4bccbSMingming Cao jbd2_journal_put_journal_head(jh); 736470decc6SDave Kleikamp __brelse(bh); 737470decc6SDave Kleikamp J_ASSERT_BH(bh, atomic_read(&bh->b_count) == 0); 738470decc6SDave Kleikamp free_buffer_head(bh); 739470decc6SDave Kleikamp 740470decc6SDave Kleikamp /* We also have to unlock and free the corresponding 741470decc6SDave Kleikamp shadowed buffer */ 742470decc6SDave Kleikamp jh = commit_transaction->t_shadow_list->b_tprev; 743470decc6SDave Kleikamp bh = jh2bh(jh); 744470decc6SDave Kleikamp clear_bit(BH_JWrite, &bh->b_state); 745470decc6SDave Kleikamp J_ASSERT_BH(bh, buffer_jbddirty(bh)); 746470decc6SDave Kleikamp 747470decc6SDave Kleikamp /* The metadata is now released for reuse, but we need 748470decc6SDave Kleikamp to remember it against this transaction so that when 749470decc6SDave Kleikamp we finally commit, we can do any checkpointing 750470decc6SDave Kleikamp required. */ 751470decc6SDave Kleikamp JBUFFER_TRACE(jh, "file as BJ_Forget"); 752f7f4bccbSMingming Cao jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget); 753470decc6SDave Kleikamp /* Wake up any transactions which were waiting for this 754470decc6SDave Kleikamp IO to complete */ 755470decc6SDave Kleikamp wake_up_bit(&bh->b_state, BH_Unshadow); 756470decc6SDave Kleikamp JBUFFER_TRACE(jh, "brelse shadowed buffer"); 757470decc6SDave Kleikamp __brelse(bh); 758470decc6SDave Kleikamp } 759470decc6SDave Kleikamp 760470decc6SDave Kleikamp J_ASSERT (commit_transaction->t_shadow_list == NULL); 761470decc6SDave Kleikamp 76287c89c23SJan Kara jbd_debug(3, "JBD: commit phase 4\n"); 763470decc6SDave Kleikamp 764470decc6SDave Kleikamp /* Here we wait for the revoke record and descriptor record buffers */ 765470decc6SDave Kleikamp wait_for_ctlbuf: 766470decc6SDave Kleikamp while (commit_transaction->t_log_list != NULL) { 767470decc6SDave Kleikamp struct buffer_head *bh; 768470decc6SDave Kleikamp 769470decc6SDave Kleikamp jh = commit_transaction->t_log_list->b_tprev; 770470decc6SDave Kleikamp bh = jh2bh(jh); 771470decc6SDave Kleikamp if (buffer_locked(bh)) { 772470decc6SDave Kleikamp wait_on_buffer(bh); 773470decc6SDave Kleikamp goto wait_for_ctlbuf; 774470decc6SDave Kleikamp } 775470decc6SDave Kleikamp if (cond_resched()) 776470decc6SDave Kleikamp goto wait_for_ctlbuf; 777470decc6SDave Kleikamp 778470decc6SDave Kleikamp if (unlikely(!buffer_uptodate(bh))) 779470decc6SDave Kleikamp err = -EIO; 780470decc6SDave Kleikamp 781470decc6SDave Kleikamp BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile"); 782470decc6SDave Kleikamp clear_buffer_jwrite(bh); 783f7f4bccbSMingming Cao jbd2_journal_unfile_buffer(journal, jh); 784f7f4bccbSMingming Cao jbd2_journal_put_journal_head(jh); 785470decc6SDave Kleikamp __brelse(bh); /* One for getblk */ 786470decc6SDave Kleikamp /* AKPM: bforget here */ 787470decc6SDave Kleikamp } 788470decc6SDave Kleikamp 78977e841deSHidehiro Kawai if (err) 79077e841deSHidehiro Kawai jbd2_journal_abort(journal, err); 79177e841deSHidehiro Kawai 79287c89c23SJan Kara jbd_debug(3, "JBD: commit phase 5\n"); 793470decc6SDave Kleikamp 794818d276cSGirish Shilamkar if (!JBD2_HAS_INCOMPAT_FEATURE(journal, 795818d276cSGirish Shilamkar JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)) { 796818d276cSGirish Shilamkar err = journal_submit_commit_record(journal, commit_transaction, 797818d276cSGirish Shilamkar &cbh, crc32_sum); 798818d276cSGirish Shilamkar if (err) 799818d276cSGirish Shilamkar __jbd2_journal_abort_hard(journal); 800818d276cSGirish Shilamkar } 801b048d846SMingming Cao if (!err && !is_journal_aborted(journal)) 802818d276cSGirish Shilamkar err = journal_wait_on_commit_record(cbh); 803470decc6SDave Kleikamp 804470decc6SDave Kleikamp if (err) 805a7fa2bafSJan Kara jbd2_journal_abort(journal, err); 806470decc6SDave Kleikamp 807470decc6SDave Kleikamp /* End of a transaction! Finally, we can do checkpoint 808470decc6SDave Kleikamp processing: any buffers committed as a result of this 809470decc6SDave Kleikamp transaction can be removed from any checkpoint list it was on 810470decc6SDave Kleikamp before. */ 811470decc6SDave Kleikamp 81287c89c23SJan Kara jbd_debug(3, "JBD: commit phase 6\n"); 813470decc6SDave Kleikamp 814c851ed54SJan Kara J_ASSERT(list_empty(&commit_transaction->t_inode_list)); 815470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_buffers == NULL); 816470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_checkpoint_list == NULL); 817470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_iobuf_list == NULL); 818470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_shadow_list == NULL); 819470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_log_list == NULL); 820470decc6SDave Kleikamp 821470decc6SDave Kleikamp restart_loop: 822470decc6SDave Kleikamp /* 823470decc6SDave Kleikamp * As there are other places (journal_unmap_buffer()) adding buffers 824470decc6SDave Kleikamp * to this list we have to be careful and hold the j_list_lock. 825470decc6SDave Kleikamp */ 826470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 827470decc6SDave Kleikamp while (commit_transaction->t_forget) { 828470decc6SDave Kleikamp transaction_t *cp_transaction; 829470decc6SDave Kleikamp struct buffer_head *bh; 830470decc6SDave Kleikamp 831470decc6SDave Kleikamp jh = commit_transaction->t_forget; 832470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 833470decc6SDave Kleikamp bh = jh2bh(jh); 834470decc6SDave Kleikamp jbd_lock_bh_state(bh); 835470decc6SDave Kleikamp J_ASSERT_JH(jh, jh->b_transaction == commit_transaction || 836470decc6SDave Kleikamp jh->b_transaction == journal->j_running_transaction); 837470decc6SDave Kleikamp 838470decc6SDave Kleikamp /* 839470decc6SDave Kleikamp * If there is undo-protected committed data against 840470decc6SDave Kleikamp * this buffer, then we can remove it now. If it is a 841470decc6SDave Kleikamp * buffer needing such protection, the old frozen_data 842470decc6SDave Kleikamp * field now points to a committed version of the 843470decc6SDave Kleikamp * buffer, so rotate that field to the new committed 844470decc6SDave Kleikamp * data. 845470decc6SDave Kleikamp * 846470decc6SDave Kleikamp * Otherwise, we can just throw away the frozen data now. 847470decc6SDave Kleikamp */ 848470decc6SDave Kleikamp if (jh->b_committed_data) { 849af1e76d6SMingming Cao jbd2_free(jh->b_committed_data, bh->b_size); 850470decc6SDave Kleikamp jh->b_committed_data = NULL; 851470decc6SDave Kleikamp if (jh->b_frozen_data) { 852470decc6SDave Kleikamp jh->b_committed_data = jh->b_frozen_data; 853470decc6SDave Kleikamp jh->b_frozen_data = NULL; 854470decc6SDave Kleikamp } 855470decc6SDave Kleikamp } else if (jh->b_frozen_data) { 856af1e76d6SMingming Cao jbd2_free(jh->b_frozen_data, bh->b_size); 857470decc6SDave Kleikamp jh->b_frozen_data = NULL; 858470decc6SDave Kleikamp } 859470decc6SDave Kleikamp 860470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 861470decc6SDave Kleikamp cp_transaction = jh->b_cp_transaction; 862470decc6SDave Kleikamp if (cp_transaction) { 863470decc6SDave Kleikamp JBUFFER_TRACE(jh, "remove from old cp transaction"); 8648e85fb3fSJohann Lombardi cp_transaction->t_chp_stats.cs_dropped++; 865f7f4bccbSMingming Cao __jbd2_journal_remove_checkpoint(jh); 866470decc6SDave Kleikamp } 867470decc6SDave Kleikamp 868470decc6SDave Kleikamp /* Only re-checkpoint the buffer_head if it is marked 869470decc6SDave Kleikamp * dirty. If the buffer was added to the BJ_Forget list 870f7f4bccbSMingming Cao * by jbd2_journal_forget, it may no longer be dirty and 871470decc6SDave Kleikamp * there's no point in keeping a checkpoint record for 872470decc6SDave Kleikamp * it. */ 873470decc6SDave Kleikamp 874470decc6SDave Kleikamp /* A buffer which has been freed while still being 875470decc6SDave Kleikamp * journaled by a previous transaction may end up still 876470decc6SDave Kleikamp * being dirty here, but we want to avoid writing back 877470decc6SDave Kleikamp * that buffer in the future now that the last use has 878470decc6SDave Kleikamp * been committed. That's not only a performance gain, 879470decc6SDave Kleikamp * it also stops aliasing problems if the buffer is left 880470decc6SDave Kleikamp * behind for writeback and gets reallocated for another 881470decc6SDave Kleikamp * use in a different page. */ 882470decc6SDave Kleikamp if (buffer_freed(bh)) { 883470decc6SDave Kleikamp clear_buffer_freed(bh); 884470decc6SDave Kleikamp clear_buffer_jbddirty(bh); 885470decc6SDave Kleikamp } 886470decc6SDave Kleikamp 887470decc6SDave Kleikamp if (buffer_jbddirty(bh)) { 888470decc6SDave Kleikamp JBUFFER_TRACE(jh, "add to new checkpointing trans"); 889f7f4bccbSMingming Cao __jbd2_journal_insert_checkpoint(jh, commit_transaction); 8907ad7445fSHidehiro Kawai if (is_journal_aborted(journal)) 8917ad7445fSHidehiro Kawai clear_buffer_jbddirty(bh); 892470decc6SDave Kleikamp JBUFFER_TRACE(jh, "refile for checkpoint writeback"); 893f7f4bccbSMingming Cao __jbd2_journal_refile_buffer(jh); 894470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 895470decc6SDave Kleikamp } else { 896470decc6SDave Kleikamp J_ASSERT_BH(bh, !buffer_dirty(bh)); 897470decc6SDave Kleikamp /* The buffer on BJ_Forget list and not jbddirty means 898470decc6SDave Kleikamp * it has been freed by this transaction and hence it 899470decc6SDave Kleikamp * could not have been reallocated until this 900470decc6SDave Kleikamp * transaction has committed. *BUT* it could be 901470decc6SDave Kleikamp * reallocated once we have written all the data to 902470decc6SDave Kleikamp * disk and before we process the buffer on BJ_Forget 903470decc6SDave Kleikamp * list. */ 904470decc6SDave Kleikamp JBUFFER_TRACE(jh, "refile or unfile freed buffer"); 905f7f4bccbSMingming Cao __jbd2_journal_refile_buffer(jh); 906470decc6SDave Kleikamp if (!jh->b_transaction) { 907470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 908470decc6SDave Kleikamp /* needs a brelse */ 909f7f4bccbSMingming Cao jbd2_journal_remove_journal_head(bh); 910470decc6SDave Kleikamp release_buffer_page(bh); 911470decc6SDave Kleikamp } else 912470decc6SDave Kleikamp jbd_unlock_bh_state(bh); 913470decc6SDave Kleikamp } 914470decc6SDave Kleikamp cond_resched_lock(&journal->j_list_lock); 915470decc6SDave Kleikamp } 916470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 917470decc6SDave Kleikamp /* 918f5a7a6b0SJan Kara * This is a bit sleazy. We use j_list_lock to protect transition 919f5a7a6b0SJan Kara * of a transaction into T_FINISHED state and calling 920f5a7a6b0SJan Kara * __jbd2_journal_drop_transaction(). Otherwise we could race with 921f5a7a6b0SJan Kara * other checkpointing code processing the transaction... 922470decc6SDave Kleikamp */ 923470decc6SDave Kleikamp spin_lock(&journal->j_state_lock); 924470decc6SDave Kleikamp spin_lock(&journal->j_list_lock); 925470decc6SDave Kleikamp /* 926470decc6SDave Kleikamp * Now recheck if some buffers did not get attached to the transaction 927470decc6SDave Kleikamp * while the lock was dropped... 928470decc6SDave Kleikamp */ 929470decc6SDave Kleikamp if (commit_transaction->t_forget) { 930470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 931470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 932470decc6SDave Kleikamp goto restart_loop; 933470decc6SDave Kleikamp } 934470decc6SDave Kleikamp 935470decc6SDave Kleikamp /* Done with this transaction! */ 936470decc6SDave Kleikamp 93787c89c23SJan Kara jbd_debug(3, "JBD: commit phase 7\n"); 938470decc6SDave Kleikamp 939470decc6SDave Kleikamp J_ASSERT(commit_transaction->t_state == T_COMMIT); 940470decc6SDave Kleikamp 9418e85fb3fSJohann Lombardi commit_transaction->t_start = jiffies; 9428e85fb3fSJohann Lombardi stats.u.run.rs_logging = jbd2_time_diff(stats.u.run.rs_logging, 9438e85fb3fSJohann Lombardi commit_transaction->t_start); 9448e85fb3fSJohann Lombardi 9458e85fb3fSJohann Lombardi /* 9468e85fb3fSJohann Lombardi * File the transaction for history 9478e85fb3fSJohann Lombardi */ 9488e85fb3fSJohann Lombardi stats.ts_type = JBD2_STATS_RUN; 9498e85fb3fSJohann Lombardi stats.ts_tid = commit_transaction->t_tid; 9508e85fb3fSJohann Lombardi stats.u.run.rs_handle_count = commit_transaction->t_handle_count; 9518e85fb3fSJohann Lombardi spin_lock(&journal->j_history_lock); 9528e85fb3fSJohann Lombardi memcpy(journal->j_history + journal->j_history_cur, &stats, 9538e85fb3fSJohann Lombardi sizeof(stats)); 9548e85fb3fSJohann Lombardi if (++journal->j_history_cur == journal->j_history_max) 9558e85fb3fSJohann Lombardi journal->j_history_cur = 0; 9568e85fb3fSJohann Lombardi 9578e85fb3fSJohann Lombardi /* 9588e85fb3fSJohann Lombardi * Calculate overall stats 9598e85fb3fSJohann Lombardi */ 9608e85fb3fSJohann Lombardi journal->j_stats.ts_tid++; 9618e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait; 9628e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_running += stats.u.run.rs_running; 9638e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked; 9648e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing; 9658e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging; 9668e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count; 9678e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks; 9688e85fb3fSJohann Lombardi journal->j_stats.u.run.rs_blocks_logged += stats.u.run.rs_blocks_logged; 9698e85fb3fSJohann Lombardi spin_unlock(&journal->j_history_lock); 9708e85fb3fSJohann Lombardi 971470decc6SDave Kleikamp commit_transaction->t_state = T_FINISHED; 972470decc6SDave Kleikamp J_ASSERT(commit_transaction == journal->j_committing_transaction); 973470decc6SDave Kleikamp journal->j_commit_sequence = commit_transaction->t_tid; 974470decc6SDave Kleikamp journal->j_committing_transaction = NULL; 975470decc6SDave Kleikamp spin_unlock(&journal->j_state_lock); 976470decc6SDave Kleikamp 977f89b7795SJan Kara if (commit_transaction->t_checkpoint_list == NULL && 978f89b7795SJan Kara commit_transaction->t_checkpoint_io_list == NULL) { 979f7f4bccbSMingming Cao __jbd2_journal_drop_transaction(journal, commit_transaction); 980470decc6SDave Kleikamp } else { 981470decc6SDave Kleikamp if (journal->j_checkpoint_transactions == NULL) { 982470decc6SDave Kleikamp journal->j_checkpoint_transactions = commit_transaction; 983470decc6SDave Kleikamp commit_transaction->t_cpnext = commit_transaction; 984470decc6SDave Kleikamp commit_transaction->t_cpprev = commit_transaction; 985470decc6SDave Kleikamp } else { 986470decc6SDave Kleikamp commit_transaction->t_cpnext = 987470decc6SDave Kleikamp journal->j_checkpoint_transactions; 988470decc6SDave Kleikamp commit_transaction->t_cpprev = 989470decc6SDave Kleikamp commit_transaction->t_cpnext->t_cpprev; 990470decc6SDave Kleikamp commit_transaction->t_cpnext->t_cpprev = 991470decc6SDave Kleikamp commit_transaction; 992470decc6SDave Kleikamp commit_transaction->t_cpprev->t_cpnext = 993470decc6SDave Kleikamp commit_transaction; 994470decc6SDave Kleikamp } 995470decc6SDave Kleikamp } 996470decc6SDave Kleikamp spin_unlock(&journal->j_list_lock); 997470decc6SDave Kleikamp 998ede86cc4STheodore Ts'o trace_mark(jbd2_end_commit, "dev %s transaction %d head %d", 999ede86cc4STheodore Ts'o journal->j_devname, commit_transaction->t_tid, 1000ede86cc4STheodore Ts'o journal->j_tail_sequence); 1001470decc6SDave Kleikamp jbd_debug(1, "JBD: commit %d complete, head %d\n", 1002470decc6SDave Kleikamp journal->j_commit_sequence, journal->j_tail_sequence); 1003470decc6SDave Kleikamp 1004470decc6SDave Kleikamp wake_up(&journal->j_wait_done_commit); 1005470decc6SDave Kleikamp } 1006