Lines Matching refs:rgd
40 struct gfs2_rgrpd *rgd; member
47 return rbm->rgd->rd_bits + rbm->bii; in rbm_bi()
52 BUG_ON(rbm->offset >= rbm->rgd->rd_data); in gfs2_rbm_to_block()
53 return rbm->rgd->rd_data0 + (rbm_bi(rbm)->bi_start * GFS2_NBBY) + in gfs2_rbm_to_block()
109 struct gfs2_sbd *sdp = rbm->rgd->rd_sbd; in gfs2_setbit()
114 (unsigned long long)rbm->rgd->rd_addr, bi->bi_start, in gfs2_setbit()
120 gfs2_consist_rgrpd(rbm->rgd); in gfs2_setbit()
279 if (!rgrp_contains_block(rbm->rgd, block)) in gfs2_rbm_from_block()
282 rbm->offset = block - rbm->rgd->rd_data0; in gfs2_rbm_from_block()
290 rbm->bii = rbm->offset / rbm->rgd->rd_sbd->sd_blocks_per_bitmap; in gfs2_rbm_from_block()
291 rbm->offset -= rbm->bii * rbm->rgd->rd_sbd->sd_blocks_per_bitmap; in gfs2_rbm_from_block()
308 struct gfs2_rgrpd *rgd = rbm->rgd; in gfs2_rbm_add() local
309 struct gfs2_bitmap *bi = rgd->rd_bits + rbm->bii; in gfs2_rbm_add()
319 if (bi == rgd->rd_bits + rgd->rd_length) in gfs2_rbm_add()
323 rbm->bii = bi - rgd->rd_bits; in gfs2_rbm_add()
435 static u32 gfs2_bitcount(struct gfs2_rgrpd *rgd, const u8 *buffer, in gfs2_bitcount() argument
465 void gfs2_rgrp_verify(struct gfs2_rgrpd *rgd) in gfs2_rgrp_verify() argument
467 struct gfs2_sbd *sdp = rgd->rd_sbd; in gfs2_rgrp_verify()
469 u32 length = rgd->rd_length; in gfs2_rgrp_verify()
477 bi = rgd->rd_bits + buf; in gfs2_rgrp_verify()
479 count[x] += gfs2_bitcount(rgd, in gfs2_rgrp_verify()
485 if (count[0] != rgd->rd_free) { in gfs2_rgrp_verify()
487 count[0], rgd->rd_free); in gfs2_rgrp_verify()
488 gfs2_consist_rgrpd(rgd); in gfs2_rgrp_verify()
492 tmp = rgd->rd_data - rgd->rd_free - rgd->rd_dinodes; in gfs2_rgrp_verify()
496 gfs2_consist_rgrpd(rgd); in gfs2_rgrp_verify()
500 if (count[2] + count[3] != rgd->rd_dinodes) { in gfs2_rgrp_verify()
502 count[2] + count[3], rgd->rd_dinodes); in gfs2_rgrp_verify()
503 gfs2_consist_rgrpd(rgd); in gfs2_rgrp_verify()
565 struct gfs2_rgrpd *rgd; in gfs2_rgrpd_get_first() local
569 rgd = rb_entry(n, struct gfs2_rgrpd, rd_node); in gfs2_rgrpd_get_first()
572 return rgd; in gfs2_rgrpd_get_first()
582 struct gfs2_rgrpd *gfs2_rgrpd_get_next(struct gfs2_rgrpd *rgd) in gfs2_rgrpd_get_next() argument
584 struct gfs2_sbd *sdp = rgd->rd_sbd; in gfs2_rgrpd_get_next()
588 n = rb_next(&rgd->rd_node); in gfs2_rgrpd_get_next()
592 if (unlikely(&rgd->rd_node == n)) { in gfs2_rgrpd_get_next()
596 rgd = rb_entry(n, struct gfs2_rgrpd, rd_node); in gfs2_rgrpd_get_next()
598 return rgd; in gfs2_rgrpd_get_next()
608 void gfs2_free_clones(struct gfs2_rgrpd *rgd) in gfs2_free_clones() argument
612 for (x = 0; x < rgd->rd_length; x++) { in gfs2_free_clones()
613 struct gfs2_bitmap *bi = rgd->rd_bits + x; in gfs2_free_clones()
638 struct gfs2_rgrpd *rgd; in __rs_deltree() local
643 rgd = rs->rs_rgd; in __rs_deltree()
645 rb_erase(&rs->rs_node, &rgd->rd_rstree); in __rs_deltree()
657 rgd->rd_extfail_pt += rs->rs_requested; in __rs_deltree()
669 struct gfs2_rgrpd *rgd; in gfs2_rs_deltree() local
671 rgd = rs->rs_rgd; in gfs2_rs_deltree()
672 if (rgd) { in gfs2_rs_deltree()
673 spin_lock(&rgd->rd_rsspin); in gfs2_rs_deltree()
676 spin_unlock(&rgd->rd_rsspin); in gfs2_rs_deltree()
703 static void return_all_reservations(struct gfs2_rgrpd *rgd) in return_all_reservations() argument
708 spin_lock(&rgd->rd_rsspin); in return_all_reservations()
709 while ((n = rb_first(&rgd->rd_rstree))) { in return_all_reservations()
713 spin_unlock(&rgd->rd_rsspin); in return_all_reservations()
719 struct gfs2_rgrpd *rgd; in gfs2_clear_rgrpd() local
723 rgd = rb_entry(n, struct gfs2_rgrpd, rd_node); in gfs2_clear_rgrpd()
724 gl = rgd->rd_gl; in gfs2_clear_rgrpd()
733 gfs2_rgrp_brelse(rgd); in gfs2_clear_rgrpd()
734 glock_clear_object(gl, rgd); in gfs2_clear_rgrpd()
738 gfs2_free_clones(rgd); in gfs2_clear_rgrpd()
739 return_all_reservations(rgd); in gfs2_clear_rgrpd()
740 kfree(rgd->rd_bits); in gfs2_clear_rgrpd()
741 rgd->rd_bits = NULL; in gfs2_clear_rgrpd()
742 kmem_cache_free(gfs2_rgrpd_cachep, rgd); in gfs2_clear_rgrpd()
755 static int compute_bitstructs(struct gfs2_rgrpd *rgd) in compute_bitstructs() argument
757 struct gfs2_sbd *sdp = rgd->rd_sbd; in compute_bitstructs()
759 u32 length = rgd->rd_length; /* # blocks in hdr & bitmap */ in compute_bitstructs()
766 rgd->rd_bits = kcalloc(length, sizeof(struct gfs2_bitmap), GFP_NOFS); in compute_bitstructs()
767 if (!rgd->rd_bits) in compute_bitstructs()
770 bytes_left = rgd->rd_bitbytes; in compute_bitstructs()
773 bi = rgd->rd_bits + x; in compute_bitstructs()
794 bi->bi_start = rgd->rd_bitbytes - bytes_left; in compute_bitstructs()
802 bi->bi_start = rgd->rd_bitbytes - bytes_left; in compute_bitstructs()
811 gfs2_consist_rgrpd(rgd); in compute_bitstructs()
814 bi = rgd->rd_bits + (length - 1); in compute_bitstructs()
815 if ((bi->bi_start + bi->bi_bytes) * GFS2_NBBY != rgd->rd_data) { in compute_bitstructs()
823 (unsigned long long)rgd->rd_addr, in compute_bitstructs()
824 rgd->rd_length, in compute_bitstructs()
825 (unsigned long long)rgd->rd_data0, in compute_bitstructs()
826 rgd->rd_data, in compute_bitstructs()
827 rgd->rd_bitbytes, in compute_bitstructs()
829 gfs2_consist_rgrpd(rgd); in compute_bitstructs()
863 static int rgd_insert(struct gfs2_rgrpd *rgd) in rgd_insert() argument
865 struct gfs2_sbd *sdp = rgd->rd_sbd; in rgd_insert()
874 if (rgd->rd_addr < cur->rd_addr) in rgd_insert()
876 else if (rgd->rd_addr > cur->rd_addr) in rgd_insert()
882 rb_link_node(&rgd->rd_node, parent, newn); in rgd_insert()
883 rb_insert_color(&rgd->rd_node, &sdp->sd_rindex_tree); in rgd_insert()
901 struct gfs2_rgrpd *rgd; in read_rindex_entry() local
912 rgd = kmem_cache_zalloc(gfs2_rgrpd_cachep, GFP_NOFS); in read_rindex_entry()
914 if (!rgd) in read_rindex_entry()
917 rgd->rd_sbd = sdp; in read_rindex_entry()
918 rgd->rd_addr = be64_to_cpu(buf.ri_addr); in read_rindex_entry()
919 rgd->rd_length = be32_to_cpu(buf.ri_length); in read_rindex_entry()
920 rgd->rd_data0 = be64_to_cpu(buf.ri_data0); in read_rindex_entry()
921 rgd->rd_data = be32_to_cpu(buf.ri_data); in read_rindex_entry()
922 rgd->rd_bitbytes = be32_to_cpu(buf.ri_bitbytes); in read_rindex_entry()
923 spin_lock_init(&rgd->rd_rsspin); in read_rindex_entry()
924 mutex_init(&rgd->rd_mutex); in read_rindex_entry()
926 error = gfs2_glock_get(sdp, rgd->rd_addr, in read_rindex_entry()
927 &gfs2_rgrp_glops, CREATE, &rgd->rd_gl); in read_rindex_entry()
931 error = compute_bitstructs(rgd); in read_rindex_entry()
935 rgd->rd_rgl = (struct gfs2_rgrp_lvb *)rgd->rd_gl->gl_lksb.sb_lvbptr; in read_rindex_entry()
936 rgd->rd_flags &= ~GFS2_RDF_PREFERRED; in read_rindex_entry()
937 if (rgd->rd_data > sdp->sd_max_rg_data) in read_rindex_entry()
938 sdp->sd_max_rg_data = rgd->rd_data; in read_rindex_entry()
940 error = rgd_insert(rgd); in read_rindex_entry()
943 glock_set_object(rgd->rd_gl, rgd); in read_rindex_entry()
949 gfs2_glock_put(rgd->rd_gl); in read_rindex_entry()
952 kfree(rgd->rd_bits); in read_rindex_entry()
953 rgd->rd_bits = NULL; in read_rindex_entry()
954 kmem_cache_free(gfs2_rgrpd_cachep, rgd); in read_rindex_entry()
968 struct gfs2_rgrpd *rgd, *first; in set_rgrp_preferences() local
973 rgd = gfs2_rgrpd_get_first(sdp); in set_rgrp_preferences()
975 rgd = gfs2_rgrpd_get_next(rgd); in set_rgrp_preferences()
976 first = rgd; in set_rgrp_preferences()
979 rgd->rd_flags |= GFS2_RDF_PREFERRED; in set_rgrp_preferences()
981 rgd = gfs2_rgrpd_get_next(rgd); in set_rgrp_preferences()
982 if (!rgd || rgd == first) in set_rgrp_preferences()
985 } while (rgd && rgd != first); in set_rgrp_preferences()
1059 static void gfs2_rgrp_in(struct gfs2_rgrpd *rgd, const void *buf) in gfs2_rgrp_in() argument
1066 rgd->rd_flags &= GFS2_RDF_MASK; in gfs2_rgrp_in()
1067 rgd->rd_flags |= rg_flags; in gfs2_rgrp_in()
1068 rgd->rd_free = be32_to_cpu(str->rg_free); in gfs2_rgrp_in()
1069 rgd->rd_dinodes = be32_to_cpu(str->rg_dinodes); in gfs2_rgrp_in()
1070 rgd->rd_igeneration = be64_to_cpu(str->rg_igeneration); in gfs2_rgrp_in()
1086 static void gfs2_rgrp_out(struct gfs2_rgrpd *rgd, void *buf) in gfs2_rgrp_out() argument
1088 struct gfs2_rgrpd *next = gfs2_rgrpd_get_next(rgd); in gfs2_rgrp_out()
1092 str->rg_flags = cpu_to_be32(rgd->rd_flags & ~GFS2_RDF_MASK); in gfs2_rgrp_out()
1093 str->rg_free = cpu_to_be32(rgd->rd_free); in gfs2_rgrp_out()
1094 str->rg_dinodes = cpu_to_be32(rgd->rd_dinodes); in gfs2_rgrp_out()
1097 else if (next->rd_addr > rgd->rd_addr) in gfs2_rgrp_out()
1098 str->rg_skip = cpu_to_be32(next->rd_addr - rgd->rd_addr); in gfs2_rgrp_out()
1099 str->rg_igeneration = cpu_to_be64(rgd->rd_igeneration); in gfs2_rgrp_out()
1100 str->rg_data0 = cpu_to_be64(rgd->rd_data0); in gfs2_rgrp_out()
1101 str->rg_data = cpu_to_be32(rgd->rd_data); in gfs2_rgrp_out()
1102 str->rg_bitbytes = cpu_to_be32(rgd->rd_bitbytes); in gfs2_rgrp_out()
1108 gfs2_rgrp_ondisk2lvb(rgd->rd_rgl, buf); in gfs2_rgrp_out()
1111 static int gfs2_rgrp_lvb_valid(struct gfs2_rgrpd *rgd) in gfs2_rgrp_lvb_valid() argument
1113 struct gfs2_rgrp_lvb *rgl = rgd->rd_rgl; in gfs2_rgrp_lvb_valid()
1114 struct gfs2_rgrp *str = (struct gfs2_rgrp *)rgd->rd_bits[0].bi_bh->b_data; in gfs2_rgrp_lvb_valid()
1115 struct gfs2_sbd *sdp = rgd->rd_sbd; in gfs2_rgrp_lvb_valid()
1120 (unsigned long long)rgd->rd_addr, in gfs2_rgrp_lvb_valid()
1126 (unsigned long long)rgd->rd_addr, in gfs2_rgrp_lvb_valid()
1132 (unsigned long long)rgd->rd_addr, in gfs2_rgrp_lvb_valid()
1139 (unsigned long long)rgd->rd_addr, in gfs2_rgrp_lvb_valid()
1147 static u32 count_unlinked(struct gfs2_rgrpd *rgd) in count_unlinked() argument
1150 const u32 length = rgd->rd_length; in count_unlinked()
1154 for (i = 0, bi = rgd->rd_bits; i < length; i++, bi++) { in count_unlinked()
1171 static void rgrp_set_bitmap_flags(struct gfs2_rgrpd *rgd) in rgrp_set_bitmap_flags() argument
1176 if (rgd->rd_free) { in rgrp_set_bitmap_flags()
1177 for (x = 0; x < rgd->rd_length; x++) { in rgrp_set_bitmap_flags()
1178 bi = rgd->rd_bits + x; in rgrp_set_bitmap_flags()
1182 for (x = 0; x < rgd->rd_length; x++) { in rgrp_set_bitmap_flags()
1183 bi = rgd->rd_bits + x; in rgrp_set_bitmap_flags()
1201 struct gfs2_rgrpd *rgd = gl->gl_object; in gfs2_rgrp_go_instantiate() local
1202 struct gfs2_sbd *sdp = rgd->rd_sbd; in gfs2_rgrp_go_instantiate()
1203 unsigned int length = rgd->rd_length; in gfs2_rgrp_go_instantiate()
1208 if (rgd->rd_bits[0].bi_bh != NULL) in gfs2_rgrp_go_instantiate()
1212 bi = rgd->rd_bits + x; in gfs2_rgrp_go_instantiate()
1213 error = gfs2_meta_read(gl, rgd->rd_addr + x, 0, 0, &bi->bi_bh); in gfs2_rgrp_go_instantiate()
1219 bi = rgd->rd_bits + y; in gfs2_rgrp_go_instantiate()
1230 gfs2_rgrp_in(rgd, (rgd->rd_bits[0].bi_bh)->b_data); in gfs2_rgrp_go_instantiate()
1231 rgrp_set_bitmap_flags(rgd); in gfs2_rgrp_go_instantiate()
1232 rgd->rd_flags |= GFS2_RDF_CHECK; in gfs2_rgrp_go_instantiate()
1233 rgd->rd_free_clone = rgd->rd_free; in gfs2_rgrp_go_instantiate()
1234 GLOCK_BUG_ON(rgd->rd_gl, rgd->rd_reserved); in gfs2_rgrp_go_instantiate()
1236 rgd->rd_extfail_pt = rgd->rd_free; in gfs2_rgrp_go_instantiate()
1237 if (cpu_to_be32(GFS2_MAGIC) != rgd->rd_rgl->rl_magic) { in gfs2_rgrp_go_instantiate()
1238 rgd->rd_rgl->rl_unlinked = cpu_to_be32(count_unlinked(rgd)); in gfs2_rgrp_go_instantiate()
1239 gfs2_rgrp_ondisk2lvb(rgd->rd_rgl, in gfs2_rgrp_go_instantiate()
1240 rgd->rd_bits[0].bi_bh->b_data); in gfs2_rgrp_go_instantiate()
1242 if (!gfs2_rgrp_lvb_valid(rgd)){ in gfs2_rgrp_go_instantiate()
1243 gfs2_consist_rgrpd(rgd); in gfs2_rgrp_go_instantiate()
1247 if (rgd->rd_rgl->rl_unlinked == 0) in gfs2_rgrp_go_instantiate()
1248 rgd->rd_flags &= ~GFS2_RDF_CHECK; in gfs2_rgrp_go_instantiate()
1254 bi = rgd->rd_bits + x; in gfs2_rgrp_go_instantiate()
1262 static int update_rgrp_lvb(struct gfs2_rgrpd *rgd, struct gfs2_holder *gh) in update_rgrp_lvb() argument
1269 if (cpu_to_be32(GFS2_MAGIC) != rgd->rd_rgl->rl_magic) in update_rgrp_lvb()
1272 rl_flags = be32_to_cpu(rgd->rd_rgl->rl_flags); in update_rgrp_lvb()
1274 rgd->rd_flags &= GFS2_RDF_MASK; in update_rgrp_lvb()
1275 rgd->rd_flags |= (rl_flags | GFS2_RDF_CHECK); in update_rgrp_lvb()
1276 if (rgd->rd_rgl->rl_unlinked == 0) in update_rgrp_lvb()
1277 rgd->rd_flags &= ~GFS2_RDF_CHECK; in update_rgrp_lvb()
1278 rgd->rd_free = be32_to_cpu(rgd->rd_rgl->rl_free); in update_rgrp_lvb()
1279 rgrp_set_bitmap_flags(rgd); in update_rgrp_lvb()
1280 rgd->rd_free_clone = rgd->rd_free; in update_rgrp_lvb()
1281 GLOCK_BUG_ON(rgd->rd_gl, rgd->rd_reserved); in update_rgrp_lvb()
1283 rgd->rd_extfail_pt = rgd->rd_free; in update_rgrp_lvb()
1284 rgd->rd_dinodes = be32_to_cpu(rgd->rd_rgl->rl_dinodes); in update_rgrp_lvb()
1285 rgd->rd_igeneration = be64_to_cpu(rgd->rd_rgl->rl_igeneration); in update_rgrp_lvb()
1295 void gfs2_rgrp_brelse(struct gfs2_rgrpd *rgd) in gfs2_rgrp_brelse() argument
1297 int x, length = rgd->rd_length; in gfs2_rgrp_brelse()
1300 struct gfs2_bitmap *bi = rgd->rd_bits + x; in gfs2_rgrp_brelse()
1306 set_bit(GLF_INSTANTIATE_NEEDED, &rgd->rd_gl->gl_flags); in gfs2_rgrp_brelse()
1390 struct gfs2_rgrpd *rgd; in gfs2_fitrim() local
1425 rgd = gfs2_blk2rgrpd(sdp, start, 0); in gfs2_fitrim()
1434 ret = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_EXCLUSIVE, in gfs2_fitrim()
1439 if (!(rgd->rd_flags & GFS2_RGF_TRIMMED)) { in gfs2_fitrim()
1441 for (x = 0; x < rgd->rd_length; x++) { in gfs2_fitrim()
1442 struct gfs2_bitmap *bi = rgd->rd_bits + x; in gfs2_fitrim()
1443 rgrp_lock_local(rgd); in gfs2_fitrim()
1445 rgd->rd_data0, NULL, bi, minlen, in gfs2_fitrim()
1447 rgrp_unlock_local(rgd); in gfs2_fitrim()
1458 bh = rgd->rd_bits[0].bi_bh; in gfs2_fitrim()
1459 rgrp_lock_local(rgd); in gfs2_fitrim()
1460 rgd->rd_flags |= GFS2_RGF_TRIMMED; in gfs2_fitrim()
1461 gfs2_trans_add_meta(rgd->rd_gl, bh); in gfs2_fitrim()
1462 gfs2_rgrp_out(rgd, bh->b_data); in gfs2_fitrim()
1463 rgrp_unlock_local(rgd); in gfs2_fitrim()
1469 if (rgd == rgd_end) in gfs2_fitrim()
1472 rgd = gfs2_rgrpd_get_next(rgd); in gfs2_fitrim()
1493 struct gfs2_rgrpd *rgd = rs->rs_rgd; in rs_insert() local
1497 spin_lock(&rgd->rd_rsspin); in rs_insert()
1498 newn = &rgd->rd_rstree.rb_node; in rs_insert()
1510 spin_unlock(&rgd->rd_rsspin); in rs_insert()
1517 rb_insert_color(&rs->rs_node, &rgd->rd_rstree); in rs_insert()
1520 rgd->rd_requested += rs->rs_requested; /* blocks requested */ in rs_insert()
1521 spin_unlock(&rgd->rd_rsspin); in rs_insert()
1538 static inline u32 rgd_free(struct gfs2_rgrpd *rgd, struct gfs2_blkreserv *rs) in rgd_free() argument
1542 if (WARN_ON_ONCE(rgd->rd_requested < rs->rs_requested)) in rgd_free()
1544 tot_reserved = rgd->rd_requested - rs->rs_requested; in rgd_free()
1546 if (rgd->rd_free_clone < tot_reserved) in rgd_free()
1549 tot_free = rgd->rd_free_clone - tot_reserved; in rgd_free()
1562 static void rg_mblk_search(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip, in rg_mblk_search() argument
1565 struct gfs2_rbm rbm = { .rgd = rgd, }; in rg_mblk_search()
1573 spin_lock(&rgd->rd_rsspin); in rg_mblk_search()
1574 free_blocks = rgd_free(rgd, rs); in rg_mblk_search()
1575 if (rgd->rd_free_clone < rgd->rd_requested) in rg_mblk_search()
1577 blocks_available = rgd->rd_free_clone - rgd->rd_reserved; in rg_mblk_search()
1578 if (rgd == rs->rs_rgd) in rg_mblk_search()
1580 spin_unlock(&rgd->rd_rsspin); in rg_mblk_search()
1592 if (rgrp_contains_block(rgd, ip->i_goal)) in rg_mblk_search()
1595 goal = rgd->rd_last_alloc + rgd->rd_data0; in rg_mblk_search()
1606 if (goal == rgd->rd_last_alloc + rgd->rd_data0) in rg_mblk_search()
1607 rgd->rd_last_alloc = 0; in rg_mblk_search()
1624 static u64 gfs2_next_unreserved_block(struct gfs2_rgrpd *rgd, u64 block, in gfs2_next_unreserved_block() argument
1632 spin_lock(&rgd->rd_rsspin); in gfs2_next_unreserved_block()
1633 n = rgd->rd_rstree.rb_node; in gfs2_next_unreserved_block()
1655 spin_unlock(&rgd->rd_rsspin); in gfs2_next_unreserved_block()
1698 nblock = gfs2_next_unreserved_block(rbm->rgd, block, extlen, rs); in gfs2_reservation_check_and_update()
1749 struct gfs2_extent maxext = { .rbm.rgd = rbm->rgd, }; in gfs2_rbm_find()
1795 if (rbm->bii == rbm->rgd->rd_length) in gfs2_rbm_find()
1818 *minext < rbm->rgd->rd_extfail_pt) in gfs2_rbm_find()
1819 rbm->rgd->rd_extfail_pt = *minext - 1; in gfs2_rbm_find()
1842 static void try_rgrp_unlink(struct gfs2_rgrpd *rgd, u64 *last_unlinked, u64 skip) in try_rgrp_unlink() argument
1845 struct gfs2_sbd *sdp = rgd->rd_sbd; in try_rgrp_unlink()
1850 struct gfs2_rbm rbm = { .rgd = rgd, .bii = 0, .offset = 0 }; in try_rgrp_unlink()
1892 rgd->rd_flags &= ~GFS2_RDF_CHECK; in try_rgrp_unlink()
1923 static bool gfs2_rgrp_congested(const struct gfs2_rgrpd *rgd, int loops) in gfs2_rgrp_congested() argument
1925 const struct gfs2_glock *gl = rgd->rd_gl; in gfs2_rgrp_congested()
1998 struct gfs2_rgrpd *rgd = *pos; in gfs2_select_rgrp() local
1999 struct gfs2_sbd *sdp = rgd->rd_sbd; in gfs2_select_rgrp()
2001 rgd = gfs2_rgrpd_get_next(rgd); in gfs2_select_rgrp()
2002 if (rgd == NULL) in gfs2_select_rgrp()
2003 rgd = gfs2_rgrpd_get_first(sdp); in gfs2_select_rgrp()
2004 *pos = rgd; in gfs2_select_rgrp()
2005 if (rgd != begin) /* If we didn't wrap */ in gfs2_select_rgrp()
2017 static inline int fast_to_acquire(struct gfs2_rgrpd *rgd) in fast_to_acquire() argument
2019 struct gfs2_glock *gl = rgd->rd_gl; in fast_to_acquire()
2025 if (rgd->rd_flags & GFS2_RDF_PREFERRED) in fast_to_acquire()
2078 struct gfs2_rgrpd *rgd; in gfs2_inplace_reserve() local
2136 rgd = rs->rs_rgd; in gfs2_inplace_reserve()
2137 spin_lock(&rgd->rd_rsspin); in gfs2_inplace_reserve()
2138 free_blocks = rgd_free(rgd, rs); in gfs2_inplace_reserve()
2139 blocks_available = rgd->rd_free_clone - rgd->rd_reserved; in gfs2_inplace_reserve()
2141 spin_unlock(&rgd->rd_rsspin); in gfs2_inplace_reserve()
2147 rgd->rd_reserved += rs->rs_reserved; in gfs2_inplace_reserve()
2148 spin_unlock(&rgd->rd_rsspin); in gfs2_inplace_reserve()
2208 struct gfs2_rgrpd *rgd = rs->rs_rgd; in gfs2_inplace_release() local
2210 spin_lock(&rgd->rd_rsspin); in gfs2_inplace_release()
2211 GLOCK_BUG_ON(rgd->rd_gl, rgd->rd_reserved < rs->rs_reserved); in gfs2_inplace_release()
2212 rgd->rd_reserved -= rs->rs_reserved; in gfs2_inplace_release()
2213 spin_unlock(&rgd->rd_rsspin); in gfs2_inplace_release()
2232 struct gfs2_rbm pos = { .rgd = rbm->rgd, }; in gfs2_alloc_extent()
2239 gfs2_trans_add_meta(rbm->rgd->rd_gl, rbm_bi(rbm)->bi_bh); in gfs2_alloc_extent()
2246 gfs2_trans_add_meta(pos.rgd->rd_gl, rbm_bi(&pos)->bi_bh); in gfs2_alloc_extent()
2262 static void rgblk_free(struct gfs2_sbd *sdp, struct gfs2_rgrpd *rgd, in rgblk_free() argument
2268 rbm.rgd = rgd; in rgblk_free()
2281 gfs2_trans_add_meta(rbm.rgd->rd_gl, bi->bi_bh); in rgblk_free()
2297 void gfs2_rgrp_dump(struct seq_file *seq, struct gfs2_rgrpd *rgd, in gfs2_rgrp_dump() argument
2303 spin_lock(&rgd->rd_rsspin); in gfs2_rgrp_dump()
2306 (unsigned long long)rgd->rd_addr, rgd->rd_flags, in gfs2_rgrp_dump()
2307 rgd->rd_free, rgd->rd_free_clone, rgd->rd_dinodes, in gfs2_rgrp_dump()
2308 rgd->rd_requested, rgd->rd_reserved, rgd->rd_extfail_pt); in gfs2_rgrp_dump()
2309 if (rgd->rd_sbd->sd_args.ar_rgrplvb) { in gfs2_rgrp_dump()
2310 struct gfs2_rgrp_lvb *rgl = rgd->rd_rgl; in gfs2_rgrp_dump()
2317 for (n = rb_first(&rgd->rd_rstree); n; n = rb_next(&trs->rs_node)) { in gfs2_rgrp_dump()
2321 spin_unlock(&rgd->rd_rsspin); in gfs2_rgrp_dump()
2324 static void gfs2_rgrp_error(struct gfs2_rgrpd *rgd) in gfs2_rgrp_error() argument
2326 struct gfs2_sbd *sdp = rgd->rd_sbd; in gfs2_rgrp_error()
2330 (unsigned long long)rgd->rd_addr); in gfs2_rgrp_error()
2333 gfs2_rgrp_dump(NULL, rgd, fs_id_buf); in gfs2_rgrp_error()
2334 rgd->rd_flags |= GFS2_RDF_ERROR; in gfs2_rgrp_error()
2352 struct gfs2_rgrpd *rgd = rbm->rgd; in gfs2_adjust_reservation() local
2365 rgd->rd_requested -= rlen; in gfs2_adjust_reservation()
2367 if (rs->rs_start < rgd->rd_data0 + rgd->rd_data && in gfs2_adjust_reservation()
2397 if (!dinode && rgrp_contains_block(rbm->rgd, ip->i_goal)) in gfs2_set_alloc_start()
2400 goal = rbm->rgd->rd_last_alloc + rbm->rgd->rd_data0; in gfs2_set_alloc_start()
2424 struct gfs2_rbm rbm = { .rgd = ip->i_res.rs_rgd, }; in gfs2_alloc_blocks()
2431 rgrp_lock_local(rbm.rgd); in gfs2_alloc_blocks()
2445 test_bit(GBF_FULL, &rbm.rgd->rd_bits->bi_flags), in gfs2_alloc_blocks()
2446 rbm.rgd->rd_extfail_pt); in gfs2_alloc_blocks()
2452 rbm.rgd->rd_last_alloc = block - rbm.rgd->rd_data0; in gfs2_alloc_blocks()
2465 spin_lock(&rbm.rgd->rd_rsspin); in gfs2_alloc_blocks()
2467 if (rbm.rgd->rd_free < *nblocks || rbm.rgd->rd_reserved < *nblocks) { in gfs2_alloc_blocks()
2469 spin_unlock(&rbm.rgd->rd_rsspin); in gfs2_alloc_blocks()
2472 GLOCK_BUG_ON(rbm.rgd->rd_gl, rbm.rgd->rd_reserved < *nblocks); in gfs2_alloc_blocks()
2473 GLOCK_BUG_ON(rbm.rgd->rd_gl, rbm.rgd->rd_free_clone < *nblocks); in gfs2_alloc_blocks()
2474 GLOCK_BUG_ON(rbm.rgd->rd_gl, rbm.rgd->rd_free < *nblocks); in gfs2_alloc_blocks()
2475 rbm.rgd->rd_reserved -= *nblocks; in gfs2_alloc_blocks()
2476 rbm.rgd->rd_free_clone -= *nblocks; in gfs2_alloc_blocks()
2477 rbm.rgd->rd_free -= *nblocks; in gfs2_alloc_blocks()
2478 spin_unlock(&rbm.rgd->rd_rsspin); in gfs2_alloc_blocks()
2480 rbm.rgd->rd_dinodes++; in gfs2_alloc_blocks()
2481 *generation = rbm.rgd->rd_igeneration++; in gfs2_alloc_blocks()
2483 *generation = rbm.rgd->rd_igeneration++; in gfs2_alloc_blocks()
2486 gfs2_trans_add_meta(rbm.rgd->rd_gl, rbm.rgd->rd_bits[0].bi_bh); in gfs2_alloc_blocks()
2487 gfs2_rgrp_out(rbm.rgd, rbm.rgd->rd_bits[0].bi_bh->b_data); in gfs2_alloc_blocks()
2488 rgrp_unlock_local(rbm.rgd); in gfs2_alloc_blocks()
2496 trace_gfs2_block_alloc(ip, rbm.rgd, block, *nblocks, in gfs2_alloc_blocks()
2502 rgrp_unlock_local(rbm.rgd); in gfs2_alloc_blocks()
2503 gfs2_rgrp_error(rbm.rgd); in gfs2_alloc_blocks()
2517 void __gfs2_free_blocks(struct gfs2_inode *ip, struct gfs2_rgrpd *rgd, in __gfs2_free_blocks() argument
2522 rgrp_lock_local(rgd); in __gfs2_free_blocks()
2523 rgblk_free(sdp, rgd, bstart, blen, GFS2_BLKST_FREE); in __gfs2_free_blocks()
2524 trace_gfs2_block_alloc(ip, rgd, bstart, blen, GFS2_BLKST_FREE); in __gfs2_free_blocks()
2525 rgd->rd_free += blen; in __gfs2_free_blocks()
2526 rgd->rd_flags &= ~GFS2_RGF_TRIMMED; in __gfs2_free_blocks()
2527 gfs2_trans_add_meta(rgd->rd_gl, rgd->rd_bits[0].bi_bh); in __gfs2_free_blocks()
2528 gfs2_rgrp_out(rgd, rgd->rd_bits[0].bi_bh->b_data); in __gfs2_free_blocks()
2529 rgrp_unlock_local(rgd); in __gfs2_free_blocks()
2545 void gfs2_free_meta(struct gfs2_inode *ip, struct gfs2_rgrpd *rgd, in gfs2_free_meta() argument
2550 __gfs2_free_blocks(ip, rgd, bstart, blen, 1); in gfs2_free_meta()
2559 struct gfs2_rgrpd *rgd; in gfs2_unlink_di() local
2562 rgd = gfs2_blk2rgrpd(sdp, blkno, true); in gfs2_unlink_di()
2563 if (!rgd) in gfs2_unlink_di()
2565 rgrp_lock_local(rgd); in gfs2_unlink_di()
2566 rgblk_free(sdp, rgd, blkno, 1, GFS2_BLKST_UNLINKED); in gfs2_unlink_di()
2567 trace_gfs2_block_alloc(ip, rgd, blkno, 1, GFS2_BLKST_UNLINKED); in gfs2_unlink_di()
2568 gfs2_trans_add_meta(rgd->rd_gl, rgd->rd_bits[0].bi_bh); in gfs2_unlink_di()
2569 gfs2_rgrp_out(rgd, rgd->rd_bits[0].bi_bh->b_data); in gfs2_unlink_di()
2570 be32_add_cpu(&rgd->rd_rgl->rl_unlinked, 1); in gfs2_unlink_di()
2571 rgrp_unlock_local(rgd); in gfs2_unlink_di()
2574 void gfs2_free_di(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip) in gfs2_free_di() argument
2576 struct gfs2_sbd *sdp = rgd->rd_sbd; in gfs2_free_di()
2578 rgrp_lock_local(rgd); in gfs2_free_di()
2579 rgblk_free(sdp, rgd, ip->i_no_addr, 1, GFS2_BLKST_FREE); in gfs2_free_di()
2580 if (!rgd->rd_dinodes) in gfs2_free_di()
2581 gfs2_consist_rgrpd(rgd); in gfs2_free_di()
2582 rgd->rd_dinodes--; in gfs2_free_di()
2583 rgd->rd_free++; in gfs2_free_di()
2585 gfs2_trans_add_meta(rgd->rd_gl, rgd->rd_bits[0].bi_bh); in gfs2_free_di()
2586 gfs2_rgrp_out(rgd, rgd->rd_bits[0].bi_bh->b_data); in gfs2_free_di()
2587 rgrp_unlock_local(rgd); in gfs2_free_di()
2588 be32_add_cpu(&rgd->rd_rgl->rl_unlinked, -1); in gfs2_free_di()
2591 trace_gfs2_block_alloc(ip, rgd, ip->i_no_addr, 1, GFS2_BLKST_FREE); in gfs2_free_di()
2613 struct gfs2_rgrpd *rgd; in gfs2_check_blk_type() local
2618 rgd = gfs2_blk2rgrpd(sdp, no_addr, 1); in gfs2_check_blk_type()
2619 if (!rgd) in gfs2_check_blk_type()
2622 error = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_SHARED, 0, &rgd_gh); in gfs2_check_blk_type()
2626 rbm.rgd = rgd; in gfs2_check_blk_type()
2662 struct gfs2_rgrpd *rgd; in gfs2_rlist_add() local
2675 rgd = rlist->rl_rgd[rlist->rl_rgrps - 1]; in gfs2_rlist_add()
2676 if (rgrp_contains_block(rgd, block)) in gfs2_rlist_add()
2678 rgd = gfs2_blk2rgrpd(sdp, block, 1); in gfs2_rlist_add()
2680 rgd = ip->i_res.rs_rgd; in gfs2_rlist_add()
2681 if (!rgd || !rgrp_contains_block(rgd, block)) in gfs2_rlist_add()
2682 rgd = gfs2_blk2rgrpd(sdp, block, 1); in gfs2_rlist_add()
2685 if (!rgd) { in gfs2_rlist_add()
2692 if (rlist->rl_rgd[x] == rgd) { in gfs2_rlist_add()
2715 rlist->rl_rgd[rlist->rl_rgrps++] = rgd; in gfs2_rlist_add()
2762 void rgrp_lock_local(struct gfs2_rgrpd *rgd) in rgrp_lock_local() argument
2764 mutex_lock(&rgd->rd_mutex); in rgrp_lock_local()
2767 void rgrp_unlock_local(struct gfs2_rgrpd *rgd) in rgrp_unlock_local() argument
2769 mutex_unlock(&rgd->rd_mutex); in rgrp_unlock_local()