Hi all. It seems I do have the long-awaited fix. The symptoms of the problem: kernel starts to issue complaints about key inconsistency with the suggestions to check the partition with fsck. Fsck sometimes finds corruptions, but sometimes reports that file system is consistent. Please apply the attached patch to reiser4 stuff for 3.6.2, or download reiser4-for-3.6.4 (which already contains this patch), and let me know if the problem has not gone: http://sourceforge.net/projects/reiser4/files/reiser4-for-linux-3.x/ Please, don't rush to deploy production systems on reiser4: it can take up to 80 hours to reproduce the problem with high workload. Thank you for your help. Edward.
Update dkeys of the pair of nodes, which took participation in the "implicit shift" during squalloc on the twig level in flush time. Signed-off-by: Edward Shishkin <edward.shishkin@xxxxxxxxx> --- fs/reiser4/flush.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) --- linux-3.6.2_.orig/fs/reiser4/flush.c +++ linux-3.6.2_/fs/reiser4/flush.c @@ -450,6 +450,7 @@ static int znode_check_flushprepped(znod { return jnode_check_flushprepped(ZJNODE(node)); } +static void update_znode_dkeys(znode * left, znode * right); /* Flush position functions */ static void pos_init(flush_pos_t *pos); @@ -1525,6 +1526,7 @@ static int squeeze_right_twig(znode * le int ret = SUBTREE_MOVED; coord_t coord; /* used to iterate over items */ reiser4_key stop_key; + reiser4_tree *tree; assert("jmacd-2008", !node_is_empty(right)); coord_init_first_unit(&coord, right); @@ -1552,6 +1554,18 @@ static int squeeze_right_twig(znode * le ON_DEBUG(shift_check(vp, left, coord.node)); } + /* + * @left and @right nodes participated in the + * implicit shift, determined by the pair of + * functions: + * . squalloc_extent() - append units to the @left + * . squalloc_right_twig_cut() - cut the units from @right + * so update their delimiting keys + */ + tree = znode_get_tree(left); + write_lock_dk(tree); + update_znode_dkeys(left, right); + write_unlock_dk(tree); if (node_is_empty(coord.node)) ret = SQUEEZE_SOURCE_EMPTY;