int exfat_bitmap_set_cluster(exfat_bs_t *bs, service_id_t service_id, exfat_cluster_t clst) { fs_node_t *fn; block_t *b = NULL; exfat_node_t *bitmapp; uint8_t *bitmap; int rc; clst -= EXFAT_CLST_FIRST; rc = exfat_bitmap_get(&fn, service_id); if (rc != EOK) return rc; bitmapp = EXFAT_NODE(fn); aoff64_t offset = clst / 8; rc = exfat_block_get(&b, bs, bitmapp, offset / BPS(bs), BLOCK_FLAGS_NONE); if (rc != EOK) { (void) exfat_node_put(fn); return rc; } bitmap = (uint8_t *)b->data; bitmap[offset % BPS(bs)] |= (1 << (clst % 8)); b->dirty = true; rc = block_put(b); if (rc != EOK) { (void) exfat_node_put(fn); return rc; } return exfat_node_put(fn); }
int exfat_read_uctable(exfat_bs_t *bs, exfat_node_t *nodep, uint8_t *uctable) { size_t i, blocks, count; block_t *b; int rc; blocks = ROUND_UP(nodep->size, BPS(bs))/BPS(bs); count = BPS(bs); for (i = 0; i < blocks; i++) { rc = exfat_block_get(&b, bs, nodep, i, BLOCK_FLAGS_NOREAD); if (rc != EOK) return rc; if (i == blocks - 1) count = nodep->size - i * BPS(bs); memcpy(uctable, b->data, count); uctable += count; rc = block_put(b); if (rc != EOK) return rc; } return EOK; }