Lines Matching defs:rbm

51 	struct gfs2_rbm rbm;
63 static int gfs2_rbm_find(struct gfs2_rbm *rbm, u8 state, u32 *minext,
69 * @rbm: The position of the bit to set
75 static inline void gfs2_setbit(const struct gfs2_rbm *rbm, bool do_clone,
79 struct gfs2_bitmap *bi = rbm_bi(rbm);
81 const unsigned int bit = (rbm->offset % GFS2_NBBY) * GFS2_BIT_SIZE;
83 byte1 = bi->bi_bh->b_data + bi->bi_offset + (rbm->offset / GFS2_NBBY);
91 struct gfs2_sbd *sdp = rbm->rgd->rd_sbd;
94 rbm->offset, cur_state, new_state);
96 (unsigned long long)rbm->rgd->rd_addr, bi->bi_start,
100 (unsigned long long)gfs2_rbm_to_block(rbm));
102 gfs2_consist_rgrpd(rbm->rgd);
108 byte2 = bi->bi_clone + bi->bi_offset + (rbm->offset / GFS2_NBBY);
116 * @rbm: The bit to test
125 static inline u8 gfs2_testbit(const struct gfs2_rbm *rbm, bool use_clone)
127 struct gfs2_bitmap *bi = rbm_bi(rbm);
137 byte = buffer + (rbm->offset / GFS2_NBBY);
138 bit = (rbm->offset % GFS2_NBBY) * GFS2_BIT_SIZE;
249 * gfs2_rbm_from_block - Set the rbm based upon rgd and block number
250 * @rbm: The rbm with rgd already set correctly
253 * This sets the bi and offset members of an rbm based on a
255 * resource group must be set in the rbm on entry, the bi and
261 static int gfs2_rbm_from_block(struct gfs2_rbm *rbm, u64 block)
263 if (!rgrp_contains_block(rbm->rgd, block))
265 rbm->bii = 0;
266 rbm->offset = block - rbm->rgd->rd_data0;
268 if (rbm->offset < rbm_bi(rbm)->bi_blocks)
272 rbm->offset += (sizeof(struct gfs2_rgrp) -
274 rbm->bii = rbm->offset / rbm->rgd->rd_sbd->sd_blocks_per_bitmap;
275 rbm->offset -= rbm->bii * rbm->rgd->rd_sbd->sd_blocks_per_bitmap;
280 * gfs2_rbm_incr - increment an rbm structure
281 * @rbm: The rbm with rgd already set correctly
283 * This function takes an existing rbm structure and increments it to the next
286 * Returns: If incrementing the offset would cause the rbm to go past the
291 static bool gfs2_rbm_incr(struct gfs2_rbm *rbm)
293 if (rbm->offset + 1 < rbm_bi(rbm)->bi_blocks) { /* in the same bitmap */
294 rbm->offset++;
297 if (rbm->bii == rbm->rgd->rd_length - 1) /* at the last bitmap */
300 rbm->offset = 0;
301 rbm->bii++;
307 * @rbm: Position to search (value/result)
314 static bool gfs2_unaligned_extlen(struct gfs2_rbm *rbm, u32 n_unaligned, u32 *len)
320 res = gfs2_testbit(rbm, true);
326 if (gfs2_rbm_incr(rbm))
338 * Starting at the block specified by the rbm, see how many free blocks
350 struct gfs2_rbm rbm = *rrbm;
351 u32 n_unaligned = rbm.offset & 3;
360 gfs2_unaligned_extlen(&rbm, 4 - n_unaligned, &len))
366 bi = rbm_bi(&rbm);
372 BUG_ON(rbm.offset & 3);
373 start += (rbm.offset / GFS2_NBBY);
380 block = gfs2_rbm_to_block(&rbm);
381 if (gfs2_rbm_from_block(&rbm, block + chunk_size)) {
394 gfs2_unaligned_extlen(&rbm, n_unaligned, &len);
1538 struct gfs2_rbm rbm = { .rgd = rgd, };
1561 if (WARN_ON(gfs2_rbm_from_block(&rbm, goal)))
1564 ret = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &extlen, ip, true);
1566 rs->rs_rbm = rbm;
1625 * @rbm: The current position in the resource group
1636 * Returns: 0 if no reservation, 1 if @rbm has changed, otherwise an error
1639 static int gfs2_reservation_check_and_update(struct gfs2_rbm *rbm,
1644 u64 block = gfs2_rbm_to_block(rbm);
1654 extlen = gfs2_free_extlen(rbm, minext);
1663 nblock = gfs2_next_unreserved_block(rbm->rgd, block, extlen, ip);
1670 maxext->rbm = *rbm;
1675 ret = gfs2_rbm_from_block(rbm, nblock);
1683 * @rbm: Value/result starting position and final position
1700 static int gfs2_rbm_find(struct gfs2_rbm *rbm, u8 state, u32 *minext,
1703 bool scan_from_start = rbm->bii == 0 && rbm->offset == 0;
1711 struct gfs2_extent maxext = { .rbm.rgd = rbm->rgd, };
1718 last_bii = rbm->bii - (rbm->offset == 0);
1721 bi = rbm_bi(rbm);
1731 offset = gfs2_bitfit(buffer, bi->bi_bytes, rbm->offset, state);
1733 if (state == GFS2_BLKST_FREE && rbm->offset == 0)
1737 rbm->offset = offset;
1741 ret = gfs2_reservation_check_and_update(rbm, ip, *minext,
1748 rbm->bii = 0;
1749 rbm->offset = 0;
1755 rbm->offset = 0;
1756 rbm->bii++;
1757 if (rbm->bii == rbm->rgd->rd_length)
1758 rbm->bii = 0;
1760 if (rbm->bii == 0) {
1769 if (wrapped && rbm->bii > last_bii)
1779 if (wrapped && (scan_from_start || rbm->bii > last_bii) &&
1780 *minext < rbm->rgd->rd_extfail_pt)
1781 rbm->rgd->rd_extfail_pt = *minext - 1;
1786 *rbm = maxext.rbm;
1812 struct gfs2_rbm rbm = { .rgd = rgd, .bii = 0, .offset = 0 };
1815 error = gfs2_rbm_find(&rbm, GFS2_BLKST_UNLINKED, NULL, NULL,
1822 block = gfs2_rbm_to_block(&rbm);
1823 if (gfs2_rbm_from_block(&rbm, block + 1))
2148 * @rbm: the resource group information
2155 static void gfs2_alloc_extent(const struct gfs2_rbm *rbm, bool dinode,
2158 struct gfs2_rbm pos = { .rgd = rbm->rgd, };
2164 block = gfs2_rbm_to_block(rbm);
2165 gfs2_trans_add_meta(rbm->rgd->rd_gl, rbm_bi(rbm)->bi_bh);
2166 gfs2_setbit(rbm, true, dinode ? GFS2_BLKST_DINODE : GFS2_BLKST_USED);
2191 struct gfs2_rbm rbm;
2194 rbm.rgd = rgd;
2195 if (WARN_ON_ONCE(gfs2_rbm_from_block(&rbm, bstart)))
2198 bi = rbm_bi(&rbm);
2207 gfs2_trans_add_meta(rbm.rgd->rd_gl, bi->bi_bh);
2210 gfs2_setbit(&rbm, false, new_state);
2211 gfs2_rbm_incr(&rbm);
2266 * @rbm: The start of the allocated blocks
2275 const struct gfs2_rbm *rbm, unsigned len)
2278 struct gfs2_rgrpd *rgd = rbm->rgd;
2285 if (gfs2_rbm_eq(&rs->rs_rbm, rbm)) {
2286 block = gfs2_rbm_to_block(rbm);
2306 * @rbm: The rbm which will be set to the required location
2315 static void gfs2_set_alloc_start(struct gfs2_rbm *rbm,
2321 *rbm = ip->i_res.rs_rbm;
2325 if (!dinode && rgrp_contains_block(rbm->rgd, ip->i_goal))
2328 goal = rbm->rgd->rd_last_alloc + rbm->rgd->rd_data0;
2330 if (WARN_ON_ONCE(gfs2_rbm_from_block(rbm, goal))) {
2331 rbm->bii = 0;
2332 rbm->offset = 0;
2352 struct gfs2_rbm rbm = { .rgd = ip->i_res.rs_rbm.rgd, };
2358 gfs2_set_alloc_start(&rbm, ip, dinode);
2359 error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext, ip, false);
2362 gfs2_set_alloc_start(&rbm, ip, dinode);
2363 error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext, NULL, false);
2370 test_bit(GBF_FULL, &rbm.rgd->rd_bits->bi_flags),
2371 rbm.rgd->rd_extfail_pt);
2375 gfs2_alloc_extent(&rbm, dinode, nblocks);
2376 block = gfs2_rbm_to_block(&rbm);
2377 rbm.rgd->rd_last_alloc = block - rbm.rgd->rd_data0;
2379 gfs2_adjust_reservation(ip, &rbm, *nblocks);
2396 if (rbm.rgd->rd_free < *nblocks) {
2401 rbm.rgd->rd_free -= *nblocks;
2403 rbm.rgd->rd_dinodes++;
2404 *generation = rbm.rgd->rd_igeneration++;
2406 *generation = rbm.rgd->rd_igeneration++;
2409 gfs2_trans_add_meta(rbm.rgd->rd_gl, rbm.rgd->rd_bits[0].bi_bh);
2410 gfs2_rgrp_out(rbm.rgd, rbm.rgd->rd_bits[0].bi_bh->b_data);
2418 rbm.rgd->rd_free_clone -= *nblocks;
2419 trace_gfs2_block_alloc(ip, rbm.rgd, block, *nblocks,
2425 gfs2_rgrp_error(rbm.rgd);
2527 struct gfs2_rbm rbm;
2538 rbm.rgd = rgd;
2539 error = gfs2_rbm_from_block(&rbm, no_addr);
2541 if (gfs2_testbit(&rbm, false) != type)