From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: sandeen@redhat.com, darrick.wong@oracle.com
Cc: linux-xfs@vger.kernel.org
Subject: [PATCH 1/2] libfrog: hoist bitmap out of scrub
Date: Wed, 30 Jan 2019 09:50:24 -0800 [thread overview]
Message-ID: <154887062444.5611.12746798208748899665.stgit@magnolia> (raw)
From: Darrick J. Wong <darrick.wong@oracle.com>
Move the bitmap code to libfrog so that we can use bitmaps in
xfs_repair.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
include/bitmap.h | 24 +++
libfrog/Makefile | 1
libfrog/bitmap.c | 393 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
scrub/Makefile | 2
scrub/bitmap.c | 393 ------------------------------------------------------
scrub/bitmap.h | 24 ---
6 files changed, 418 insertions(+), 419 deletions(-)
create mode 100644 include/bitmap.h
create mode 100644 libfrog/bitmap.c
delete mode 100644 scrub/bitmap.c
delete mode 100644 scrub/bitmap.h
diff --git a/include/bitmap.h b/include/bitmap.h
new file mode 100644
index 00000000..e29a4335
--- /dev/null
+++ b/include/bitmap.h
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018 Oracle. All Rights Reserved.
+ * Author: Darrick J. Wong <darrick.wong@oracle.com>
+ */
+#ifndef LIBFROG_BITMAP_H_
+#define LIBFROG_BITMAP_H_
+
+struct bitmap {
+ pthread_mutex_t bt_lock;
+ struct avl64tree_desc *bt_tree;
+};
+
+bool bitmap_init(struct bitmap **bmap);
+void bitmap_free(struct bitmap **bmap);
+bool bitmap_set(struct bitmap *bmap, uint64_t start, uint64_t length);
+bool bitmap_iterate(struct bitmap *bmap,
+ bool (*fn)(uint64_t, uint64_t, void *), void *arg);
+bool bitmap_test(struct bitmap *bmap, uint64_t start,
+ uint64_t len);
+bool bitmap_empty(struct bitmap *bmap);
+void bitmap_dump(struct bitmap *bmap);
+
+#endif /* LIBFROG_BITMAP_H_ */
diff --git a/libfrog/Makefile b/libfrog/Makefile
index dbff9596..f5a0539b 100644
--- a/libfrog/Makefile
+++ b/libfrog/Makefile
@@ -12,6 +12,7 @@ LT_AGE = 0
CFILES = \
avl64.c \
+bitmap.c \
convert.c \
crc32.c \
fsgeom.c \
diff --git a/libfrog/bitmap.c b/libfrog/bitmap.c
new file mode 100644
index 00000000..aecdba0d
--- /dev/null
+++ b/libfrog/bitmap.c
@@ -0,0 +1,393 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2018 Oracle. All Rights Reserved.
+ * Author: Darrick J. Wong <darrick.wong@oracle.com>
+ */
+#include "xfs.h"
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <pthread.h>
+#include "platform_defs.h"
+#include "avl64.h"
+#include "list.h"
+#include "bitmap.h"
+
+/*
+ * Space Efficient Bitmap
+ *
+ * Implements a space-efficient bitmap. We use an AVL tree to manage
+ * extent records that tell us which ranges are set; the bitmap key is
+ * an arbitrary uint64_t. The usual bitmap operations (set, clear,
+ * test, test and set) are supported, plus we can iterate set ranges.
+ */
+
+#define avl_for_each_range_safe(pos, n, l, first, last) \
+ for (pos = (first), n = pos->avl_nextino, l = (last)->avl_nextino; pos != (l); \
+ pos = n, n = pos ? pos->avl_nextino : NULL)
+
+#define avl_for_each_safe(tree, pos, n) \
+ for (pos = (tree)->avl_firstino, n = pos ? pos->avl_nextino : NULL; \
+ pos != NULL; \
+ pos = n, n = pos ? pos->avl_nextino : NULL)
+
+#define avl_for_each(tree, pos) \
+ for (pos = (tree)->avl_firstino; pos != NULL; pos = pos->avl_nextino)
+
+struct bitmap_node {
+ struct avl64node btn_node;
+ uint64_t btn_start;
+ uint64_t btn_length;
+};
+
+static uint64_t
+extent_start(
+ struct avl64node *node)
+{
+ struct bitmap_node *btn;
+
+ btn = container_of(node, struct bitmap_node, btn_node);
+ return btn->btn_start;
+}
+
+static uint64_t
+extent_end(
+ struct avl64node *node)
+{
+ struct bitmap_node *btn;
+
+ btn = container_of(node, struct bitmap_node, btn_node);
+ return btn->btn_start + btn->btn_length;
+}
+
+static struct avl64ops bitmap_ops = {
+ extent_start,
+ extent_end,
+};
+
+/* Initialize a bitmap. */
+bool
+bitmap_init(
+ struct bitmap **bmapp)
+{
+ struct bitmap *bmap;
+
+ bmap = calloc(1, sizeof(struct bitmap));
+ if (!bmap)
+ return false;
+ bmap->bt_tree = malloc(sizeof(struct avl64tree_desc));
+ if (!bmap->bt_tree) {
+ free(bmap);
+ return false;
+ }
+
+ pthread_mutex_init(&bmap->bt_lock, NULL);
+ avl64_init_tree(bmap->bt_tree, &bitmap_ops);
+ *bmapp = bmap;
+
+ return true;
+}
+
+/* Free a bitmap. */
+void
+bitmap_free(
+ struct bitmap **bmapp)
+{
+ struct bitmap *bmap;
+ struct avl64node *node;
+ struct avl64node *n;
+ struct bitmap_node *ext;
+
+ bmap = *bmapp;
+ avl_for_each_safe(bmap->bt_tree, node, n) {
+ ext = container_of(node, struct bitmap_node, btn_node);
+ free(ext);
+ }
+ free(bmap->bt_tree);
+ *bmapp = NULL;
+}
+
+/* Create a new bitmap extent node. */
+static struct bitmap_node *
+bitmap_node_init(
+ uint64_t start,
+ uint64_t len)
+{
+ struct bitmap_node *ext;
+
+ ext = malloc(sizeof(struct bitmap_node));
+ if (!ext)
+ return NULL;
+
+ ext->btn_node.avl_nextino = NULL;
+ ext->btn_start = start;
+ ext->btn_length = len;
+
+ return ext;
+}
+
+/* Set a region of bits (locked). */
+static bool
+__bitmap_set(
+ struct bitmap *bmap,
+ uint64_t start,
+ uint64_t length)
+{
+ struct avl64node *firstn;
+ struct avl64node *lastn;
+ struct avl64node *pos;
+ struct avl64node *n;
+ struct avl64node *l;
+ struct bitmap_node *ext;
+ uint64_t new_start;
+ uint64_t new_length;
+ struct avl64node *node;
+ bool res = true;
+
+ /* Find any existing nodes adjacent or within that range. */
+ avl64_findranges(bmap->bt_tree, start - 1, start + length + 1,
+ &firstn, &lastn);
+
+ /* Nothing, just insert a new extent. */
+ if (firstn == NULL && lastn == NULL) {
+ ext = bitmap_node_init(start, length);
+ if (!ext)
+ return false;
+
+ node = avl64_insert(bmap->bt_tree, &ext->btn_node);
+ if (node == NULL) {
+ free(ext);
+ errno = EEXIST;
+ return false;
+ }
+
+ return true;
+ }
+
+ assert(firstn != NULL && lastn != NULL);
+ new_start = start;
+ new_length = length;
+
+ avl_for_each_range_safe(pos, n, l, firstn, lastn) {
+ ext = container_of(pos, struct bitmap_node, btn_node);
+
+ /* Bail if the new extent is contained within an old one. */
+ if (ext->btn_start <= start &&
+ ext->btn_start + ext->btn_length >= start + length)
+ return res;
+
+ /* Check for overlapping and adjacent extents. */
+ if (ext->btn_start + ext->btn_length >= start ||
+ ext->btn_start <= start + length) {
+ if (ext->btn_start < start) {
+ new_start = ext->btn_start;
+ new_length += ext->btn_length;
+ }
+
+ if (ext->btn_start + ext->btn_length >
+ new_start + new_length)
+ new_length = ext->btn_start + ext->btn_length -
+ new_start;
+
+ avl64_delete(bmap->bt_tree, pos);
+ free(ext);
+ }
+ }
+
+ ext = bitmap_node_init(new_start, new_length);
+ if (!ext)
+ return false;
+
+ node = avl64_insert(bmap->bt_tree, &ext->btn_node);
+ if (node == NULL) {
+ free(ext);
+ errno = EEXIST;
+ return false;
+ }
+
+ return res;
+}
+
+/* Set a region of bits. */
+bool
+bitmap_set(
+ struct bitmap *bmap,
+ uint64_t start,
+ uint64_t length)
+{
+ bool res;
+
+ pthread_mutex_lock(&bmap->bt_lock);
+ res = __bitmap_set(bmap, start, length);
+ pthread_mutex_unlock(&bmap->bt_lock);
+
+ return res;
+}
+
+#if 0 /* Unused, provided for completeness. */
+/* Clear a region of bits. */
+bool
+bitmap_clear(
+ struct bitmap *bmap,
+ uint64_t start,
+ uint64_t len)
+{
+ struct avl64node *firstn;
+ struct avl64node *lastn;
+ struct avl64node *pos;
+ struct avl64node *n;
+ struct avl64node *l;
+ struct bitmap_node *ext;
+ uint64_t new_start;
+ uint64_t new_length;
+ struct avl64node *node;
+ int stat;
+
+ pthread_mutex_lock(&bmap->bt_lock);
+ /* Find any existing nodes over that range. */
+ avl64_findranges(bmap->bt_tree, start, start + len, &firstn, &lastn);
+
+ /* Nothing, we're done. */
+ if (firstn == NULL && lastn == NULL) {
+ pthread_mutex_unlock(&bmap->bt_lock);
+ return true;
+ }
+
+ assert(firstn != NULL && lastn != NULL);
+
+ /* Delete or truncate everything in sight. */
+ avl_for_each_range_safe(pos, n, l, firstn, lastn) {
+ ext = container_of(pos, struct bitmap_node, btn_node);
+
+ stat = 0;
+ if (ext->btn_start < start)
+ stat |= 1;
+ if (ext->btn_start + ext->btn_length > start + len)
+ stat |= 2;
+ switch (stat) {
+ case 0:
+ /* Extent totally within range; delete. */
+ avl64_delete(bmap->bt_tree, pos);
+ free(ext);
+ break;
+ case 1:
+ /* Extent is left-adjacent; truncate. */
+ ext->btn_length = start - ext->btn_start;
+ break;
+ case 2:
+ /* Extent is right-adjacent; move it. */
+ ext->btn_length = ext->btn_start + ext->btn_length -
+ (start + len);
+ ext->btn_start = start + len;
+ break;
+ case 3:
+ /* Extent overlaps both ends. */
+ ext->btn_length = start - ext->btn_start;
+ new_start = start + len;
+ new_length = ext->btn_start + ext->btn_length -
+ new_start;
+
+ ext = bitmap_node_init(new_start, new_length);
+ if (!ext)
+ return false;
+
+ node = avl64_insert(bmap->bt_tree, &ext->btn_node);
+ if (node == NULL) {
+ errno = EEXIST;
+ return false;
+ }
+ break;
+ }
+ }
+
+ pthread_mutex_unlock(&bmap->bt_lock);
+ return true;
+}
+#endif
+
+#ifdef DEBUG
+/* Iterate the set regions of this bitmap. */
+bool
+bitmap_iterate(
+ struct bitmap *bmap,
+ bool (*fn)(uint64_t, uint64_t, void *),
+ void *arg)
+{
+ struct avl64node *node;
+ struct bitmap_node *ext;
+ bool moveon = true;
+
+ pthread_mutex_lock(&bmap->bt_lock);
+ avl_for_each(bmap->bt_tree, node) {
+ ext = container_of(node, struct bitmap_node, btn_node);
+ moveon = fn(ext->btn_start, ext->btn_length, arg);
+ if (!moveon)
+ break;
+ }
+ pthread_mutex_unlock(&bmap->bt_lock);
+
+ return moveon;
+}
+#endif
+
+/* Do any bitmap extents overlap the given one? (locked) */
+static bool
+__bitmap_test(
+ struct bitmap *bmap,
+ uint64_t start,
+ uint64_t len)
+{
+ struct avl64node *firstn;
+ struct avl64node *lastn;
+
+ /* Find any existing nodes over that range. */
+ avl64_findranges(bmap->bt_tree, start, start + len, &firstn, &lastn);
+
+ return firstn != NULL && lastn != NULL;
+}
+
+/* Is any part of this range set? */
+bool
+bitmap_test(
+ struct bitmap *bmap,
+ uint64_t start,
+ uint64_t len)
+{
+ bool res;
+
+ pthread_mutex_lock(&bmap->bt_lock);
+ res = __bitmap_test(bmap, start, len);
+ pthread_mutex_unlock(&bmap->bt_lock);
+
+ return res;
+}
+
+/* Are none of the bits set? */
+bool
+bitmap_empty(
+ struct bitmap *bmap)
+{
+ return bmap->bt_tree->avl_firstino == NULL;
+}
+
+#ifdef DEBUG
+static bool
+bitmap_dump_fn(
+ uint64_t startblock,
+ uint64_t blockcount,
+ void *arg)
+{
+ printf("%"PRIu64":%"PRIu64"\n", startblock, blockcount);
+ return true;
+}
+
+/* Dump bitmap. */
+void
+bitmap_dump(
+ struct bitmap *bmap)
+{
+ printf("BITMAP DUMP %p\n", bmap);
+ bitmap_iterate(bmap, bitmap_dump_fn, NULL);
+ printf("BITMAP DUMP DONE\n");
+}
+#endif
diff --git a/scrub/Makefile b/scrub/Makefile
index c6473c12..9c56d550 100644
--- a/scrub/Makefile
+++ b/scrub/Makefile
@@ -31,7 +31,6 @@ endif
endif # scrub_prereqs
HFILES = \
-bitmap.h \
common.h \
counter.h \
disk.h \
@@ -48,7 +47,6 @@ vfs.h \
xfs_scrub.h
CFILES = \
-bitmap.c \
common.c \
counter.c \
disk.c \
diff --git a/scrub/bitmap.c b/scrub/bitmap.c
deleted file mode 100644
index aecdba0d..00000000
--- a/scrub/bitmap.c
+++ /dev/null
@@ -1,393 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright (C) 2018 Oracle. All Rights Reserved.
- * Author: Darrick J. Wong <darrick.wong@oracle.com>
- */
-#include "xfs.h"
-#include <stdint.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <pthread.h>
-#include "platform_defs.h"
-#include "avl64.h"
-#include "list.h"
-#include "bitmap.h"
-
-/*
- * Space Efficient Bitmap
- *
- * Implements a space-efficient bitmap. We use an AVL tree to manage
- * extent records that tell us which ranges are set; the bitmap key is
- * an arbitrary uint64_t. The usual bitmap operations (set, clear,
- * test, test and set) are supported, plus we can iterate set ranges.
- */
-
-#define avl_for_each_range_safe(pos, n, l, first, last) \
- for (pos = (first), n = pos->avl_nextino, l = (last)->avl_nextino; pos != (l); \
- pos = n, n = pos ? pos->avl_nextino : NULL)
-
-#define avl_for_each_safe(tree, pos, n) \
- for (pos = (tree)->avl_firstino, n = pos ? pos->avl_nextino : NULL; \
- pos != NULL; \
- pos = n, n = pos ? pos->avl_nextino : NULL)
-
-#define avl_for_each(tree, pos) \
- for (pos = (tree)->avl_firstino; pos != NULL; pos = pos->avl_nextino)
-
-struct bitmap_node {
- struct avl64node btn_node;
- uint64_t btn_start;
- uint64_t btn_length;
-};
-
-static uint64_t
-extent_start(
- struct avl64node *node)
-{
- struct bitmap_node *btn;
-
- btn = container_of(node, struct bitmap_node, btn_node);
- return btn->btn_start;
-}
-
-static uint64_t
-extent_end(
- struct avl64node *node)
-{
- struct bitmap_node *btn;
-
- btn = container_of(node, struct bitmap_node, btn_node);
- return btn->btn_start + btn->btn_length;
-}
-
-static struct avl64ops bitmap_ops = {
- extent_start,
- extent_end,
-};
-
-/* Initialize a bitmap. */
-bool
-bitmap_init(
- struct bitmap **bmapp)
-{
- struct bitmap *bmap;
-
- bmap = calloc(1, sizeof(struct bitmap));
- if (!bmap)
- return false;
- bmap->bt_tree = malloc(sizeof(struct avl64tree_desc));
- if (!bmap->bt_tree) {
- free(bmap);
- return false;
- }
-
- pthread_mutex_init(&bmap->bt_lock, NULL);
- avl64_init_tree(bmap->bt_tree, &bitmap_ops);
- *bmapp = bmap;
-
- return true;
-}
-
-/* Free a bitmap. */
-void
-bitmap_free(
- struct bitmap **bmapp)
-{
- struct bitmap *bmap;
- struct avl64node *node;
- struct avl64node *n;
- struct bitmap_node *ext;
-
- bmap = *bmapp;
- avl_for_each_safe(bmap->bt_tree, node, n) {
- ext = container_of(node, struct bitmap_node, btn_node);
- free(ext);
- }
- free(bmap->bt_tree);
- *bmapp = NULL;
-}
-
-/* Create a new bitmap extent node. */
-static struct bitmap_node *
-bitmap_node_init(
- uint64_t start,
- uint64_t len)
-{
- struct bitmap_node *ext;
-
- ext = malloc(sizeof(struct bitmap_node));
- if (!ext)
- return NULL;
-
- ext->btn_node.avl_nextino = NULL;
- ext->btn_start = start;
- ext->btn_length = len;
-
- return ext;
-}
-
-/* Set a region of bits (locked). */
-static bool
-__bitmap_set(
- struct bitmap *bmap,
- uint64_t start,
- uint64_t length)
-{
- struct avl64node *firstn;
- struct avl64node *lastn;
- struct avl64node *pos;
- struct avl64node *n;
- struct avl64node *l;
- struct bitmap_node *ext;
- uint64_t new_start;
- uint64_t new_length;
- struct avl64node *node;
- bool res = true;
-
- /* Find any existing nodes adjacent or within that range. */
- avl64_findranges(bmap->bt_tree, start - 1, start + length + 1,
- &firstn, &lastn);
-
- /* Nothing, just insert a new extent. */
- if (firstn == NULL && lastn == NULL) {
- ext = bitmap_node_init(start, length);
- if (!ext)
- return false;
-
- node = avl64_insert(bmap->bt_tree, &ext->btn_node);
- if (node == NULL) {
- free(ext);
- errno = EEXIST;
- return false;
- }
-
- return true;
- }
-
- assert(firstn != NULL && lastn != NULL);
- new_start = start;
- new_length = length;
-
- avl_for_each_range_safe(pos, n, l, firstn, lastn) {
- ext = container_of(pos, struct bitmap_node, btn_node);
-
- /* Bail if the new extent is contained within an old one. */
- if (ext->btn_start <= start &&
- ext->btn_start + ext->btn_length >= start + length)
- return res;
-
- /* Check for overlapping and adjacent extents. */
- if (ext->btn_start + ext->btn_length >= start ||
- ext->btn_start <= start + length) {
- if (ext->btn_start < start) {
- new_start = ext->btn_start;
- new_length += ext->btn_length;
- }
-
- if (ext->btn_start + ext->btn_length >
- new_start + new_length)
- new_length = ext->btn_start + ext->btn_length -
- new_start;
-
- avl64_delete(bmap->bt_tree, pos);
- free(ext);
- }
- }
-
- ext = bitmap_node_init(new_start, new_length);
- if (!ext)
- return false;
-
- node = avl64_insert(bmap->bt_tree, &ext->btn_node);
- if (node == NULL) {
- free(ext);
- errno = EEXIST;
- return false;
- }
-
- return res;
-}
-
-/* Set a region of bits. */
-bool
-bitmap_set(
- struct bitmap *bmap,
- uint64_t start,
- uint64_t length)
-{
- bool res;
-
- pthread_mutex_lock(&bmap->bt_lock);
- res = __bitmap_set(bmap, start, length);
- pthread_mutex_unlock(&bmap->bt_lock);
-
- return res;
-}
-
-#if 0 /* Unused, provided for completeness. */
-/* Clear a region of bits. */
-bool
-bitmap_clear(
- struct bitmap *bmap,
- uint64_t start,
- uint64_t len)
-{
- struct avl64node *firstn;
- struct avl64node *lastn;
- struct avl64node *pos;
- struct avl64node *n;
- struct avl64node *l;
- struct bitmap_node *ext;
- uint64_t new_start;
- uint64_t new_length;
- struct avl64node *node;
- int stat;
-
- pthread_mutex_lock(&bmap->bt_lock);
- /* Find any existing nodes over that range. */
- avl64_findranges(bmap->bt_tree, start, start + len, &firstn, &lastn);
-
- /* Nothing, we're done. */
- if (firstn == NULL && lastn == NULL) {
- pthread_mutex_unlock(&bmap->bt_lock);
- return true;
- }
-
- assert(firstn != NULL && lastn != NULL);
-
- /* Delete or truncate everything in sight. */
- avl_for_each_range_safe(pos, n, l, firstn, lastn) {
- ext = container_of(pos, struct bitmap_node, btn_node);
-
- stat = 0;
- if (ext->btn_start < start)
- stat |= 1;
- if (ext->btn_start + ext->btn_length > start + len)
- stat |= 2;
- switch (stat) {
- case 0:
- /* Extent totally within range; delete. */
- avl64_delete(bmap->bt_tree, pos);
- free(ext);
- break;
- case 1:
- /* Extent is left-adjacent; truncate. */
- ext->btn_length = start - ext->btn_start;
- break;
- case 2:
- /* Extent is right-adjacent; move it. */
- ext->btn_length = ext->btn_start + ext->btn_length -
- (start + len);
- ext->btn_start = start + len;
- break;
- case 3:
- /* Extent overlaps both ends. */
- ext->btn_length = start - ext->btn_start;
- new_start = start + len;
- new_length = ext->btn_start + ext->btn_length -
- new_start;
-
- ext = bitmap_node_init(new_start, new_length);
- if (!ext)
- return false;
-
- node = avl64_insert(bmap->bt_tree, &ext->btn_node);
- if (node == NULL) {
- errno = EEXIST;
- return false;
- }
- break;
- }
- }
-
- pthread_mutex_unlock(&bmap->bt_lock);
- return true;
-}
-#endif
-
-#ifdef DEBUG
-/* Iterate the set regions of this bitmap. */
-bool
-bitmap_iterate(
- struct bitmap *bmap,
- bool (*fn)(uint64_t, uint64_t, void *),
- void *arg)
-{
- struct avl64node *node;
- struct bitmap_node *ext;
- bool moveon = true;
-
- pthread_mutex_lock(&bmap->bt_lock);
- avl_for_each(bmap->bt_tree, node) {
- ext = container_of(node, struct bitmap_node, btn_node);
- moveon = fn(ext->btn_start, ext->btn_length, arg);
- if (!moveon)
- break;
- }
- pthread_mutex_unlock(&bmap->bt_lock);
-
- return moveon;
-}
-#endif
-
-/* Do any bitmap extents overlap the given one? (locked) */
-static bool
-__bitmap_test(
- struct bitmap *bmap,
- uint64_t start,
- uint64_t len)
-{
- struct avl64node *firstn;
- struct avl64node *lastn;
-
- /* Find any existing nodes over that range. */
- avl64_findranges(bmap->bt_tree, start, start + len, &firstn, &lastn);
-
- return firstn != NULL && lastn != NULL;
-}
-
-/* Is any part of this range set? */
-bool
-bitmap_test(
- struct bitmap *bmap,
- uint64_t start,
- uint64_t len)
-{
- bool res;
-
- pthread_mutex_lock(&bmap->bt_lock);
- res = __bitmap_test(bmap, start, len);
- pthread_mutex_unlock(&bmap->bt_lock);
-
- return res;
-}
-
-/* Are none of the bits set? */
-bool
-bitmap_empty(
- struct bitmap *bmap)
-{
- return bmap->bt_tree->avl_firstino == NULL;
-}
-
-#ifdef DEBUG
-static bool
-bitmap_dump_fn(
- uint64_t startblock,
- uint64_t blockcount,
- void *arg)
-{
- printf("%"PRIu64":%"PRIu64"\n", startblock, blockcount);
- return true;
-}
-
-/* Dump bitmap. */
-void
-bitmap_dump(
- struct bitmap *bmap)
-{
- printf("BITMAP DUMP %p\n", bmap);
- bitmap_iterate(bmap, bitmap_dump_fn, NULL);
- printf("BITMAP DUMP DONE\n");
-}
-#endif
diff --git a/scrub/bitmap.h b/scrub/bitmap.h
deleted file mode 100644
index e9746a12..00000000
--- a/scrub/bitmap.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright (C) 2018 Oracle. All Rights Reserved.
- * Author: Darrick J. Wong <darrick.wong@oracle.com>
- */
-#ifndef XFS_SCRUB_BITMAP_H_
-#define XFS_SCRUB_BITMAP_H_
-
-struct bitmap {
- pthread_mutex_t bt_lock;
- struct avl64tree_desc *bt_tree;
-};
-
-bool bitmap_init(struct bitmap **bmap);
-void bitmap_free(struct bitmap **bmap);
-bool bitmap_set(struct bitmap *bmap, uint64_t start, uint64_t length);
-bool bitmap_iterate(struct bitmap *bmap,
- bool (*fn)(uint64_t, uint64_t, void *), void *arg);
-bool bitmap_test(struct bitmap *bmap, uint64_t start,
- uint64_t len);
-bool bitmap_empty(struct bitmap *bmap);
-void bitmap_dump(struct bitmap *bmap);
-
-#endif /* XFS_SCRUB_BITMAP_H_ */
next reply other threads:[~2019-01-30 17:50 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-30 17:50 Darrick J. Wong [this message]
2019-01-30 17:50 ` [PATCH 2/2] xfs_repair: correctly account for free space btree shrinks when fixing freelist Darrick J. Wong
2019-02-01 18:39 ` Eric Sandeen
2019-02-01 18:42 ` Darrick J. Wong
2019-02-01 18:47 ` [PATCH v2 " Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=154887062444.5611.12746798208748899665.stgit@magnolia \
--to=darrick.wong@oracle.com \
--cc=linux-xfs@vger.kernel.org \
--cc=sandeen@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.