From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: sandeen@sandeen.net, darrick.wong@oracle.com
Cc: linux-xfs@vger.kernel.org
Subject: [PATCH 28/36] libfrog: hoist bitmap out of scrub
Date: Thu, 14 Mar 2019 14:06:41 -0700 [thread overview]
Message-ID: <155259760163.31886.7233821089132244184.stgit@magnolia> (raw)
In-Reply-To: <155259742281.31886.17157720770696604377.stgit@magnolia>
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 bbcfe338..882da8fd 100644
--- a/scrub/Makefile
+++ b/scrub/Makefile
@@ -32,7 +32,6 @@ endif
endif # scrub_prereqs
HFILES = \
-bitmap.h \
common.h \
counter.h \
disk.h \
@@ -49,7 +48,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 prev parent reply other threads:[~2019-03-14 21:06 UTC|newest]
Thread overview: 135+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-14 21:03 [PATCH v2 00/36] xfsprogs-5.0: fix various problems Darrick J. Wong
2019-03-14 21:03 ` [PATCH 01/36] libxfs: fix repair deadlock due to failed inode flushes Darrick J. Wong
2019-03-15 22:01 ` Allison Henderson
2019-03-14 21:03 ` [PATCH 02/36] configure: use sys/xattr.h for fsetxattr detection Darrick J. Wong
2019-03-15 22:01 ` Allison Henderson
2019-03-14 21:04 ` [PATCH 03/36] configure.ac: fix alignment of features Darrick J. Wong
2019-03-14 23:46 ` Eric Sandeen
2019-03-15 22:02 ` Allison Henderson
2019-03-14 21:04 ` [PATCH 04/36] debian: drop dangling libhandle.a symlinks in xfslibs-dev Darrick J. Wong
2019-03-15 0:14 ` Nathan Scott
2019-03-15 22:02 ` Allison Henderson
2019-03-14 21:04 ` [PATCH 05/36] debian: don't bypass top level Makefile when building subdirs Darrick J. Wong
2019-03-15 0:16 ` Nathan Scott
2019-03-15 22:02 ` Allison Henderson
2019-03-14 21:04 ` [PATCH 06/36] debian: enable parallel make Darrick J. Wong
2019-03-15 0:18 ` Nathan Scott
2019-03-15 1:01 ` Darrick J. Wong
2019-03-15 5:30 ` Darrick J. Wong
2019-03-14 21:04 ` [PATCH 07/36] xfs_io: actually check copy file range helper return values Darrick J. Wong
2019-03-15 2:12 ` Eric Sandeen
2019-03-15 2:56 ` Darrick J. Wong
2019-03-15 16:51 ` Eric Sandeen
2019-03-17 22:45 ` Dave Chinner
2019-03-14 21:04 ` [PATCH 08/36] xfs_io: statx -r should print attributes_mask Darrick J. Wong
2019-04-03 16:31 ` Eric Sandeen
2019-03-14 21:04 ` [PATCH 09/36] xfs_io: don't walk off the end of argv in fzero_f Darrick J. Wong
2019-03-15 0:25 ` [PATCH 09.5/36] xfs_io: document fzero_f -k option in manpage Eric Sandeen
2019-03-15 0:31 ` Darrick J. Wong
2019-03-15 3:06 ` [PATCH 09/36] xfs_io: don't walk off the end of argv in fzero_f Eric Sandeen
2019-03-14 21:04 ` [PATCH 10/36] xfs_scrub_all: walk the lsblk device/fs hierarchy correctly Darrick J. Wong
2019-03-15 2:46 ` Eric Sandeen
2019-03-15 2:55 ` Darrick J. Wong
2019-03-14 21:04 ` [PATCH 11/36] xfs_scrub_all.timer: activate after most of the system is up Darrick J. Wong
2019-03-15 2:56 ` Eric Sandeen
2019-03-15 2:59 ` Darrick J. Wong
2019-03-15 3:02 ` Eric Sandeen
2019-03-14 21:05 ` [PATCH 12/36] xfs_scrub: rename the global nr_threads Darrick J. Wong
2019-03-15 3:09 ` Eric Sandeen
2019-03-14 21:05 ` [PATCH 13/36] xfs_scrub: use datadev parallelization estimates for thread count Darrick J. Wong
2019-03-15 17:36 ` Eric Sandeen
2019-03-15 17:41 ` Darrick J. Wong
2019-03-14 21:05 ` [PATCH 14/36] xfs_scrub: don't expose internal pool state Darrick J. Wong
2019-03-15 17:49 ` Eric Sandeen
2019-03-14 21:05 ` [PATCH 15/36] xfs_scrub: one read/verify pool per disk Darrick J. Wong
2019-03-20 20:03 ` Eric Sandeen
2019-03-20 20:06 ` [PATCH v2 " Darrick J. Wong
2019-03-28 22:57 ` Eric Sandeen
2019-03-14 21:05 ` [PATCH 16/36] xfs_scrub: don't close mnt_fd when mnt_fd open fails Darrick J. Wong
2019-03-20 20:06 ` Eric Sandeen
2019-03-14 21:05 ` [PATCH 17/36] xfs_scrub: check label for misleading characters Darrick J. Wong
2019-03-20 20:09 ` Eric Sandeen
2019-03-20 20:13 ` Darrick J. Wong
2019-03-28 23:00 ` Eric Sandeen
2019-03-14 21:05 ` [PATCH 18/36] scrub: fix Makefile targets which depend on builddefs Darrick J. Wong
2019-03-20 20:23 ` Eric Sandeen
2019-03-21 20:39 ` Darrick J. Wong
2019-03-14 21:05 ` [PATCH 19/36] mkfs: validate extent size hint parameters Darrick J. Wong
2019-03-26 16:59 ` Eric Sandeen
2019-03-26 17:56 ` Darrick J. Wong
2019-04-12 19:31 ` [PATCH v2 " Darrick J. Wong
2019-03-14 21:05 ` [PATCH 20/36] xfs_db: fix finobt record decoding when sparse inodes enabled Darrick J. Wong
2019-03-26 17:05 ` Eric Sandeen
2019-03-26 17:08 ` Darrick J. Wong
2019-03-14 21:05 ` [PATCH 21/36] xfs_db: use TYP_FINOBT for finobt metadump Darrick J. Wong
2019-03-26 17:11 ` Eric Sandeen
2019-03-14 21:06 ` [PATCH 22/36] xfs_info: use findmnt to handle mounted block devices Darrick J. Wong
2019-03-26 17:28 ` Eric Sandeen
2019-04-18 19:12 ` Darrick J. Wong
2019-03-14 21:06 ` [PATCH 23/36] xfs_repair: reinitialize the root directory nlink correctly Darrick J. Wong
2019-04-09 20:44 ` Eric Sandeen
2019-03-14 21:06 ` [PATCH 24/36] xfs_repair: bump the irec on-disk nlink when adding lost+found Darrick J. Wong
2019-04-09 20:46 ` Eric Sandeen
2019-03-14 21:06 ` [PATCH 25/36] xfs_repair: fix uninitialized variable warnings Darrick J. Wong
2019-03-26 19:56 ` Eric Sandeen
2019-03-26 21:21 ` Darrick J. Wong
2019-04-09 20:40 ` Eric Sandeen
2019-03-14 21:06 ` [PATCH 26/36] xfs_repair: refactor buffer ops assignments during phase 5 Darrick J. Wong
2019-04-09 21:11 ` Eric Sandeen
2019-04-10 15:25 ` [PATCH v2 " Darrick J. Wong
2019-04-12 20:29 ` Eric Sandeen
2019-03-14 21:06 ` [PATCH 27/36] xfs_repair: pass ops through during scan Darrick J. Wong
2019-04-12 20:30 ` Eric Sandeen
2019-03-14 21:06 ` Darrick J. Wong [this message]
2019-04-03 18:33 ` [PATCH 28/36] libfrog: hoist bitmap out of scrub Eric Sandeen
2019-03-14 21:06 ` [PATCH 29/36] xfs_repair: correctly account for free space btree shrinks when fixing freelist Darrick J. Wong
2019-03-14 21:06 ` [PATCH 30/36] libxfs: retain ifork_ops when flushing inode Darrick J. Wong
2019-04-05 18:17 ` Eric Sandeen
2019-04-05 18:19 ` Eric Sandeen
2019-04-05 20:06 ` Darrick J. Wong
2019-03-14 21:07 ` [PATCH 31/36] libxfs: refactor the open-coded libxfs_trans_bjoin calls Darrick J. Wong
2019-04-05 18:39 ` Eric Sandeen
2019-03-14 21:07 ` [PATCH 32/36] libxfs: refactor buffer item release code Darrick J. Wong
2019-03-14 21:07 ` [PATCH 33/36] libxfs: don't touch buffer log item pointer when flushing inode log item Darrick J. Wong
2019-03-14 21:07 ` [PATCH 34/36] libxfs: fix buffer log item lifetime weirdness Darrick J. Wong
2019-03-14 21:07 ` [PATCH 35/36] libxfs: shorten inode item lifetime Darrick J. Wong
2019-03-14 21:07 ` [PATCH 36/36] libxfs: remove libxfs_trans_iget Darrick J. Wong
2019-04-05 19:28 ` Eric Sandeen
2019-03-20 19:34 ` [PATCH 37/36] xfs_scrub: include unicrash.h in unicrash.c Darrick J. Wong
2019-04-04 21:07 ` Eric Sandeen
2019-03-20 19:34 ` [PATCH 38/36] xfs_io: don't read garbage stack contents if INUMBERS goes nuts Darrick J. Wong
2019-04-04 21:12 ` Eric Sandeen
2019-04-04 21:39 ` Darrick J. Wong
2019-03-20 19:35 ` [PATCH 39/36] misc: fix strncpy length complaints Darrick J. Wong
2019-04-04 21:30 ` Eric Sandeen
2019-04-18 18:51 ` Darrick J. Wong
2019-03-20 19:36 ` [PATCH 40/36] xfs_io: fix label parsing and validation Darrick J. Wong
2019-04-04 21:51 ` Eric Sandeen
2019-03-20 19:36 ` [PATCH 41/36] xfs_repair: better cli option parameter checking Darrick J. Wong
2019-04-04 22:08 ` Eric Sandeen
2019-03-20 19:36 ` [PATCH 42/36] xfs_db: refactor metadump handling of multi-fsb objects Darrick J. Wong
2019-04-04 22:17 ` Eric Sandeen
2019-03-20 19:37 ` [PATCH 43/36] xfs_db: refactor multi-fsb object detection decision making Darrick J. Wong
2019-04-04 23:49 ` Eric Sandeen
2019-04-05 0:01 ` Darrick J. Wong
2019-04-05 0:09 ` [PATCH v2 " Darrick J. Wong
2019-04-05 20:31 ` Eric Sandeen
2019-03-20 19:37 ` [PATCH 44/36] xfs_db: metadump should handle symlinks properly Darrick J. Wong
2019-04-05 14:18 ` Eric Sandeen
2019-04-05 14:44 ` Darrick J. Wong
2019-03-20 20:03 ` [PATCH 45/36] xfs_scrub: rename confusing structure Darrick J. Wong
2019-04-04 16:40 ` Eric Sandeen
2019-04-04 16:56 ` Darrick J. Wong
2019-04-04 17:10 ` [PATCH v2 " Darrick J. Wong
2019-04-12 19:22 ` Eric Sandeen
2019-03-20 20:04 ` [PATCH 46/36] xfs_scrub: remove pointless xfs_verify_error_info struct Darrick J. Wong
2019-04-04 16:47 ` Eric Sandeen
2019-04-04 17:10 ` [PATCH v2 " Darrick J. Wong
2019-04-12 19:23 ` Eric Sandeen
2019-04-12 19:32 ` Darrick J. Wong
2019-03-20 20:05 ` [PATCH 47/36] xfs_scrub: remove xfs_ prefixes from structure names Darrick J. Wong
2019-04-04 16:49 ` Eric Sandeen
2019-03-26 17:18 ` [PATCH 48/36] mkfs: don't use DIFLAG values for fsx_xflags Darrick J. Wong
2019-04-04 16:38 ` Eric Sandeen
2019-04-01 16:43 ` [PATCH 49/36] xfs_scrub: remove redundant function declarations Darrick J. Wong
2019-04-04 16:33 ` Eric Sandeen
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=155259760163.31886.7233821089132244184.stgit@magnolia \
--to=darrick.wong@oracle.com \
--cc=linux-xfs@vger.kernel.org \
--cc=sandeen@sandeen.net \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox