Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Unified Diff: dm-bht.c

Issue 6670096: verity: create a regular trie when depth=0 (Closed) Base URL: http://git.chromium.org/git/dm-verity.git@master
Patch Set: Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | dm-bht_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dm-bht.c
diff --git a/dm-bht.c b/dm-bht.c
index 5957cb7cd7f625d024429bf273007ab8819c8614..1665c742a81bab770ffb0b60c89f1b0d07424dcc 100644
--- a/dm-bht.c
+++ b/dm-bht.c
@@ -265,27 +265,6 @@ int dm_bht_create(struct dm_bht *bht, unsigned int depth,
goto bad_block_count;
}
- bht->depth = depth; /* assignment below */
- DMDEBUG("Setting depth %u", depth);
- if (!depth || depth > UINT_MAX / sizeof(struct dm_bht_level)) {
- DMERR("bht depth is invalid: %u", depth);
- status = -EINVAL;
- goto bad_depth;
- }
-
- /* Allocate levels. Each level of the tree may have an arbitrary number
- * of dm_bht_entry structs. Each entry contains node_count nodes.
- * Each node in the tree is a cryptographic digest of either node_count
- * nodes on the subsequent level or of a specific block on disk.
- */
- bht->levels = (struct dm_bht_level *)
- kcalloc(depth, sizeof(struct dm_bht_level), GFP_KERNEL);
- if (!bht->levels) {
- DMERR("failed to allocate tree levels");
- status = -ENOMEM;
- goto bad_level_alloc;
- }
-
/* Each dm_bht_entry->nodes is one page. The node code tracks
* how many nodes fit into one entry where a node is a single
* hash (message digest).
@@ -302,6 +281,19 @@ int dm_bht_create(struct dm_bht *bht, unsigned int depth,
status = -EINVAL;
goto bad_node_count;
}
+
+ /* if depth == 0, create a "regular" trie with a single root block */
+ if (depth == 0)
+ depth = DIV_ROUND_UP(fls(block_count - 1),
+ bht->node_count_shift);
+ if (depth > UINT_MAX / sizeof(struct dm_bht_level)) {
+ DMERR("bht depth is invalid: %u", depth);
+ status = -EINVAL;
+ goto bad_depth;
+ }
+ DMDEBUG("Setting depth to %u.", depth);
+ bht->depth = depth;
+
/* Ensure that we can safely shift by this value. */
if (depth * bht->node_count_shift >= sizeof(unsigned int) * 8) {
DMERR("specified depth and node_count_shift is too large");
@@ -309,6 +301,19 @@ int dm_bht_create(struct dm_bht *bht, unsigned int depth,
goto bad_node_count;
}
+ /* Allocate levels. Each level of the tree may have an arbitrary number
+ * of dm_bht_entry structs. Each entry contains node_count nodes.
+ * Each node in the tree is a cryptographic digest of either node_count
+ * nodes on the subsequent level or of a specific block on disk.
+ */
+ bht->levels = (struct dm_bht_level *)
+ kcalloc(depth, sizeof(struct dm_bht_level), GFP_KERNEL);
+ if (!bht->levels) {
+ DMERR("failed to allocate tree levels");
+ status = -ENOMEM;
+ goto bad_level_alloc;
+ }
+
/* Setup callback stubs */
bht->read_cb = &dm_bht_read_callback_stub;
bht->write_cb = &dm_bht_write_callback_stub;
@@ -322,8 +327,8 @@ int dm_bht_create(struct dm_bht *bht, unsigned int depth,
bad_entries_alloc:
while (bht->depth-- > 0)
kfree(bht->levels[bht->depth].entries);
-bad_node_count:
kfree(bht->levels);
+bad_node_count:
bad_level_alloc:
bad_block_count:
bad_depth:
« no previous file with comments | « no previous file | dm-bht_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698