]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/spdk/lib/util/bit_array.c
import 15.2.0 Octopus source
[ceph.git] / ceph / src / spdk / lib / util / bit_array.c
index d6c112f79e2a61405591a184345593ee86b062ac..661c420874767cce295f8e15b90e7dc7d10109ad 100644 (file)
@@ -74,7 +74,7 @@ spdk_bit_array_free(struct spdk_bit_array **bap)
 
        ba = *bap;
        *bap = NULL;
-       spdk_dma_free(ba);
+       spdk_free(ba);
 }
 
 static inline uint32_t
@@ -114,7 +114,7 @@ spdk_bit_array_resize(struct spdk_bit_array **bap, uint32_t num_bits)
         */
        new_size += SPDK_BIT_ARRAY_WORD_BYTES;
 
-       new_ba = (struct spdk_bit_array *)spdk_dma_realloc(*bap, new_size, 64, NULL);
+       new_ba = (struct spdk_bit_array *)spdk_realloc(*bap, new_size, 64);
        if (!new_ba) {
                return -ENOMEM;
        }
@@ -311,3 +311,53 @@ spdk_bit_array_count_clear(const struct spdk_bit_array *ba)
 {
        return ba->bit_count - spdk_bit_array_count_set(ba);
 }
+
+void
+spdk_bit_array_store_mask(const struct spdk_bit_array *ba, void *mask)
+{
+       uint32_t size, i;
+       uint32_t num_bits = spdk_bit_array_capacity(ba);
+
+       size = num_bits / CHAR_BIT;
+       memcpy(mask, ba->words, size);
+
+       for (i = 0; i < num_bits % CHAR_BIT; i++) {
+               if (spdk_bit_array_get(ba, i + size * CHAR_BIT)) {
+                       ((uint8_t *)mask)[size] |= (1U << i);
+               } else {
+                       ((uint8_t *)mask)[size] &= ~(1U << i);
+               }
+       }
+}
+
+void
+spdk_bit_array_load_mask(struct spdk_bit_array *ba, const void *mask)
+{
+       uint32_t size, i;
+       uint32_t num_bits = spdk_bit_array_capacity(ba);
+
+       size = num_bits / CHAR_BIT;
+       memcpy(ba->words, mask, size);
+
+       for (i = 0; i < num_bits % CHAR_BIT; i++) {
+               if (((uint8_t *)mask)[size] & (1U << i)) {
+                       spdk_bit_array_set(ba, i + size * CHAR_BIT);
+               } else {
+                       spdk_bit_array_clear(ba, i + size * CHAR_BIT);
+               }
+       }
+}
+
+void
+spdk_bit_array_clear_mask(struct spdk_bit_array *ba)
+{
+       uint32_t size, i;
+       uint32_t num_bits = spdk_bit_array_capacity(ba);
+
+       size = num_bits / CHAR_BIT;
+       memset(ba->words, 0, size);
+
+       for (i = 0; i < num_bits % CHAR_BIT; i++) {
+               spdk_bit_array_clear(ba, i + size * CHAR_BIT);
+       }
+}