1 // SPDX-License-Identifier: GPL-2.0-only << 2 /* 1 /* 3 * Copyright (C) Sistina Software, Inc. 1997- 2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. 4 * Copyright (C) 2004-2006 Red Hat, Inc. All 3 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. >> 4 * >> 5 * This copyrighted material is made available to anyone wishing to use, >> 6 * modify, copy, or redistribute it subject to the terms and conditions >> 7 * of the GNU General Public License version 2. 5 */ 8 */ 6 9 7 #include <linux/sched.h> 10 #include <linux/sched.h> 8 #include <linux/slab.h> 11 #include <linux/slab.h> 9 #include <linux/spinlock.h> 12 #include <linux/spinlock.h> 10 #include <linux/completion.h> 13 #include <linux/completion.h> 11 #include <linux/buffer_head.h> 14 #include <linux/buffer_head.h> 12 #include <linux/mempool.h> << 13 #include <linux/gfs2_ondisk.h> 15 #include <linux/gfs2_ondisk.h> 14 #include <linux/bio.h> 16 #include <linux/bio.h> 15 #include <linux/fs.h> 17 #include <linux/fs.h> 16 #include <linux/list_sort.h> << 17 #include <linux/blkdev.h> << 18 18 19 #include "bmap.h" << 20 #include "dir.h" << 21 #include "gfs2.h" 19 #include "gfs2.h" 22 #include "incore.h" 20 #include "incore.h" 23 #include "inode.h" 21 #include "inode.h" 24 #include "glock.h" 22 #include "glock.h" 25 #include "glops.h" << 26 #include "log.h" 23 #include "log.h" 27 #include "lops.h" 24 #include "lops.h" 28 #include "meta_io.h" 25 #include "meta_io.h" 29 #include "recovery.h" 26 #include "recovery.h" 30 #include "rgrp.h" 27 #include "rgrp.h" 31 #include "trans.h" 28 #include "trans.h" 32 #include "util.h" 29 #include "util.h" 33 #include "trace_gfs2.h" 30 #include "trace_gfs2.h" 34 31 35 /** 32 /** 36 * gfs2_pin - Pin a buffer in memory 33 * gfs2_pin - Pin a buffer in memory 37 * @sdp: The superblock 34 * @sdp: The superblock 38 * @bh: The buffer to be pinned 35 * @bh: The buffer to be pinned 39 * 36 * 40 * The log lock must be held when calling this 37 * The log lock must be held when calling this function 41 */ 38 */ 42 void gfs2_pin(struct gfs2_sbd *sdp, struct buf !! 39 static void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head *bh) 43 { 40 { 44 struct gfs2_bufdata *bd; 41 struct gfs2_bufdata *bd; 45 42 46 BUG_ON(!current->journal_info); !! 43 gfs2_assert_withdraw(sdp, test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)); 47 44 48 clear_buffer_dirty(bh); 45 clear_buffer_dirty(bh); 49 if (test_set_buffer_pinned(bh)) 46 if (test_set_buffer_pinned(bh)) 50 gfs2_assert_withdraw(sdp, 0); 47 gfs2_assert_withdraw(sdp, 0); 51 if (!buffer_uptodate(bh)) 48 if (!buffer_uptodate(bh)) 52 gfs2_io_error_bh_wd(sdp, bh); !! 49 gfs2_io_error_bh(sdp, bh); 53 bd = bh->b_private; 50 bd = bh->b_private; 54 /* If this buffer is in the AIL and it 51 /* If this buffer is in the AIL and it has already been written 55 * to in-place disk block, remove it f 52 * to in-place disk block, remove it from the AIL. 56 */ 53 */ 57 spin_lock(&sdp->sd_ail_lock); !! 54 if (bd->bd_ail) 58 if (bd->bd_tr) !! 55 list_move(&bd->bd_ail_st_list, &bd->bd_ail->ai_ail2_list); 59 list_move(&bd->bd_ail_st_list, << 60 spin_unlock(&sdp->sd_ail_lock); << 61 get_bh(bh); 56 get_bh(bh); 62 atomic_inc(&sdp->sd_log_pinned); << 63 trace_gfs2_pin(bd, 1); 57 trace_gfs2_pin(bd, 1); 64 } 58 } 65 59 66 static bool buffer_is_rgrp(const struct gfs2_b << 67 { << 68 return bd->bd_gl->gl_name.ln_type == L << 69 } << 70 << 71 static void maybe_release_space(struct gfs2_bu << 72 { << 73 struct gfs2_glock *gl = bd->bd_gl; << 74 struct gfs2_sbd *sdp = gl->gl_name.ln_ << 75 struct gfs2_rgrpd *rgd = gfs2_glock2rg << 76 unsigned int index = bd->bd_bh->b_bloc << 77 struct gfs2_bitmap *bi = rgd->rd_bits << 78 << 79 rgrp_lock_local(rgd); << 80 if (bi->bi_clone == NULL) << 81 goto out; << 82 if (sdp->sd_args.ar_discard) << 83 gfs2_rgrp_send_discards(sdp, r << 84 memcpy(bi->bi_clone + bi->bi_offset, << 85 bd->bd_bh->b_data + bi->bi_offs << 86 clear_bit(GBF_FULL, &bi->bi_flags); << 87 rgd->rd_free_clone = rgd->rd_free; << 88 BUG_ON(rgd->rd_free_clone < rgd->rd_re << 89 rgd->rd_extfail_pt = rgd->rd_free; << 90 << 91 out: << 92 rgrp_unlock_local(rgd); << 93 } << 94 << 95 /** 60 /** 96 * gfs2_unpin - Unpin a buffer 61 * gfs2_unpin - Unpin a buffer 97 * @sdp: the filesystem the buffer belongs to 62 * @sdp: the filesystem the buffer belongs to 98 * @bh: The buffer to unpin 63 * @bh: The buffer to unpin 99 * @tr: The system transaction being flushed !! 64 * @ai: >> 65 * 100 */ 66 */ 101 67 102 static void gfs2_unpin(struct gfs2_sbd *sdp, s 68 static void gfs2_unpin(struct gfs2_sbd *sdp, struct buffer_head *bh, 103 struct gfs2_trans *tr) !! 69 struct gfs2_ail *ai) 104 { 70 { 105 struct gfs2_bufdata *bd = bh->b_privat 71 struct gfs2_bufdata *bd = bh->b_private; 106 72 107 BUG_ON(!buffer_uptodate(bh)); !! 73 gfs2_assert_withdraw(sdp, buffer_uptodate(bh)); 108 BUG_ON(!buffer_pinned(bh)); !! 74 >> 75 if (!buffer_pinned(bh)) >> 76 gfs2_assert_withdraw(sdp, 0); 109 77 110 lock_buffer(bh); 78 lock_buffer(bh); 111 mark_buffer_dirty(bh); 79 mark_buffer_dirty(bh); 112 clear_buffer_pinned(bh); 80 clear_buffer_pinned(bh); 113 81 114 if (buffer_is_rgrp(bd)) !! 82 gfs2_log_lock(sdp); 115 maybe_release_space(bd); !! 83 if (bd->bd_ail) { 116 << 117 spin_lock(&sdp->sd_ail_lock); << 118 if (bd->bd_tr) { << 119 list_del(&bd->bd_ail_st_list); 84 list_del(&bd->bd_ail_st_list); 120 brelse(bh); 85 brelse(bh); 121 } else { 86 } else { 122 struct gfs2_glock *gl = bd->bd 87 struct gfs2_glock *gl = bd->bd_gl; 123 list_add(&bd->bd_ail_gl_list, 88 list_add(&bd->bd_ail_gl_list, &gl->gl_ail_list); 124 atomic_inc(&gl->gl_ail_count); 89 atomic_inc(&gl->gl_ail_count); 125 } 90 } 126 bd->bd_tr = tr; !! 91 bd->bd_ail = ai; 127 list_add(&bd->bd_ail_st_list, &tr->tr_ !! 92 list_add(&bd->bd_ail_st_list, &ai->ai_ail1_list); 128 spin_unlock(&sdp->sd_ail_lock); << 129 << 130 clear_bit(GLF_LFLUSH, &bd->bd_gl->gl_f 93 clear_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags); 131 trace_gfs2_pin(bd, 0); 94 trace_gfs2_pin(bd, 0); >> 95 gfs2_log_unlock(sdp); 132 unlock_buffer(bh); 96 unlock_buffer(bh); 133 atomic_dec(&sdp->sd_log_pinned); << 134 } 97 } 135 98 136 void gfs2_log_incr_head(struct gfs2_sbd *sdp) << 137 { << 138 BUG_ON((sdp->sd_log_flush_head == sdp- << 139 (sdp->sd_log_flush_head != sdp- << 140 99 141 if (++sdp->sd_log_flush_head == sdp->s !! 100 static inline struct gfs2_log_descriptor *bh_log_desc(struct buffer_head *bh) 142 sdp->sd_log_flush_head = 0; << 143 } << 144 << 145 u64 gfs2_log_bmap(struct gfs2_jdesc *jd, unsig << 146 { 101 { 147 struct gfs2_journal_extent *je; !! 102 return (struct gfs2_log_descriptor *)bh->b_data; 148 << 149 list_for_each_entry(je, &jd->extent_li << 150 if (lblock >= je->lblock && lb << 151 return je->dblock + lb << 152 } << 153 << 154 return -1; << 155 } 103 } 156 104 157 /** !! 105 static inline __be64 *bh_log_ptr(struct buffer_head *bh) 158 * gfs2_end_log_write_bh - end log write of pa << 159 * @sdp: The superblock << 160 * @bvec: The bio_vec << 161 * @error: The i/o status << 162 * << 163 * This finds the relevant buffers and unlocks << 164 * error flag according to the status of the i << 165 * used when the log is writing data which has << 166 * that is pinned in the pagecache. << 167 */ << 168 << 169 static void gfs2_end_log_write_bh(struct gfs2_ << 170 struct bio_v << 171 blk_status_t << 172 { << 173 struct buffer_head *bh, *next; << 174 struct page *page = bvec->bv_page; << 175 unsigned size; << 176 << 177 bh = page_buffers(page); << 178 size = bvec->bv_len; << 179 while (bh_offset(bh) < bvec->bv_offset << 180 bh = bh->b_this_page; << 181 do { << 182 if (error) << 183 mark_buffer_write_io_e << 184 unlock_buffer(bh); << 185 next = bh->b_this_page; << 186 size -= bh->b_size; << 187 brelse(bh); << 188 bh = next; << 189 } while(bh && size); << 190 } << 191 << 192 /** << 193 * gfs2_end_log_write - end of i/o to the log << 194 * @bio: The bio << 195 * << 196 * Each bio_vec contains either data from the << 197 * relating to the log itself. Here we iterate << 198 * array, processing both kinds of data. << 199 * << 200 */ << 201 << 202 static void gfs2_end_log_write(struct bio *bio << 203 { 106 { 204 struct gfs2_sbd *sdp = bio->bi_private !! 107 struct gfs2_log_descriptor *ld = bh_log_desc(bh); 205 struct bio_vec *bvec; !! 108 return (__force __be64 *)(ld + 1); 206 struct page *page; << 207 struct bvec_iter_all iter_all; << 208 << 209 if (bio->bi_status) { << 210 if (!cmpxchg(&sdp->sd_log_erro << 211 fs_err(sdp, "Error %d << 212 bio->bi_status, << 213 gfs2_withdraw_delayed(sdp); << 214 /* prevent more writes to the << 215 clear_bit(SDF_JOURNAL_LIVE, &s << 216 wake_up(&sdp->sd_logd_waitq); << 217 } << 218 << 219 bio_for_each_segment_all(bvec, bio, it << 220 page = bvec->bv_page; << 221 if (page_has_buffers(page)) << 222 gfs2_end_log_write_bh( << 223 else << 224 mempool_free(page, gfs << 225 } << 226 << 227 bio_put(bio); << 228 if (atomic_dec_and_test(&sdp->sd_log_i << 229 wake_up(&sdp->sd_log_flush_wai << 230 } 109 } 231 110 232 /** !! 111 static inline __be64 *bh_ptr_end(struct buffer_head *bh) 233 * gfs2_log_submit_bio - Submit any pending lo << 234 * @biop: Address of the bio pointer << 235 * @opf: REQ_OP | op_flags << 236 * << 237 * Submit any pending part-built or full bio t << 238 * there is no pending bio, then this is a no- << 239 */ << 240 << 241 void gfs2_log_submit_bio(struct bio **biop, bl << 242 { 112 { 243 struct bio *bio = *biop; !! 113 return (__force __be64 *)(bh->b_data + bh->b_size); 244 if (bio) { << 245 struct gfs2_sbd *sdp = bio->bi << 246 atomic_inc(&sdp->sd_log_in_fli << 247 bio->bi_opf = opf; << 248 submit_bio(bio); << 249 *biop = NULL; << 250 } << 251 } << 252 << 253 /** << 254 * gfs2_log_alloc_bio - Allocate a bio << 255 * @sdp: The super block << 256 * @blkno: The device block number we want to << 257 * @end_io: The bi_end_io callback << 258 * << 259 * Allocate a new bio, initialize it with the << 260 * << 261 * Returns: The newly allocated bio << 262 */ << 263 << 264 static struct bio *gfs2_log_alloc_bio(struct g << 265 bio_end_ << 266 { << 267 struct super_block *sb = sdp->sd_vfs; << 268 struct bio *bio = bio_alloc(sb->s_bdev << 269 << 270 bio->bi_iter.bi_sector = blkno << sdp- << 271 bio->bi_end_io = end_io; << 272 bio->bi_private = sdp; << 273 << 274 return bio; << 275 } 114 } 276 115 277 /** << 278 * gfs2_log_get_bio - Get cached log bio, or a << 279 * @sdp: The super block << 280 * @blkno: The device block number we want to << 281 * @biop: The bio to get or allocate << 282 * @op: REQ_OP << 283 * @end_io: The bi_end_io callback << 284 * @flush: Always flush the current bio and al << 285 * << 286 * If there is a cached bio, then if the next << 287 * with the previous one, return it, otherwise << 288 * device. If there is no cached bio, or we ju << 289 * allocate a new one. << 290 * << 291 * Returns: The bio to use for log writes << 292 */ << 293 << 294 static struct bio *gfs2_log_get_bio(struct gfs << 295 struct bio << 296 bio_end_io << 297 { << 298 struct bio *bio = *biop; << 299 << 300 if (bio) { << 301 u64 nblk; << 302 << 303 nblk = bio_end_sector(bio); << 304 nblk >>= sdp->sd_fsb2bb_shift; << 305 if (blkno == nblk && !flush) << 306 return bio; << 307 gfs2_log_submit_bio(biop, op); << 308 } << 309 << 310 *biop = gfs2_log_alloc_bio(sdp, blkno, << 311 return *biop; << 312 } << 313 << 314 /** << 315 * gfs2_log_write - write to log << 316 * @sdp: the filesystem << 317 * @jd: The journal descriptor << 318 * @page: the page to write << 319 * @size: the size of the data to write << 320 * @offset: the offset within the page << 321 * @blkno: block number of the log entry << 322 * << 323 * Try and add the page segment to the current << 324 * submit the current bio to the device and cr << 325 * then add the page segment to that. << 326 */ << 327 << 328 void gfs2_log_write(struct gfs2_sbd *sdp, stru << 329 struct page *page, unsigne << 330 u64 blkno) << 331 { << 332 struct bio *bio; << 333 int ret; << 334 << 335 bio = gfs2_log_get_bio(sdp, blkno, &jd << 336 gfs2_end_log_wr << 337 ret = bio_add_page(bio, page, size, of << 338 if (ret == 0) { << 339 bio = gfs2_log_get_bio(sdp, bl << 340 REQ_OP_ << 341 ret = bio_add_page(bio, page, << 342 WARN_ON(ret == 0); << 343 } << 344 } << 345 << 346 /** << 347 * gfs2_log_write_bh - write a buffer's conten << 348 * @sdp: The super block << 349 * @bh: The buffer pointing to the in-place lo << 350 * << 351 * This writes the content of the buffer to th << 352 * in the log. The buffer will be unlocked onc << 353 * completed. << 354 */ << 355 << 356 static void gfs2_log_write_bh(struct gfs2_sbd << 357 { << 358 u64 dblock; << 359 << 360 dblock = gfs2_log_bmap(sdp->sd_jdesc, << 361 gfs2_log_incr_head(sdp); << 362 gfs2_log_write(sdp, sdp->sd_jdesc, bh- << 363 bh_offset(bh), dblock); << 364 } << 365 << 366 /** << 367 * gfs2_log_write_page - write one block store << 368 * @sdp: The superblock << 369 * @page: The struct page << 370 * << 371 * This writes the first block-sized part of t << 372 * that the page must have been allocated from << 373 * and that after this has been called, owners << 374 * the page may be freed at any time. << 375 */ << 376 << 377 static void gfs2_log_write_page(struct gfs2_sb << 378 { << 379 struct super_block *sb = sdp->sd_vfs; << 380 u64 dblock; << 381 << 382 dblock = gfs2_log_bmap(sdp->sd_jdesc, << 383 gfs2_log_incr_head(sdp); << 384 gfs2_log_write(sdp, sdp->sd_jdesc, pag << 385 } << 386 << 387 /** << 388 * gfs2_end_log_read - end I/O callback for re << 389 * @bio: The bio << 390 * << 391 * Simply unlock the pages in the bio. The mai << 392 * process them in order as necessary. << 393 */ << 394 static void gfs2_end_log_read(struct bio *bio) << 395 { << 396 int error = blk_status_to_errno(bio->b << 397 struct folio_iter fi; << 398 << 399 bio_for_each_folio_all(fi, bio) { << 400 /* We're abusing wb_err to get << 401 filemap_set_wb_err(fi.folio->m << 402 folio_end_read(fi.folio, !erro << 403 } << 404 << 405 bio_put(bio); << 406 } << 407 << 408 /** << 409 * gfs2_jhead_pg_srch - Look for the journal h << 410 * @jd: The journal descriptor << 411 * @head: The journal head to start from << 412 * @page: The page to look in << 413 * << 414 * Returns: 1 if found, 0 otherwise. << 415 */ << 416 << 417 static bool gfs2_jhead_pg_srch(struct gfs2_jde << 418 struct gfs2_log_ << 419 struct page *pag << 420 { << 421 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_ << 422 struct gfs2_log_header_host lh; << 423 void *kaddr; << 424 unsigned int offset; << 425 bool ret = false; << 426 << 427 kaddr = kmap_local_page(page); << 428 for (offset = 0; offset < PAGE_SIZE; o << 429 if (!__get_log_header(sdp, kad << 430 if (lh.lh_sequence >= << 431 *head = lh; << 432 else { << 433 ret = true; << 434 break; << 435 } << 436 } << 437 } << 438 kunmap_local(kaddr); << 439 return ret; << 440 } << 441 << 442 /** << 443 * gfs2_jhead_process_page - Search/cleanup a << 444 * @jd: The journal descriptor << 445 * @index: Index of the page to look into << 446 * @head: The journal head to start from << 447 * @done: If set, perform only cleanup, else s << 448 * << 449 * Find the folio with 'index' in the journal' << 450 * the journal head if requested (cleanup == f << 451 * folio so the page cache can reclaim it. We << 452 * reference on this folio twice, first when w << 453 * to obtain the folio to add it to the bio an << 454 * filemap_get_folio() here to get the folio t << 455 * completed. << 456 * This function is also used to free up a fol << 457 * used. Maybe we added it to a bio, but not s << 458 * submitted the I/O, but we already found the << 459 * our references to the folio. << 460 */ << 461 << 462 static void gfs2_jhead_process_page(struct gfs << 463 struct gfs << 464 bool *done << 465 { << 466 struct folio *folio; << 467 << 468 folio = filemap_get_folio(jd->jd_inode << 469 << 470 folio_wait_locked(folio); << 471 if (!folio_test_uptodate(folio)) << 472 *done = true; << 473 << 474 if (!*done) << 475 *done = gfs2_jhead_pg_srch(jd, << 476 << 477 /* filemap_get_folio() and the earlier << 478 folio_put_refs(folio, 2); << 479 } << 480 << 481 static struct bio *gfs2_chain_bio(struct bio * << 482 { << 483 struct bio *new; << 484 << 485 new = bio_alloc(prev->bi_bdev, nr_iove << 486 bio_clone_blkg_association(new, prev); << 487 new->bi_iter.bi_sector = bio_end_secto << 488 bio_chain(new, prev); << 489 submit_bio(prev); << 490 return new; << 491 } << 492 << 493 /** << 494 * gfs2_find_jhead - find the head of a log << 495 * @jd: The journal descriptor << 496 * @head: The log descriptor for the head of t << 497 * @keep_cache: If set inode pages will not be << 498 * << 499 * Do a search of a journal by reading it in l << 500 * the valid log entry with the highest sequen << 501 * << 502 * Returns: 0 on success, errno otherwise << 503 */ << 504 int gfs2_find_jhead(struct gfs2_jdesc *jd, str << 505 bool keep_cache) << 506 { << 507 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_ << 508 struct address_space *mapping = jd->jd << 509 unsigned int block = 0, blocks_submitt << 510 unsigned int bsize = sdp->sd_sb.sb_bsi << 511 unsigned int bsize_shift = sdp->sd_sb. << 512 unsigned int shift = PAGE_SHIFT - bsiz << 513 unsigned int max_blocks = 2 * 1024 * 1 << 514 struct gfs2_journal_extent *je; << 515 int sz, ret = 0; << 516 struct bio *bio = NULL; << 517 struct page *page = NULL; << 518 bool done = false; << 519 errseq_t since; << 520 << 521 memset(head, 0, sizeof(*head)); << 522 if (list_empty(&jd->extent_list)) << 523 gfs2_map_journal_extents(sdp, << 524 << 525 since = filemap_sample_wb_err(mapping) << 526 list_for_each_entry(je, &jd->extent_li << 527 u64 dblock = je->dblock; << 528 << 529 for (; block < je->lblock + je << 530 if (!page) { << 531 page = grab_ca << 532 if (!page) { << 533 ret = << 534 done = << 535 goto o << 536 } << 537 off = 0; << 538 } << 539 << 540 if (bio && (off || blo << 541 sector_t secto << 542 << 543 if (bio_end_se << 544 sz = b << 545 if (sz << 546 << 547 } << 548 if (off) { << 549 unsign << 550 << 551 << 552 bio = << 553 goto a << 554 } << 555 } << 556 << 557 if (bio) { << 558 blocks_submitt << 559 submit_bio(bio << 560 } << 561 << 562 bio = gfs2_log_alloc_b << 563 bio->bi_opf = REQ_OP_R << 564 add_block_to_new_bio: << 565 sz = bio_add_page(bio, << 566 BUG_ON(sz != bsize); << 567 block_added: << 568 off += bsize; << 569 if (off == PAGE_SIZE) << 570 page = NULL; << 571 if (blocks_submitted < << 572 /* Keep at lea << 573 continue; << 574 } << 575 << 576 gfs2_jhead_process_pag << 577 blocks_read += PAGE_SI << 578 if (done) << 579 goto out; /* << 580 } << 581 } << 582 << 583 out: << 584 if (bio) << 585 submit_bio(bio); << 586 while (blocks_read < block) { << 587 gfs2_jhead_process_page(jd, bl << 588 blocks_read += PAGE_SIZE >> bs << 589 } << 590 << 591 if (!ret) << 592 ret = filemap_check_wb_err(map << 593 << 594 if (!keep_cache) << 595 truncate_inode_pages(mapping, << 596 << 597 return ret; << 598 } << 599 116 600 static struct page *gfs2_get_log_desc(struct g !! 117 static struct buffer_head *gfs2_get_log_desc(struct gfs2_sbd *sdp, u32 ld_type) 601 u32 ld_l << 602 { 118 { 603 struct page *page = mempool_alloc(gfs2 !! 119 struct buffer_head *bh = gfs2_log_get_buf(sdp); 604 struct gfs2_log_descriptor *ld = page_ !! 120 struct gfs2_log_descriptor *ld = bh_log_desc(bh); 605 clear_page(ld); << 606 ld->ld_header.mh_magic = cpu_to_be32(G 121 ld->ld_header.mh_magic = cpu_to_be32(GFS2_MAGIC); 607 ld->ld_header.mh_type = cpu_to_be32(GF 122 ld->ld_header.mh_type = cpu_to_be32(GFS2_METATYPE_LD); 608 ld->ld_header.mh_format = cpu_to_be32( 123 ld->ld_header.mh_format = cpu_to_be32(GFS2_FORMAT_LD); 609 ld->ld_type = cpu_to_be32(ld_type); 124 ld->ld_type = cpu_to_be32(ld_type); 610 ld->ld_length = cpu_to_be32(ld_length) !! 125 ld->ld_length = 0; 611 ld->ld_data1 = cpu_to_be32(ld_data1); !! 126 ld->ld_data1 = 0; 612 ld->ld_data2 = 0; 127 ld->ld_data2 = 0; 613 return page; !! 128 memset(ld->ld_reserved, 0, sizeof(ld->ld_reserved)); >> 129 return bh; 614 } 130 } 615 131 616 static void gfs2_check_magic(struct buffer_hea !! 132 static void buf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le) 617 { << 618 void *kaddr; << 619 __be32 *ptr; << 620 << 621 clear_buffer_escaped(bh); << 622 kaddr = kmap_local_page(bh->b_page); << 623 ptr = kaddr + bh_offset(bh); << 624 if (*ptr == cpu_to_be32(GFS2_MAGIC)) << 625 set_buffer_escaped(bh); << 626 kunmap_local(kaddr); << 627 } << 628 << 629 static int blocknr_cmp(void *priv, const struc << 630 const struct list_head << 631 { 133 { 632 struct gfs2_bufdata *bda, *bdb; !! 134 struct gfs2_bufdata *bd = container_of(le, struct gfs2_bufdata, bd_le); 633 !! 135 struct gfs2_trans *tr; 634 bda = list_entry(a, struct gfs2_bufdat << 635 bdb = list_entry(b, struct gfs2_bufdat << 636 136 637 if (bda->bd_bh->b_blocknr < bdb->bd_bh !! 137 lock_buffer(bd->bd_bh); 638 return -1; !! 138 gfs2_log_lock(sdp); 639 if (bda->bd_bh->b_blocknr > bdb->bd_bh !! 139 if (!list_empty(&bd->bd_list_tr)) 640 return 1; !! 140 goto out; 641 return 0; !! 141 tr = current->journal_info; >> 142 tr->tr_touched = 1; >> 143 tr->tr_num_buf++; >> 144 list_add(&bd->bd_list_tr, &tr->tr_list_buf); >> 145 if (!list_empty(&le->le_list)) >> 146 goto out; >> 147 set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags); >> 148 set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags); >> 149 gfs2_meta_check(sdp, bd->bd_bh); >> 150 gfs2_pin(sdp, bd->bd_bh); >> 151 sdp->sd_log_num_buf++; >> 152 list_add(&le->le_list, &sdp->sd_log_le_buf); >> 153 tr->tr_num_buf_new++; >> 154 out: >> 155 gfs2_log_unlock(sdp); >> 156 unlock_buffer(bd->bd_bh); 642 } 157 } 643 158 644 static void gfs2_before_commit(struct gfs2_sbd !! 159 static void buf_lo_before_commit(struct gfs2_sbd *sdp) 645 unsigned int t << 646 bool is_databu << 647 { 160 { >> 161 struct buffer_head *bh; 648 struct gfs2_log_descriptor *ld; 162 struct gfs2_log_descriptor *ld; 649 struct gfs2_bufdata *bd1 = NULL, *bd2; 163 struct gfs2_bufdata *bd1 = NULL, *bd2; 650 struct page *page; !! 164 unsigned int total; >> 165 unsigned int limit; 651 unsigned int num; 166 unsigned int num; 652 unsigned n; 167 unsigned n; 653 __be64 *ptr; 168 __be64 *ptr; 654 169 >> 170 limit = buf_limit(sdp); >> 171 /* for 4k blocks, limit = 503 */ >> 172 655 gfs2_log_lock(sdp); 173 gfs2_log_lock(sdp); 656 list_sort(NULL, blist, blocknr_cmp); !! 174 total = sdp->sd_log_num_buf; 657 bd1 = bd2 = list_prepare_entry(bd1, bl !! 175 bd1 = bd2 = list_prepare_entry(bd1, &sdp->sd_log_le_buf, bd_le.le_list); 658 while(total) { 176 while(total) { 659 num = total; 177 num = total; 660 if (total > limit) 178 if (total > limit) 661 num = limit; 179 num = limit; 662 gfs2_log_unlock(sdp); 180 gfs2_log_unlock(sdp); 663 page = gfs2_get_log_desc(sdp, !! 181 bh = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_METADATA); 664 is_da << 665 GFS2_ << 666 ld = page_address(page); << 667 gfs2_log_lock(sdp); 182 gfs2_log_lock(sdp); 668 ptr = (__be64 *)(ld + 1); !! 183 ld = bh_log_desc(bh); >> 184 ptr = bh_log_ptr(bh); >> 185 ld->ld_length = cpu_to_be32(num + 1); >> 186 ld->ld_data1 = cpu_to_be32(num); 669 187 670 n = 0; 188 n = 0; 671 list_for_each_entry_continue(b !! 189 list_for_each_entry_continue(bd1, &sdp->sd_log_le_buf, >> 190 bd_le.le_list) { 672 *ptr++ = cpu_to_be64(b 191 *ptr++ = cpu_to_be64(bd1->bd_bh->b_blocknr); 673 if (is_databuf) { << 674 gfs2_check_mag << 675 *ptr++ = cpu_t << 676 } << 677 if (++n >= num) 192 if (++n >= num) 678 break; 193 break; 679 } 194 } 680 195 681 gfs2_log_unlock(sdp); 196 gfs2_log_unlock(sdp); 682 gfs2_log_write_page(sdp, page) !! 197 submit_bh(WRITE_SYNC_PLUG, bh); 683 gfs2_log_lock(sdp); 198 gfs2_log_lock(sdp); 684 199 685 n = 0; 200 n = 0; 686 list_for_each_entry_continue(b !! 201 list_for_each_entry_continue(bd2, &sdp->sd_log_le_buf, >> 202 bd_le.le_list) { 687 get_bh(bd2->bd_bh); 203 get_bh(bd2->bd_bh); 688 gfs2_log_unlock(sdp); 204 gfs2_log_unlock(sdp); 689 lock_buffer(bd2->bd_bh 205 lock_buffer(bd2->bd_bh); 690 !! 206 bh = gfs2_log_fake_buf(sdp, bd2->bd_bh); 691 if (buffer_escaped(bd2 !! 207 submit_bh(WRITE_SYNC_PLUG, bh); 692 void *p; << 693 << 694 page = mempool << 695 p = page_addre << 696 memcpy_from_pa << 697 *(__be32 *)p = << 698 clear_buffer_e << 699 unlock_buffer( << 700 brelse(bd2->bd << 701 gfs2_log_write << 702 } else { << 703 gfs2_log_write << 704 } << 705 gfs2_log_lock(sdp); 208 gfs2_log_lock(sdp); 706 if (++n >= num) 209 if (++n >= num) 707 break; 210 break; 708 } 211 } 709 212 710 BUG_ON(total < num); 213 BUG_ON(total < num); 711 total -= num; 214 total -= num; 712 } 215 } 713 gfs2_log_unlock(sdp); 216 gfs2_log_unlock(sdp); 714 } 217 } 715 218 716 static void buf_lo_before_commit(struct gfs2_s !! 219 static void buf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai) 717 { << 718 unsigned int limit = buf_limit(sdp); / << 719 unsigned int nbuf; << 720 if (tr == NULL) << 721 return; << 722 nbuf = tr->tr_num_buf_new - tr->tr_num << 723 gfs2_before_commit(sdp, limit, nbuf, & << 724 } << 725 << 726 static void buf_lo_after_commit(struct gfs2_sb << 727 { 220 { 728 struct list_head *head; !! 221 struct list_head *head = &sdp->sd_log_le_buf; 729 struct gfs2_bufdata *bd; 222 struct gfs2_bufdata *bd; 730 223 731 if (tr == NULL) << 732 return; << 733 << 734 head = &tr->tr_buf; << 735 while (!list_empty(head)) { 224 while (!list_empty(head)) { 736 bd = list_first_entry(head, st !! 225 bd = list_entry(head->next, struct gfs2_bufdata, bd_le.le_list); 737 list_del_init(&bd->bd_list); !! 226 list_del_init(&bd->bd_le.le_list); 738 gfs2_unpin(sdp, bd->bd_bh, tr) !! 227 sdp->sd_log_num_buf--; >> 228 >> 229 gfs2_unpin(sdp, bd->bd_bh, ai); 739 } 230 } >> 231 gfs2_assert_warn(sdp, !sdp->sd_log_num_buf); 740 } 232 } 741 233 742 static void buf_lo_before_scan(struct gfs2_jde 234 static void buf_lo_before_scan(struct gfs2_jdesc *jd, 743 struct gfs2_log 235 struct gfs2_log_header_host *head, int pass) 744 { 236 { >> 237 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); >> 238 745 if (pass != 0) 239 if (pass != 0) 746 return; 240 return; 747 241 748 jd->jd_found_blocks = 0; !! 242 sdp->sd_found_blocks = 0; 749 jd->jd_replayed_blocks = 0; !! 243 sdp->sd_replayed_blocks = 0; 750 } 244 } 751 245 752 #define obsolete_rgrp_replay \ !! 246 static int buf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start, 753 "Replaying 0x%llx from jid=%d/0x%llx but we al << 754 #define obsolete_rgrp_replay2 \ << 755 "busy:%d, pinned:%d rg_gen:0x%llx, j_gen:0x%ll << 756 << 757 static void obsolete_rgrp(struct gfs2_jdesc *j << 758 u64 blkno) << 759 { << 760 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_ << 761 struct gfs2_rgrpd *rgd; << 762 struct gfs2_rgrp *jrgd = (struct gfs2_ << 763 << 764 rgd = gfs2_blk2rgrpd(sdp, blkno, false << 765 if (rgd && rgd->rd_addr == blkno && << 766 rgd->rd_bits && rgd->rd_bits->bi_b << 767 fs_info(sdp, obsolete_rgrp_rep << 768 jd->jd_jid, bh_log->b_ << 769 fs_info(sdp, obsolete_rgrp_rep << 770 buffer_busy(rgd->rd_bi << 771 buffer_pinned(rgd->rd_ << 772 rgd->rd_igeneration, << 773 be64_to_cpu(jrgd->rg_i << 774 gfs2_dump_glock(NULL, rgd->rd_ << 775 } << 776 } << 777 << 778 static int buf_lo_scan_elements(struct gfs2_jd << 779 struct gfs2_lo 247 struct gfs2_log_descriptor *ld, __be64 *ptr, 780 int pass) 248 int pass) 781 { 249 { 782 struct gfs2_inode *ip = GFS2_I(jd->jd_ 250 struct gfs2_inode *ip = GFS2_I(jd->jd_inode); 783 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_ 251 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 784 struct gfs2_glock *gl = ip->i_gl; 252 struct gfs2_glock *gl = ip->i_gl; 785 unsigned int blks = be32_to_cpu(ld->ld 253 unsigned int blks = be32_to_cpu(ld->ld_data1); 786 struct buffer_head *bh_log, *bh_ip; 254 struct buffer_head *bh_log, *bh_ip; 787 u64 blkno; 255 u64 blkno; 788 int error = 0; 256 int error = 0; 789 257 790 if (pass != 1 || be32_to_cpu(ld->ld_ty 258 if (pass != 1 || be32_to_cpu(ld->ld_type) != GFS2_LOG_DESC_METADATA) 791 return 0; 259 return 0; 792 260 793 gfs2_replay_incr_blk(jd, &start); !! 261 gfs2_replay_incr_blk(sdp, &start); 794 262 795 for (; blks; gfs2_replay_incr_blk(jd, !! 263 for (; blks; gfs2_replay_incr_blk(sdp, &start), blks--) { 796 blkno = be64_to_cpu(*ptr++); 264 blkno = be64_to_cpu(*ptr++); 797 265 798 jd->jd_found_blocks++; !! 266 sdp->sd_found_blocks++; 799 267 800 if (gfs2_revoke_check(jd, blkn !! 268 if (gfs2_revoke_check(sdp, blkno, start)) 801 continue; 269 continue; 802 270 803 error = gfs2_replay_read_block 271 error = gfs2_replay_read_block(jd, start, &bh_log); 804 if (error) 272 if (error) 805 return error; 273 return error; 806 274 807 bh_ip = gfs2_meta_new(gl, blkn 275 bh_ip = gfs2_meta_new(gl, blkno); 808 memcpy(bh_ip->b_data, bh_log-> 276 memcpy(bh_ip->b_data, bh_log->b_data, bh_log->b_size); 809 277 810 if (gfs2_meta_check(sdp, bh_ip 278 if (gfs2_meta_check(sdp, bh_ip)) 811 error = -EIO; 279 error = -EIO; 812 else { !! 280 else 813 struct gfs2_meta_heade << 814 (struct gfs2_m << 815 << 816 if (mh->mh_type == cpu << 817 obsolete_rgrp( << 818 << 819 mark_buffer_dirty(bh_i 281 mark_buffer_dirty(bh_ip); 820 } !! 282 821 brelse(bh_log); 283 brelse(bh_log); 822 brelse(bh_ip); 284 brelse(bh_ip); 823 285 824 if (error) 286 if (error) 825 break; 287 break; 826 288 827 jd->jd_replayed_blocks++; !! 289 sdp->sd_replayed_blocks++; 828 } 290 } 829 291 830 return error; 292 return error; 831 } 293 } 832 294 833 static void buf_lo_after_scan(struct gfs2_jdes 295 static void buf_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass) 834 { 296 { 835 struct gfs2_inode *ip = GFS2_I(jd->jd_ 297 struct gfs2_inode *ip = GFS2_I(jd->jd_inode); 836 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_ 298 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 837 299 838 if (error) { 300 if (error) { 839 gfs2_inode_metasync(ip->i_gl); !! 301 gfs2_meta_sync(ip->i_gl); 840 return; 302 return; 841 } 303 } 842 if (pass != 1) 304 if (pass != 1) 843 return; 305 return; 844 306 845 gfs2_inode_metasync(ip->i_gl); !! 307 gfs2_meta_sync(ip->i_gl); 846 308 847 fs_info(sdp, "jid=%u: Replayed %u of % 309 fs_info(sdp, "jid=%u: Replayed %u of %u blocks\n", 848 jd->jd_jid, jd->jd_replayed_bl !! 310 jd->jd_jid, sdp->sd_replayed_blocks, sdp->sd_found_blocks); 849 } 311 } 850 312 851 static void revoke_lo_before_commit(struct gfs !! 313 static void revoke_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le) 852 { 314 { >> 315 struct gfs2_trans *tr; >> 316 >> 317 tr = current->journal_info; >> 318 tr->tr_touched = 1; >> 319 tr->tr_num_revoke++; >> 320 sdp->sd_log_num_revoke++; >> 321 list_add(&le->le_list, &sdp->sd_log_le_revoke); >> 322 } >> 323 >> 324 static void revoke_lo_before_commit(struct gfs2_sbd *sdp) >> 325 { >> 326 struct gfs2_log_descriptor *ld; 853 struct gfs2_meta_header *mh; 327 struct gfs2_meta_header *mh; >> 328 struct buffer_head *bh; 854 unsigned int offset; 329 unsigned int offset; 855 struct list_head *head = &sdp->sd_log_ !! 330 struct list_head *head = &sdp->sd_log_le_revoke; 856 struct gfs2_bufdata *bd; 331 struct gfs2_bufdata *bd; 857 struct page *page; << 858 unsigned int length; << 859 332 860 gfs2_flush_revokes(sdp); << 861 if (!sdp->sd_log_num_revoke) 333 if (!sdp->sd_log_num_revoke) 862 return; 334 return; 863 335 864 length = gfs2_struct2blk(sdp, sdp->sd_ !! 336 bh = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_REVOKE); 865 page = gfs2_get_log_desc(sdp, GFS2_LOG !! 337 ld = bh_log_desc(bh); >> 338 ld->ld_length = cpu_to_be32(gfs2_struct2blk(sdp, sdp->sd_log_num_revoke, >> 339 sizeof(u64))); >> 340 ld->ld_data1 = cpu_to_be32(sdp->sd_log_num_revoke); 866 offset = sizeof(struct gfs2_log_descri 341 offset = sizeof(struct gfs2_log_descriptor); 867 342 868 list_for_each_entry(bd, head, bd_list) !! 343 while (!list_empty(head)) { >> 344 bd = list_entry(head->next, struct gfs2_bufdata, bd_le.le_list); >> 345 list_del_init(&bd->bd_le.le_list); 869 sdp->sd_log_num_revoke--; 346 sdp->sd_log_num_revoke--; 870 347 871 if (offset + sizeof(u64) > sdp 348 if (offset + sizeof(u64) > sdp->sd_sb.sb_bsize) { 872 gfs2_log_write_page(sd !! 349 submit_bh(WRITE_SYNC_PLUG, bh); 873 page = mempool_alloc(g !! 350 874 mh = page_address(page !! 351 bh = gfs2_log_get_buf(sdp); 875 clear_page(mh); !! 352 mh = (struct gfs2_meta_header *)bh->b_data; 876 mh->mh_magic = cpu_to_ 353 mh->mh_magic = cpu_to_be32(GFS2_MAGIC); 877 mh->mh_type = cpu_to_b 354 mh->mh_type = cpu_to_be32(GFS2_METATYPE_LB); 878 mh->mh_format = cpu_to 355 mh->mh_format = cpu_to_be32(GFS2_FORMAT_LB); 879 offset = sizeof(struct 356 offset = sizeof(struct gfs2_meta_header); 880 } 357 } 881 358 882 *(__be64 *)(page_address(page) !! 359 *(__be64 *)(bh->b_data + offset) = cpu_to_be64(bd->bd_blkno); >> 360 kmem_cache_free(gfs2_bufdata_cachep, bd); >> 361 883 offset += sizeof(u64); 362 offset += sizeof(u64); 884 } 363 } 885 gfs2_assert_withdraw(sdp, !sdp->sd_log 364 gfs2_assert_withdraw(sdp, !sdp->sd_log_num_revoke); 886 365 887 gfs2_log_write_page(sdp, page); !! 366 submit_bh(WRITE_SYNC_PLUG, bh); 888 } << 889 << 890 void gfs2_drain_revokes(struct gfs2_sbd *sdp) << 891 { << 892 struct list_head *head = &sdp->sd_log_ << 893 struct gfs2_bufdata *bd; << 894 struct gfs2_glock *gl; << 895 << 896 while (!list_empty(head)) { << 897 bd = list_first_entry(head, st << 898 list_del_init(&bd->bd_list); << 899 gl = bd->bd_gl; << 900 gfs2_glock_remove_revoke(gl); << 901 kmem_cache_free(gfs2_bufdata_c << 902 } << 903 } << 904 << 905 static void revoke_lo_after_commit(struct gfs2 << 906 { << 907 gfs2_drain_revokes(sdp); << 908 } 367 } 909 368 910 static void revoke_lo_before_scan(struct gfs2_ 369 static void revoke_lo_before_scan(struct gfs2_jdesc *jd, 911 struct gfs2_ 370 struct gfs2_log_header_host *head, int pass) 912 { 371 { >> 372 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); >> 373 913 if (pass != 0) 374 if (pass != 0) 914 return; 375 return; 915 376 916 jd->jd_found_revokes = 0; !! 377 sdp->sd_found_revokes = 0; 917 jd->jd_replay_tail = head->lh_tail; !! 378 sdp->sd_replay_tail = head->lh_tail; 918 } 379 } 919 380 920 static int revoke_lo_scan_elements(struct gfs2 !! 381 static int revoke_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start, 921 struct gfs2 382 struct gfs2_log_descriptor *ld, __be64 *ptr, 922 int pass) 383 int pass) 923 { 384 { 924 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_ 385 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 925 unsigned int blks = be32_to_cpu(ld->ld 386 unsigned int blks = be32_to_cpu(ld->ld_length); 926 unsigned int revokes = be32_to_cpu(ld- 387 unsigned int revokes = be32_to_cpu(ld->ld_data1); 927 struct buffer_head *bh; 388 struct buffer_head *bh; 928 unsigned int offset; 389 unsigned int offset; 929 u64 blkno; 390 u64 blkno; 930 int first = 1; 391 int first = 1; 931 int error; 392 int error; 932 393 933 if (pass != 0 || be32_to_cpu(ld->ld_ty 394 if (pass != 0 || be32_to_cpu(ld->ld_type) != GFS2_LOG_DESC_REVOKE) 934 return 0; 395 return 0; 935 396 936 offset = sizeof(struct gfs2_log_descri 397 offset = sizeof(struct gfs2_log_descriptor); 937 398 938 for (; blks; gfs2_replay_incr_blk(jd, !! 399 for (; blks; gfs2_replay_incr_blk(sdp, &start), blks--) { 939 error = gfs2_replay_read_block 400 error = gfs2_replay_read_block(jd, start, &bh); 940 if (error) 401 if (error) 941 return error; 402 return error; 942 403 943 if (!first) 404 if (!first) 944 gfs2_metatype_check(sd 405 gfs2_metatype_check(sdp, bh, GFS2_METATYPE_LB); 945 406 946 while (offset + sizeof(u64) <= 407 while (offset + sizeof(u64) <= sdp->sd_sb.sb_bsize) { 947 blkno = be64_to_cpu(*( 408 blkno = be64_to_cpu(*(__be64 *)(bh->b_data + offset)); 948 409 949 error = gfs2_revoke_ad !! 410 error = gfs2_revoke_add(sdp, blkno, start); 950 if (error < 0) { 411 if (error < 0) { 951 brelse(bh); 412 brelse(bh); 952 return error; 413 return error; 953 } 414 } 954 else if (error) 415 else if (error) 955 jd->jd_found_r !! 416 sdp->sd_found_revokes++; 956 417 957 if (!--revokes) 418 if (!--revokes) 958 break; 419 break; 959 offset += sizeof(u64); 420 offset += sizeof(u64); 960 } 421 } 961 422 962 brelse(bh); 423 brelse(bh); 963 offset = sizeof(struct gfs2_me 424 offset = sizeof(struct gfs2_meta_header); 964 first = 0; 425 first = 0; 965 } 426 } 966 427 967 return 0; 428 return 0; 968 } 429 } 969 430 970 static void revoke_lo_after_scan(struct gfs2_j 431 static void revoke_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass) 971 { 432 { 972 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_ 433 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 973 434 974 if (error) { 435 if (error) { 975 gfs2_revoke_clean(jd); !! 436 gfs2_revoke_clean(sdp); 976 return; 437 return; 977 } 438 } 978 if (pass != 1) 439 if (pass != 1) 979 return; 440 return; 980 441 981 fs_info(sdp, "jid=%u: Found %u revoke 442 fs_info(sdp, "jid=%u: Found %u revoke tags\n", 982 jd->jd_jid, jd->jd_found_revok !! 443 jd->jd_jid, sdp->sd_found_revokes); 983 444 984 gfs2_revoke_clean(jd); !! 445 gfs2_revoke_clean(sdp); >> 446 } >> 447 >> 448 static void rg_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le) >> 449 { >> 450 struct gfs2_rgrpd *rgd; >> 451 struct gfs2_trans *tr = current->journal_info; >> 452 >> 453 tr->tr_touched = 1; >> 454 >> 455 rgd = container_of(le, struct gfs2_rgrpd, rd_le); >> 456 >> 457 gfs2_log_lock(sdp); >> 458 if (!list_empty(&le->le_list)){ >> 459 gfs2_log_unlock(sdp); >> 460 return; >> 461 } >> 462 gfs2_rgrp_bh_hold(rgd); >> 463 sdp->sd_log_num_rg++; >> 464 list_add(&le->le_list, &sdp->sd_log_le_rg); >> 465 gfs2_log_unlock(sdp); >> 466 } >> 467 >> 468 static void rg_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai) >> 469 { >> 470 struct list_head *head = &sdp->sd_log_le_rg; >> 471 struct gfs2_rgrpd *rgd; >> 472 >> 473 while (!list_empty(head)) { >> 474 rgd = list_entry(head->next, struct gfs2_rgrpd, rd_le.le_list); >> 475 list_del_init(&rgd->rd_le.le_list); >> 476 sdp->sd_log_num_rg--; >> 477 >> 478 gfs2_rgrp_repolish_clones(rgd); >> 479 gfs2_rgrp_bh_put(rgd); >> 480 } >> 481 gfs2_assert_warn(sdp, !sdp->sd_log_num_rg); 985 } 482 } 986 483 987 /** 484 /** 988 * databuf_lo_before_commit - Scan the data bu !! 485 * databuf_lo_add - Add a databuf to the transaction. 989 * @sdp: The filesystem !! 486 * 990 * @tr: The system transaction being flushed !! 487 * This is used in two distinct cases: >> 488 * i) In ordered write mode >> 489 * We put the data buffer on a list so that we can ensure that its >> 490 * synced to disk at the right time >> 491 * ii) In journaled data mode >> 492 * We need to journal the data block in the same way as metadata in >> 493 * the functions above. The difference is that here we have a tag >> 494 * which is two __be64's being the block number (as per meta data) >> 495 * and a flag which says whether the data block needs escaping or >> 496 * not. This means we need a new log entry for each 251 or so data >> 497 * blocks, which isn't an enormous overhead but twice as much as >> 498 * for normal metadata blocks. 991 */ 499 */ >> 500 static void databuf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le) >> 501 { >> 502 struct gfs2_bufdata *bd = container_of(le, struct gfs2_bufdata, bd_le); >> 503 struct gfs2_trans *tr = current->journal_info; >> 504 struct address_space *mapping = bd->bd_bh->b_page->mapping; >> 505 struct gfs2_inode *ip = GFS2_I(mapping->host); >> 506 >> 507 lock_buffer(bd->bd_bh); >> 508 gfs2_log_lock(sdp); >> 509 if (tr) { >> 510 if (!list_empty(&bd->bd_list_tr)) >> 511 goto out; >> 512 tr->tr_touched = 1; >> 513 if (gfs2_is_jdata(ip)) { >> 514 tr->tr_num_buf++; >> 515 list_add(&bd->bd_list_tr, &tr->tr_list_buf); >> 516 } >> 517 } >> 518 if (!list_empty(&le->le_list)) >> 519 goto out; >> 520 >> 521 set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags); >> 522 set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags); >> 523 if (gfs2_is_jdata(ip)) { >> 524 gfs2_pin(sdp, bd->bd_bh); >> 525 tr->tr_num_databuf_new++; >> 526 sdp->sd_log_num_databuf++; >> 527 list_add(&le->le_list, &sdp->sd_log_le_databuf); >> 528 } else { >> 529 list_add(&le->le_list, &sdp->sd_log_le_ordered); >> 530 } >> 531 out: >> 532 gfs2_log_unlock(sdp); >> 533 unlock_buffer(bd->bd_bh); >> 534 } 992 535 993 static void databuf_lo_before_commit(struct gf !! 536 static void gfs2_check_magic(struct buffer_head *bh) 994 { 537 { 995 unsigned int limit = databuf_limit(sdp !! 538 void *kaddr; 996 unsigned int nbuf; !! 539 __be32 *ptr; 997 if (tr == NULL) !! 540 >> 541 clear_buffer_escaped(bh); >> 542 kaddr = kmap_atomic(bh->b_page, KM_USER0); >> 543 ptr = kaddr + bh_offset(bh); >> 544 if (*ptr == cpu_to_be32(GFS2_MAGIC)) >> 545 set_buffer_escaped(bh); >> 546 kunmap_atomic(kaddr, KM_USER0); >> 547 } >> 548 >> 549 static void gfs2_write_blocks(struct gfs2_sbd *sdp, struct buffer_head *bh, >> 550 struct list_head *list, struct list_head *done, >> 551 unsigned int n) >> 552 { >> 553 struct buffer_head *bh1; >> 554 struct gfs2_log_descriptor *ld; >> 555 struct gfs2_bufdata *bd; >> 556 __be64 *ptr; >> 557 >> 558 if (!bh) 998 return; 559 return; 999 nbuf = tr->tr_num_databuf_new - tr->tr !! 560 1000 gfs2_before_commit(sdp, limit, nbuf, !! 561 ld = bh_log_desc(bh); >> 562 ld->ld_length = cpu_to_be32(n + 1); >> 563 ld->ld_data1 = cpu_to_be32(n); >> 564 >> 565 ptr = bh_log_ptr(bh); >> 566 >> 567 get_bh(bh); >> 568 submit_bh(WRITE_SYNC_PLUG, bh); >> 569 gfs2_log_lock(sdp); >> 570 while(!list_empty(list)) { >> 571 bd = list_entry(list->next, struct gfs2_bufdata, bd_le.le_list); >> 572 list_move_tail(&bd->bd_le.le_list, done); >> 573 get_bh(bd->bd_bh); >> 574 while (be64_to_cpu(*ptr) != bd->bd_bh->b_blocknr) { >> 575 gfs2_log_incr_head(sdp); >> 576 ptr += 2; >> 577 } >> 578 gfs2_log_unlock(sdp); >> 579 lock_buffer(bd->bd_bh); >> 580 if (buffer_escaped(bd->bd_bh)) { >> 581 void *kaddr; >> 582 bh1 = gfs2_log_get_buf(sdp); >> 583 kaddr = kmap_atomic(bd->bd_bh->b_page, KM_USER0); >> 584 memcpy(bh1->b_data, kaddr + bh_offset(bd->bd_bh), >> 585 bh1->b_size); >> 586 kunmap_atomic(kaddr, KM_USER0); >> 587 *(__be32 *)bh1->b_data = 0; >> 588 clear_buffer_escaped(bd->bd_bh); >> 589 unlock_buffer(bd->bd_bh); >> 590 brelse(bd->bd_bh); >> 591 } else { >> 592 bh1 = gfs2_log_fake_buf(sdp, bd->bd_bh); >> 593 } >> 594 submit_bh(WRITE_SYNC_PLUG, bh1); >> 595 gfs2_log_lock(sdp); >> 596 ptr += 2; >> 597 } >> 598 gfs2_log_unlock(sdp); >> 599 brelse(bh); >> 600 } >> 601 >> 602 /** >> 603 * databuf_lo_before_commit - Scan the data buffers, writing as we go >> 604 * >> 605 */ >> 606 >> 607 static void databuf_lo_before_commit(struct gfs2_sbd *sdp) >> 608 { >> 609 struct gfs2_bufdata *bd = NULL; >> 610 struct buffer_head *bh = NULL; >> 611 unsigned int n = 0; >> 612 __be64 *ptr = NULL, *end = NULL; >> 613 LIST_HEAD(processed); >> 614 LIST_HEAD(in_progress); >> 615 >> 616 gfs2_log_lock(sdp); >> 617 while (!list_empty(&sdp->sd_log_le_databuf)) { >> 618 if (ptr == end) { >> 619 gfs2_log_unlock(sdp); >> 620 gfs2_write_blocks(sdp, bh, &in_progress, &processed, n); >> 621 n = 0; >> 622 bh = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_JDATA); >> 623 ptr = bh_log_ptr(bh); >> 624 end = bh_ptr_end(bh) - 1; >> 625 gfs2_log_lock(sdp); >> 626 continue; >> 627 } >> 628 bd = list_entry(sdp->sd_log_le_databuf.next, struct gfs2_bufdata, bd_le.le_list); >> 629 list_move_tail(&bd->bd_le.le_list, &in_progress); >> 630 gfs2_check_magic(bd->bd_bh); >> 631 *ptr++ = cpu_to_be64(bd->bd_bh->b_blocknr); >> 632 *ptr++ = cpu_to_be64(buffer_escaped(bh) ? 1 : 0); >> 633 n++; >> 634 } >> 635 gfs2_log_unlock(sdp); >> 636 gfs2_write_blocks(sdp, bh, &in_progress, &processed, n); >> 637 gfs2_log_lock(sdp); >> 638 list_splice(&processed, &sdp->sd_log_le_databuf); >> 639 gfs2_log_unlock(sdp); 1001 } 640 } 1002 641 1003 static int databuf_lo_scan_elements(struct gf !! 642 static int databuf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start, 1004 struct gf 643 struct gfs2_log_descriptor *ld, 1005 __be64 *p 644 __be64 *ptr, int pass) 1006 { 645 { 1007 struct gfs2_inode *ip = GFS2_I(jd->jd 646 struct gfs2_inode *ip = GFS2_I(jd->jd_inode); >> 647 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 1008 struct gfs2_glock *gl = ip->i_gl; 648 struct gfs2_glock *gl = ip->i_gl; 1009 unsigned int blks = be32_to_cpu(ld->l 649 unsigned int blks = be32_to_cpu(ld->ld_data1); 1010 struct buffer_head *bh_log, *bh_ip; 650 struct buffer_head *bh_log, *bh_ip; 1011 u64 blkno; 651 u64 blkno; 1012 u64 esc; 652 u64 esc; 1013 int error = 0; 653 int error = 0; 1014 654 1015 if (pass != 1 || be32_to_cpu(ld->ld_t 655 if (pass != 1 || be32_to_cpu(ld->ld_type) != GFS2_LOG_DESC_JDATA) 1016 return 0; 656 return 0; 1017 657 1018 gfs2_replay_incr_blk(jd, &start); !! 658 gfs2_replay_incr_blk(sdp, &start); 1019 for (; blks; gfs2_replay_incr_blk(jd, !! 659 for (; blks; gfs2_replay_incr_blk(sdp, &start), blks--) { 1020 blkno = be64_to_cpu(*ptr++); 660 blkno = be64_to_cpu(*ptr++); 1021 esc = be64_to_cpu(*ptr++); 661 esc = be64_to_cpu(*ptr++); 1022 662 1023 jd->jd_found_blocks++; !! 663 sdp->sd_found_blocks++; 1024 664 1025 if (gfs2_revoke_check(jd, blk !! 665 if (gfs2_revoke_check(sdp, blkno, start)) 1026 continue; 666 continue; 1027 667 1028 error = gfs2_replay_read_bloc 668 error = gfs2_replay_read_block(jd, start, &bh_log); 1029 if (error) 669 if (error) 1030 return error; 670 return error; 1031 671 1032 bh_ip = gfs2_meta_new(gl, blk 672 bh_ip = gfs2_meta_new(gl, blkno); 1033 memcpy(bh_ip->b_data, bh_log- 673 memcpy(bh_ip->b_data, bh_log->b_data, bh_log->b_size); 1034 674 1035 /* Unescape */ 675 /* Unescape */ 1036 if (esc) { 676 if (esc) { 1037 __be32 *eptr = (__be3 677 __be32 *eptr = (__be32 *)bh_ip->b_data; 1038 *eptr = cpu_to_be32(G 678 *eptr = cpu_to_be32(GFS2_MAGIC); 1039 } 679 } 1040 mark_buffer_dirty(bh_ip); 680 mark_buffer_dirty(bh_ip); 1041 681 1042 brelse(bh_log); 682 brelse(bh_log); 1043 brelse(bh_ip); 683 brelse(bh_ip); >> 684 if (error) >> 685 break; 1044 686 1045 jd->jd_replayed_blocks++; !! 687 sdp->sd_replayed_blocks++; 1046 } 688 } 1047 689 1048 return error; 690 return error; 1049 } 691 } 1050 692 1051 /* FIXME: sort out accounting for log blocks 693 /* FIXME: sort out accounting for log blocks etc. */ 1052 694 1053 static void databuf_lo_after_scan(struct gfs2 695 static void databuf_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass) 1054 { 696 { 1055 struct gfs2_inode *ip = GFS2_I(jd->jd 697 struct gfs2_inode *ip = GFS2_I(jd->jd_inode); 1056 struct gfs2_sbd *sdp = GFS2_SB(jd->jd 698 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 1057 699 1058 if (error) { 700 if (error) { 1059 gfs2_inode_metasync(ip->i_gl) !! 701 gfs2_meta_sync(ip->i_gl); 1060 return; 702 return; 1061 } 703 } 1062 if (pass != 1) 704 if (pass != 1) 1063 return; 705 return; 1064 706 1065 /* data sync? */ 707 /* data sync? */ 1066 gfs2_inode_metasync(ip->i_gl); !! 708 gfs2_meta_sync(ip->i_gl); 1067 709 1068 fs_info(sdp, "jid=%u: Replayed %u of 710 fs_info(sdp, "jid=%u: Replayed %u of %u data blocks\n", 1069 jd->jd_jid, jd->jd_replayed_b !! 711 jd->jd_jid, sdp->sd_replayed_blocks, sdp->sd_found_blocks); 1070 } 712 } 1071 713 1072 static void databuf_lo_after_commit(struct gf !! 714 static void databuf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai) 1073 { 715 { 1074 struct list_head *head; !! 716 struct list_head *head = &sdp->sd_log_le_databuf; 1075 struct gfs2_bufdata *bd; 717 struct gfs2_bufdata *bd; 1076 718 1077 if (tr == NULL) << 1078 return; << 1079 << 1080 head = &tr->tr_databuf; << 1081 while (!list_empty(head)) { 719 while (!list_empty(head)) { 1082 bd = list_first_entry(head, s !! 720 bd = list_entry(head->next, struct gfs2_bufdata, bd_le.le_list); 1083 list_del_init(&bd->bd_list); !! 721 list_del_init(&bd->bd_le.le_list); 1084 gfs2_unpin(sdp, bd->bd_bh, tr !! 722 sdp->sd_log_num_databuf--; >> 723 gfs2_unpin(sdp, bd->bd_bh, ai); 1085 } 724 } >> 725 gfs2_assert_warn(sdp, !sdp->sd_log_num_databuf); 1086 } 726 } 1087 727 1088 728 1089 static const struct gfs2_log_operations gfs2_ !! 729 const struct gfs2_log_operations gfs2_buf_lops = { >> 730 .lo_add = buf_lo_add, 1090 .lo_before_commit = buf_lo_before_com 731 .lo_before_commit = buf_lo_before_commit, 1091 .lo_after_commit = buf_lo_after_commi 732 .lo_after_commit = buf_lo_after_commit, 1092 .lo_before_scan = buf_lo_before_scan, 733 .lo_before_scan = buf_lo_before_scan, 1093 .lo_scan_elements = buf_lo_scan_eleme 734 .lo_scan_elements = buf_lo_scan_elements, 1094 .lo_after_scan = buf_lo_after_scan, 735 .lo_after_scan = buf_lo_after_scan, 1095 .lo_name = "buf", 736 .lo_name = "buf", 1096 }; 737 }; 1097 738 1098 static const struct gfs2_log_operations gfs2_ !! 739 const struct gfs2_log_operations gfs2_revoke_lops = { >> 740 .lo_add = revoke_lo_add, 1099 .lo_before_commit = revoke_lo_before_ 741 .lo_before_commit = revoke_lo_before_commit, 1100 .lo_after_commit = revoke_lo_after_co << 1101 .lo_before_scan = revoke_lo_before_sc 742 .lo_before_scan = revoke_lo_before_scan, 1102 .lo_scan_elements = revoke_lo_scan_el 743 .lo_scan_elements = revoke_lo_scan_elements, 1103 .lo_after_scan = revoke_lo_after_scan 744 .lo_after_scan = revoke_lo_after_scan, 1104 .lo_name = "revoke", 745 .lo_name = "revoke", 1105 }; 746 }; 1106 747 1107 static const struct gfs2_log_operations gfs2_ !! 748 const struct gfs2_log_operations gfs2_rg_lops = { >> 749 .lo_add = rg_lo_add, >> 750 .lo_after_commit = rg_lo_after_commit, >> 751 .lo_name = "rg", >> 752 }; >> 753 >> 754 const struct gfs2_log_operations gfs2_databuf_lops = { >> 755 .lo_add = databuf_lo_add, 1108 .lo_before_commit = databuf_lo_before 756 .lo_before_commit = databuf_lo_before_commit, 1109 .lo_after_commit = databuf_lo_after_c 757 .lo_after_commit = databuf_lo_after_commit, 1110 .lo_scan_elements = databuf_lo_scan_e 758 .lo_scan_elements = databuf_lo_scan_elements, 1111 .lo_after_scan = databuf_lo_after_sca 759 .lo_after_scan = databuf_lo_after_scan, 1112 .lo_name = "databuf", 760 .lo_name = "databuf", 1113 }; 761 }; 1114 762 1115 const struct gfs2_log_operations *gfs2_log_op 763 const struct gfs2_log_operations *gfs2_log_ops[] = { 1116 &gfs2_databuf_lops, 764 &gfs2_databuf_lops, 1117 &gfs2_buf_lops, 765 &gfs2_buf_lops, >> 766 &gfs2_rg_lops, 1118 &gfs2_revoke_lops, 767 &gfs2_revoke_lops, 1119 NULL, 768 NULL, 1120 }; 769 }; 1121 770 1122 771
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.