Lines Matching refs:rbm

45 static inline struct gfs2_bitmap *rbm_bi(const struct gfs2_rbm *rbm)  in rbm_bi()  argument
47 return rbm->rgd->rd_bits + rbm->bii; in rbm_bi()
50 static inline u64 gfs2_rbm_to_block(const struct gfs2_rbm *rbm) in gfs2_rbm_to_block() argument
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()
54 rbm->offset; in gfs2_rbm_to_block()
69 struct gfs2_rbm rbm; member
81 static int gfs2_rbm_find(struct gfs2_rbm *rbm, u8 state, u32 *minext,
93 static inline void gfs2_setbit(const struct gfs2_rbm *rbm, bool do_clone, in gfs2_setbit() argument
97 struct gfs2_bitmap *bi = rbm_bi(rbm); in gfs2_setbit()
99 const unsigned int bit = (rbm->offset % GFS2_NBBY) * GFS2_BIT_SIZE; in gfs2_setbit()
101 byte1 = bi->bi_bh->b_data + bi->bi_offset + (rbm->offset / GFS2_NBBY); in gfs2_setbit()
109 struct gfs2_sbd *sdp = rbm->rgd->rd_sbd; in gfs2_setbit()
112 rbm->offset, cur_state, new_state); in gfs2_setbit()
114 (unsigned long long)rbm->rgd->rd_addr, bi->bi_start, in gfs2_setbit()
118 (unsigned long long)gfs2_rbm_to_block(rbm)); in gfs2_setbit()
120 gfs2_consist_rgrpd(rbm->rgd); in gfs2_setbit()
126 byte2 = bi->bi_clone + bi->bi_offset + (rbm->offset / GFS2_NBBY); in gfs2_setbit()
143 static inline u8 gfs2_testbit(const struct gfs2_rbm *rbm, bool use_clone) in gfs2_testbit() argument
145 struct gfs2_bitmap *bi = rbm_bi(rbm); in gfs2_testbit()
155 byte = buffer + (rbm->offset / GFS2_NBBY); in gfs2_testbit()
156 bit = (rbm->offset % GFS2_NBBY) * GFS2_BIT_SIZE; in gfs2_testbit()
277 static int gfs2_rbm_from_block(struct gfs2_rbm *rbm, u64 block) in gfs2_rbm_from_block() argument
279 if (!rgrp_contains_block(rbm->rgd, block)) in gfs2_rbm_from_block()
281 rbm->bii = 0; in gfs2_rbm_from_block()
282 rbm->offset = block - rbm->rgd->rd_data0; in gfs2_rbm_from_block()
284 if (rbm->offset < rbm_bi(rbm)->bi_blocks) in gfs2_rbm_from_block()
288 rbm->offset += (sizeof(struct gfs2_rgrp) - 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()
306 static bool gfs2_rbm_add(struct gfs2_rbm *rbm, u32 blocks) in gfs2_rbm_add() argument
308 struct gfs2_rgrpd *rgd = rbm->rgd; in gfs2_rbm_add()
309 struct gfs2_bitmap *bi = rgd->rd_bits + rbm->bii; in gfs2_rbm_add()
311 if (rbm->offset + blocks < bi->bi_blocks) { in gfs2_rbm_add()
312 rbm->offset += blocks; in gfs2_rbm_add()
315 blocks -= bi->bi_blocks - rbm->offset; in gfs2_rbm_add()
322 rbm->offset = blocks; in gfs2_rbm_add()
323 rbm->bii = bi - rgd->rd_bits; in gfs2_rbm_add()
340 static bool gfs2_unaligned_extlen(struct gfs2_rbm *rbm, u32 n_unaligned, u32 *len) in gfs2_unaligned_extlen() argument
346 res = gfs2_testbit(rbm, true); in gfs2_unaligned_extlen()
352 if (gfs2_rbm_add(rbm, 1)) in gfs2_unaligned_extlen()
376 struct gfs2_rbm rbm = *rrbm; in gfs2_free_extlen() local
377 u32 n_unaligned = rbm.offset & 3; in gfs2_free_extlen()
386 gfs2_unaligned_extlen(&rbm, 4 - n_unaligned, &len)) in gfs2_free_extlen()
392 bi = rbm_bi(&rbm); in gfs2_free_extlen()
398 BUG_ON(rbm.offset & 3); in gfs2_free_extlen()
399 start += (rbm.offset / GFS2_NBBY); in gfs2_free_extlen()
406 block = gfs2_rbm_to_block(&rbm); in gfs2_free_extlen()
407 if (gfs2_rbm_from_block(&rbm, block + chunk_size)) { in gfs2_free_extlen()
420 gfs2_unaligned_extlen(&rbm, n_unaligned, &len); in gfs2_free_extlen()
1565 struct gfs2_rbm rbm = { .rgd = rgd, }; in rg_mblk_search() local
1597 if (WARN_ON(gfs2_rbm_from_block(&rbm, goal))) in rg_mblk_search()
1600 ret = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &extlen, &ip->i_res, true); in rg_mblk_search()
1602 rs->rs_start = gfs2_rbm_to_block(&rbm); in rg_mblk_search()
1675 static int gfs2_reservation_check_and_update(struct gfs2_rbm *rbm, in gfs2_reservation_check_and_update() argument
1680 u64 block = gfs2_rbm_to_block(rbm); in gfs2_reservation_check_and_update()
1689 extlen = gfs2_free_extlen(rbm, minext); in gfs2_reservation_check_and_update()
1698 nblock = gfs2_next_unreserved_block(rbm->rgd, block, extlen, rs); in gfs2_reservation_check_and_update()
1705 maxext->rbm = *rbm; in gfs2_reservation_check_and_update()
1714 if (gfs2_rbm_add(rbm, extlen)) in gfs2_reservation_check_and_update()
1738 static int gfs2_rbm_find(struct gfs2_rbm *rbm, u8 state, u32 *minext, in gfs2_rbm_find() argument
1741 bool scan_from_start = rbm->bii == 0 && rbm->offset == 0; in gfs2_rbm_find()
1749 struct gfs2_extent maxext = { .rbm.rgd = rbm->rgd, }; in gfs2_rbm_find()
1756 last_bii = rbm->bii - (rbm->offset == 0); in gfs2_rbm_find()
1759 bi = rbm_bi(rbm); in gfs2_rbm_find()
1769 offset = gfs2_bitfit(buffer, bi->bi_bytes, rbm->offset, state); in gfs2_rbm_find()
1771 if (state == GFS2_BLKST_FREE && rbm->offset == 0) in gfs2_rbm_find()
1775 rbm->offset = offset; in gfs2_rbm_find()
1779 ret = gfs2_reservation_check_and_update(rbm, rs, *minext, in gfs2_rbm_find()
1786 rbm->bii = 0; in gfs2_rbm_find()
1787 rbm->offset = 0; in gfs2_rbm_find()
1793 rbm->offset = 0; in gfs2_rbm_find()
1794 rbm->bii++; in gfs2_rbm_find()
1795 if (rbm->bii == rbm->rgd->rd_length) in gfs2_rbm_find()
1796 rbm->bii = 0; in gfs2_rbm_find()
1798 if (rbm->bii == 0) { in gfs2_rbm_find()
1807 if (wrapped && rbm->bii > last_bii) in gfs2_rbm_find()
1817 if (wrapped && (scan_from_start || rbm->bii > last_bii) && 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()
1824 *rbm = maxext.rbm; in gfs2_rbm_find()
1850 struct gfs2_rbm rbm = { .rgd = rgd, .bii = 0, .offset = 0 }; in try_rgrp_unlink() local
1853 error = gfs2_rbm_find(&rbm, GFS2_BLKST_UNLINKED, NULL, NULL, in try_rgrp_unlink()
1860 block = gfs2_rbm_to_block(&rbm); in try_rgrp_unlink()
1861 if (gfs2_rbm_from_block(&rbm, block + 1)) in try_rgrp_unlink()
2229 static void gfs2_alloc_extent(const struct gfs2_rbm *rbm, bool dinode, in gfs2_alloc_extent() argument
2232 struct gfs2_rbm pos = { .rgd = rbm->rgd, }; in gfs2_alloc_extent()
2238 block = gfs2_rbm_to_block(rbm); in gfs2_alloc_extent()
2239 gfs2_trans_add_meta(rbm->rgd->rd_gl, rbm_bi(rbm)->bi_bh); in gfs2_alloc_extent()
2240 gfs2_setbit(rbm, true, dinode ? GFS2_BLKST_DINODE : GFS2_BLKST_USED); in gfs2_alloc_extent()
2265 struct gfs2_rbm rbm; in rgblk_free() local
2268 rbm.rgd = rgd; in rgblk_free()
2269 if (WARN_ON_ONCE(gfs2_rbm_from_block(&rbm, bstart))) in rgblk_free()
2272 bi = rbm_bi(&rbm); in rgblk_free()
2281 gfs2_trans_add_meta(rbm.rgd->rd_gl, bi->bi_bh); in rgblk_free()
2284 gfs2_setbit(&rbm, false, new_state); in rgblk_free()
2285 gfs2_rbm_add(&rbm, 1); in rgblk_free()
2349 const struct gfs2_rbm *rbm, unsigned len) in gfs2_adjust_reservation() argument
2352 struct gfs2_rgrpd *rgd = rbm->rgd; in gfs2_adjust_reservation()
2357 u64 start = gfs2_rbm_to_block(rbm); in gfs2_adjust_reservation()
2389 static void gfs2_set_alloc_start(struct gfs2_rbm *rbm, in gfs2_set_alloc_start() argument
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()
2402 if (WARN_ON_ONCE(gfs2_rbm_from_block(rbm, goal))) { in gfs2_set_alloc_start()
2403 rbm->bii = 0; in gfs2_set_alloc_start()
2404 rbm->offset = 0; in gfs2_set_alloc_start()
2424 struct gfs2_rbm rbm = { .rgd = ip->i_res.rs_rgd, }; in gfs2_alloc_blocks() local
2431 rgrp_lock_local(rbm.rgd); in gfs2_alloc_blocks()
2433 gfs2_set_alloc_start(&rbm, ip, dinode); in gfs2_alloc_blocks()
2434 error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext, &ip->i_res, false); in gfs2_alloc_blocks()
2437 gfs2_set_alloc_start(&rbm, ip, dinode); in gfs2_alloc_blocks()
2438 error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext, NULL, false); 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()
2450 gfs2_alloc_extent(&rbm, dinode, nblocks); in gfs2_alloc_blocks()
2451 block = gfs2_rbm_to_block(&rbm); 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()
2466 gfs2_adjust_reservation(ip, &rbm, *nblocks); 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()
2615 struct gfs2_rbm rbm; in gfs2_check_blk_type() local
2626 rbm.rgd = rgd; in gfs2_check_blk_type()
2627 error = gfs2_rbm_from_block(&rbm, no_addr); in gfs2_check_blk_type()
2636 if (gfs2_testbit(&rbm, false) != type) in gfs2_check_blk_type()