.. | .. |
---|
| 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 | |
---|