* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2012 Whamcloud, Inc.
+ * Copyright (c) 2012, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
assert_inv(n_invariant(leaf));
}
+static int lvar_leaf_empty(struct iam_leaf *leaf)
+{
+ return h_used(n_head(leaf)) == sizeof(struct lvar_leaf_header);
+}
+
static struct iam_leaf_operations lvar_leaf_ops = {
.init = lvar_init,
.init_new = lvar_init_new,
.rec_add = lvar_rec_add,
.rec_del = lvar_rec_del,
.can_add = lvar_can_add,
- .split = lvar_split
+ .split = lvar_split,
+ .leaf_empty = lvar_leaf_empty,
};
/*
sizeof (lvar_hash_t) + ptrsize)
};
- entry = root + 1;
- /*
- * Skip over @limit.
- */
- entry += isize;
+ /* To guarantee that the padding "keysize + ptrsize"
+ * covers the "dx_countlimit" and the "idle_blocks". */
+ LASSERT((keysize + ptrsize) >=
+ (sizeof(struct dx_countlimit) + sizeof(__u32)));
+
+ entry = (void *)(limit + 1);
+ /* Put "idle_blocks" just after the limit. There was padding after
+ * the limit, the "idle_blocks" re-uses part of the padding, so no
+ * compatibility issues with old layout.
+ */
+ *(__u32 *)entry = 0;
+
+ /*
+ * Skip over @limit.
+ */
+ entry = (void *)(root + 1) + isize;
/*
* Entry format is <key> followed by <ptr>. In the minimal tree
descr->id_node_gap = 0;
descr->id_ops = &lvar_ops;
descr->id_leaf_ops = &lvar_leaf_ops;
- } else
- result = -EBADF;
- brelse(bh);
- }
- return result;
+
+ c->ic_root_bh = bh;
+ } else {
+ result = -EBADF;
+ brelse(bh);
+ }
+ }
+ return result;
}
static struct iam_format lvar_format = {