Lines Matching refs:rbm

51 	struct gfs2_rbm rbm;  member
63 static int gfs2_rbm_find(struct gfs2_rbm *rbm, u8 state, u32 *minext,
75 static inline void gfs2_setbit(const struct gfs2_rbm *rbm, bool do_clone, in gfs2_setbit() argument
79 struct gfs2_bitmap *bi = rbm_bi(rbm); in gfs2_setbit()
81 const unsigned int bit = (rbm->offset % GFS2_NBBY) * GFS2_BIT_SIZE; in gfs2_setbit()
83 byte1 = bi->bi_bh->b_data + bi->bi_offset + (rbm->offset / GFS2_NBBY); in gfs2_setbit()
91 struct gfs2_sbd *sdp = rbm->rgd->rd_sbd; in gfs2_setbit()
94 rbm->offset, cur_state, new_state); in gfs2_setbit()
96 (unsigned long long)rbm->rgd->rd_addr, bi->bi_start, in gfs2_setbit()
100 (unsigned long long)gfs2_rbm_to_block(rbm)); in gfs2_setbit()
102 gfs2_consist_rgrpd(rbm->rgd); in gfs2_setbit()
108 byte2 = bi->bi_clone + bi->bi_offset + (rbm->offset / GFS2_NBBY); in gfs2_setbit()
125 static inline u8 gfs2_testbit(const struct gfs2_rbm *rbm, bool use_clone) in gfs2_testbit() argument
127 struct gfs2_bitmap *bi = rbm_bi(rbm); in gfs2_testbit()
137 byte = buffer + (rbm->offset / GFS2_NBBY); in gfs2_testbit()
138 bit = (rbm->offset % GFS2_NBBY) * GFS2_BIT_SIZE; in gfs2_testbit()
261 static int gfs2_rbm_from_block(struct gfs2_rbm *rbm, u64 block) in gfs2_rbm_from_block() argument
263 if (!rgrp_contains_block(rbm->rgd, block)) in gfs2_rbm_from_block()
265 rbm->bii = 0; in gfs2_rbm_from_block()
266 rbm->offset = block - rbm->rgd->rd_data0; in gfs2_rbm_from_block()
268 if (rbm->offset < rbm_bi(rbm)->bi_blocks) in gfs2_rbm_from_block()
272 rbm->offset += (sizeof(struct gfs2_rgrp) - in gfs2_rbm_from_block()
274 rbm->bii = rbm->offset / rbm->rgd->rd_sbd->sd_blocks_per_bitmap; in gfs2_rbm_from_block()
275 rbm->offset -= rbm->bii * rbm->rgd->rd_sbd->sd_blocks_per_bitmap; in gfs2_rbm_from_block()
291 static bool gfs2_rbm_incr(struct gfs2_rbm *rbm) in gfs2_rbm_incr() argument
293 if (rbm->offset + 1 < rbm_bi(rbm)->bi_blocks) { /* in the same bitmap */ in gfs2_rbm_incr()
294 rbm->offset++; in gfs2_rbm_incr()
297 if (rbm->bii == rbm->rgd->rd_length - 1) /* at the last bitmap */ in gfs2_rbm_incr()
300 rbm->offset = 0; in gfs2_rbm_incr()
301 rbm->bii++; in gfs2_rbm_incr()
314 static bool gfs2_unaligned_extlen(struct gfs2_rbm *rbm, u32 n_unaligned, u32 *len) in gfs2_unaligned_extlen() argument
320 res = gfs2_testbit(rbm, true); in gfs2_unaligned_extlen()
326 if (gfs2_rbm_incr(rbm)) in gfs2_unaligned_extlen()
350 struct gfs2_rbm rbm = *rrbm; in gfs2_free_extlen() local
351 u32 n_unaligned = rbm.offset & 3; in gfs2_free_extlen()
360 gfs2_unaligned_extlen(&rbm, 4 - n_unaligned, &len)) in gfs2_free_extlen()
366 bi = rbm_bi(&rbm); in gfs2_free_extlen()
372 BUG_ON(rbm.offset & 3); in gfs2_free_extlen()
373 start += (rbm.offset / GFS2_NBBY); in gfs2_free_extlen()
380 block = gfs2_rbm_to_block(&rbm); in gfs2_free_extlen()
381 if (gfs2_rbm_from_block(&rbm, block + chunk_size)) { in gfs2_free_extlen()
394 gfs2_unaligned_extlen(&rbm, n_unaligned, &len); in gfs2_free_extlen()
1536 struct gfs2_rbm rbm = { .rgd = rgd, }; in rg_mblk_search() local
1559 if (WARN_ON(gfs2_rbm_from_block(&rbm, goal))) in rg_mblk_search()
1562 ret = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &extlen, ip, true); in rg_mblk_search()
1564 rs->rs_rbm = rbm; in rg_mblk_search()
1637 static int gfs2_reservation_check_and_update(struct gfs2_rbm *rbm, in gfs2_reservation_check_and_update() argument
1642 u64 block = gfs2_rbm_to_block(rbm); in gfs2_reservation_check_and_update()
1652 extlen = gfs2_free_extlen(rbm, minext); in gfs2_reservation_check_and_update()
1661 nblock = gfs2_next_unreserved_block(rbm->rgd, block, extlen, ip); in gfs2_reservation_check_and_update()
1668 maxext->rbm = *rbm; in gfs2_reservation_check_and_update()
1673 ret = gfs2_rbm_from_block(rbm, nblock); in gfs2_reservation_check_and_update()
1698 static int gfs2_rbm_find(struct gfs2_rbm *rbm, u8 state, u32 *minext, in gfs2_rbm_find() argument
1701 bool scan_from_start = rbm->bii == 0 && rbm->offset == 0; in gfs2_rbm_find()
1709 struct gfs2_extent maxext = { .rbm.rgd = rbm->rgd, }; in gfs2_rbm_find()
1716 last_bii = rbm->bii - (rbm->offset == 0); in gfs2_rbm_find()
1719 bi = rbm_bi(rbm); in gfs2_rbm_find()
1730 offset = gfs2_bitfit(buffer, bi->bi_bytes, rbm->offset, state); in gfs2_rbm_find()
1732 if (state == GFS2_BLKST_FREE && rbm->offset == 0) in gfs2_rbm_find()
1736 rbm->offset = offset; in gfs2_rbm_find()
1740 ret = gfs2_reservation_check_and_update(rbm, ip, in gfs2_rbm_find()
1748 rbm->bii = 0; in gfs2_rbm_find()
1749 rbm->offset = 0; in gfs2_rbm_find()
1755 rbm->offset = 0; in gfs2_rbm_find()
1756 rbm->bii++; in gfs2_rbm_find()
1757 if (rbm->bii == rbm->rgd->rd_length) in gfs2_rbm_find()
1758 rbm->bii = 0; in gfs2_rbm_find()
1760 if (rbm->bii == 0) { in gfs2_rbm_find()
1769 if (wrapped && rbm->bii > last_bii) in gfs2_rbm_find()
1779 if (wrapped && (scan_from_start || rbm->bii > last_bii) && in gfs2_rbm_find()
1780 *minext < rbm->rgd->rd_extfail_pt) in gfs2_rbm_find()
1781 rbm->rgd->rd_extfail_pt = *minext; in gfs2_rbm_find()
1786 *rbm = maxext.rbm; in gfs2_rbm_find()
1812 struct gfs2_rbm rbm = { .rgd = rgd, .bii = 0, .offset = 0 }; in try_rgrp_unlink() local
1815 error = gfs2_rbm_find(&rbm, GFS2_BLKST_UNLINKED, NULL, NULL, in try_rgrp_unlink()
1822 block = gfs2_rbm_to_block(&rbm); in try_rgrp_unlink()
1823 if (gfs2_rbm_from_block(&rbm, block + 1)) in try_rgrp_unlink()
2155 static void gfs2_alloc_extent(const struct gfs2_rbm *rbm, bool dinode, in gfs2_alloc_extent() argument
2158 struct gfs2_rbm pos = { .rgd = rbm->rgd, }; in gfs2_alloc_extent()
2164 block = gfs2_rbm_to_block(rbm); in gfs2_alloc_extent()
2165 gfs2_trans_add_meta(rbm->rgd->rd_gl, rbm_bi(rbm)->bi_bh); in gfs2_alloc_extent()
2166 gfs2_setbit(rbm, true, dinode ? GFS2_BLKST_DINODE : GFS2_BLKST_USED); in gfs2_alloc_extent()
2191 struct gfs2_rbm rbm; in rgblk_free() local
2194 rbm.rgd = rgd; in rgblk_free()
2195 if (WARN_ON_ONCE(gfs2_rbm_from_block(&rbm, bstart))) in rgblk_free()
2198 bi = rbm_bi(&rbm); in rgblk_free()
2207 gfs2_trans_add_meta(rbm.rgd->rd_gl, bi->bi_bh); in rgblk_free()
2210 gfs2_setbit(&rbm, false, new_state); in rgblk_free()
2211 gfs2_rbm_incr(&rbm); in rgblk_free()
2275 const struct gfs2_rbm *rbm, unsigned len) in gfs2_adjust_reservation() argument
2278 struct gfs2_rgrpd *rgd = rbm->rgd; in gfs2_adjust_reservation()
2285 if (gfs2_rbm_eq(&rs->rs_rbm, rbm)) { in gfs2_adjust_reservation()
2286 block = gfs2_rbm_to_block(rbm); in gfs2_adjust_reservation()
2315 static void gfs2_set_alloc_start(struct gfs2_rbm *rbm, in gfs2_set_alloc_start() argument
2321 *rbm = ip->i_res.rs_rbm; in gfs2_set_alloc_start()
2325 if (!dinode && rgrp_contains_block(rbm->rgd, ip->i_goal)) in gfs2_set_alloc_start()
2328 goal = rbm->rgd->rd_last_alloc + rbm->rgd->rd_data0; in gfs2_set_alloc_start()
2330 if (WARN_ON_ONCE(gfs2_rbm_from_block(rbm, goal))) { in gfs2_set_alloc_start()
2331 rbm->bii = 0; in gfs2_set_alloc_start()
2332 rbm->offset = 0; in gfs2_set_alloc_start()
2352 struct gfs2_rbm rbm = { .rgd = ip->i_res.rs_rbm.rgd, }; in gfs2_alloc_blocks() local
2357 gfs2_set_alloc_start(&rbm, ip, dinode); in gfs2_alloc_blocks()
2358 error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, NULL, ip, false); in gfs2_alloc_blocks()
2361 gfs2_set_alloc_start(&rbm, ip, dinode); in gfs2_alloc_blocks()
2362 error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, NULL, NULL, false); in gfs2_alloc_blocks()
2369 test_bit(GBF_FULL, &rbm.rgd->rd_bits->bi_flags), in gfs2_alloc_blocks()
2370 rbm.rgd->rd_extfail_pt); in gfs2_alloc_blocks()
2374 gfs2_alloc_extent(&rbm, dinode, nblocks); in gfs2_alloc_blocks()
2375 block = gfs2_rbm_to_block(&rbm); in gfs2_alloc_blocks()
2376 rbm.rgd->rd_last_alloc = block - rbm.rgd->rd_data0; in gfs2_alloc_blocks()
2378 gfs2_adjust_reservation(ip, &rbm, *nblocks); in gfs2_alloc_blocks()
2395 if (rbm.rgd->rd_free < *nblocks) { in gfs2_alloc_blocks()
2400 rbm.rgd->rd_free -= *nblocks; in gfs2_alloc_blocks()
2402 rbm.rgd->rd_dinodes++; in gfs2_alloc_blocks()
2403 *generation = rbm.rgd->rd_igeneration++; in gfs2_alloc_blocks()
2405 *generation = rbm.rgd->rd_igeneration++; in gfs2_alloc_blocks()
2408 gfs2_trans_add_meta(rbm.rgd->rd_gl, rbm.rgd->rd_bits[0].bi_bh); in gfs2_alloc_blocks()
2409 gfs2_rgrp_out(rbm.rgd, rbm.rgd->rd_bits[0].bi_bh->b_data); in gfs2_alloc_blocks()
2417 rbm.rgd->rd_free_clone -= *nblocks; in gfs2_alloc_blocks()
2418 trace_gfs2_block_alloc(ip, rbm.rgd, block, *nblocks, in gfs2_alloc_blocks()
2424 gfs2_rgrp_error(rbm.rgd); in gfs2_alloc_blocks()
2526 struct gfs2_rbm rbm; in gfs2_check_blk_type() local
2537 rbm.rgd = rgd; in gfs2_check_blk_type()
2538 error = gfs2_rbm_from_block(&rbm, no_addr); in gfs2_check_blk_type()
2540 if (gfs2_testbit(&rbm, false) != type) in gfs2_check_blk_type()