1 /* 2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. 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. 8 */ 9 10 #include <linux/sched.h> 11 #include <linux/slab.h> 12 #include <linux/spinlock.h> 13 #include <linux/completion.h> 14 #include <linux/buffer_head.h> 15 #include <linux/gfs2_ondisk.h> 16 #include <linux/bio.h> 17 #include <linux/fs.h> 18 19 #include "gfs2.h" 20 #include "incore.h" 21 #include "inode.h" 22 #include "glock.h" 23 #include "log.h" 24 #include "lops.h" 25 #include "meta_io.h" 26 #include "recovery.h" 27 #include "rgrp.h" 28 #include "trans.h" 29 #include "util.h" 30 #include "trace_gfs2.h" 31 32 /** 33 * gfs2_pin - Pin a buffer in memory 34 * @sdp: The superblock 35 * @bh: The buffer to be pinned 36 * 37 * The log lock must be held when calling this function 38 */ 39 static void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head *bh) 40 { 41 struct gfs2_bufdata *bd; 42 43 gfs2_assert_withdraw(sdp, test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)); 44 45 clear_buffer_dirty(bh); 46 if (test_set_buffer_pinned(bh)) 47 gfs2_assert_withdraw(sdp, 0); 48 if (!buffer_uptodate(bh)) 49 gfs2_io_error_bh(sdp, bh); 50 bd = bh->b_private; 51 /* If this buffer is in the AIL and it has already been written 52 * to in-place disk block, remove it from the AIL. 53 */ 54 if (bd->bd_ail) 55 list_move(&bd->bd_ail_st_list, &bd->bd_ail->ai_ail2_list); 56 get_bh(bh); 57 atomic_inc(&sdp->sd_log_pinned); 58 trace_gfs2_pin(bd, 1); 59 } 60 61 /** 62 * gfs2_unpin - Unpin a buffer 63 * @sdp: the filesystem the buffer belongs to 64 * @bh: The buffer to unpin 65 * @ai: 66 * 67 */ 68 69 static void gfs2_unpin(struct gfs2_sbd *sdp, struct buffer_head *bh, 70 struct gfs2_ail *ai) 71 { 72 struct gfs2_bufdata *bd = bh->b_private; 73 74 gfs2_assert_withdraw(sdp, buffer_uptodate(bh)); 75 76 if (!buffer_pinned(bh)) 77 gfs2_assert_withdraw(sdp, 0); 78 79 lock_buffer(bh); 80 mark_buffer_dirty(bh); 81 clear_buffer_pinned(bh); 82 83 gfs2_log_lock(sdp); 84 if (bd->bd_ail) { 85 list_del(&bd->bd_ail_st_list); 86 brelse(bh); 87 } else { 88 struct gfs2_glock *gl = bd->bd_gl; 89 list_add(&bd->bd_ail_gl_list, &gl->gl_ail_list); 90 atomic_inc(&gl->gl_ail_count); 91 } 92 bd->bd_ail = ai; 93 list_add(&bd->bd_ail_st_list, &ai->ai_ail1_list); 94 clear_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags); 95 trace_gfs2_pin(bd, 0); 96 gfs2_log_unlock(sdp); 97 unlock_buffer(bh); 98 atomic_dec(&sdp->sd_log_pinned); 99 } 100 101 102 static inline struct gfs2_log_descriptor *bh_log_desc(struct buffer_head *bh) 103 { 104 return (struct gfs2_log_descriptor *)bh->b_data; 105 } 106 107 static inline __be64 *bh_log_ptr(struct buffer_head *bh) 108 { 109 struct gfs2_log_descriptor *ld = bh_log_desc(bh); 110 return (__force __be64 *)(ld + 1); 111 } 112 113 static inline __be64 *bh_ptr_end(struct buffer_head *bh) 114 { 115 return (__force __be64 *)(bh->b_data + bh->b_size); 116 } 117 118 119 static struct buffer_head *gfs2_get_log_desc(struct gfs2_sbd *sdp, u32 ld_type) 120 { 121 struct buffer_head *bh = gfs2_log_get_buf(sdp); 122 struct gfs2_log_descriptor *ld = bh_log_desc(bh); 123 ld->ld_header.mh_magic = cpu_to_be32(GFS2_MAGIC); 124 ld->ld_header.mh_type = cpu_to_be32(GFS2_METATYPE_LD); 125 ld->ld_header.mh_format = cpu_to_be32(GFS2_FORMAT_LD); 126 ld->ld_type = cpu_to_be32(ld_type); 127 ld->ld_length = 0; 128 ld->ld_data1 = 0; 129 ld->ld_data2 = 0; 130 memset(ld->ld_reserved, 0, sizeof(ld->ld_reserved)); 131 return bh; 132 } 133 134 static void buf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le) 135 { 136 struct gfs2_bufdata *bd = container_of(le, struct gfs2_bufdata, bd_le); 137 struct gfs2_meta_header *mh; 138 struct gfs2_trans *tr; 139 140 lock_buffer(bd->bd_bh); 141 gfs2_log_lock(sdp); 142 if (!list_empty(&bd->bd_list_tr)) 143 goto out; 144 tr = current->journal_info; 145 tr->tr_touched = 1; 146 tr->tr_num_buf++; 147 list_add(&bd->bd_list_tr, &tr->tr_list_buf); 148 if (!list_empty(&le->le_list)) 149 goto out; 150 set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags); 151 set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags); 152 gfs2_meta_check(sdp, bd->bd_bh); 153 gfs2_pin(sdp, bd->bd_bh); 154 mh = (struct gfs2_meta_header *)bd->bd_bh->b_data; 155 mh->__pad0 = cpu_to_be64(0); 156 mh->mh_jid = cpu_to_be32(sdp->sd_jdesc->jd_jid); 157 sdp->sd_log_num_buf++; 158 list_add(&le->le_list, &sdp->sd_log_le_buf); 159 tr->tr_num_buf_new++; 160 out: 161 gfs2_log_unlock(sdp); 162 unlock_buffer(bd->bd_bh); 163 } 164 165 static void buf_lo_before_commit(struct gfs2_sbd *sdp) 166 { 167 struct buffer_head *bh; 168 struct gfs2_log_descriptor *ld; 169 struct gfs2_bufdata *bd1 = NULL, *bd2; 170 unsigned int total; 171 unsigned int limit; 172 unsigned int num; 173 unsigned n; 174 __be64 *ptr; 175 176 limit = buf_limit(sdp); 177 /* for 4k blocks, limit = 503 */ 178 179 gfs2_log_lock(sdp); 180 total = sdp->sd_log_num_buf; 181 bd1 = bd2 = list_prepare_entry(bd1, &sdp->sd_log_le_buf, bd_le.le_list); 182 while(total) { 183 num = total; 184 if (total > limit) 185 num = limit; 186 gfs2_log_unlock(sdp); 187 bh = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_METADATA); 188 gfs2_log_lock(sdp); 189 ld = bh_log_desc(bh); 190 ptr = bh_log_ptr(bh); 191 ld->ld_length = cpu_to_be32(num + 1); 192 ld->ld_data1 = cpu_to_be32(num); 193 194 n = 0; 195 list_for_each_entry_continue(bd1, &sdp->sd_log_le_buf, 196 bd_le.le_list) { 197 *ptr++ = cpu_to_be64(bd1->bd_bh->b_blocknr); 198 if (++n >= num) 199 break; 200 } 201 202 gfs2_log_unlock(sdp); 203 submit_bh(WRITE_SYNC_PLUG, bh); 204 gfs2_log_lock(sdp); 205 206 n = 0; 207 list_for_each_entry_continue(bd2, &sdp->sd_log_le_buf, 208 bd_le.le_list) { 209 get_bh(bd2->bd_bh); 210 gfs2_log_unlock(sdp); 211 lock_buffer(bd2->bd_bh); 212 bh = gfs2_log_fake_buf(sdp, bd2->bd_bh); 213 submit_bh(WRITE_SYNC_PLUG, bh); 214 gfs2_log_lock(sdp); 215 if (++n >= num) 216 break; 217 } 218 219 BUG_ON(total < num); 220 total -= num; 221 } 222 gfs2_log_unlock(sdp); 223 } 224 225 static void buf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai) 226 { 227 struct list_head *head = &sdp->sd_log_le_buf; 228 struct gfs2_bufdata *bd; 229 230 while (!list_empty(head)) { 231 bd = list_entry(head->next, struct gfs2_bufdata, bd_le.le_list); 232 list_del_init(&bd->bd_le.le_list); 233 sdp->sd_log_num_buf--; 234 235 gfs2_unpin(sdp, bd->bd_bh, ai); 236 } 237 gfs2_assert_warn(sdp, !sdp->sd_log_num_buf); 238 } 239 240 static void buf_lo_before_scan(struct gfs2_jdesc *jd, 241 struct gfs2_log_header_host *head, int pass) 242 { 243 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 244 245 if (pass != 0) 246 return; 247 248 sdp->sd_found_blocks = 0; 249 sdp->sd_replayed_blocks = 0; 250 } 251 252 static int buf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start, 253 struct gfs2_log_descriptor *ld, __be64 *ptr, 254 int pass) 255 { 256 struct gfs2_inode *ip = GFS2_I(jd->jd_inode); 257 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 258 struct gfs2_glock *gl = ip->i_gl; 259 unsigned int blks = be32_to_cpu(ld->ld_data1); 260 struct buffer_head *bh_log, *bh_ip; 261 u64 blkno; 262 int error = 0; 263 264 if (pass != 1 || be32_to_cpu(ld->ld_type) != GFS2_LOG_DESC_METADATA) 265 return 0; 266 267 gfs2_replay_incr_blk(sdp, &start); 268 269 for (; blks; gfs2_replay_incr_blk(sdp, &start), blks--) { 270 blkno = be64_to_cpu(*ptr++); 271 272 sdp->sd_found_blocks++; 273 274 if (gfs2_revoke_check(sdp, blkno, start)) 275 continue; 276 277 error = gfs2_replay_read_block(jd, start, &bh_log); 278 if (error) 279 return error; 280 281 bh_ip = gfs2_meta_new(gl, blkno); 282 memcpy(bh_ip->b_data, bh_log->b_data, bh_log->b_size); 283 284 if (gfs2_meta_check(sdp, bh_ip)) 285 error = -EIO; 286 else 287 mark_buffer_dirty(bh_ip); 288 289 brelse(bh_log); 290 brelse(bh_ip); 291 292 if (error) 293 break; 294 295 sdp->sd_replayed_blocks++; 296 } 297 298 return error; 299 } 300 301 static void buf_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass) 302 { 303 struct gfs2_inode *ip = GFS2_I(jd->jd_inode); 304 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 305 306 if (error) { 307 gfs2_meta_sync(ip->i_gl); 308 return; 309 } 310 if (pass != 1) 311 return; 312 313 gfs2_meta_sync(ip->i_gl); 314 315 fs_info(sdp, "jid=%u: Replayed %u of %u blocks\n", 316 jd->jd_jid, sdp->sd_replayed_blocks, sdp->sd_found_blocks); 317 } 318 319 static void revoke_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le) 320 { 321 struct gfs2_trans *tr; 322 323 tr = current->journal_info; 324 tr->tr_touched = 1; 325 tr->tr_num_revoke++; 326 sdp->sd_log_num_revoke++; 327 list_add(&le->le_list, &sdp->sd_log_le_revoke); 328 } 329 330 static void revoke_lo_before_commit(struct gfs2_sbd *sdp) 331 { 332 struct gfs2_log_descriptor *ld; 333 struct gfs2_meta_header *mh; 334 struct buffer_head *bh; 335 unsigned int offset; 336 struct list_head *head = &sdp->sd_log_le_revoke; 337 struct gfs2_bufdata *bd; 338 339 if (!sdp->sd_log_num_revoke) 340 return; 341 342 bh = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_REVOKE); 343 ld = bh_log_desc(bh); 344 ld->ld_length = cpu_to_be32(gfs2_struct2blk(sdp, sdp->sd_log_num_revoke, 345 sizeof(u64))); 346 ld->ld_data1 = cpu_to_be32(sdp->sd_log_num_revoke); 347 offset = sizeof(struct gfs2_log_descriptor); 348 349 while (!list_empty(head)) { 350 bd = list_entry(head->next, struct gfs2_bufdata, bd_le.le_list); 351 list_del_init(&bd->bd_le.le_list); 352 sdp->sd_log_num_revoke--; 353 354 if (offset + sizeof(u64) > sdp->sd_sb.sb_bsize) { 355 submit_bh(WRITE_SYNC_PLUG, bh); 356 357 bh = gfs2_log_get_buf(sdp); 358 mh = (struct gfs2_meta_header *)bh->b_data; 359 mh->mh_magic = cpu_to_be32(GFS2_MAGIC); 360 mh->mh_type = cpu_to_be32(GFS2_METATYPE_LB); 361 mh->mh_format = cpu_to_be32(GFS2_FORMAT_LB); 362 offset = sizeof(struct gfs2_meta_header); 363 } 364 365 *(__be64 *)(bh->b_data + offset) = cpu_to_be64(bd->bd_blkno); 366 kmem_cache_free(gfs2_bufdata_cachep, bd); 367 368 offset += sizeof(u64); 369 } 370 gfs2_assert_withdraw(sdp, !sdp->sd_log_num_revoke); 371 372 submit_bh(WRITE_SYNC_PLUG, bh); 373 } 374 375 static void revoke_lo_before_scan(struct gfs2_jdesc *jd, 376 struct gfs2_log_header_host *head, int pass) 377 { 378 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 379 380 if (pass != 0) 381 return; 382 383 sdp->sd_found_revokes = 0; 384 sdp->sd_replay_tail = head->lh_tail; 385 } 386 387 static int revoke_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start, 388 struct gfs2_log_descriptor *ld, __be64 *ptr, 389 int pass) 390 { 391 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 392 unsigned int blks = be32_to_cpu(ld->ld_length); 393 unsigned int revokes = be32_to_cpu(ld->ld_data1); 394 struct buffer_head *bh; 395 unsigned int offset; 396 u64 blkno; 397 int first = 1; 398 int error; 399 400 if (pass != 0 || be32_to_cpu(ld->ld_type) != GFS2_LOG_DESC_REVOKE) 401 return 0; 402 403 offset = sizeof(struct gfs2_log_descriptor); 404 405 for (; blks; gfs2_replay_incr_blk(sdp, &start), blks--) { 406 error = gfs2_replay_read_block(jd, start, &bh); 407 if (error) 408 return error; 409 410 if (!first) 411 gfs2_metatype_check(sdp, bh, GFS2_METATYPE_LB); 412 413 while (offset + sizeof(u64) <= sdp->sd_sb.sb_bsize) { 414 blkno = be64_to_cpu(*(__be64 *)(bh->b_data + offset)); 415 416 error = gfs2_revoke_add(sdp, blkno, start); 417 if (error < 0) { 418 brelse(bh); 419 return error; 420 } 421 else if (error) 422 sdp->sd_found_revokes++; 423 424 if (!--revokes) 425 break; 426 offset += sizeof(u64); 427 } 428 429 brelse(bh); 430 offset = sizeof(struct gfs2_meta_header); 431 first = 0; 432 } 433 434 return 0; 435 } 436 437 static void revoke_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass) 438 { 439 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 440 441 if (error) { 442 gfs2_revoke_clean(sdp); 443 return; 444 } 445 if (pass != 1) 446 return; 447 448 fs_info(sdp, "jid=%u: Found %u revoke tags\n", 449 jd->jd_jid, sdp->sd_found_revokes); 450 451 gfs2_revoke_clean(sdp); 452 } 453 454 static void rg_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le) 455 { 456 struct gfs2_rgrpd *rgd; 457 struct gfs2_trans *tr = current->journal_info; 458 459 tr->tr_touched = 1; 460 461 rgd = container_of(le, struct gfs2_rgrpd, rd_le); 462 463 gfs2_log_lock(sdp); 464 if (!list_empty(&le->le_list)){ 465 gfs2_log_unlock(sdp); 466 return; 467 } 468 gfs2_rgrp_bh_hold(rgd); 469 sdp->sd_log_num_rg++; 470 list_add(&le->le_list, &sdp->sd_log_le_rg); 471 gfs2_log_unlock(sdp); 472 } 473 474 static void rg_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai) 475 { 476 struct list_head *head = &sdp->sd_log_le_rg; 477 struct gfs2_rgrpd *rgd; 478 479 while (!list_empty(head)) { 480 rgd = list_entry(head->next, struct gfs2_rgrpd, rd_le.le_list); 481 list_del_init(&rgd->rd_le.le_list); 482 sdp->sd_log_num_rg--; 483 484 gfs2_rgrp_repolish_clones(rgd); 485 gfs2_rgrp_bh_put(rgd); 486 } 487 gfs2_assert_warn(sdp, !sdp->sd_log_num_rg); 488 } 489 490 /** 491 * databuf_lo_add - Add a databuf to the transaction. 492 * 493 * This is used in two distinct cases: 494 * i) In ordered write mode 495 * We put the data buffer on a list so that we can ensure that its 496 * synced to disk at the right time 497 * ii) In journaled data mode 498 * We need to journal the data block in the same way as metadata in 499 * the functions above. The difference is that here we have a tag 500 * which is two __be64's being the block number (as per meta data) 501 * and a flag which says whether the data block needs escaping or 502 * not. This means we need a new log entry for each 251 or so data 503 * blocks, which isn't an enormous overhead but twice as much as 504 * for normal metadata blocks. 505 */ 506 static void databuf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le) 507 { 508 struct gfs2_bufdata *bd = container_of(le, struct gfs2_bufdata, bd_le); 509 struct gfs2_trans *tr = current->journal_info; 510 struct address_space *mapping = bd->bd_bh->b_page->mapping; 511 struct gfs2_inode *ip = GFS2_I(mapping->host); 512 513 lock_buffer(bd->bd_bh); 514 gfs2_log_lock(sdp); 515 if (tr) { 516 if (!list_empty(&bd->bd_list_tr)) 517 goto out; 518 tr->tr_touched = 1; 519 if (gfs2_is_jdata(ip)) { 520 tr->tr_num_buf++; 521 list_add(&bd->bd_list_tr, &tr->tr_list_buf); 522 } 523 } 524 if (!list_empty(&le->le_list)) 525 goto out; 526 527 set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags); 528 set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags); 529 if (gfs2_is_jdata(ip)) { 530 gfs2_pin(sdp, bd->bd_bh); 531 tr->tr_num_databuf_new++; 532 sdp->sd_log_num_databuf++; 533 list_add_tail(&le->le_list, &sdp->sd_log_le_databuf); 534 } else { 535 list_add_tail(&le->le_list, &sdp->sd_log_le_ordered); 536 } 537 out: 538 gfs2_log_unlock(sdp); 539 unlock_buffer(bd->bd_bh); 540 } 541 542 static void gfs2_check_magic(struct buffer_head *bh) 543 { 544 void *kaddr; 545 __be32 *ptr; 546 547 clear_buffer_escaped(bh); 548 kaddr = kmap_atomic(bh->b_page, KM_USER0); 549 ptr = kaddr + bh_offset(bh); 550 if (*ptr == cpu_to_be32(GFS2_MAGIC)) 551 set_buffer_escaped(bh); 552 kunmap_atomic(kaddr, KM_USER0); 553 } 554 555 static void gfs2_write_blocks(struct gfs2_sbd *sdp, struct buffer_head *bh, 556 struct list_head *list, struct list_head *done, 557 unsigned int n) 558 { 559 struct buffer_head *bh1; 560 struct gfs2_log_descriptor *ld; 561 struct gfs2_bufdata *bd; 562 __be64 *ptr; 563 564 if (!bh) 565 return; 566 567 ld = bh_log_desc(bh); 568 ld->ld_length = cpu_to_be32(n + 1); 569 ld->ld_data1 = cpu_to_be32(n); 570 571 ptr = bh_log_ptr(bh); 572 573 get_bh(bh); 574 submit_bh(WRITE_SYNC_PLUG, bh); 575 gfs2_log_lock(sdp); 576 while(!list_empty(list)) { 577 bd = list_entry(list->next, struct gfs2_bufdata, bd_le.le_list); 578 list_move_tail(&bd->bd_le.le_list, done); 579 get_bh(bd->bd_bh); 580 while (be64_to_cpu(*ptr) != bd->bd_bh->b_blocknr) { 581 gfs2_log_incr_head(sdp); 582 ptr += 2; 583 } 584 gfs2_log_unlock(sdp); 585 lock_buffer(bd->bd_bh); 586 if (buffer_escaped(bd->bd_bh)) { 587 void *kaddr; 588 bh1 = gfs2_log_get_buf(sdp); 589 kaddr = kmap_atomic(bd->bd_bh->b_page, KM_USER0); 590 memcpy(bh1->b_data, kaddr + bh_offset(bd->bd_bh), 591 bh1->b_size); 592 kunmap_atomic(kaddr, KM_USER0); 593 *(__be32 *)bh1->b_data = 0; 594 clear_buffer_escaped(bd->bd_bh); 595 unlock_buffer(bd->bd_bh); 596 brelse(bd->bd_bh); 597 } else { 598 bh1 = gfs2_log_fake_buf(sdp, bd->bd_bh); 599 } 600 submit_bh(WRITE_SYNC_PLUG, bh1); 601 gfs2_log_lock(sdp); 602 ptr += 2; 603 } 604 gfs2_log_unlock(sdp); 605 brelse(bh); 606 } 607 608 /** 609 * databuf_lo_before_commit - Scan the data buffers, writing as we go 610 * 611 */ 612 613 static void databuf_lo_before_commit(struct gfs2_sbd *sdp) 614 { 615 struct gfs2_bufdata *bd = NULL; 616 struct buffer_head *bh = NULL; 617 unsigned int n = 0; 618 __be64 *ptr = NULL, *end = NULL; 619 LIST_HEAD(processed); 620 LIST_HEAD(in_progress); 621 622 gfs2_log_lock(sdp); 623 while (!list_empty(&sdp->sd_log_le_databuf)) { 624 if (ptr == end) { 625 gfs2_log_unlock(sdp); 626 gfs2_write_blocks(sdp, bh, &in_progress, &processed, n); 627 n = 0; 628 bh = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_JDATA); 629 ptr = bh_log_ptr(bh); 630 end = bh_ptr_end(bh) - 1; 631 gfs2_log_lock(sdp); 632 continue; 633 } 634 bd = list_entry(sdp->sd_log_le_databuf.next, struct gfs2_bufdata, bd_le.le_list); 635 list_move_tail(&bd->bd_le.le_list, &in_progress); 636 gfs2_check_magic(bd->bd_bh); 637 *ptr++ = cpu_to_be64(bd->bd_bh->b_blocknr); 638 *ptr++ = cpu_to_be64(buffer_escaped(bh) ? 1 : 0); 639 n++; 640 } 641 gfs2_log_unlock(sdp); 642 gfs2_write_blocks(sdp, bh, &in_progress, &processed, n); 643 gfs2_log_lock(sdp); 644 list_splice(&processed, &sdp->sd_log_le_databuf); 645 gfs2_log_unlock(sdp); 646 } 647 648 static int databuf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start, 649 struct gfs2_log_descriptor *ld, 650 __be64 *ptr, int pass) 651 { 652 struct gfs2_inode *ip = GFS2_I(jd->jd_inode); 653 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 654 struct gfs2_glock *gl = ip->i_gl; 655 unsigned int blks = be32_to_cpu(ld->ld_data1); 656 struct buffer_head *bh_log, *bh_ip; 657 u64 blkno; 658 u64 esc; 659 int error = 0; 660 661 if (pass != 1 || be32_to_cpu(ld->ld_type) != GFS2_LOG_DESC_JDATA) 662 return 0; 663 664 gfs2_replay_incr_blk(sdp, &start); 665 for (; blks; gfs2_replay_incr_blk(sdp, &start), blks--) { 666 blkno = be64_to_cpu(*ptr++); 667 esc = be64_to_cpu(*ptr++); 668 669 sdp->sd_found_blocks++; 670 671 if (gfs2_revoke_check(sdp, blkno, start)) 672 continue; 673 674 error = gfs2_replay_read_block(jd, start, &bh_log); 675 if (error) 676 return error; 677 678 bh_ip = gfs2_meta_new(gl, blkno); 679 memcpy(bh_ip->b_data, bh_log->b_data, bh_log->b_size); 680 681 /* Unescape */ 682 if (esc) { 683 __be32 *eptr = (__be32 *)bh_ip->b_data; 684 *eptr = cpu_to_be32(GFS2_MAGIC); 685 } 686 mark_buffer_dirty(bh_ip); 687 688 brelse(bh_log); 689 brelse(bh_ip); 690 if (error) 691 break; 692 693 sdp->sd_replayed_blocks++; 694 } 695 696 return error; 697 } 698 699 /* FIXME: sort out accounting for log blocks etc. */ 700 701 static void databuf_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass) 702 { 703 struct gfs2_inode *ip = GFS2_I(jd->jd_inode); 704 struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode); 705 706 if (error) { 707 gfs2_meta_sync(ip->i_gl); 708 return; 709 } 710 if (pass != 1) 711 return; 712 713 /* data sync? */ 714 gfs2_meta_sync(ip->i_gl); 715 716 fs_info(sdp, "jid=%u: Replayed %u of %u data blocks\n", 717 jd->jd_jid, sdp->sd_replayed_blocks, sdp->sd_found_blocks); 718 } 719 720 static void databuf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai) 721 { 722 struct list_head *head = &sdp->sd_log_le_databuf; 723 struct gfs2_bufdata *bd; 724 725 while (!list_empty(head)) { 726 bd = list_entry(head->next, struct gfs2_bufdata, bd_le.le_list); 727 list_del_init(&bd->bd_le.le_list); 728 sdp->sd_log_num_databuf--; 729 gfs2_unpin(sdp, bd->bd_bh, ai); 730 } 731 gfs2_assert_warn(sdp, !sdp->sd_log_num_databuf); 732 } 733 734 735 const struct gfs2_log_operations gfs2_buf_lops = { 736 .lo_add = buf_lo_add, 737 .lo_before_commit = buf_lo_before_commit, 738 .lo_after_commit = buf_lo_after_commit, 739 .lo_before_scan = buf_lo_before_scan, 740 .lo_scan_elements = buf_lo_scan_elements, 741 .lo_after_scan = buf_lo_after_scan, 742 .lo_name = "buf", 743 }; 744 745 const struct gfs2_log_operations gfs2_revoke_lops = { 746 .lo_add = revoke_lo_add, 747 .lo_before_commit = revoke_lo_before_commit, 748 .lo_before_scan = revoke_lo_before_scan, 749 .lo_scan_elements = revoke_lo_scan_elements, 750 .lo_after_scan = revoke_lo_after_scan, 751 .lo_name = "revoke", 752 }; 753 754 const struct gfs2_log_operations gfs2_rg_lops = { 755 .lo_add = rg_lo_add, 756 .lo_after_commit = rg_lo_after_commit, 757 .lo_name = "rg", 758 }; 759 760 const struct gfs2_log_operations gfs2_databuf_lops = { 761 .lo_add = databuf_lo_add, 762 .lo_before_commit = databuf_lo_before_commit, 763 .lo_after_commit = databuf_lo_after_commit, 764 .lo_scan_elements = databuf_lo_scan_elements, 765 .lo_after_scan = databuf_lo_after_scan, 766 .lo_name = "databuf", 767 }; 768 769 const struct gfs2_log_operations *gfs2_log_ops[] = { 770 &gfs2_databuf_lops, 771 &gfs2_buf_lops, 772 &gfs2_rg_lops, 773 &gfs2_revoke_lops, 774 NULL, 775 }; 776 777