Lines Matching refs:rbm

63 	struct gfs2_rbm rbm;  member
75 static int gfs2_rbm_find(struct gfs2_rbm *rbm, u8 state, u32 *minext,
88 static inline void gfs2_setbit(const struct gfs2_rbm *rbm, bool do_clone, in gfs2_setbit() argument
92 struct gfs2_bitmap *bi = rbm_bi(rbm); in gfs2_setbit()
94 const unsigned int bit = (rbm->offset % GFS2_NBBY) * GFS2_BIT_SIZE; in gfs2_setbit()
96 byte1 = bi->bi_bh->b_data + bi->bi_offset + (rbm->offset / GFS2_NBBY); in gfs2_setbit()
105 rbm->offset, cur_state, new_state); in gfs2_setbit()
107 (unsigned long long)rbm->rgd->rd_addr, bi->bi_start); in gfs2_setbit()
111 gfs2_consist_rgrpd(rbm->rgd); in gfs2_setbit()
117 byte2 = bi->bi_clone + bi->bi_offset + (rbm->offset / GFS2_NBBY); in gfs2_setbit()
130 static inline u8 gfs2_testbit(const struct gfs2_rbm *rbm) in gfs2_testbit() argument
132 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 u64 rblock = block - rbm->rgd->rd_data0; in gfs2_rbm_from_block()
267 if (block >= rbm->rgd->rd_data0 + rbm->rgd->rd_data) in gfs2_rbm_from_block()
270 rbm->bii = 0; in gfs2_rbm_from_block()
271 rbm->offset = (u32)(rblock); in gfs2_rbm_from_block()
273 if (rbm->offset < rbm_bi(rbm)->bi_blocks) in gfs2_rbm_from_block()
277 rbm->offset += (sizeof(struct gfs2_rgrp) - in gfs2_rbm_from_block()
279 rbm->bii = rbm->offset / rbm->rgd->rd_sbd->sd_blocks_per_bitmap; in gfs2_rbm_from_block()
280 rbm->offset -= rbm->bii * rbm->rgd->rd_sbd->sd_blocks_per_bitmap; in gfs2_rbm_from_block()
296 static bool gfs2_rbm_incr(struct gfs2_rbm *rbm) in gfs2_rbm_incr() argument
298 if (rbm->offset + 1 < rbm_bi(rbm)->bi_blocks) { /* in the same bitmap */ in gfs2_rbm_incr()
299 rbm->offset++; in gfs2_rbm_incr()
302 if (rbm->bii == rbm->rgd->rd_length - 1) /* at the last bitmap */ in gfs2_rbm_incr()
305 rbm->offset = 0; in gfs2_rbm_incr()
306 rbm->bii++; in gfs2_rbm_incr()
319 static bool gfs2_unaligned_extlen(struct gfs2_rbm *rbm, u32 n_unaligned, u32 *len) in gfs2_unaligned_extlen() argument
325 res = gfs2_testbit(rbm); in gfs2_unaligned_extlen()
331 if (gfs2_rbm_incr(rbm)) in gfs2_unaligned_extlen()
355 struct gfs2_rbm rbm = *rrbm; in gfs2_free_extlen() local
356 u32 n_unaligned = rbm.offset & 3; in gfs2_free_extlen()
365 gfs2_unaligned_extlen(&rbm, 4 - n_unaligned, &len)) in gfs2_free_extlen()
371 bi = rbm_bi(&rbm); in gfs2_free_extlen()
377 BUG_ON(rbm.offset & 3); in gfs2_free_extlen()
378 start += (rbm.offset / GFS2_NBBY); in gfs2_free_extlen()
385 block = gfs2_rbm_to_block(&rbm); in gfs2_free_extlen()
386 if (gfs2_rbm_from_block(&rbm, block + chunk_size)) { in gfs2_free_extlen()
399 gfs2_unaligned_extlen(&rbm, n_unaligned, &len); in gfs2_free_extlen()
1504 struct gfs2_rbm rbm = { .rgd = rgd, }; in rg_mblk_search() local
1527 if (WARN_ON(gfs2_rbm_from_block(&rbm, goal))) in rg_mblk_search()
1530 ret = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &extlen, ip, true, ap); in rg_mblk_search()
1532 rs->rs_rbm = rbm; in rg_mblk_search()
1606 static int gfs2_reservation_check_and_update(struct gfs2_rbm *rbm, in gfs2_reservation_check_and_update() argument
1611 u64 block = gfs2_rbm_to_block(rbm); in gfs2_reservation_check_and_update()
1621 extlen = gfs2_free_extlen(rbm, minext); in gfs2_reservation_check_and_update()
1630 nblock = gfs2_next_unreserved_block(rbm->rgd, block, extlen, ip); in gfs2_reservation_check_and_update()
1637 maxext->rbm = *rbm; in gfs2_reservation_check_and_update()
1642 ret = gfs2_rbm_from_block(rbm, nblock); in gfs2_reservation_check_and_update()
1668 static int gfs2_rbm_find(struct gfs2_rbm *rbm, u8 state, u32 *minext, in gfs2_rbm_find() argument
1675 int first_bii = rbm->bii; in gfs2_rbm_find()
1676 u32 first_offset = rbm->offset; in gfs2_rbm_find()
1680 int iters = rbm->rgd->rd_length; in gfs2_rbm_find()
1683 struct gfs2_extent maxext = { .rbm.rgd = rbm->rgd, }; in gfs2_rbm_find()
1689 if (rbm->offset != 0) in gfs2_rbm_find()
1693 bi = rbm_bi(rbm); in gfs2_rbm_find()
1703 initial_offset = rbm->offset; in gfs2_rbm_find()
1704 offset = gfs2_bitfit(buffer, bi->bi_len, rbm->offset, state); in gfs2_rbm_find()
1707 rbm->offset = offset; in gfs2_rbm_find()
1711 initial_bii = rbm->bii; in gfs2_rbm_find()
1712 ret = gfs2_reservation_check_and_update(rbm, ip, in gfs2_rbm_find()
1718 n += (rbm->bii - initial_bii); in gfs2_rbm_find()
1722 rbm->bii = 0; in gfs2_rbm_find()
1723 rbm->offset = 0; in gfs2_rbm_find()
1724 n += (rbm->bii - initial_bii); in gfs2_rbm_find()
1734 rbm->offset = 0; in gfs2_rbm_find()
1735 rbm->bii++; in gfs2_rbm_find()
1736 if (rbm->bii == rbm->rgd->rd_length) in gfs2_rbm_find()
1737 rbm->bii = 0; in gfs2_rbm_find()
1739 if ((rbm->bii == 0) && nowrap) in gfs2_rbm_find()
1754 (*minext < rbm->rgd->rd_extfail_pt)) in gfs2_rbm_find()
1755 rbm->rgd->rd_extfail_pt = *minext; in gfs2_rbm_find()
1760 *rbm = maxext.rbm; in gfs2_rbm_find()
1786 struct gfs2_rbm rbm = { .rgd = rgd, .bii = 0, .offset = 0 }; in try_rgrp_unlink() local
1790 error = gfs2_rbm_find(&rbm, GFS2_BLKST_UNLINKED, NULL, NULL, in try_rgrp_unlink()
1798 block = gfs2_rbm_to_block(&rbm); in try_rgrp_unlink()
1799 if (gfs2_rbm_from_block(&rbm, block + 1)) in try_rgrp_unlink()
2132 struct gfs2_rbm rbm = { .rgd = rgd, }; in gfs2_get_block_type() local
2135 ret = gfs2_rbm_from_block(&rbm, block); in gfs2_get_block_type()
2138 return gfs2_testbit(&rbm); in gfs2_get_block_type()
2151 static void gfs2_alloc_extent(const struct gfs2_rbm *rbm, bool dinode, in gfs2_alloc_extent() argument
2154 struct gfs2_rbm pos = { .rgd = rbm->rgd, }; in gfs2_alloc_extent()
2160 block = gfs2_rbm_to_block(rbm); in gfs2_alloc_extent()
2161 gfs2_trans_add_meta(rbm->rgd->rd_gl, rbm_bi(rbm)->bi_bh); in gfs2_alloc_extent()
2162 gfs2_setbit(rbm, true, dinode ? GFS2_BLKST_DINODE : GFS2_BLKST_USED); in gfs2_alloc_extent()
2188 struct gfs2_rbm rbm; in rgblk_free() local
2191 rbm.rgd = gfs2_blk2rgrpd(sdp, bstart, 1); in rgblk_free()
2192 if (!rbm.rgd) { in rgblk_free()
2198 gfs2_rbm_from_block(&rbm, bstart); in rgblk_free()
2200 bi = rbm_bi(&rbm); in rgblk_free()
2209 gfs2_trans_add_meta(rbm.rgd->rd_gl, bi->bi_bh); in rgblk_free()
2212 gfs2_setbit(&rbm, false, new_state); in rgblk_free()
2213 gfs2_rbm_incr(&rbm); in rgblk_free()
2216 return rbm.rgd; in rgblk_free()
2268 const struct gfs2_rbm *rbm, unsigned len) in gfs2_adjust_reservation() argument
2271 struct gfs2_rgrpd *rgd = rbm->rgd; in gfs2_adjust_reservation()
2278 if (gfs2_rbm_eq(&rs->rs_rbm, rbm)) { in gfs2_adjust_reservation()
2279 block = gfs2_rbm_to_block(rbm); in gfs2_adjust_reservation()
2308 static void gfs2_set_alloc_start(struct gfs2_rbm *rbm, in gfs2_set_alloc_start() argument
2314 *rbm = ip->i_res->rs_rbm; in gfs2_set_alloc_start()
2318 if (!dinode && rgrp_contains_block(rbm->rgd, ip->i_goal)) in gfs2_set_alloc_start()
2321 goal = rbm->rgd->rd_last_alloc + rbm->rgd->rd_data0; in gfs2_set_alloc_start()
2323 gfs2_rbm_from_block(rbm, goal); in gfs2_set_alloc_start()
2342 struct gfs2_rbm rbm = { .rgd = ip->i_rgd, }; in gfs2_alloc_blocks() local
2347 gfs2_set_alloc_start(&rbm, ip, dinode); in gfs2_alloc_blocks()
2348 error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, NULL, ip, false, NULL); in gfs2_alloc_blocks()
2351 gfs2_set_alloc_start(&rbm, ip, dinode); in gfs2_alloc_blocks()
2352 error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, NULL, NULL, false, in gfs2_alloc_blocks()
2360 test_bit(GBF_FULL, &rbm.rgd->rd_bits->bi_flags), in gfs2_alloc_blocks()
2361 rbm.rgd->rd_extfail_pt); in gfs2_alloc_blocks()
2365 gfs2_alloc_extent(&rbm, dinode, nblocks); in gfs2_alloc_blocks()
2366 block = gfs2_rbm_to_block(&rbm); in gfs2_alloc_blocks()
2367 rbm.rgd->rd_last_alloc = block - rbm.rgd->rd_data0; in gfs2_alloc_blocks()
2369 gfs2_adjust_reservation(ip, &rbm, *nblocks); in gfs2_alloc_blocks()
2386 if (rbm.rgd->rd_free < *nblocks) { in gfs2_alloc_blocks()
2391 rbm.rgd->rd_free -= *nblocks; in gfs2_alloc_blocks()
2393 rbm.rgd->rd_dinodes++; in gfs2_alloc_blocks()
2394 *generation = rbm.rgd->rd_igeneration++; in gfs2_alloc_blocks()
2396 *generation = rbm.rgd->rd_igeneration++; in gfs2_alloc_blocks()
2399 gfs2_trans_add_meta(rbm.rgd->rd_gl, rbm.rgd->rd_bits[0].bi_bh); in gfs2_alloc_blocks()
2400 gfs2_rgrp_out(rbm.rgd, rbm.rgd->rd_bits[0].bi_bh->b_data); in gfs2_alloc_blocks()
2401 gfs2_rgrp_ondisk2lvb(rbm.rgd->rd_rgl, rbm.rgd->rd_bits[0].bi_bh->b_data); in gfs2_alloc_blocks()
2409 rbm.rgd->rd_free_clone -= *nblocks; in gfs2_alloc_blocks()
2410 trace_gfs2_block_alloc(ip, rbm.rgd, block, *nblocks, in gfs2_alloc_blocks()
2416 gfs2_rgrp_error(rbm.rgd); in gfs2_alloc_blocks()