| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. |
|---|
| 3 | 4 | * Copyright (C) 2004-2008 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 | 5 | */ |
|---|
| 9 | 6 | |
|---|
| 10 | 7 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
|---|
| .. | .. |
|---|
| 38 | 35 | |
|---|
| 39 | 36 | #define BFITNOENT ((u32)~0) |
|---|
| 40 | 37 | #define NO_BLOCK ((u64)~0) |
|---|
| 41 | | - |
|---|
| 42 | | -#if BITS_PER_LONG == 32 |
|---|
| 43 | | -#define LBITMASK (0x55555555UL) |
|---|
| 44 | | -#define LBITSKIP55 (0x55555555UL) |
|---|
| 45 | | -#define LBITSKIP00 (0x00000000UL) |
|---|
| 46 | | -#else |
|---|
| 47 | | -#define LBITMASK (0x5555555555555555UL) |
|---|
| 48 | | -#define LBITSKIP55 (0x5555555555555555UL) |
|---|
| 49 | | -#define LBITSKIP00 (0x0000000000000000UL) |
|---|
| 50 | | -#endif |
|---|
| 51 | 38 | |
|---|
| 52 | 39 | /* |
|---|
| 53 | 40 | * These routines are used by the resource group routines (rgrp.c) |
|---|
| .. | .. |
|---|
| 90 | 77 | { |
|---|
| 91 | 78 | unsigned char *byte1, *byte2, *end, cur_state; |
|---|
| 92 | 79 | struct gfs2_bitmap *bi = rbm_bi(rbm); |
|---|
| 93 | | - unsigned int buflen = bi->bi_len; |
|---|
| 80 | + unsigned int buflen = bi->bi_bytes; |
|---|
| 94 | 81 | const unsigned int bit = (rbm->offset % GFS2_NBBY) * GFS2_BIT_SIZE; |
|---|
| 95 | 82 | |
|---|
| 96 | 83 | byte1 = bi->bi_bh->b_data + bi->bi_offset + (rbm->offset / GFS2_NBBY); |
|---|
| .. | .. |
|---|
| 101 | 88 | cur_state = (*byte1 >> bit) & GFS2_BIT_MASK; |
|---|
| 102 | 89 | |
|---|
| 103 | 90 | if (unlikely(!valid_change[new_state * 4 + cur_state])) { |
|---|
| 104 | | - pr_warn("buf_blk = 0x%x old_state=%d, new_state=%d\n", |
|---|
| 91 | + struct gfs2_sbd *sdp = rbm->rgd->rd_sbd; |
|---|
| 92 | + |
|---|
| 93 | + fs_warn(sdp, "buf_blk = 0x%x old_state=%d, new_state=%d\n", |
|---|
| 105 | 94 | rbm->offset, cur_state, new_state); |
|---|
| 106 | | - pr_warn("rgrp=0x%llx bi_start=0x%x\n", |
|---|
| 107 | | - (unsigned long long)rbm->rgd->rd_addr, bi->bi_start); |
|---|
| 108 | | - pr_warn("bi_offset=0x%x bi_len=0x%x\n", |
|---|
| 109 | | - bi->bi_offset, bi->bi_len); |
|---|
| 95 | + fs_warn(sdp, "rgrp=0x%llx bi_start=0x%x biblk: 0x%llx\n", |
|---|
| 96 | + (unsigned long long)rbm->rgd->rd_addr, bi->bi_start, |
|---|
| 97 | + (unsigned long long)bi->bi_bh->b_blocknr); |
|---|
| 98 | + fs_warn(sdp, "bi_offset=0x%x bi_bytes=0x%x block=0x%llx\n", |
|---|
| 99 | + bi->bi_offset, bi->bi_bytes, |
|---|
| 100 | + (unsigned long long)gfs2_rbm_to_block(rbm)); |
|---|
| 110 | 101 | dump_stack(); |
|---|
| 111 | 102 | gfs2_consist_rgrpd(rbm->rgd); |
|---|
| 112 | 103 | return; |
|---|
| .. | .. |
|---|
| 269 | 260 | |
|---|
| 270 | 261 | static int gfs2_rbm_from_block(struct gfs2_rbm *rbm, u64 block) |
|---|
| 271 | 262 | { |
|---|
| 272 | | - u64 rblock = block - rbm->rgd->rd_data0; |
|---|
| 273 | | - |
|---|
| 274 | | - if (WARN_ON_ONCE(rblock > UINT_MAX)) |
|---|
| 275 | | - return -EINVAL; |
|---|
| 276 | | - if (block >= rbm->rgd->rd_data0 + rbm->rgd->rd_data) |
|---|
| 263 | + if (!rgrp_contains_block(rbm->rgd, block)) |
|---|
| 277 | 264 | return -E2BIG; |
|---|
| 278 | | - |
|---|
| 279 | 265 | rbm->bii = 0; |
|---|
| 280 | | - rbm->offset = (u32)(rblock); |
|---|
| 266 | + rbm->offset = block - rbm->rgd->rd_data0; |
|---|
| 281 | 267 | /* Check if the block is within the first block */ |
|---|
| 282 | 268 | if (rbm->offset < rbm_bi(rbm)->bi_blocks) |
|---|
| 283 | 269 | return 0; |
|---|
| .. | .. |
|---|
| 382 | 368 | if (bi->bi_clone) |
|---|
| 383 | 369 | start = bi->bi_clone; |
|---|
| 384 | 370 | start += bi->bi_offset; |
|---|
| 385 | | - end = start + bi->bi_len; |
|---|
| 371 | + end = start + bi->bi_bytes; |
|---|
| 386 | 372 | BUG_ON(rbm.offset & 3); |
|---|
| 387 | 373 | start += (rbm.offset / GFS2_NBBY); |
|---|
| 388 | 374 | bytes = min_t(u32, len / GFS2_NBBY, (end - start)); |
|---|
| .. | .. |
|---|
| 467 | 453 | count[x] += gfs2_bitcount(rgd, |
|---|
| 468 | 454 | bi->bi_bh->b_data + |
|---|
| 469 | 455 | bi->bi_offset, |
|---|
| 470 | | - bi->bi_len, x); |
|---|
| 456 | + bi->bi_bytes, x); |
|---|
| 471 | 457 | } |
|---|
| 472 | 458 | |
|---|
| 473 | 459 | if (count[0] != rgd->rd_free) { |
|---|
| 474 | | - if (gfs2_consist_rgrpd(rgd)) |
|---|
| 475 | | - fs_err(sdp, "free data mismatch: %u != %u\n", |
|---|
| 476 | | - count[0], rgd->rd_free); |
|---|
| 460 | + gfs2_lm(sdp, "free data mismatch: %u != %u\n", |
|---|
| 461 | + count[0], rgd->rd_free); |
|---|
| 462 | + gfs2_consist_rgrpd(rgd); |
|---|
| 477 | 463 | return; |
|---|
| 478 | 464 | } |
|---|
| 479 | 465 | |
|---|
| 480 | 466 | tmp = rgd->rd_data - rgd->rd_free - rgd->rd_dinodes; |
|---|
| 481 | 467 | if (count[1] != tmp) { |
|---|
| 482 | | - if (gfs2_consist_rgrpd(rgd)) |
|---|
| 483 | | - fs_err(sdp, "used data mismatch: %u != %u\n", |
|---|
| 484 | | - count[1], tmp); |
|---|
| 468 | + gfs2_lm(sdp, "used data mismatch: %u != %u\n", |
|---|
| 469 | + count[1], tmp); |
|---|
| 470 | + gfs2_consist_rgrpd(rgd); |
|---|
| 485 | 471 | return; |
|---|
| 486 | 472 | } |
|---|
| 487 | 473 | |
|---|
| 488 | 474 | if (count[2] + count[3] != rgd->rd_dinodes) { |
|---|
| 489 | | - if (gfs2_consist_rgrpd(rgd)) |
|---|
| 490 | | - fs_err(sdp, "used metadata mismatch: %u != %u\n", |
|---|
| 491 | | - count[2] + count[3], rgd->rd_dinodes); |
|---|
| 475 | + gfs2_lm(sdp, "used metadata mismatch: %u != %u\n", |
|---|
| 476 | + count[2] + count[3], rgd->rd_dinodes); |
|---|
| 477 | + gfs2_consist_rgrpd(rgd); |
|---|
| 492 | 478 | return; |
|---|
| 493 | 479 | } |
|---|
| 494 | 480 | } |
|---|
| .. | .. |
|---|
| 604 | 590 | } |
|---|
| 605 | 591 | } |
|---|
| 606 | 592 | |
|---|
| 607 | | -/** |
|---|
| 608 | | - * gfs2_rsqa_alloc - make sure we have a reservation assigned to the inode |
|---|
| 609 | | - * plus a quota allocations data structure, if necessary |
|---|
| 610 | | - * @ip: the inode for this reservation |
|---|
| 611 | | - */ |
|---|
| 612 | | -int gfs2_rsqa_alloc(struct gfs2_inode *ip) |
|---|
| 613 | | -{ |
|---|
| 614 | | - return gfs2_qa_alloc(ip); |
|---|
| 615 | | -} |
|---|
| 616 | | - |
|---|
| 617 | | -static void dump_rs(struct seq_file *seq, const struct gfs2_blkreserv *rs) |
|---|
| 593 | +static void dump_rs(struct seq_file *seq, const struct gfs2_blkreserv *rs, |
|---|
| 594 | + const char *fs_id_buf) |
|---|
| 618 | 595 | { |
|---|
| 619 | 596 | struct gfs2_inode *ip = container_of(rs, struct gfs2_inode, i_res); |
|---|
| 620 | 597 | |
|---|
| 621 | | - gfs2_print_dbg(seq, " B: n:%llu s:%llu b:%u f:%u\n", |
|---|
| 598 | + gfs2_print_dbg(seq, "%s B: n:%llu s:%llu b:%u f:%u\n", fs_id_buf, |
|---|
| 622 | 599 | (unsigned long long)ip->i_no_addr, |
|---|
| 623 | 600 | (unsigned long long)gfs2_rbm_to_block(&rs->rs_rbm), |
|---|
| 624 | 601 | rs->rs_rbm.offset, rs->rs_free); |
|---|
| .. | .. |
|---|
| 685 | 662 | } |
|---|
| 686 | 663 | |
|---|
| 687 | 664 | /** |
|---|
| 688 | | - * gfs2_rsqa_delete - delete a multi-block reservation and quota allocation |
|---|
| 665 | + * gfs2_rs_delete - delete a multi-block reservation |
|---|
| 689 | 666 | * @ip: The inode for this reservation |
|---|
| 690 | | - * @wcount: The inode's write count, or NULL |
|---|
| 691 | 667 | * |
|---|
| 692 | 668 | */ |
|---|
| 693 | | -void gfs2_rsqa_delete(struct gfs2_inode *ip, atomic_t *wcount) |
|---|
| 669 | +void gfs2_rs_delete(struct gfs2_inode *ip) |
|---|
| 694 | 670 | { |
|---|
| 671 | + struct inode *inode = &ip->i_inode; |
|---|
| 672 | + |
|---|
| 695 | 673 | down_write(&ip->i_rw_mutex); |
|---|
| 696 | | - if ((wcount == NULL) || (atomic_read(wcount) <= 1)) |
|---|
| 674 | + if (atomic_read(&inode->i_writecount) <= 1) |
|---|
| 697 | 675 | gfs2_rs_deltree(&ip->i_res); |
|---|
| 698 | 676 | up_write(&ip->i_rw_mutex); |
|---|
| 699 | | - gfs2_qa_delete(ip, wcount); |
|---|
| 700 | 677 | } |
|---|
| 701 | 678 | |
|---|
| 702 | 679 | /** |
|---|
| .. | .. |
|---|
| 733 | 710 | rb_erase(n, &sdp->sd_rindex_tree); |
|---|
| 734 | 711 | |
|---|
| 735 | 712 | if (gl) { |
|---|
| 736 | | - glock_clear_object(gl, rgd); |
|---|
| 713 | + if (gl->gl_state != LM_ST_UNLOCKED) { |
|---|
| 714 | + gfs2_glock_cb(gl, LM_ST_UNLOCKED); |
|---|
| 715 | + flush_delayed_work(&gl->gl_work); |
|---|
| 716 | + } |
|---|
| 737 | 717 | gfs2_rgrp_brelse(rgd); |
|---|
| 718 | + glock_clear_object(gl, rgd); |
|---|
| 738 | 719 | gfs2_glock_put(gl); |
|---|
| 739 | 720 | } |
|---|
| 740 | 721 | |
|---|
| .. | .. |
|---|
| 744 | 725 | rgd->rd_bits = NULL; |
|---|
| 745 | 726 | kmem_cache_free(gfs2_rgrpd_cachep, rgd); |
|---|
| 746 | 727 | } |
|---|
| 747 | | -} |
|---|
| 748 | | - |
|---|
| 749 | | -static void gfs2_rindex_print(const struct gfs2_rgrpd *rgd) |
|---|
| 750 | | -{ |
|---|
| 751 | | - pr_info("ri_addr = %llu\n", (unsigned long long)rgd->rd_addr); |
|---|
| 752 | | - pr_info("ri_length = %u\n", rgd->rd_length); |
|---|
| 753 | | - pr_info("ri_data0 = %llu\n", (unsigned long long)rgd->rd_data0); |
|---|
| 754 | | - pr_info("ri_data = %u\n", rgd->rd_data); |
|---|
| 755 | | - pr_info("ri_bitbytes = %u\n", rgd->rd_bitbytes); |
|---|
| 756 | 728 | } |
|---|
| 757 | 729 | |
|---|
| 758 | 730 | /** |
|---|
| .. | .. |
|---|
| 790 | 762 | bytes = bytes_left; |
|---|
| 791 | 763 | bi->bi_offset = sizeof(struct gfs2_rgrp); |
|---|
| 792 | 764 | bi->bi_start = 0; |
|---|
| 793 | | - bi->bi_len = bytes; |
|---|
| 765 | + bi->bi_bytes = bytes; |
|---|
| 794 | 766 | bi->bi_blocks = bytes * GFS2_NBBY; |
|---|
| 795 | 767 | /* header block */ |
|---|
| 796 | 768 | } else if (x == 0) { |
|---|
| 797 | 769 | bytes = sdp->sd_sb.sb_bsize - sizeof(struct gfs2_rgrp); |
|---|
| 798 | 770 | bi->bi_offset = sizeof(struct gfs2_rgrp); |
|---|
| 799 | 771 | bi->bi_start = 0; |
|---|
| 800 | | - bi->bi_len = bytes; |
|---|
| 772 | + bi->bi_bytes = bytes; |
|---|
| 801 | 773 | bi->bi_blocks = bytes * GFS2_NBBY; |
|---|
| 802 | 774 | /* last block */ |
|---|
| 803 | 775 | } else if (x + 1 == length) { |
|---|
| 804 | 776 | bytes = bytes_left; |
|---|
| 805 | 777 | bi->bi_offset = sizeof(struct gfs2_meta_header); |
|---|
| 806 | 778 | bi->bi_start = rgd->rd_bitbytes - bytes_left; |
|---|
| 807 | | - bi->bi_len = bytes; |
|---|
| 779 | + bi->bi_bytes = bytes; |
|---|
| 808 | 780 | bi->bi_blocks = bytes * GFS2_NBBY; |
|---|
| 809 | 781 | /* other blocks */ |
|---|
| 810 | 782 | } else { |
|---|
| .. | .. |
|---|
| 812 | 784 | sizeof(struct gfs2_meta_header); |
|---|
| 813 | 785 | bi->bi_offset = sizeof(struct gfs2_meta_header); |
|---|
| 814 | 786 | bi->bi_start = rgd->rd_bitbytes - bytes_left; |
|---|
| 815 | | - bi->bi_len = bytes; |
|---|
| 787 | + bi->bi_bytes = bytes; |
|---|
| 816 | 788 | bi->bi_blocks = bytes * GFS2_NBBY; |
|---|
| 817 | 789 | } |
|---|
| 818 | 790 | |
|---|
| .. | .. |
|---|
| 824 | 796 | return -EIO; |
|---|
| 825 | 797 | } |
|---|
| 826 | 798 | bi = rgd->rd_bits + (length - 1); |
|---|
| 827 | | - if ((bi->bi_start + bi->bi_len) * GFS2_NBBY != rgd->rd_data) { |
|---|
| 828 | | - if (gfs2_consist_rgrpd(rgd)) { |
|---|
| 829 | | - gfs2_rindex_print(rgd); |
|---|
| 830 | | - fs_err(sdp, "start=%u len=%u offset=%u\n", |
|---|
| 831 | | - bi->bi_start, bi->bi_len, bi->bi_offset); |
|---|
| 832 | | - } |
|---|
| 799 | + if ((bi->bi_start + bi->bi_bytes) * GFS2_NBBY != rgd->rd_data) { |
|---|
| 800 | + gfs2_lm(sdp, |
|---|
| 801 | + "ri_addr = %llu\n" |
|---|
| 802 | + "ri_length = %u\n" |
|---|
| 803 | + "ri_data0 = %llu\n" |
|---|
| 804 | + "ri_data = %u\n" |
|---|
| 805 | + "ri_bitbytes = %u\n" |
|---|
| 806 | + "start=%u len=%u offset=%u\n", |
|---|
| 807 | + (unsigned long long)rgd->rd_addr, |
|---|
| 808 | + rgd->rd_length, |
|---|
| 809 | + (unsigned long long)rgd->rd_data0, |
|---|
| 810 | + rgd->rd_data, |
|---|
| 811 | + rgd->rd_bitbytes, |
|---|
| 812 | + bi->bi_start, bi->bi_bytes, bi->bi_offset); |
|---|
| 813 | + gfs2_consist_rgrpd(rgd); |
|---|
| 833 | 814 | return -EIO; |
|---|
| 834 | 815 | } |
|---|
| 835 | 816 | |
|---|
| .. | .. |
|---|
| 898 | 879 | static int read_rindex_entry(struct gfs2_inode *ip) |
|---|
| 899 | 880 | { |
|---|
| 900 | 881 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); |
|---|
| 901 | | - const unsigned bsize = sdp->sd_sb.sb_bsize; |
|---|
| 902 | 882 | loff_t pos = sdp->sd_rgrps * sizeof(struct gfs2_rindex); |
|---|
| 903 | 883 | struct gfs2_rindex buf; |
|---|
| 904 | 884 | int error; |
|---|
| .. | .. |
|---|
| 926 | 906 | rgd->rd_bitbytes = be32_to_cpu(buf.ri_bitbytes); |
|---|
| 927 | 907 | spin_lock_init(&rgd->rd_rsspin); |
|---|
| 928 | 908 | |
|---|
| 929 | | - error = compute_bitstructs(rgd); |
|---|
| 930 | | - if (error) |
|---|
| 931 | | - goto fail; |
|---|
| 932 | | - |
|---|
| 933 | 909 | error = gfs2_glock_get(sdp, rgd->rd_addr, |
|---|
| 934 | 910 | &gfs2_rgrp_glops, CREATE, &rgd->rd_gl); |
|---|
| 935 | 911 | if (error) |
|---|
| 936 | 912 | goto fail; |
|---|
| 913 | + |
|---|
| 914 | + error = compute_bitstructs(rgd); |
|---|
| 915 | + if (error) |
|---|
| 916 | + goto fail_glock; |
|---|
| 937 | 917 | |
|---|
| 938 | 918 | rgd->rd_rgl = (struct gfs2_rgrp_lvb *)rgd->rd_gl->gl_lksb.sb_lvbptr; |
|---|
| 939 | 919 | rgd->rd_flags &= ~(GFS2_RDF_UPTODATE | GFS2_RDF_PREFERRED); |
|---|
| .. | .. |
|---|
| 944 | 924 | spin_unlock(&sdp->sd_rindex_spin); |
|---|
| 945 | 925 | if (!error) { |
|---|
| 946 | 926 | glock_set_object(rgd->rd_gl, rgd); |
|---|
| 947 | | - rgd->rd_gl->gl_vm.start = (rgd->rd_addr * bsize) & PAGE_MASK; |
|---|
| 948 | | - rgd->rd_gl->gl_vm.end = PAGE_ALIGN((rgd->rd_addr + |
|---|
| 949 | | - rgd->rd_length) * bsize) - 1; |
|---|
| 950 | 927 | return 0; |
|---|
| 951 | 928 | } |
|---|
| 952 | 929 | |
|---|
| 953 | 930 | error = 0; /* someone else read in the rgrp; free it and ignore it */ |
|---|
| 931 | +fail_glock: |
|---|
| 954 | 932 | gfs2_glock_put(rgd->rd_gl); |
|---|
| 955 | 933 | |
|---|
| 956 | 934 | fail: |
|---|
| .. | .. |
|---|
| 1117 | 1095 | { |
|---|
| 1118 | 1096 | struct gfs2_rgrp_lvb *rgl = rgd->rd_rgl; |
|---|
| 1119 | 1097 | struct gfs2_rgrp *str = (struct gfs2_rgrp *)rgd->rd_bits[0].bi_bh->b_data; |
|---|
| 1098 | + struct gfs2_sbd *sdp = rgd->rd_sbd; |
|---|
| 1099 | + int valid = 1; |
|---|
| 1120 | 1100 | |
|---|
| 1121 | | - if (rgl->rl_flags != str->rg_flags || rgl->rl_free != str->rg_free || |
|---|
| 1122 | | - rgl->rl_dinodes != str->rg_dinodes || |
|---|
| 1123 | | - rgl->rl_igeneration != str->rg_igeneration) |
|---|
| 1124 | | - return 0; |
|---|
| 1125 | | - return 1; |
|---|
| 1101 | + if (rgl->rl_flags != str->rg_flags) { |
|---|
| 1102 | + fs_warn(sdp, "GFS2: rgd: %llu lvb flag mismatch %u/%u", |
|---|
| 1103 | + (unsigned long long)rgd->rd_addr, |
|---|
| 1104 | + be32_to_cpu(rgl->rl_flags), be32_to_cpu(str->rg_flags)); |
|---|
| 1105 | + valid = 0; |
|---|
| 1106 | + } |
|---|
| 1107 | + if (rgl->rl_free != str->rg_free) { |
|---|
| 1108 | + fs_warn(sdp, "GFS2: rgd: %llu lvb free mismatch %u/%u", |
|---|
| 1109 | + (unsigned long long)rgd->rd_addr, |
|---|
| 1110 | + be32_to_cpu(rgl->rl_free), be32_to_cpu(str->rg_free)); |
|---|
| 1111 | + valid = 0; |
|---|
| 1112 | + } |
|---|
| 1113 | + if (rgl->rl_dinodes != str->rg_dinodes) { |
|---|
| 1114 | + fs_warn(sdp, "GFS2: rgd: %llu lvb dinode mismatch %u/%u", |
|---|
| 1115 | + (unsigned long long)rgd->rd_addr, |
|---|
| 1116 | + be32_to_cpu(rgl->rl_dinodes), |
|---|
| 1117 | + be32_to_cpu(str->rg_dinodes)); |
|---|
| 1118 | + valid = 0; |
|---|
| 1119 | + } |
|---|
| 1120 | + if (rgl->rl_igeneration != str->rg_igeneration) { |
|---|
| 1121 | + fs_warn(sdp, "GFS2: rgd: %llu lvb igen mismatch %llu/%llu", |
|---|
| 1122 | + (unsigned long long)rgd->rd_addr, |
|---|
| 1123 | + (unsigned long long)be64_to_cpu(rgl->rl_igeneration), |
|---|
| 1124 | + (unsigned long long)be64_to_cpu(str->rg_igeneration)); |
|---|
| 1125 | + valid = 0; |
|---|
| 1126 | + } |
|---|
| 1127 | + return valid; |
|---|
| 1126 | 1128 | } |
|---|
| 1127 | 1129 | |
|---|
| 1128 | 1130 | static u32 count_unlinked(struct gfs2_rgrpd *rgd) |
|---|
| .. | .. |
|---|
| 1136 | 1138 | goal = 0; |
|---|
| 1137 | 1139 | buffer = bi->bi_bh->b_data + bi->bi_offset; |
|---|
| 1138 | 1140 | WARN_ON(!buffer_uptodate(bi->bi_bh)); |
|---|
| 1139 | | - while (goal < bi->bi_len * GFS2_NBBY) { |
|---|
| 1140 | | - goal = gfs2_bitfit(buffer, bi->bi_len, goal, |
|---|
| 1141 | + while (goal < bi->bi_blocks) { |
|---|
| 1142 | + goal = gfs2_bitfit(buffer, bi->bi_bytes, goal, |
|---|
| 1141 | 1143 | GFS2_BLKST_UNLINKED); |
|---|
| 1142 | 1144 | if (goal == BFITNOENT) |
|---|
| 1143 | 1145 | break; |
|---|
| .. | .. |
|---|
| 1277 | 1279 | bi->bi_bh = NULL; |
|---|
| 1278 | 1280 | } |
|---|
| 1279 | 1281 | } |
|---|
| 1280 | | - |
|---|
| 1281 | | -} |
|---|
| 1282 | | - |
|---|
| 1283 | | -/** |
|---|
| 1284 | | - * gfs2_rgrp_go_unlock - Unlock a rgrp glock |
|---|
| 1285 | | - * @gh: The glock holder for the resource group |
|---|
| 1286 | | - * |
|---|
| 1287 | | - */ |
|---|
| 1288 | | - |
|---|
| 1289 | | -void gfs2_rgrp_go_unlock(struct gfs2_holder *gh) |
|---|
| 1290 | | -{ |
|---|
| 1291 | | - struct gfs2_rgrpd *rgd = gh->gh_gl->gl_object; |
|---|
| 1292 | | - int demote_requested = test_bit(GLF_DEMOTE, &gh->gh_gl->gl_flags) | |
|---|
| 1293 | | - test_bit(GLF_PENDING_DEMOTE, &gh->gh_gl->gl_flags); |
|---|
| 1294 | | - |
|---|
| 1295 | | - if (rgd && demote_requested) |
|---|
| 1296 | | - gfs2_rgrp_brelse(rgd); |
|---|
| 1297 | 1282 | } |
|---|
| 1298 | 1283 | |
|---|
| 1299 | 1284 | int gfs2_rgrp_send_discards(struct gfs2_sbd *sdp, u64 offset, |
|---|
| .. | .. |
|---|
| 1309 | 1294 | u32 trimmed = 0; |
|---|
| 1310 | 1295 | u8 diff; |
|---|
| 1311 | 1296 | |
|---|
| 1312 | | - for (x = 0; x < bi->bi_len; x++) { |
|---|
| 1297 | + for (x = 0; x < bi->bi_bytes; x++) { |
|---|
| 1313 | 1298 | const u8 *clone = bi->bi_clone ? bi->bi_clone : bi->bi_bh->b_data; |
|---|
| 1314 | 1299 | clone += bi->bi_offset; |
|---|
| 1315 | 1300 | clone += x; |
|---|
| .. | .. |
|---|
| 1406 | 1391 | |
|---|
| 1407 | 1392 | start = r.start >> bs_shift; |
|---|
| 1408 | 1393 | end = start + (r.len >> bs_shift); |
|---|
| 1409 | | - minlen = max_t(u64, r.minlen, |
|---|
| 1394 | + minlen = max_t(u64, r.minlen, sdp->sd_sb.sb_bsize); |
|---|
| 1395 | + minlen = max_t(u64, minlen, |
|---|
| 1410 | 1396 | q->limits.discard_granularity) >> bs_shift; |
|---|
| 1411 | 1397 | |
|---|
| 1412 | 1398 | if (end <= start || minlen > sdp->sd_max_rg_data) |
|---|
| .. | .. |
|---|
| 1558 | 1544 | if (S_ISDIR(inode->i_mode)) |
|---|
| 1559 | 1545 | extlen = 1; |
|---|
| 1560 | 1546 | else { |
|---|
| 1561 | | - extlen = max_t(u32, atomic_read(&rs->rs_sizehint), ap->target); |
|---|
| 1562 | | - extlen = clamp(extlen, RGRP_RSRV_MINBLKS, free_blocks); |
|---|
| 1547 | + extlen = max_t(u32, atomic_read(&ip->i_sizehint), ap->target); |
|---|
| 1548 | + extlen = clamp(extlen, (u32)RGRP_RSRV_MINBLKS, free_blocks); |
|---|
| 1563 | 1549 | } |
|---|
| 1564 | 1550 | if ((rgd->rd_free_clone < rgd->rd_reserved) || (free_blocks < extlen)) |
|---|
| 1565 | 1551 | return; |
|---|
| .. | .. |
|---|
| 1712 | 1698 | static int gfs2_rbm_find(struct gfs2_rbm *rbm, u8 state, u32 *minext, |
|---|
| 1713 | 1699 | const struct gfs2_inode *ip, bool nowrap) |
|---|
| 1714 | 1700 | { |
|---|
| 1701 | + bool scan_from_start = rbm->bii == 0 && rbm->offset == 0; |
|---|
| 1715 | 1702 | struct buffer_head *bh; |
|---|
| 1716 | | - int initial_bii; |
|---|
| 1717 | | - u32 initial_offset; |
|---|
| 1718 | | - int first_bii = rbm->bii; |
|---|
| 1719 | | - u32 first_offset = rbm->offset; |
|---|
| 1703 | + int last_bii; |
|---|
| 1720 | 1704 | u32 offset; |
|---|
| 1721 | 1705 | u8 *buffer; |
|---|
| 1722 | | - int n = 0; |
|---|
| 1723 | | - int iters = rbm->rgd->rd_length; |
|---|
| 1706 | + bool wrapped = false; |
|---|
| 1724 | 1707 | int ret; |
|---|
| 1725 | 1708 | struct gfs2_bitmap *bi; |
|---|
| 1726 | 1709 | struct gfs2_extent maxext = { .rbm.rgd = rbm->rgd, }; |
|---|
| 1727 | 1710 | |
|---|
| 1728 | | - /* If we are not starting at the beginning of a bitmap, then we |
|---|
| 1729 | | - * need to add one to the bitmap count to ensure that we search |
|---|
| 1730 | | - * the starting bitmap twice. |
|---|
| 1711 | + /* |
|---|
| 1712 | + * Determine the last bitmap to search. If we're not starting at the |
|---|
| 1713 | + * beginning of a bitmap, we need to search that bitmap twice to scan |
|---|
| 1714 | + * the entire resource group. |
|---|
| 1731 | 1715 | */ |
|---|
| 1732 | | - if (rbm->offset != 0) |
|---|
| 1733 | | - iters++; |
|---|
| 1716 | + last_bii = rbm->bii - (rbm->offset == 0); |
|---|
| 1734 | 1717 | |
|---|
| 1735 | 1718 | while(1) { |
|---|
| 1736 | 1719 | bi = rbm_bi(rbm); |
|---|
| .. | .. |
|---|
| 1744 | 1727 | WARN_ON(!buffer_uptodate(bh)); |
|---|
| 1745 | 1728 | if (state != GFS2_BLKST_UNLINKED && bi->bi_clone) |
|---|
| 1746 | 1729 | buffer = bi->bi_clone + bi->bi_offset; |
|---|
| 1747 | | - initial_offset = rbm->offset; |
|---|
| 1748 | | - offset = gfs2_bitfit(buffer, bi->bi_len, rbm->offset, state); |
|---|
| 1749 | | - if (offset == BFITNOENT) |
|---|
| 1750 | | - goto bitmap_full; |
|---|
| 1730 | + offset = gfs2_bitfit(buffer, bi->bi_bytes, rbm->offset, state); |
|---|
| 1731 | + if (offset == BFITNOENT) { |
|---|
| 1732 | + if (state == GFS2_BLKST_FREE && rbm->offset == 0) |
|---|
| 1733 | + set_bit(GBF_FULL, &bi->bi_flags); |
|---|
| 1734 | + goto next_bitmap; |
|---|
| 1735 | + } |
|---|
| 1751 | 1736 | rbm->offset = offset; |
|---|
| 1752 | 1737 | if (ip == NULL) |
|---|
| 1753 | 1738 | return 0; |
|---|
| 1754 | 1739 | |
|---|
| 1755 | | - initial_bii = rbm->bii; |
|---|
| 1756 | 1740 | ret = gfs2_reservation_check_and_update(rbm, ip, |
|---|
| 1757 | 1741 | minext ? *minext : 0, |
|---|
| 1758 | 1742 | &maxext); |
|---|
| 1759 | 1743 | if (ret == 0) |
|---|
| 1760 | 1744 | return 0; |
|---|
| 1761 | | - if (ret > 0) { |
|---|
| 1762 | | - n += (rbm->bii - initial_bii); |
|---|
| 1745 | + if (ret > 0) |
|---|
| 1763 | 1746 | goto next_iter; |
|---|
| 1764 | | - } |
|---|
| 1765 | 1747 | if (ret == -E2BIG) { |
|---|
| 1766 | 1748 | rbm->bii = 0; |
|---|
| 1767 | 1749 | rbm->offset = 0; |
|---|
| 1768 | | - n += (rbm->bii - initial_bii); |
|---|
| 1769 | 1750 | goto res_covered_end_of_rgrp; |
|---|
| 1770 | 1751 | } |
|---|
| 1771 | 1752 | return ret; |
|---|
| 1772 | | - |
|---|
| 1773 | | -bitmap_full: /* Mark bitmap as full and fall through */ |
|---|
| 1774 | | - if ((state == GFS2_BLKST_FREE) && initial_offset == 0) |
|---|
| 1775 | | - set_bit(GBF_FULL, &bi->bi_flags); |
|---|
| 1776 | 1753 | |
|---|
| 1777 | 1754 | next_bitmap: /* Find next bitmap in the rgrp */ |
|---|
| 1778 | 1755 | rbm->offset = 0; |
|---|
| .. | .. |
|---|
| 1780 | 1757 | if (rbm->bii == rbm->rgd->rd_length) |
|---|
| 1781 | 1758 | rbm->bii = 0; |
|---|
| 1782 | 1759 | res_covered_end_of_rgrp: |
|---|
| 1783 | | - if ((rbm->bii == 0) && nowrap) |
|---|
| 1784 | | - break; |
|---|
| 1785 | | - n++; |
|---|
| 1760 | + if (rbm->bii == 0) { |
|---|
| 1761 | + if (wrapped) |
|---|
| 1762 | + break; |
|---|
| 1763 | + wrapped = true; |
|---|
| 1764 | + if (nowrap) |
|---|
| 1765 | + break; |
|---|
| 1766 | + } |
|---|
| 1786 | 1767 | next_iter: |
|---|
| 1787 | | - if (n >= iters) |
|---|
| 1768 | + /* Have we scanned the entire resource group? */ |
|---|
| 1769 | + if (wrapped && rbm->bii > last_bii) |
|---|
| 1788 | 1770 | break; |
|---|
| 1789 | 1771 | } |
|---|
| 1790 | 1772 | |
|---|
| .. | .. |
|---|
| 1794 | 1776 | /* If the extent was too small, and it's smaller than the smallest |
|---|
| 1795 | 1777 | to have failed before, remember for future reference that it's |
|---|
| 1796 | 1778 | useless to search this rgrp again for this amount or more. */ |
|---|
| 1797 | | - if ((first_offset == 0) && (first_bii == 0) && |
|---|
| 1798 | | - (*minext < rbm->rgd->rd_extfail_pt)) |
|---|
| 1779 | + if (wrapped && (scan_from_start || rbm->bii > last_bii) && |
|---|
| 1780 | + *minext < rbm->rgd->rd_extfail_pt) |
|---|
| 1799 | 1781 | rbm->rgd->rd_extfail_pt = *minext; |
|---|
| 1800 | 1782 | |
|---|
| 1801 | 1783 | /* If the maximum extent we found is big enough to fulfill the |
|---|
| .. | .. |
|---|
| 1830 | 1812 | struct gfs2_rbm rbm = { .rgd = rgd, .bii = 0, .offset = 0 }; |
|---|
| 1831 | 1813 | |
|---|
| 1832 | 1814 | while (1) { |
|---|
| 1833 | | - down_write(&sdp->sd_log_flush_lock); |
|---|
| 1834 | 1815 | error = gfs2_rbm_find(&rbm, GFS2_BLKST_UNLINKED, NULL, NULL, |
|---|
| 1835 | 1816 | true); |
|---|
| 1836 | | - up_write(&sdp->sd_log_flush_lock); |
|---|
| 1837 | 1817 | if (error == -ENOSPC) |
|---|
| 1838 | 1818 | break; |
|---|
| 1839 | 1819 | if (WARN_ON_ONCE(error)) |
|---|
| .. | .. |
|---|
| 1861 | 1841 | */ |
|---|
| 1862 | 1842 | ip = gl->gl_object; |
|---|
| 1863 | 1843 | |
|---|
| 1864 | | - if (ip || queue_work(gfs2_delete_workqueue, &gl->gl_delete) == 0) |
|---|
| 1844 | + if (ip || !gfs2_queue_delete_work(gl, 0)) |
|---|
| 1865 | 1845 | gfs2_glock_put(gl); |
|---|
| 1866 | 1846 | else |
|---|
| 1867 | 1847 | found++; |
|---|
| .. | .. |
|---|
| 2016 | 1996 | * We try our best to find an rgrp that has at least ap->target blocks |
|---|
| 2017 | 1997 | * available. After a couple of passes (loops == 2), the prospects of finding |
|---|
| 2018 | 1998 | * such an rgrp diminish. At this stage, we return the first rgrp that has |
|---|
| 2019 | | - * atleast ap->min_target blocks available. Either way, we set ap->allowed to |
|---|
| 1999 | + * at least ap->min_target blocks available. Either way, we set ap->allowed to |
|---|
| 2020 | 2000 | * the number of blocks available in the chosen rgrp. |
|---|
| 2021 | 2001 | * |
|---|
| 2022 | 2002 | * Returns: 0 on success, |
|---|
| .. | .. |
|---|
| 2070 | 2050 | } |
|---|
| 2071 | 2051 | error = gfs2_glock_nq_init(rs->rs_rbm.rgd->rd_gl, |
|---|
| 2072 | 2052 | LM_ST_EXCLUSIVE, flags, |
|---|
| 2073 | | - &rs->rs_rgd_gh); |
|---|
| 2053 | + &ip->i_rgd_gh); |
|---|
| 2074 | 2054 | if (unlikely(error)) |
|---|
| 2075 | 2055 | return error; |
|---|
| 2076 | 2056 | if (!gfs2_rs_active(rs) && (loops < 2) && |
|---|
| .. | .. |
|---|
| 2079 | 2059 | if (sdp->sd_args.ar_rgrplvb) { |
|---|
| 2080 | 2060 | error = update_rgrp_lvb(rs->rs_rbm.rgd); |
|---|
| 2081 | 2061 | if (unlikely(error)) { |
|---|
| 2082 | | - gfs2_glock_dq_uninit(&rs->rs_rgd_gh); |
|---|
| 2062 | + gfs2_glock_dq_uninit(&ip->i_rgd_gh); |
|---|
| 2083 | 2063 | return error; |
|---|
| 2084 | 2064 | } |
|---|
| 2085 | 2065 | } |
|---|
| 2086 | 2066 | } |
|---|
| 2087 | 2067 | |
|---|
| 2088 | | - /* Skip unuseable resource groups */ |
|---|
| 2068 | + /* Skip unusable resource groups */ |
|---|
| 2089 | 2069 | if ((rs->rs_rbm.rgd->rd_flags & (GFS2_RGF_NOALLOC | |
|---|
| 2090 | 2070 | GFS2_RDF_ERROR)) || |
|---|
| 2091 | 2071 | (loops == 0 && ap->target > rs->rs_rbm.rgd->rd_extfail_pt)) |
|---|
| .. | .. |
|---|
| 2122 | 2102 | |
|---|
| 2123 | 2103 | /* Unlock rgrp if required */ |
|---|
| 2124 | 2104 | if (!rg_locked) |
|---|
| 2125 | | - gfs2_glock_dq_uninit(&rs->rs_rgd_gh); |
|---|
| 2105 | + gfs2_glock_dq_uninit(&ip->i_rgd_gh); |
|---|
| 2126 | 2106 | next_rgrp: |
|---|
| 2127 | 2107 | /* Find the next rgrp, and continue looking */ |
|---|
| 2128 | 2108 | if (gfs2_select_rgrp(&rs->rs_rbm.rgd, begin)) |
|---|
| .. | .. |
|---|
| 2159 | 2139 | |
|---|
| 2160 | 2140 | void gfs2_inplace_release(struct gfs2_inode *ip) |
|---|
| 2161 | 2141 | { |
|---|
| 2162 | | - struct gfs2_blkreserv *rs = &ip->i_res; |
|---|
| 2163 | | - |
|---|
| 2164 | | - if (gfs2_holder_initialized(&rs->rs_rgd_gh)) |
|---|
| 2165 | | - gfs2_glock_dq_uninit(&rs->rs_rgd_gh); |
|---|
| 2142 | + if (gfs2_holder_initialized(&ip->i_rgd_gh)) |
|---|
| 2143 | + gfs2_glock_dq_uninit(&ip->i_rgd_gh); |
|---|
| 2166 | 2144 | } |
|---|
| 2167 | 2145 | |
|---|
| 2168 | 2146 | /** |
|---|
| .. | .. |
|---|
| 2201 | 2179 | /** |
|---|
| 2202 | 2180 | * rgblk_free - Change alloc state of given block(s) |
|---|
| 2203 | 2181 | * @sdp: the filesystem |
|---|
| 2182 | + * @rgd: the resource group the blocks are in |
|---|
| 2204 | 2183 | * @bstart: the start of a run of blocks to free |
|---|
| 2205 | 2184 | * @blen: the length of the block run (all must lie within ONE RG!) |
|---|
| 2206 | 2185 | * @new_state: GFS2_BLKST_XXX the after-allocation block state |
|---|
| 2207 | | - * |
|---|
| 2208 | | - * Returns: Resource group containing the block(s) |
|---|
| 2209 | 2186 | */ |
|---|
| 2210 | 2187 | |
|---|
| 2211 | | -static struct gfs2_rgrpd *rgblk_free(struct gfs2_sbd *sdp, u64 bstart, |
|---|
| 2212 | | - u32 blen, unsigned char new_state) |
|---|
| 2188 | +static void rgblk_free(struct gfs2_sbd *sdp, struct gfs2_rgrpd *rgd, |
|---|
| 2189 | + u64 bstart, u32 blen, unsigned char new_state) |
|---|
| 2213 | 2190 | { |
|---|
| 2214 | 2191 | struct gfs2_rbm rbm; |
|---|
| 2215 | 2192 | struct gfs2_bitmap *bi, *bi_prev = NULL; |
|---|
| 2216 | 2193 | |
|---|
| 2217 | | - rbm.rgd = gfs2_blk2rgrpd(sdp, bstart, 1); |
|---|
| 2218 | | - if (!rbm.rgd) { |
|---|
| 2219 | | - if (gfs2_consist(sdp)) |
|---|
| 2220 | | - fs_err(sdp, "block = %llu\n", (unsigned long long)bstart); |
|---|
| 2221 | | - return NULL; |
|---|
| 2222 | | - } |
|---|
| 2223 | | - |
|---|
| 2224 | | - gfs2_rbm_from_block(&rbm, bstart); |
|---|
| 2194 | + rbm.rgd = rgd; |
|---|
| 2195 | + if (WARN_ON_ONCE(gfs2_rbm_from_block(&rbm, bstart))) |
|---|
| 2196 | + return; |
|---|
| 2225 | 2197 | while (blen--) { |
|---|
| 2226 | 2198 | bi = rbm_bi(&rbm); |
|---|
| 2227 | 2199 | if (bi != bi_prev) { |
|---|
| .. | .. |
|---|
| 2230 | 2202 | GFP_NOFS | __GFP_NOFAIL); |
|---|
| 2231 | 2203 | memcpy(bi->bi_clone + bi->bi_offset, |
|---|
| 2232 | 2204 | bi->bi_bh->b_data + bi->bi_offset, |
|---|
| 2233 | | - bi->bi_len); |
|---|
| 2205 | + bi->bi_bytes); |
|---|
| 2234 | 2206 | } |
|---|
| 2235 | 2207 | gfs2_trans_add_meta(rbm.rgd->rd_gl, bi->bi_bh); |
|---|
| 2236 | 2208 | bi_prev = bi; |
|---|
| .. | .. |
|---|
| 2238 | 2210 | gfs2_setbit(&rbm, false, new_state); |
|---|
| 2239 | 2211 | gfs2_rbm_incr(&rbm); |
|---|
| 2240 | 2212 | } |
|---|
| 2241 | | - |
|---|
| 2242 | | - return rbm.rgd; |
|---|
| 2243 | 2213 | } |
|---|
| 2244 | 2214 | |
|---|
| 2245 | 2215 | /** |
|---|
| 2246 | 2216 | * gfs2_rgrp_dump - print out an rgrp |
|---|
| 2247 | 2217 | * @seq: The iterator |
|---|
| 2248 | | - * @gl: The glock in question |
|---|
| 2218 | + * @rgd: The rgrp in question |
|---|
| 2219 | + * @fs_id_buf: pointer to file system id (if requested) |
|---|
| 2249 | 2220 | * |
|---|
| 2250 | 2221 | */ |
|---|
| 2251 | 2222 | |
|---|
| 2252 | | -void gfs2_rgrp_dump(struct seq_file *seq, const struct gfs2_glock *gl) |
|---|
| 2223 | +void gfs2_rgrp_dump(struct seq_file *seq, struct gfs2_rgrpd *rgd, |
|---|
| 2224 | + const char *fs_id_buf) |
|---|
| 2253 | 2225 | { |
|---|
| 2254 | | - struct gfs2_rgrpd *rgd = gl->gl_object; |
|---|
| 2255 | 2226 | struct gfs2_blkreserv *trs; |
|---|
| 2256 | 2227 | const struct rb_node *n; |
|---|
| 2257 | 2228 | |
|---|
| 2258 | | - if (rgd == NULL) |
|---|
| 2259 | | - return; |
|---|
| 2260 | | - gfs2_print_dbg(seq, " R: n:%llu f:%02x b:%u/%u i:%u r:%u e:%u\n", |
|---|
| 2229 | + gfs2_print_dbg(seq, "%s R: n:%llu f:%02x b:%u/%u i:%u r:%u e:%u\n", |
|---|
| 2230 | + fs_id_buf, |
|---|
| 2261 | 2231 | (unsigned long long)rgd->rd_addr, rgd->rd_flags, |
|---|
| 2262 | 2232 | rgd->rd_free, rgd->rd_free_clone, rgd->rd_dinodes, |
|---|
| 2263 | 2233 | rgd->rd_reserved, rgd->rd_extfail_pt); |
|---|
| 2234 | + if (rgd->rd_sbd->sd_args.ar_rgrplvb) { |
|---|
| 2235 | + struct gfs2_rgrp_lvb *rgl = rgd->rd_rgl; |
|---|
| 2236 | + |
|---|
| 2237 | + gfs2_print_dbg(seq, "%s L: f:%02x b:%u i:%u\n", fs_id_buf, |
|---|
| 2238 | + be32_to_cpu(rgl->rl_flags), |
|---|
| 2239 | + be32_to_cpu(rgl->rl_free), |
|---|
| 2240 | + be32_to_cpu(rgl->rl_dinodes)); |
|---|
| 2241 | + } |
|---|
| 2264 | 2242 | spin_lock(&rgd->rd_rsspin); |
|---|
| 2265 | 2243 | for (n = rb_first(&rgd->rd_rstree); n; n = rb_next(&trs->rs_node)) { |
|---|
| 2266 | 2244 | trs = rb_entry(n, struct gfs2_blkreserv, rs_node); |
|---|
| 2267 | | - dump_rs(seq, trs); |
|---|
| 2245 | + dump_rs(seq, trs, fs_id_buf); |
|---|
| 2268 | 2246 | } |
|---|
| 2269 | 2247 | spin_unlock(&rgd->rd_rsspin); |
|---|
| 2270 | 2248 | } |
|---|
| .. | .. |
|---|
| 2272 | 2250 | static void gfs2_rgrp_error(struct gfs2_rgrpd *rgd) |
|---|
| 2273 | 2251 | { |
|---|
| 2274 | 2252 | struct gfs2_sbd *sdp = rgd->rd_sbd; |
|---|
| 2253 | + char fs_id_buf[sizeof(sdp->sd_fsname) + 7]; |
|---|
| 2254 | + |
|---|
| 2275 | 2255 | fs_warn(sdp, "rgrp %llu has an error, marking it readonly until umount\n", |
|---|
| 2276 | 2256 | (unsigned long long)rgd->rd_addr); |
|---|
| 2277 | 2257 | fs_warn(sdp, "umount on all nodes and run fsck.gfs2 to fix the error\n"); |
|---|
| 2278 | | - gfs2_rgrp_dump(NULL, rgd->rd_gl); |
|---|
| 2258 | + sprintf(fs_id_buf, "fsid=%s: ", sdp->sd_fsname); |
|---|
| 2259 | + gfs2_rgrp_dump(NULL, rgd, fs_id_buf); |
|---|
| 2279 | 2260 | rgd->rd_flags |= GFS2_RDF_ERROR; |
|---|
| 2280 | 2261 | } |
|---|
| 2281 | 2262 | |
|---|
| .. | .. |
|---|
| 2312 | 2293 | goto out; |
|---|
| 2313 | 2294 | /* We used up our block reservation, so we should |
|---|
| 2314 | 2295 | reserve more blocks next time. */ |
|---|
| 2315 | | - atomic_add(RGRP_RSRV_ADDBLKS, &rs->rs_sizehint); |
|---|
| 2296 | + atomic_add(RGRP_RSRV_ADDBLKS, &ip->i_sizehint); |
|---|
| 2316 | 2297 | } |
|---|
| 2317 | 2298 | __rs_deltree(rs); |
|---|
| 2318 | 2299 | } |
|---|
| .. | .. |
|---|
| 2346 | 2327 | else |
|---|
| 2347 | 2328 | goal = rbm->rgd->rd_last_alloc + rbm->rgd->rd_data0; |
|---|
| 2348 | 2329 | |
|---|
| 2349 | | - gfs2_rbm_from_block(rbm, goal); |
|---|
| 2330 | + if (WARN_ON_ONCE(gfs2_rbm_from_block(rbm, goal))) { |
|---|
| 2331 | + rbm->bii = 0; |
|---|
| 2332 | + rbm->offset = 0; |
|---|
| 2333 | + } |
|---|
| 2350 | 2334 | } |
|---|
| 2351 | 2335 | |
|---|
| 2352 | 2336 | /** |
|---|
| .. | .. |
|---|
| 2409 | 2393 | } |
|---|
| 2410 | 2394 | } |
|---|
| 2411 | 2395 | if (rbm.rgd->rd_free < *nblocks) { |
|---|
| 2412 | | - pr_warn("nblocks=%u\n", *nblocks); |
|---|
| 2396 | + fs_warn(sdp, "nblocks=%u\n", *nblocks); |
|---|
| 2413 | 2397 | goto rgrp_error; |
|---|
| 2414 | 2398 | } |
|---|
| 2415 | 2399 | |
|---|
| .. | .. |
|---|
| 2426 | 2410 | |
|---|
| 2427 | 2411 | gfs2_statfs_change(sdp, 0, -(s64)*nblocks, dinode ? 1 : 0); |
|---|
| 2428 | 2412 | if (dinode) |
|---|
| 2429 | | - gfs2_trans_add_unrevoke(sdp, block, *nblocks); |
|---|
| 2413 | + gfs2_trans_remove_revoke(sdp, block, *nblocks); |
|---|
| 2430 | 2414 | |
|---|
| 2431 | 2415 | gfs2_quota_change(ip, *nblocks, ip->i_inode.i_uid, ip->i_inode.i_gid); |
|---|
| 2432 | 2416 | |
|---|
| .. | .. |
|---|
| 2444 | 2428 | /** |
|---|
| 2445 | 2429 | * __gfs2_free_blocks - free a contiguous run of block(s) |
|---|
| 2446 | 2430 | * @ip: the inode these blocks are being freed from |
|---|
| 2431 | + * @rgd: the resource group the blocks are in |
|---|
| 2447 | 2432 | * @bstart: first block of a run of contiguous blocks |
|---|
| 2448 | 2433 | * @blen: the length of the block run |
|---|
| 2449 | 2434 | * @meta: 1 if the blocks represent metadata |
|---|
| 2450 | 2435 | * |
|---|
| 2451 | 2436 | */ |
|---|
| 2452 | 2437 | |
|---|
| 2453 | | -void __gfs2_free_blocks(struct gfs2_inode *ip, u64 bstart, u32 blen, int meta) |
|---|
| 2438 | +void __gfs2_free_blocks(struct gfs2_inode *ip, struct gfs2_rgrpd *rgd, |
|---|
| 2439 | + u64 bstart, u32 blen, int meta) |
|---|
| 2454 | 2440 | { |
|---|
| 2455 | 2441 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); |
|---|
| 2456 | | - struct gfs2_rgrpd *rgd; |
|---|
| 2457 | 2442 | |
|---|
| 2458 | | - rgd = rgblk_free(sdp, bstart, blen, GFS2_BLKST_FREE); |
|---|
| 2459 | | - if (!rgd) |
|---|
| 2460 | | - return; |
|---|
| 2443 | + rgblk_free(sdp, rgd, bstart, blen, GFS2_BLKST_FREE); |
|---|
| 2461 | 2444 | trace_gfs2_block_alloc(ip, rgd, bstart, blen, GFS2_BLKST_FREE); |
|---|
| 2462 | 2445 | rgd->rd_free += blen; |
|---|
| 2463 | 2446 | rgd->rd_flags &= ~GFS2_RGF_TRIMMED; |
|---|
| .. | .. |
|---|
| 2465 | 2448 | gfs2_rgrp_out(rgd, rgd->rd_bits[0].bi_bh->b_data); |
|---|
| 2466 | 2449 | |
|---|
| 2467 | 2450 | /* Directories keep their data in the metadata address space */ |
|---|
| 2468 | | - if (meta || ip->i_depth) |
|---|
| 2469 | | - gfs2_meta_wipe(ip, bstart, blen); |
|---|
| 2451 | + if (meta || ip->i_depth || gfs2_is_jdata(ip)) |
|---|
| 2452 | + gfs2_journal_wipe(ip, bstart, blen); |
|---|
| 2470 | 2453 | } |
|---|
| 2471 | 2454 | |
|---|
| 2472 | 2455 | /** |
|---|
| 2473 | 2456 | * gfs2_free_meta - free a contiguous run of data block(s) |
|---|
| 2474 | 2457 | * @ip: the inode these blocks are being freed from |
|---|
| 2458 | + * @rgd: the resource group the blocks are in |
|---|
| 2475 | 2459 | * @bstart: first block of a run of contiguous blocks |
|---|
| 2476 | 2460 | * @blen: the length of the block run |
|---|
| 2477 | 2461 | * |
|---|
| 2478 | 2462 | */ |
|---|
| 2479 | 2463 | |
|---|
| 2480 | | -void gfs2_free_meta(struct gfs2_inode *ip, u64 bstart, u32 blen) |
|---|
| 2464 | +void gfs2_free_meta(struct gfs2_inode *ip, struct gfs2_rgrpd *rgd, |
|---|
| 2465 | + u64 bstart, u32 blen) |
|---|
| 2481 | 2466 | { |
|---|
| 2482 | 2467 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); |
|---|
| 2483 | 2468 | |
|---|
| 2484 | | - __gfs2_free_blocks(ip, bstart, blen, 1); |
|---|
| 2469 | + __gfs2_free_blocks(ip, rgd, bstart, blen, 1); |
|---|
| 2485 | 2470 | gfs2_statfs_change(sdp, 0, +blen, 0); |
|---|
| 2486 | 2471 | gfs2_quota_change(ip, -(s64)blen, ip->i_inode.i_uid, ip->i_inode.i_gid); |
|---|
| 2487 | 2472 | } |
|---|
| .. | .. |
|---|
| 2493 | 2478 | struct gfs2_rgrpd *rgd; |
|---|
| 2494 | 2479 | u64 blkno = ip->i_no_addr; |
|---|
| 2495 | 2480 | |
|---|
| 2496 | | - rgd = rgblk_free(sdp, blkno, 1, GFS2_BLKST_UNLINKED); |
|---|
| 2481 | + rgd = gfs2_blk2rgrpd(sdp, blkno, true); |
|---|
| 2497 | 2482 | if (!rgd) |
|---|
| 2498 | 2483 | return; |
|---|
| 2484 | + rgblk_free(sdp, rgd, blkno, 1, GFS2_BLKST_UNLINKED); |
|---|
| 2499 | 2485 | trace_gfs2_block_alloc(ip, rgd, blkno, 1, GFS2_BLKST_UNLINKED); |
|---|
| 2500 | 2486 | gfs2_trans_add_meta(rgd->rd_gl, rgd->rd_bits[0].bi_bh); |
|---|
| 2501 | 2487 | gfs2_rgrp_out(rgd, rgd->rd_bits[0].bi_bh->b_data); |
|---|
| .. | .. |
|---|
| 2505 | 2491 | void gfs2_free_di(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip) |
|---|
| 2506 | 2492 | { |
|---|
| 2507 | 2493 | struct gfs2_sbd *sdp = rgd->rd_sbd; |
|---|
| 2508 | | - struct gfs2_rgrpd *tmp_rgd; |
|---|
| 2509 | 2494 | |
|---|
| 2510 | | - tmp_rgd = rgblk_free(sdp, ip->i_no_addr, 1, GFS2_BLKST_FREE); |
|---|
| 2511 | | - if (!tmp_rgd) |
|---|
| 2512 | | - return; |
|---|
| 2513 | | - gfs2_assert_withdraw(sdp, rgd == tmp_rgd); |
|---|
| 2514 | | - |
|---|
| 2495 | + rgblk_free(sdp, rgd, ip->i_no_addr, 1, GFS2_BLKST_FREE); |
|---|
| 2515 | 2496 | if (!rgd->rd_dinodes) |
|---|
| 2516 | 2497 | gfs2_consist_rgrpd(rgd); |
|---|
| 2517 | 2498 | rgd->rd_dinodes--; |
|---|
| .. | .. |
|---|
| 2524 | 2505 | gfs2_statfs_change(sdp, 0, +1, -1); |
|---|
| 2525 | 2506 | trace_gfs2_block_alloc(ip, rgd, ip->i_no_addr, 1, GFS2_BLKST_FREE); |
|---|
| 2526 | 2507 | gfs2_quota_change(ip, -1, ip->i_inode.i_uid, ip->i_inode.i_gid); |
|---|
| 2527 | | - gfs2_meta_wipe(ip, ip->i_no_addr, 1); |
|---|
| 2508 | + gfs2_journal_wipe(ip, ip->i_no_addr, 1); |
|---|
| 2528 | 2509 | } |
|---|
| 2529 | 2510 | |
|---|
| 2530 | 2511 | /** |
|---|
| .. | .. |
|---|
| 2555 | 2536 | |
|---|
| 2556 | 2537 | rbm.rgd = rgd; |
|---|
| 2557 | 2538 | error = gfs2_rbm_from_block(&rbm, no_addr); |
|---|
| 2558 | | - WARN_ON_ONCE(error != 0); |
|---|
| 2559 | | - |
|---|
| 2560 | | - if (gfs2_testbit(&rbm, false) != type) |
|---|
| 2561 | | - error = -ESTALE; |
|---|
| 2539 | + if (!WARN_ON_ONCE(error)) { |
|---|
| 2540 | + if (gfs2_testbit(&rbm, false) != type) |
|---|
| 2541 | + error = -ESTALE; |
|---|
| 2542 | + } |
|---|
| 2562 | 2543 | |
|---|
| 2563 | 2544 | gfs2_glock_dq_uninit(&rgd_gh); |
|---|
| 2545 | + |
|---|
| 2564 | 2546 | fail: |
|---|
| 2565 | 2547 | return error; |
|---|
| 2566 | 2548 | } |
|---|
| .. | .. |
|---|
| 2641 | 2623 | * gfs2_rlist_alloc - all RGs have been added to the rlist, now allocate |
|---|
| 2642 | 2624 | * and initialize an array of glock holders for them |
|---|
| 2643 | 2625 | * @rlist: the list of resource groups |
|---|
| 2644 | | - * @state: the lock state to acquire the RG lock in |
|---|
| 2645 | 2626 | * |
|---|
| 2646 | 2627 | * FIXME: Don't use NOFAIL |
|---|
| 2647 | 2628 | * |
|---|
| 2648 | 2629 | */ |
|---|
| 2649 | 2630 | |
|---|
| 2650 | | -void gfs2_rlist_alloc(struct gfs2_rgrp_list *rlist, unsigned int state) |
|---|
| 2631 | +void gfs2_rlist_alloc(struct gfs2_rgrp_list *rlist) |
|---|
| 2651 | 2632 | { |
|---|
| 2652 | 2633 | unsigned int x; |
|---|
| 2653 | 2634 | |
|---|
| .. | .. |
|---|
| 2656 | 2637 | GFP_NOFS | __GFP_NOFAIL); |
|---|
| 2657 | 2638 | for (x = 0; x < rlist->rl_rgrps; x++) |
|---|
| 2658 | 2639 | gfs2_holder_init(rlist->rl_rgd[x]->rd_gl, |
|---|
| 2659 | | - state, 0, |
|---|
| 2640 | + LM_ST_EXCLUSIVE, 0, |
|---|
| 2660 | 2641 | &rlist->rl_ghs[x]); |
|---|
| 2661 | 2642 | } |
|---|
| 2662 | 2643 | |
|---|