Lines Matching defs:rbm
45 static inline struct gfs2_bitmap *rbm_bi(const struct gfs2_rbm *rbm)
47 return rbm->rgd->rd_bits + rbm->bii;
50 static inline u64 gfs2_rbm_to_block(const struct gfs2_rbm *rbm)
52 BUG_ON(rbm->offset >= rbm->rgd->rd_data);
53 return rbm->rgd->rd_data0 + (rbm_bi(rbm)->bi_start * GFS2_NBBY) +
54 rbm->offset;
69 struct gfs2_rbm rbm;
81 static int gfs2_rbm_find(struct gfs2_rbm *rbm, u8 state, u32 *minext,
87 * @rbm: The position of the bit to set
93 static inline void gfs2_setbit(const struct gfs2_rbm *rbm, bool do_clone,
97 struct gfs2_bitmap *bi = rbm_bi(rbm);
99 const unsigned int bit = (rbm->offset % GFS2_NBBY) * GFS2_BIT_SIZE;
101 byte1 = bi->bi_bh->b_data + bi->bi_offset + (rbm->offset / GFS2_NBBY);
109 struct gfs2_sbd *sdp = rbm->rgd->rd_sbd;
112 rbm->offset, cur_state, new_state);
114 (unsigned long long)rbm->rgd->rd_addr, bi->bi_start,
118 (unsigned long long)gfs2_rbm_to_block(rbm));
120 gfs2_consist_rgrpd(rbm->rgd);
126 byte2 = bi->bi_clone + bi->bi_offset + (rbm->offset / GFS2_NBBY);
134 * @rbm: The bit to test
143 static inline u8 gfs2_testbit(const struct gfs2_rbm *rbm, bool use_clone)
145 struct gfs2_bitmap *bi = rbm_bi(rbm);
155 byte = buffer + (rbm->offset / GFS2_NBBY);
156 bit = (rbm->offset % GFS2_NBBY) * GFS2_BIT_SIZE;
265 * gfs2_rbm_from_block - Set the rbm based upon rgd and block number
266 * @rbm: The rbm with rgd already set correctly
269 * This sets the bi and offset members of an rbm based on a
271 * resource group must be set in the rbm on entry, the bi and
277 static int gfs2_rbm_from_block(struct gfs2_rbm *rbm, u64 block)
279 if (!rgrp_contains_block(rbm->rgd, block))
281 rbm->bii = 0;
282 rbm->offset = block - rbm->rgd->rd_data0;
284 if (rbm->offset < rbm_bi(rbm)->bi_blocks)
288 rbm->offset += (sizeof(struct gfs2_rgrp) -
290 rbm->bii = rbm->offset / rbm->rgd->rd_sbd->sd_blocks_per_bitmap;
291 rbm->offset -= rbm->bii * rbm->rgd->rd_sbd->sd_blocks_per_bitmap;
296 * gfs2_rbm_add - add a number of blocks to an rbm
297 * @rbm: The rbm with rgd already set correctly
300 * This function takes an existing rbm structure and adds a number of blocks to
303 * Returns: True if the new rbm would point past the end of the rgrp.
306 static bool gfs2_rbm_add(struct gfs2_rbm *rbm, u32 blocks)
308 struct gfs2_rgrpd *rgd = rbm->rgd;
309 struct gfs2_bitmap *bi = rgd->rd_bits + rbm->bii;
311 if (rbm->offset + blocks < bi->bi_blocks) {
312 rbm->offset += blocks;
315 blocks -= bi->bi_blocks - rbm->offset;
322 rbm->offset = blocks;
323 rbm->bii = bi - rgd->rd_bits;
332 * @rbm: Position to search (value/result)
340 static bool gfs2_unaligned_extlen(struct gfs2_rbm *rbm, u32 n_unaligned, u32 *len)
346 res = gfs2_testbit(rbm, true);
352 if (gfs2_rbm_add(rbm, 1))
364 * Starting at the block specified by the rbm, see how many free blocks
376 struct gfs2_rbm rbm = *rrbm;
377 u32 n_unaligned = rbm.offset & 3;
386 gfs2_unaligned_extlen(&rbm, 4 - n_unaligned, &len))
392 bi = rbm_bi(&rbm);
398 BUG_ON(rbm.offset & 3);
399 start += (rbm.offset / GFS2_NBBY);
406 block = gfs2_rbm_to_block(&rbm);
407 if (gfs2_rbm_from_block(&rbm, block + chunk_size)) {
420 gfs2_unaligned_extlen(&rbm, n_unaligned, &len);
1565 struct gfs2_rbm rbm = { .rgd = rgd, };
1597 if (WARN_ON(gfs2_rbm_from_block(&rbm, goal)))
1600 ret = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &extlen, &ip->i_res, true);
1602 rs->rs_start = gfs2_rbm_to_block(&rbm);
1661 * @rbm: The current position in the resource group
1672 * Returns: 0 if no reservation, 1 if @rbm has changed, otherwise an error
1675 static int gfs2_reservation_check_and_update(struct gfs2_rbm *rbm,
1680 u64 block = gfs2_rbm_to_block(rbm);
1689 extlen = gfs2_free_extlen(rbm, minext);
1698 nblock = gfs2_next_unreserved_block(rbm->rgd, block, extlen, rs);
1705 maxext->rbm = *rbm;
1714 if (gfs2_rbm_add(rbm, extlen))
1721 * @rbm: Value/result starting position and final position
1738 static int gfs2_rbm_find(struct gfs2_rbm *rbm, u8 state, u32 *minext,
1741 bool scan_from_start = rbm->bii == 0 && rbm->offset == 0;
1749 struct gfs2_extent maxext = { .rbm.rgd = rbm->rgd, };
1756 last_bii = rbm->bii - (rbm->offset == 0);
1759 bi = rbm_bi(rbm);
1769 offset = gfs2_bitfit(buffer, bi->bi_bytes, rbm->offset, state);
1771 if (state == GFS2_BLKST_FREE && rbm->offset == 0)
1775 rbm->offset = offset;
1779 ret = gfs2_reservation_check_and_update(rbm, rs, *minext,
1786 rbm->bii = 0;
1787 rbm->offset = 0;
1793 rbm->offset = 0;
1794 rbm->bii++;
1795 if (rbm->bii == rbm->rgd->rd_length)
1796 rbm->bii = 0;
1798 if (rbm->bii == 0) {
1807 if (wrapped && rbm->bii > last_bii)
1817 if (wrapped && (scan_from_start || rbm->bii > last_bii) &&
1818 *minext < rbm->rgd->rd_extfail_pt)
1819 rbm->rgd->rd_extfail_pt = *minext - 1;
1824 *rbm = maxext.rbm;
1850 struct gfs2_rbm rbm = { .rgd = rgd, .bii = 0, .offset = 0 };
1853 error = gfs2_rbm_find(&rbm, GFS2_BLKST_UNLINKED, NULL, NULL,
1860 block = gfs2_rbm_to_block(&rbm);
1861 if (gfs2_rbm_from_block(&rbm, block + 1))
2222 * @rbm: the resource group information
2229 static void gfs2_alloc_extent(const struct gfs2_rbm *rbm, bool dinode,
2232 struct gfs2_rbm pos = { .rgd = rbm->rgd, };
2238 block = gfs2_rbm_to_block(rbm);
2239 gfs2_trans_add_meta(rbm->rgd->rd_gl, rbm_bi(rbm)->bi_bh);
2240 gfs2_setbit(rbm, true, dinode ? GFS2_BLKST_DINODE : GFS2_BLKST_USED);
2265 struct gfs2_rbm rbm;
2268 rbm.rgd = rgd;
2269 if (WARN_ON_ONCE(gfs2_rbm_from_block(&rbm, bstart)))
2272 bi = rbm_bi(&rbm);
2281 gfs2_trans_add_meta(rbm.rgd->rd_gl, bi->bi_bh);
2284 gfs2_setbit(&rbm, false, new_state);
2285 gfs2_rbm_add(&rbm, 1);
2340 * @rbm: The start of the allocated blocks
2349 const struct gfs2_rbm *rbm, unsigned len)
2352 struct gfs2_rgrpd *rgd = rbm->rgd;
2357 u64 start = gfs2_rbm_to_block(rbm);
2380 * @rbm: The rbm which will be set to the required location
2389 static void gfs2_set_alloc_start(struct gfs2_rbm *rbm,
2397 if (!dinode && rgrp_contains_block(rbm->rgd, ip->i_goal))
2400 goal = rbm->rgd->rd_last_alloc + rbm->rgd->rd_data0;
2402 if (WARN_ON_ONCE(gfs2_rbm_from_block(rbm, goal))) {
2403 rbm->bii = 0;
2404 rbm->offset = 0;
2424 struct gfs2_rbm rbm = { .rgd = ip->i_res.rs_rgd, };
2431 rgrp_lock_local(rbm.rgd);
2433 gfs2_set_alloc_start(&rbm, ip, dinode);
2434 error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext, &ip->i_res, false);
2437 gfs2_set_alloc_start(&rbm, ip, dinode);
2438 error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext, NULL, false);
2445 test_bit(GBF_FULL, &rbm.rgd->rd_bits->bi_flags),
2446 rbm.rgd->rd_extfail_pt);
2450 gfs2_alloc_extent(&rbm, dinode, nblocks);
2451 block = gfs2_rbm_to_block(&rbm);
2452 rbm.rgd->rd_last_alloc = block - rbm.rgd->rd_data0;
2465 spin_lock(&rbm.rgd->rd_rsspin);
2466 gfs2_adjust_reservation(ip, &rbm, *nblocks);
2467 if (rbm.rgd->rd_free < *nblocks || rbm.rgd->rd_reserved < *nblocks) {
2469 spin_unlock(&rbm.rgd->rd_rsspin);
2472 GLOCK_BUG_ON(rbm.rgd->rd_gl, rbm.rgd->rd_reserved < *nblocks);
2473 GLOCK_BUG_ON(rbm.rgd->rd_gl, rbm.rgd->rd_free_clone < *nblocks);
2474 GLOCK_BUG_ON(rbm.rgd->rd_gl, rbm.rgd->rd_free < *nblocks);
2475 rbm.rgd->rd_reserved -= *nblocks;
2476 rbm.rgd->rd_free_clone -= *nblocks;
2477 rbm.rgd->rd_free -= *nblocks;
2478 spin_unlock(&rbm.rgd->rd_rsspin);
2480 rbm.rgd->rd_dinodes++;
2481 *generation = rbm.rgd->rd_igeneration++;
2483 *generation = rbm.rgd->rd_igeneration++;
2486 gfs2_trans_add_meta(rbm.rgd->rd_gl, rbm.rgd->rd_bits[0].bi_bh);
2487 gfs2_rgrp_out(rbm.rgd, rbm.rgd->rd_bits[0].bi_bh->b_data);
2488 rgrp_unlock_local(rbm.rgd);
2496 trace_gfs2_block_alloc(ip, rbm.rgd, block, *nblocks,
2502 rgrp_unlock_local(rbm.rgd);
2503 gfs2_rgrp_error(rbm.rgd);
2615 struct gfs2_rbm rbm;
2626 rbm.rgd = rgd;
2627 error = gfs2_rbm_from_block(&rbm, no_addr);
2636 if (gfs2_testbit(&rbm, false) != type)