* [patch 1/4] reiser4: fixups in cryptcompress plugin
@ 2012-10-21 17:58 Edward Shishkin
0 siblings, 0 replies; only message in thread
From: Edward Shishkin @ 2012-10-21 17:58 UTC (permalink / raw)
To: reiserfs-devel
[-- Attachment #1: Type: text/plain, Size: 1 bytes --]
[-- Attachment #2: reiser4-cryptcompress-fixups.patch --]
[-- Type: text/x-patch, Size: 6850 bytes --]
Fix up the main search procedure of cryptcompress plugin:
. make full-fledged tree traversal in the case when we
encountered empty right neighbor;
. unlock the left neighbor only in the case when we moved
to right.
Signed-off-by: Edward Shishkin <edward.shishkin@gmail.com>
---
fs/reiser4/carry_ops.c | 6 +
fs/reiser4/forward.h | 4 -
fs/reiser4/plugin/file/cryptcompress.c | 124 +++++++++++++++++++++++----------
fs/reiser4/plugin/item/ctail.c | 5 +
4 files changed, 101 insertions(+), 38 deletions(-)
--- linux-3.5.3.orig/fs/reiser4/plugin/file/cryptcompress.c
+++ linux-3.5.3/fs/reiser4/plugin/file/cryptcompress.c
@@ -703,8 +703,11 @@ static void free_reserved4cluster(struct
ch->reserved = 0;
}
-/* The core search procedure of the cryptcompress plugin.
- If returned value is not cbk_errored, then current znode is locked */
+/*
+ * The core search procedure of the cryptcompress plugin.
+ * If returned value is not cbk_errored, then current position
+ * is locked.
+ */
static int find_cluster_item(hint_t * hint,
const reiser4_key * key, /* key of the item we are
looking for */
@@ -713,7 +716,6 @@ static int find_cluster_item(hint_t * hi
{
int result;
reiser4_key ikey;
- int went_right = 0;
coord_t *coord = &hint->ext_coord.coord;
coord_t orig = *coord;
@@ -730,58 +732,110 @@ static int find_cluster_item(hint_t * hi
hint_set_valid(hint);
}
assert("edward-709", znode_is_any_locked(coord->node));
-
- /* In-place lookup is going here, it means we just need to
- check if next item of the @coord match to the @keyhint) */
-
+ /*
+ * Hint is valid, so we perform in-place lookup.
+ * It means we just need to check if the next item in
+ * the tree (relative to the current position @coord)
+ * has key @key.
+ *
+ * Valid hint means in particular, that node is not
+ * empty and at least one its item has been processed
+ */
if (equal_to_rdk(coord->node, key)) {
- result = goto_right_neighbor(coord, &hint->lh);
- if (result == -E_NO_NEIGHBOR) {
- assert("edward-1217", 0);
- return RETERR(-EIO);
+ /*
+ * Look for the item in the right neighbor
+ */
+ lock_handle lh_right;
+
+ init_lh(&lh_right);
+ result = reiser4_get_right_neighbor(&lh_right, coord->node,
+ znode_is_wlocked(coord->node) ?
+ ZNODE_WRITE_LOCK : ZNODE_READ_LOCK,
+ GN_CAN_USE_UPPER_LEVELS);
+ if (result) {
+ done_lh(&lh_right);
+ reiser4_unset_hint(hint);
+ if (result == -E_NO_NEIGHBOR)
+ return RETERR(-EIO);
+ return result;
}
- if (result)
+ assert("edward-1218",
+ equal_to_ldk(lh_right.node, key));
+ result = zload(lh_right.node);
+ if (result) {
+ done_lh(&lh_right);
+ reiser4_unset_hint(hint);
return result;
- assert("edward-1218", equal_to_ldk(coord->node, key));
- went_right = 1;
+ }
+ coord_init_first_unit_nocheck(coord, lh_right.node);
+
+ if (!coord_is_existing_item(coord)) {
+ zrelse(lh_right.node);
+ done_lh(&lh_right);
+ goto traverse_tree;
+ }
+ item_key_by_coord(coord, &ikey);
+ zrelse(coord->node);
+ if (unlikely(!keyeq(key, &ikey))) {
+ warning("edward-1608",
+ "Expected item not found. Fsck?");
+ done_lh(&lh_right);
+ goto not_found;
+ }
+ /*
+ * item has been found in the right neighbor;
+ * move lock to the right
+ */
+ done_lh(&hint->lh);
+ move_lh(&hint->lh, &lh_right);
+
+ dclust_inc_extension_ncount(hint);
+
+ return CBK_COORD_FOUND;
} else {
+ /*
+ * Look for the item in the current node
+ */
coord->item_pos++;
coord->unit_pos = 0;
coord->between = AT_UNIT;
- }
- result = zload(coord->node);
- if (result)
- return result;
- assert("edward-1219", !node_is_empty(coord->node));
- if (!coord_is_existing_item(coord)) {
+ result = zload(coord->node);
+ if (result) {
+ done_lh(&hint->lh);
+ return result;
+ }
+ if (!coord_is_existing_item(coord)) {
+ zrelse(coord->node);
+ goto not_found;
+ }
+ item_key_by_coord(coord, &ikey);
zrelse(coord->node);
- goto not_found;
+ if (!keyeq(key, &ikey))
+ goto not_found;
+ /*
+ * item has been found in the current node
+ */
+ return CBK_COORD_FOUND;
}
- item_key_by_coord(coord, &ikey);
- zrelse(coord->node);
- if (!keyeq(key, &ikey))
- goto not_found;
- /* Ok, item is found, update node counts */
- if (went_right)
- dclust_inc_extension_ncount(hint);
- return CBK_COORD_FOUND;
-
not_found:
- assert("edward-1220", coord->item_pos > 0);
- //coord->item_pos--;
- /* roll back */
+ /*
+ * The tree doesn't contain an item with @key;
+ * roll back the coord
+ */
*coord = orig;
ON_DEBUG(coord_update_v(coord));
return CBK_COORD_NOTFOUND;
traverse_tree:
- assert("edward-713", hint->lh.owner == NULL);
- assert("edward-714", reiser4_schedulable());
reiser4_unset_hint(hint);
dclust_init_extension(hint);
coord_init_zero(coord);
+
+ assert("edward-713", hint->lh.owner == NULL);
+ assert("edward-714", reiser4_schedulable());
+
result = coord_by_key(current_tree, key, coord, &hint->lh,
lock_mode, bias, LEAF_LEVEL, LEAF_LEVEL,
CBK_UNIQUE | flags, ra_info);
--- linux-3.5.3.orig/fs/reiser4/carry_ops.c
+++ linux-3.5.3/fs/reiser4/carry_ops.c
@@ -943,7 +943,7 @@ static int enough_space_for_whole_flow(c
#define MIN_FLOW_FRACTION 1
static int enough_space_for_min_flow_fraction(carry_op * op)
{
- assert("vs-902", coord_is_after_rightmost(flow_insert_point(op)));
+ //assert("vs-902", coord_is_after_rightmost(flow_insert_point(op)));
return what_can_fit_into_node(op) >= MIN_FLOW_FRACTION;
}
@@ -1096,6 +1096,10 @@ make_space_for_flow_insertion(carry_op *
/* whole flow fits into insert point node */
return 0;
}
+ if ((flags & COPI_SWEEP) &&
+ enough_space_for_min_flow_fraction(op))
+ /* use the rest of space in the current node */
+ return 0;
if (!(flags & COPI_DONT_SHIFT_LEFT)
&& (make_space_by_shift_left(op, doing, todo) == 0)) {
--- linux-3.5.3.orig/fs/reiser4/forward.h
+++ linux-3.5.3/fs/reiser4/forward.h
@@ -224,7 +224,9 @@ typedef enum {
COPI_GO_RIGHT = (1 << 6),
/* try to step back into original node if insertion into new node
fails after shifting data there. */
- COPI_STEP_BACK = (1 << 7)
+ COPI_STEP_BACK = (1 << 7),
+ /* use all possible space in the node */
+ COPI_SWEEP = (1 << 8)
} cop_insert_flag;
typedef enum {
--- linux-3.5.3.orig/fs/reiser4/plugin/item/ctail.c
+++ linux-3.5.3/fs/reiser4/plugin/item/ctail.c
@@ -935,7 +935,10 @@ insert_cryptcompress_flow(coord_t * coor
data->length = 0;
data->data = NULL;
- op->u.insert_flow.flags = COPI_DONT_SHIFT_LEFT | COPI_DONT_SHIFT_RIGHT;
+ op->u.insert_flow.flags =
+ COPI_SWEEP |
+ COPI_DONT_SHIFT_LEFT |
+ COPI_DONT_SHIFT_RIGHT;
op->u.insert_flow.insert_point = coord;
op->u.insert_flow.flow = f;
op->u.insert_flow.data = data;
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2012-10-21 17:58 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-10-21 17:58 [patch 1/4] reiser4: fixups in cryptcompress plugin Edward Shishkin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).