17336d0e6SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 2b3b94faaSDavid Teigland /* 3b3b94faaSDavid Teigland * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. 43a8a9a10SSteven Whitehouse * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. 5b3b94faaSDavid Teigland */ 6b3b94faaSDavid Teigland 7d77d1b58SJoe Perches #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 8d77d1b58SJoe Perches 9b3b94faaSDavid Teigland #include <linux/sched.h> 10b3b94faaSDavid Teigland #include <linux/slab.h> 11b3b94faaSDavid Teigland #include <linux/spinlock.h> 12b3b94faaSDavid Teigland #include <linux/completion.h> 13b3b94faaSDavid Teigland #include <linux/buffer_head.h> 14d0dc80dbSSteven Whitehouse #include <linux/kallsyms.h> 15f057f6cdSSteven Whitehouse #include <linux/gfs2_ondisk.h> 16b3b94faaSDavid Teigland 17b3b94faaSDavid Teigland #include "gfs2.h" 185c676f6dSSteven Whitehouse #include "incore.h" 19b3b94faaSDavid Teigland #include "glock.h" 20767f433fSSteven Whitehouse #include "inode.h" 21b3b94faaSDavid Teigland #include "log.h" 22b3b94faaSDavid Teigland #include "lops.h" 23b3b94faaSDavid Teigland #include "meta_io.h" 24b3b94faaSDavid Teigland #include "trans.h" 255c676f6dSSteven Whitehouse #include "util.h" 265e687eacSBenjamin Marzinski #include "trace_gfs2.h" 27b3b94faaSDavid Teigland 28d0dc80dbSSteven Whitehouse int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks, 29d0dc80dbSSteven Whitehouse unsigned int revokes) 30b3b94faaSDavid Teigland { 31b3b94faaSDavid Teigland struct gfs2_trans *tr; 32b3b94faaSDavid Teigland int error; 33b3b94faaSDavid Teigland 34d0dc80dbSSteven Whitehouse BUG_ON(current->journal_info); 35d0dc80dbSSteven Whitehouse BUG_ON(blocks == 0 && revokes == 0); 36b3b94faaSDavid Teigland 37a1c0643fSSteven Whitehouse if (!test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) 38a1c0643fSSteven Whitehouse return -EROFS; 39a1c0643fSSteven Whitehouse 40f55ab26aSSteven Whitehouse tr = kzalloc(sizeof(struct gfs2_trans), GFP_NOFS); 41b3b94faaSDavid Teigland if (!tr) 42b3b94faaSDavid Teigland return -ENOMEM; 43b3b94faaSDavid Teigland 44d29c0afeSFabian Frederick tr->tr_ip = _RET_IP_; 45b3b94faaSDavid Teigland tr->tr_blocks = blocks; 46b3b94faaSDavid Teigland tr->tr_revokes = revokes; 47b3b94faaSDavid Teigland tr->tr_reserved = 1; 489862ca05SBob Peterson set_bit(TR_ALLOCED, &tr->tr_flags); 49b3b94faaSDavid Teigland if (blocks) 50f4154ea0SSteven Whitehouse tr->tr_reserved += 6 + blocks; 51b3b94faaSDavid Teigland if (revokes) 52b3b94faaSDavid Teigland tr->tr_reserved += gfs2_struct2blk(sdp, revokes, 53cd915493SSteven Whitehouse sizeof(u64)); 54d69a3c65SSteven Whitehouse INIT_LIST_HEAD(&tr->tr_databuf); 55d69a3c65SSteven Whitehouse INIT_LIST_HEAD(&tr->tr_buf); 56d69a3c65SSteven Whitehouse 5739263d5eSJan Kara sb_start_intwrite(sdp->sd_vfs); 58b3b94faaSDavid Teigland 59b3b94faaSDavid Teigland error = gfs2_log_reserve(sdp, tr->tr_reserved); 60b3b94faaSDavid Teigland if (error) 6124972557SBenjamin Marzinski goto fail; 62b3b94faaSDavid Teigland 635c676f6dSSteven Whitehouse current->journal_info = tr; 64b3b94faaSDavid Teigland 65b3b94faaSDavid Teigland return 0; 66b3b94faaSDavid Teigland 6724972557SBenjamin Marzinski fail: 6839263d5eSJan Kara sb_end_intwrite(sdp->sd_vfs); 69b3b94faaSDavid Teigland kfree(tr); 70b3b94faaSDavid Teigland 71b3b94faaSDavid Teigland return error; 72b3b94faaSDavid Teigland } 73b3b94faaSDavid Teigland 74e54c78a2SBob Peterson static void gfs2_print_trans(struct gfs2_sbd *sdp, const struct gfs2_trans *tr) 75c50b91c4SSteven Whitehouse { 76e54c78a2SBob Peterson fs_warn(sdp, "Transaction created at: %pSR\n", (void *)tr->tr_ip); 77e54c78a2SBob Peterson fs_warn(sdp, "blocks=%u revokes=%u reserved=%u touched=%u\n", 789862ca05SBob Peterson tr->tr_blocks, tr->tr_revokes, tr->tr_reserved, 799862ca05SBob Peterson test_bit(TR_TOUCHED, &tr->tr_flags)); 80e955537eSBob Peterson fs_warn(sdp, "Buf %u/%u Databuf %u/%u Revoke %u\n", 81c50b91c4SSteven Whitehouse tr->tr_num_buf_new, tr->tr_num_buf_rm, 82c50b91c4SSteven Whitehouse tr->tr_num_databuf_new, tr->tr_num_databuf_rm, 83e955537eSBob Peterson tr->tr_num_revoke); 84c50b91c4SSteven Whitehouse } 85c50b91c4SSteven Whitehouse 86b3b94faaSDavid Teigland void gfs2_trans_end(struct gfs2_sbd *sdp) 87b3b94faaSDavid Teigland { 88f4154ea0SSteven Whitehouse struct gfs2_trans *tr = current->journal_info; 89c50b91c4SSteven Whitehouse s64 nbuf; 909862ca05SBob Peterson int alloced = test_bit(TR_ALLOCED, &tr->tr_flags); 912e60d768SBenjamin Marzinski 925c676f6dSSteven Whitehouse current->journal_info = NULL; 93b3b94faaSDavid Teigland 949862ca05SBob Peterson if (!test_bit(TR_TOUCHED, &tr->tr_flags)) { 95b3b94faaSDavid Teigland gfs2_log_release(sdp, tr->tr_reserved); 962e60d768SBenjamin Marzinski if (alloced) { 97e317ffcbSSteven Whitehouse kfree(tr); 9839263d5eSJan Kara sb_end_intwrite(sdp->sd_vfs); 992e60d768SBenjamin Marzinski } 100b3b94faaSDavid Teigland return; 101b3b94faaSDavid Teigland } 102b3b94faaSDavid Teigland 103c50b91c4SSteven Whitehouse nbuf = tr->tr_num_buf_new + tr->tr_num_databuf_new; 104c50b91c4SSteven Whitehouse nbuf -= tr->tr_num_buf_rm; 105c50b91c4SSteven Whitehouse nbuf -= tr->tr_num_databuf_rm; 106c50b91c4SSteven Whitehouse 107c50b91c4SSteven Whitehouse if (gfs2_assert_withdraw(sdp, (nbuf <= tr->tr_blocks) && 108c50b91c4SSteven Whitehouse (tr->tr_num_revoke <= tr->tr_revokes))) 109e54c78a2SBob Peterson gfs2_print_trans(sdp, tr); 110b3b94faaSDavid Teigland 111b3b94faaSDavid Teigland gfs2_log_commit(sdp, tr); 1129862ca05SBob Peterson if (alloced && !test_bit(TR_ATTACHED, &tr->tr_flags)) 113b4dc7291SSteven Whitehouse kfree(tr); 11416ca9412SBenjamin Marzinski up_read(&sdp->sd_log_flush_lock); 115b3b94faaSDavid Teigland 1161751e8a6SLinus Torvalds if (sdp->sd_vfs->s_flags & SB_SYNCHRONOUS) 117805c0907SBob Peterson gfs2_log_flush(sdp, NULL, GFS2_LOG_HEAD_FLUSH_NORMAL | 118805c0907SBob Peterson GFS2_LFC_TRANS_END); 1192e60d768SBenjamin Marzinski if (alloced) 12039263d5eSJan Kara sb_end_intwrite(sdp->sd_vfs); 121b3b94faaSDavid Teigland } 122b3b94faaSDavid Teigland 123c76c4d96SSteven Whitehouse static struct gfs2_bufdata *gfs2_alloc_bufdata(struct gfs2_glock *gl, 124cbbe76c8SBob Peterson struct buffer_head *bh) 125c76c4d96SSteven Whitehouse { 126c76c4d96SSteven Whitehouse struct gfs2_bufdata *bd; 127c76c4d96SSteven Whitehouse 128c76c4d96SSteven Whitehouse bd = kmem_cache_zalloc(gfs2_bufdata_cachep, GFP_NOFS | __GFP_NOFAIL); 129c76c4d96SSteven Whitehouse bd->bd_bh = bh; 130c76c4d96SSteven Whitehouse bd->bd_gl = gl; 131c76c4d96SSteven Whitehouse INIT_LIST_HEAD(&bd->bd_list); 132c76c4d96SSteven Whitehouse bh->b_private = bd; 133c76c4d96SSteven Whitehouse return bd; 134c76c4d96SSteven Whitehouse } 135c76c4d96SSteven Whitehouse 136b3b94faaSDavid Teigland /** 13745138990SSteven Whitehouse * gfs2_trans_add_data - Add a databuf to the transaction. 13845138990SSteven Whitehouse * @gl: The inode glock associated with the buffer 13945138990SSteven Whitehouse * @bh: The buffer to add 140b3b94faaSDavid Teigland * 141845802b1SAndreas Gruenbacher * This is used in journaled data mode. 142767f433fSSteven Whitehouse * We need to journal the data block in the same way as metadata in 143767f433fSSteven Whitehouse * the functions above. The difference is that here we have a tag 144767f433fSSteven Whitehouse * which is two __be64's being the block number (as per meta data) 145767f433fSSteven Whitehouse * and a flag which says whether the data block needs escaping or 146767f433fSSteven Whitehouse * not. This means we need a new log entry for each 251 or so data 147767f433fSSteven Whitehouse * blocks, which isn't an enormous overhead but twice as much as 148767f433fSSteven Whitehouse * for normal metadata blocks. 149b3b94faaSDavid Teigland */ 150767f433fSSteven Whitehouse void gfs2_trans_add_data(struct gfs2_glock *gl, struct buffer_head *bh) 151767f433fSSteven Whitehouse { 15245138990SSteven Whitehouse struct gfs2_trans *tr = current->journal_info; 15315562c43SBob Peterson struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; 154b3b94faaSDavid Teigland struct gfs2_bufdata *bd; 155b3b94faaSDavid Teigland 15696e5d1d3SBenjamin Marzinski lock_buffer(bh); 157aacee720SBob Peterson if (buffer_pinned(bh)) { 158aacee720SBob Peterson set_bit(TR_TOUCHED, &tr->tr_flags); 159aacee720SBob Peterson goto out; 160aacee720SBob Peterson } 16196e5d1d3SBenjamin Marzinski gfs2_log_lock(sdp); 1625c676f6dSSteven Whitehouse bd = bh->b_private; 163c76c4d96SSteven Whitehouse if (bd == NULL) { 16496e5d1d3SBenjamin Marzinski gfs2_log_unlock(sdp); 16596e5d1d3SBenjamin Marzinski unlock_buffer(bh); 166c76c4d96SSteven Whitehouse if (bh->b_private == NULL) 167cbbe76c8SBob Peterson bd = gfs2_alloc_bufdata(gl, bh); 168491e94f7SBob Peterson else 169491e94f7SBob Peterson bd = bh->b_private; 17096e5d1d3SBenjamin Marzinski lock_buffer(bh); 17196e5d1d3SBenjamin Marzinski gfs2_log_lock(sdp); 172b3b94faaSDavid Teigland } 173c76c4d96SSteven Whitehouse gfs2_assert(sdp, bd->bd_gl == gl); 1749862ca05SBob Peterson set_bit(TR_TOUCHED, &tr->tr_flags); 17545138990SSteven Whitehouse if (list_empty(&bd->bd_list)) { 17645138990SSteven Whitehouse set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags); 17745138990SSteven Whitehouse set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags); 17845138990SSteven Whitehouse gfs2_pin(sdp, bd->bd_bh); 17945138990SSteven Whitehouse tr->tr_num_databuf_new++; 180d69a3c65SSteven Whitehouse list_add_tail(&bd->bd_list, &tr->tr_databuf); 18145138990SSteven Whitehouse } 18296e5d1d3SBenjamin Marzinski gfs2_log_unlock(sdp); 183aacee720SBob Peterson out: 18496e5d1d3SBenjamin Marzinski unlock_buffer(bh); 185b3b94faaSDavid Teigland } 186b3b94faaSDavid Teigland 187350a9b0aSSteven Whitehouse void gfs2_trans_add_meta(struct gfs2_glock *gl, struct buffer_head *bh) 188350a9b0aSSteven Whitehouse { 189767f433fSSteven Whitehouse 19015562c43SBob Peterson struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; 191767f433fSSteven Whitehouse struct gfs2_bufdata *bd; 192192738b7SBob Peterson struct gfs2_meta_header *mh; 193aacee720SBob Peterson struct gfs2_trans *tr = current->journal_info; 194192738b7SBob Peterson enum gfs2_freeze_state state = atomic_read(&sdp->sd_freeze_state); 195767f433fSSteven Whitehouse 196767f433fSSteven Whitehouse lock_buffer(bh); 197aacee720SBob Peterson if (buffer_pinned(bh)) { 198aacee720SBob Peterson set_bit(TR_TOUCHED, &tr->tr_flags); 199aacee720SBob Peterson goto out; 200aacee720SBob Peterson } 201767f433fSSteven Whitehouse gfs2_log_lock(sdp); 202767f433fSSteven Whitehouse bd = bh->b_private; 203c76c4d96SSteven Whitehouse if (bd == NULL) { 204767f433fSSteven Whitehouse gfs2_log_unlock(sdp); 205767f433fSSteven Whitehouse unlock_buffer(bh); 206c76c4d96SSteven Whitehouse lock_page(bh->b_page); 207c76c4d96SSteven Whitehouse if (bh->b_private == NULL) 208cbbe76c8SBob Peterson bd = gfs2_alloc_bufdata(gl, bh); 209491e94f7SBob Peterson else 210491e94f7SBob Peterson bd = bh->b_private; 211c76c4d96SSteven Whitehouse unlock_page(bh->b_page); 212767f433fSSteven Whitehouse lock_buffer(bh); 213767f433fSSteven Whitehouse gfs2_log_lock(sdp); 214767f433fSSteven Whitehouse } 215c76c4d96SSteven Whitehouse gfs2_assert(sdp, bd->bd_gl == gl); 216192738b7SBob Peterson set_bit(TR_TOUCHED, &tr->tr_flags); 217192738b7SBob Peterson if (!list_empty(&bd->bd_list)) 218192738b7SBob Peterson goto out_unlock; 219192738b7SBob Peterson set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags); 220192738b7SBob Peterson set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags); 221192738b7SBob Peterson mh = (struct gfs2_meta_header *)bd->bd_bh->b_data; 222192738b7SBob Peterson if (unlikely(mh->mh_magic != cpu_to_be32(GFS2_MAGIC))) { 223e54c78a2SBob Peterson fs_err(sdp, "Attempting to add uninitialised block to " 224e54c78a2SBob Peterson "journal (inplace block=%lld)\n", 225192738b7SBob Peterson (unsigned long long)bd->bd_bh->b_blocknr); 226192738b7SBob Peterson BUG(); 227192738b7SBob Peterson } 228192738b7SBob Peterson if (unlikely(state == SFS_FROZEN)) { 229e54c78a2SBob Peterson fs_info(sdp, "GFS2:adding buf while frozen\n"); 230192738b7SBob Peterson gfs2_assert_withdraw(sdp, 0); 231192738b7SBob Peterson } 232192738b7SBob Peterson gfs2_pin(sdp, bd->bd_bh); 233192738b7SBob Peterson mh->__pad0 = cpu_to_be64(0); 234192738b7SBob Peterson mh->mh_jid = cpu_to_be32(sdp->sd_jdesc->jd_jid); 235192738b7SBob Peterson list_add(&bd->bd_list, &tr->tr_buf); 236192738b7SBob Peterson tr->tr_num_buf_new++; 237192738b7SBob Peterson out_unlock: 238767f433fSSteven Whitehouse gfs2_log_unlock(sdp); 239aacee720SBob Peterson out: 240767f433fSSteven Whitehouse unlock_buffer(bh); 241350a9b0aSSteven Whitehouse } 242350a9b0aSSteven Whitehouse 2431ad38c43SSteven Whitehouse void gfs2_trans_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd) 244b3b94faaSDavid Teigland { 24575f2b879SSteven Whitehouse struct gfs2_trans *tr = current->journal_info; 24675f2b879SSteven Whitehouse 247c0752aa7SBob Peterson BUG_ON(!list_empty(&bd->bd_list)); 2485d054964SBenjamin Marzinski gfs2_add_revoke(sdp, bd); 2499862ca05SBob Peterson set_bit(TR_TOUCHED, &tr->tr_flags); 25075f2b879SSteven Whitehouse tr->tr_num_revoke++; 251b3b94faaSDavid Teigland } 252b3b94faaSDavid Teigland 253fbb27873SAndreas Gruenbacher void gfs2_trans_remove_revoke(struct gfs2_sbd *sdp, u64 blkno, unsigned int len) 254b3b94faaSDavid Teigland { 2555731be53SSteven Whitehouse struct gfs2_bufdata *bd, *tmp; 2565731be53SSteven Whitehouse struct gfs2_trans *tr = current->journal_info; 2575731be53SSteven Whitehouse unsigned int n = len; 258b3b94faaSDavid Teigland 259b3b94faaSDavid Teigland gfs2_log_lock(sdp); 260a5b1d3fcSAndreas Gruenbacher list_for_each_entry_safe(bd, tmp, &sdp->sd_log_revokes, bd_list) { 2615731be53SSteven Whitehouse if ((bd->bd_blkno >= blkno) && (bd->bd_blkno < (blkno + len))) { 262c0752aa7SBob Peterson list_del_init(&bd->bd_list); 263b3b94faaSDavid Teigland gfs2_assert_withdraw(sdp, sdp->sd_log_num_revoke); 264b3b94faaSDavid Teigland sdp->sd_log_num_revoke--; 265fe5e7ba1SBob Peterson if (bd->bd_gl) 266fe5e7ba1SBob Peterson gfs2_glock_remove_revoke(bd->bd_gl); 2675731be53SSteven Whitehouse kmem_cache_free(gfs2_bufdata_cachep, bd); 268e955537eSBob Peterson tr->tr_num_revoke--; 2695731be53SSteven Whitehouse if (--n == 0) 270b3b94faaSDavid Teigland break; 271b3b94faaSDavid Teigland } 272b3b94faaSDavid Teigland } 273b3b94faaSDavid Teigland gfs2_log_unlock(sdp); 274b3b94faaSDavid Teigland } 275b3b94faaSDavid Teigland 276