The branch, master has been updated via 85f6032cbdb197f3a003d86f086afa2cee898a4d (commit) from 647003da975d4823abe8ed2bfb46153d68ea0fb0 (commit)
http://gitweb.samba.org/?p=sahlberg/ctdb.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 85f6032cbdb197f3a003d86f086afa2cee898a4d Author: Andrew Tridgell <[EMAIL PROTECTED]> Date: Tue Sep 30 07:09:06 2008 -0700 merged a bugfix for the idtree code from the Linux kernel. This matches commit 7aae6dd80e265aa9402ed507caaff4a5dba55069 in the kernel. Many thanks to Jim Houston for pointing out this fix to us ----------------------------------------------------------------------- Summary of changes: lib/util/idtree.c | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/util/idtree.c b/lib/util/idtree.c index 6fef3d1..1b69319 100644 --- a/lib/util/idtree.c +++ b/lib/util/idtree.c @@ -105,12 +105,13 @@ static int sub_alloc(struct idr_context *idp, void *ptr, int *starting_id) int n, m, sh; struct idr_layer *p, *new; struct idr_layer *pa[MAX_LEVEL]; - int l, id; + int l, id, oid; uint32_t bm; memset(pa, 0, sizeof(pa)); id = *starting_id; +restart: p = idp->top; l = idp->layers; pa[l--] = NULL; @@ -124,12 +125,23 @@ static int sub_alloc(struct idr_context *idp, void *ptr, int *starting_id) if (m == IDR_SIZE) { /* no space available go back to previous layer. */ l++; + oid = id; id = (id | ((1 << (IDR_BITS*l))-1)) + 1; + + /* if already at the top layer, we need to grow */ if (!(p = pa[l])) { *starting_id = id; return -2; } - continue; + + /* If we need to go up one layer, continue the + * loop; otherwise, restart from the top. + */ + sh = IDR_BITS * (l + 1); + if (oid >> sh == id >> sh) + continue; + else + goto restart; } if (m != n) { sh = IDR_BITS*l; -- CTDB repository