Hello, 

would you try this patch, it should fix the problem,
email me about the result please.

> ***** Semantic Traverse Pass: reiser4 semantic tree checking.
> Error: Node (1444613), item (2): StatData of the file [2a:0:ffff] has the
> wrong bytes (0), Fixed to (188). Plugin (stat40).
>
> Looks good, but when I run "fsck.reiser4 /dev/sys/backup" again, it tells
> me that it has found 1 fixable corruption and that I need to run it with
> the --fix parameter...
> P.S. How about all these spelling errors in fsck's output? ;)

all spelling fixes are appreciated :)

-- 
Thanks,
Vitaly Fertman
diff -Nru a/librepair/repair.c b/librepair/repair.c
--- a/librepair/repair.c	Fri Apr  2 17:41:46 2004
+++ b/librepair/repair.c	Fri Apr  2 17:41:46 2004
@@ -617,7 +617,7 @@
 	
 	/* FIXME: This is oid40 specific fix, not correct. To be rewritten when
 	   shared oid handling will be realy. */
-	if (control->oid && control->oid != val) {
+	if (control->oid && control->oid > val) {
 		if (mode != RM_BUILD) {
 			aal_mess("First not used oid %llu is wrong. %s %llu.",
 				 val, mode == RM_CHECK ? "Sould be" : 
diff -Nru a/plugin/key/key_large/key_large.c b/plugin/key/key_large/key_large.c
--- a/plugin/key/key_large/key_large.c	Fri Apr  2 17:41:46 2004
+++ b/plugin/key/key_large/key_large.c	Fri Apr  2 17:41:46 2004
@@ -207,12 +207,12 @@
 	if (key_large_get_type(key1) == KEY_FILENAME_TYPE)
 		return 0;
 
-	ord1 = key_large_get_ordering(key1);
-	ord2 = key_large_get_ordering(key2);
-	
 	/* Checking ordering. */
-	if ((res = aal_memcmp(&ord1, &ord2, sizeof(ord1))))
+	if ((res = kl_comp_el((key_large_t *)key1->body,
+			      (key_large_t *)key2->body, 1)))
+	{
 		return res;
+	}
 	
 	/* Checking objectid  */
 	return kl_comp_el((key_large_t *)key1->body,
@@ -295,9 +295,8 @@
 				   len - INLINE_CHARS);
 	}
 
-	ordering |= ((uint64_t)plug_call(fibre->o.fibre_ops, 
-					 build, name + INLINE_CHARS,
-					 len - INLINE_CHARS) << FIBRE_SHIFT);
+	ordering |= ((uint64_t)plug_call(fibre->o.fibre_ops, build, 
+					 name, len) << FIBRE_SHIFT);
 	
 	/* Setting up objectid and offset */
 	key_large_set_ordering(key, ordering);
diff -Nru a/plugin/key/key_short/key_short.c b/plugin/key/key_short/key_short.c
--- a/plugin/key/key_short/key_short.c	Fri Apr  2 17:41:46 2004
+++ b/plugin/key/key_short/key_short.c	Fri Apr  2 17:41:46 2004
@@ -276,9 +276,8 @@
 				   len - OBJECTID_CHARS);
 	}
 	
-	objectid |= ((uint64_t)plug_call(fibre->o.fibre_ops, 
-					 build, name + OBJECTID_CHARS,
-					 len - OBJECTID_CHARS) << FIBRE_SHIFT);
+	objectid |= ((uint64_t)plug_call(fibre->o.fibre_ops, build, 
+					 name, len) << FIBRE_SHIFT);
 	
 	/* Objectid must occupie 60 bits. If it takes more, then we have broken
 	   key, or objectid allocator reached this value, that impossible in
diff -Nru a/plugin/object/dir40/dir40.c b/plugin/object/dir40/dir40.c
--- a/plugin/object/dir40/dir40.c	Fri Apr  2 17:41:46 2004
+++ b/plugin/object/dir40/dir40.c	Fri Apr  2 17:41:46 2004
@@ -464,7 +476,6 @@
 {
 	rid_t pid;
 	dir40_t *dir;
-	uint64_t mask;
 	entry_hint_t entry;
 	trans_hint_t body_hint;
 	reiser4_plug_t *body_plug;
@@ -556,9 +567,7 @@
 	}
 
 	/* Create stat data item. */
-	mask = (1 << SDEXT_UNIX_ID | 1 << SDEXT_LW_ID);
-	
-	if (obj40_create_stat(&dir->obj, hint->label.statdata, mask,
+	if (obj40_create_stat(&dir->obj, hint->label.statdata, 
 			      1, body_hint.len, 0, 1, S_IFDIR, NULL))
 	{
 	
diff -Nru a/plugin/object/dir40/dir40_repair.c b/plugin/object/dir40/dir40_repair.c
--- a/plugin/object/dir40/dir40_repair.c	Fri Apr  2 17:41:46 2004
+++ b/plugin/object/dir40/dir40_repair.c	Fri Apr  2 17:41:46 2004
@@ -7,7 +7,11 @@
 #include "dir40.h"
 #include "repair/plugin.h"
 
-#define dir40_exts ((uint64_t)1 << SDEXT_LW_ID)
+/* Set of extentions that must present. */
+#define DIR40_EXTS_MUST ((uint64_t)1 << SDEXT_LW_ID)
+
+/* Set of unknown extentions. */
+#define DIR40_EXTS_UNKN ((uint64_t)1 << SDEXT_SYMLINK_ID)
 
 static errno_t dir40_extensions(reiser4_place_t *stat) {
 	uint64_t extmask;
@@ -15,12 +19,11 @@
 	extmask = obj40_extmask(stat);
 	
 	/* Check that there is no one unknown extension. */
-	/*
-	if (extmask & ~(dir40_exts | 1 << SDEXT_PLUG_ID))
+	if (extmask & DIR40_EXTS_UNKN)
 		return RE_FATAL;
-	*/
+	
 	/* Check that LW and UNIX extensions exist. */
-	return ((extmask & dir40_exts) == dir40_exts) ? 0 : RE_FATAL;
+	return ((extmask & DIR40_EXTS_MUST) == DIR40_EXTS_MUST) ? 0 : RE_FATAL;
 }
 
 /* Check SD extensions and that mode in LW extension is DIRFILE. */
@@ -153,8 +156,7 @@
 	
 	info = &dir->obj.info;
 	
-	if ((res = obj40_launch_stat(&dir->obj, NULL, dir40_exts, 1, 
-				     S_IFDIR, mode)))
+	if ((res = obj40_launch_stat(&dir->obj, NULL, 1, S_IFDIR, mode)))
 		return res;
 	
 	/* Try to register SD as an item of this file. */
diff -Nru a/plugin/object/obj40/obj40.c b/plugin/object/obj40/obj40.c
--- a/plugin/object/obj40/obj40.c	Fri Apr  2 17:41:46 2004
+++ b/plugin/object/obj40/obj40.c	Fri Apr  2 17:41:46 2004
@@ -189,9 +189,9 @@
 
 /* Create stat data item basing on passed extensions @mask, @size, @bytes,
    @nlinks, @mode and @path for symlinks. Returns error or zero for success. */
-errno_t obj40_create_stat(obj40_t *obj, rid_t pid, uint64_t mask,
-			  uint64_t size, uint64_t bytes, uint64_t rdev,
-			  uint32_t nlink, uint16_t mode, char *path)
+errno_t obj40_create_stat(obj40_t *obj, rid_t pid, uint64_t size, 
+			  uint64_t bytes, uint64_t rdev, uint32_t nlink, 
+			  uint16_t mode, char *path)
 {
 	int64_t res;
 	lookup_t lookup;
@@ -218,7 +218,7 @@
 		  &hint.offset, &obj->info.object);
     
 	/* Initializing stat data item hint. */
-	stat.extmask = mask;
+	stat.extmask = (1 << SDEXT_UNIX_ID | 1 << SDEXT_LW_ID);
     	
 	/* Light weight hint initializing. */
 	lw_ext.size = size;
@@ -247,8 +247,10 @@
 	stat.ext[SDEXT_LW_ID] = &lw_ext;
 	stat.ext[SDEXT_UNIX_ID] = &unix_ext;
 
-	if ((1 << SDEXT_SYMLINK_ID) & mask)
+	if (path) {
+		stat.extmask |= (1 << SDEXT_SYMLINK_ID);
 		stat.ext[SDEXT_SYMLINK_ID] = path;
+	}
 	
 	hint.specific = &stat;
 
diff -Nru a/plugin/object/obj40/obj40.h b/plugin/object/obj40/obj40.h
--- a/plugin/object/obj40/obj40.h	Fri Apr  2 17:41:46 2004
+++ b/plugin/object/obj40/obj40.h	Fri Apr  2 17:41:46 2004
@@ -130,14 +130,12 @@
 
 #ifndef ENABLE_STAND_ALONE
 extern errno_t obj40_create_stat(obj40_t *obj, rid_t pid,
-				 uint64_t mask, uint64_t size,
-				 uint64_t bytes, uint64_t rdev,
-				 uint32_t nlink, uint16_t mode,
-				 char *path);
+				 uint64_t size, uint64_t bytes, 
+				 uint64_t rdev, uint32_t nlink, 
+				 uint16_t mode, char *path);
 
 extern errno_t obj40_launch_stat(obj40_t *obj, stat_func_t stat_func, 
-				 uint64_t mask, uint32_t nlink, 
-				 uint16_t objmode, uint8_t mode);
+				 uint32_t nlink, uint16_t objmode, uint8_t mode);
 
 extern errno_t obj40_check_stat(obj40_t *obj, nlink_func_t nlink_func,
 				mode_func_t mode_func, size_func_t size_func,
diff -Nru a/plugin/object/obj40/obj40_repair.c b/plugin/object/obj40/obj40_repair.c
--- a/plugin/object/obj40/obj40_repair.c	Fri Apr  2 17:41:46 2004
+++ b/plugin/object/obj40/obj40_repair.c	Fri Apr  2 17:41:46 2004
@@ -6,6 +6,7 @@
 #ifndef ENABLE_STAND_ALONE
 #include "obj40.h"
 #include <repair/plugin.h>
+#include <sys/stat.h>
 
 /* Obtains the plugin of the type @type from SD if stored there, otherwise
    obtains the default one from the params. This differs from obj40_plug as it
@@ -60,13 +61,10 @@
 	if (info->start.plug->id.group != STATDATA_ITEM)
 		return RE_FATAL;
 	
-	/* Is @info->start SD of the wanted file? If some fields are broken, 
-	   like offset != 0, fix it at check_struct time. */
-	if (info->object.plug->o.key_ops->compshort(&info->object, 
-						    &info->start.key))
-	{
+	/* Compare the correct key with the place key. */
+	if (plug_call(info->object.plug->o.key_ops, compfull,
+		      &info->object, &info->start.key))
 		return RE_FATAL;
-	}
 	
 	/* Some SD is recognized. Check that this is our SD. */
 	return stat_func ? stat_func(&info->start) : 0;
@@ -79,48 +77,28 @@
 	reiser4_key_t key;
 
 	aal_assert("vpf-1121", obj->info.tree != NULL);
-	aal_assert("vpf-1127", obj->info.object.plug || obj->info.start.plug);
+	aal_assert("vpf-1127", obj->info.object.plug != NULL);
 	
 	info = &obj->info;
 	
-	if (info->object.plug) {
-		locality = plug_call(info->object.plug->o.key_ops,
-				     get_locality, &info->object);
-
-		objectid = plug_call(info->object.plug->o.key_ops,
-				     get_objectid, &info->object);
-
-		ordering = plug_call(info->object.plug->o.key_ops,
-				     get_ordering, &info->object);
-
-	
-		plug_call(info->object.plug->o.key_ops, build_generic, &key,
-			  KEY_STATDATA_TYPE, locality, ordering, objectid, 0);
-		
-		/* Realizing on the key: SD is not found. Check if the key 
-		   pointer is correct. */
-		if (plug_call(info->object.plug->o.key_ops, compfull, 
-			      &key, &info->object))
-			return RE_FATAL;
-	} else {
-		/* Realizing on the SD. */
-		aal_assert("vpf-1204",  info->start.plug->id.group == 
-			   		STATDATA_ITEM);
-
-		locality = plug_call(info->object.plug->o.key_ops,
-				     get_locality, &info->start.key);
-
-		objectid = plug_call(info->object.plug->o.key_ops,
-				     get_objectid, &info->start.key);
-
-		ordering = plug_call(info->object.plug->o.key_ops,
-				     get_ordering, &info->start.key);
-
-		/* Build the SD key into @info->object. */
-		plug_call(info->start.key.plug->o.key_ops, build_generic, 
-			  &info->object, KEY_STATDATA_TYPE, locality, 
-			  ordering, objectid, 0);
-	}
+	/* Check if the key pointer is correct and then check the found item 
+	   if it is SD with the proper key. */
+	locality = plug_call(info->object.plug->o.key_ops,
+			     get_locality, &info->object);
+
+	objectid = plug_call(info->object.plug->o.key_ops,
+			     get_objectid, &info->object);
+
+	ordering = plug_call(info->object.plug->o.key_ops,
+			     get_ordering, &info->object);
+
+	plug_call(info->object.plug->o.key_ops, build_generic, &key,
+		  KEY_STATDATA_TYPE, locality, ordering, objectid, 0);
+
+	/* Compare the correct key with the search one. */
+	if (plug_call(info->object.plug->o.key_ops, compfull, 
+		      &key, &info->object))
+		return RE_FATAL;
 	
 	/* @info->object is the key of SD for now and @info->start is the 
 	   result of tree lookup by @info->object -- skip objects w/out SD. */
@@ -255,8 +233,7 @@
 }
 
 errno_t obj40_launch_stat(obj40_t *obj, stat_func_t stat_func, 
-			  uint64_t mask, uint32_t nlink, 
-			  uint16_t objmode, uint8_t mode)
+			  uint32_t nlink, uint16_t objmode, uint8_t mode)
 {
 	reiser4_key_t *key;
 	lookup_t lookup;
@@ -309,8 +286,8 @@
 	if ((pid = obj->core->param_ops.value("statdata") == INVAL_PID))
 		return -EINVAL;
 
-	if ((res = obj40_create_stat(obj, pid, mask, 0, 0,
-				     0, nlink, objmode, NULL)))
+	if ((res = obj40_create_stat(obj, pid, 0, 0, 0, nlink, objmode, 
+				     objmode == S_IFLNK ? "FAKE_LINK" : NULL)))
 	{
 		aal_error("The file [%s] failed to create a "
 			  "StatData item. Plugin %s.", 
diff -Nru a/plugin/object/reg40/reg40.c b/plugin/object/reg40/reg40.c
--- a/plugin/object/reg40/reg40.c	Fri Apr  2 17:41:46 2004
+++ b/plugin/object/reg40/reg40.c	Fri Apr  2 17:41:46 2004
@@ -195,7 +195,6 @@
 				     object_hint_t *hint)
 {
 	reg40_t *reg;
-	uint64_t mask;
 	
 	aal_assert("umka-1169", info != NULL);
 	aal_assert("umka-1738", hint != NULL);
@@ -229,12 +228,9 @@
 		goto error_free_reg;
 	}
 
-	/* Create stat data item with size, bytes, nlinks equal to zero and mask
-	   equal to @mask. */
-	mask = (1 << SDEXT_UNIX_ID | 1 << SDEXT_LW_ID);
-
+	/* Create stat data item with size, bytes, nlinks equal to zero. */
 	if (obj40_create_stat(&reg->obj, hint->label.statdata,
-			      mask, 0, 0, 0, 0, S_IFREG, NULL))
+			      0, 0, 0, 0, S_IFREG, NULL))
 	{
 		goto error_free_reg;
 	}
diff -Nru a/plugin/object/reg40/reg40_repair.c b/plugin/object/reg40/reg40_repair.c
--- a/plugin/object/reg40/reg40_repair.c	Fri Apr  2 17:41:46 2004
+++ b/plugin/object/reg40/reg40_repair.c	Fri Apr  2 17:41:46 2004
@@ -7,7 +7,11 @@
 #include "reg40.h"
 #include "repair/plugin.h"
 
-#define reg40_exts ((uint64_t)1 << SDEXT_LW_ID)
+/* Set of extentions that must present. */
+#define REG40_EXTS_MUST ((uint64_t)1 << SDEXT_LW_ID)
+
+/* Set of unknown extentions. */
+#define REG40_EXTS_UNKN ((uint64_t)1 << SDEXT_SYMLINK_ID)
 
 static errno_t reg40_extensions(reiser4_place_t *stat) {
 	uint64_t extmask;
@@ -15,12 +19,12 @@
 	/* Check that there is no one unknown extension. */
 	extmask = obj40_extmask(stat);
 	
-	/*
-	if (extmask & ~(reg40_exts | 1 << SDEXT_PLUG_ID))
+	/* Check that there is no one unknown extension. */
+	if (extmask & REG40_EXTS_UNKN)
 		return RE_FATAL;
-	*/
+
 	/* Check that LW and UNIX extensions exist. */
-	return ((extmask & reg40_exts) == reg40_exts) ? 0 : RE_FATAL;
+	return ((extmask & REG40_EXTS_MUST) == REG40_EXTS_MUST) ? 0 : RE_FATAL;
 }
 
 /* Check SD extensions and that mode in LW extension is REGFILE. */
@@ -389,18 +393,12 @@
 	info = &reg->obj.info;
 	
 	if ((res = obj40_launch_stat(&reg->obj, callback_stat, 
-				     reg40_exts, 1, S_IFREG, mode)))
-	{
+				     1, S_IFREG, mode)))
 		return res;
-	}
 
 	/* Try to register SD as an item of this file. */
 	if (func && func(&info->start, data))
 		return -EINVAL;
-	
-	/* Fix SD's key if differs. */
-	if ((res = obj40_fix_key(&reg->obj, &info->start, &info->object, mode)))
-		return res;
 	
 	/* Get the reg file tail policy. */
 	if (!(reg->policy = obj40_plug(&reg->obj, POLICY_PLUG_TYPE, "policy")))
diff -Nru a/plugin/object/spl40/spl40.c b/plugin/object/spl40/spl40.c
--- a/plugin/object/spl40/spl40.c	Fri Apr  2 17:41:46 2004
+++ b/plugin/object/spl40/spl40.c	Fri Apr  2 17:41:46 2004
@@ -61,7 +61,6 @@
 				     object_hint_t *hint)
 {
 	spl40_t *spl;
-	uint64_t mask;
 	
 	aal_assert("umka-2531", info != NULL);
 	aal_assert("umka-2533", hint != NULL);
@@ -73,10 +72,8 @@
 	/* Inizializes file handle */
 	obj40_init(&spl->obj, &spl40_plug, spl40_core, info);
 
-	mask = (1 << SDEXT_UNIX_ID | 1 << SDEXT_LW_ID);
-	
 	if (obj40_create_stat(&spl->obj, hint->label.statdata,
-			      mask, 0, 0, hint->body.spl.rdev,
+			      0, 0, hint->body.spl.rdev,
 			      0, hint->label.mode, NULL))
 	{
 		goto error_free_spl;
diff -Nru a/plugin/object/spl40/spl40_repair.c b/plugin/object/spl40/spl40_repair.c
--- a/plugin/object/spl40/spl40_repair.c	Fri Apr  2 17:41:46 2004
+++ b/plugin/object/spl40/spl40_repair.c	Fri Apr  2 17:41:46 2004
@@ -7,7 +7,11 @@
 #include "spl40.h"
 #include "repair/plugin.h"
 
-#define spl40_exts ((uint64_t)1 << SDEXT_LW_ID)
+/* Set of extentions that must present. */
+#define SPL40_EXTS_MUST ((uint64_t)1 << SDEXT_LW_ID)
+
+/* Set of unknown extentions. */
+#define SPL40_EXTS_UNKN ((uint64_t)1 << SDEXT_SYMLINK_ID)
 
 static errno_t spl40_extensions(reiser4_place_t *stat) {
 	uint64_t extmask;
@@ -15,12 +19,11 @@
 	extmask = obj40_extmask(stat);
 	
 	/* Check that there is no one unknown extension. */
-	/*
-	if (extmask & ~(sym40_exts | 1 << SDEXT_PLUG_ID))
+	if (extmask & SPL40_EXTS_UNKN)
 		return RE_FATAL;
-	*/
+	
 	/* Check that LW and UNIX extensions exist. */
-	return ((extmask & spl40_exts) == spl40_exts) ? 0 : RE_FATAL;
+	return ((extmask & SPL40_EXTS_MUST) == SPL40_EXTS_MUST) ? 0 : RE_FATAL;
 }
 
 /* Check SD extensions and that mode in LW extension is DIRFILE. */
@@ -90,8 +93,7 @@
 	aal_assert("vpf-1358", spl->obj.info.tree != NULL);
 	aal_assert("vpf-1359", spl->obj.info.object.plug != NULL);
 
-	if ((res = obj40_launch_stat(&spl->obj, spl40_extensions, 
-				     0, 1, 0, mode)))
+	if ((res = obj40_launch_stat(&spl->obj, spl40_extensions, 1, 0, mode)))
 		return res;
 	
 	/* Try to register SD as an item of this file. */
diff -Nru a/plugin/object/sym40/sym40.c b/plugin/object/sym40/sym40.c
--- a/plugin/object/sym40/sym40.c	Fri Apr  2 17:41:46 2004
+++ b/plugin/object/sym40/sym40.c	Fri Apr  2 17:41:46 2004
@@ -89,7 +89,6 @@
 {
 	sym40_t *sym;
 	uint32_t len;
-	uint64_t mask;
 	
 	aal_assert("umka-1741", info != NULL);
 	aal_assert("vpf-1094",  info->tree != NULL);
@@ -101,14 +100,10 @@
 	/* Inizializes symlink file handle. */
 	obj40_init(&sym->obj, &sym40_plug, sym40_core, info);
 
-	/* Initializing stat data extensions mask */
-	mask = (1 << SDEXT_UNIX_ID | 1 << SDEXT_LW_ID |
-		1 << SDEXT_SYMLINK_ID);
-
 	len = aal_strlen(hint->body.sym);
 
 	/* Create symlink sta data item. */
-	if (obj40_create_stat(&sym->obj, hint->label.statdata, mask,
+	if (obj40_create_stat(&sym->obj, hint->label.statdata,
 			      len, len, 0, 0, S_IFLNK, hint->body.sym))
 	{
 		goto error_free_sym;
diff -Nru a/plugin/object/sym40/sym40_repair.c b/plugin/object/sym40/sym40_repair.c
--- a/plugin/object/sym40/sym40_repair.c	Fri Apr  2 17:41:46 2004
+++ b/plugin/object/sym40/sym40_repair.c	Fri Apr  2 17:41:46 2004
@@ -8,20 +8,15 @@
 #include "sym40.h"
 #include "repair/plugin.h"
 
-#define sym40_exts ((uint64_t)1 << SDEXT_LW_ID | 1 << SDEXT_SYMLINK_ID)
+#define SYM40_EXTS_MUST ((uint64_t)1 << SDEXT_LW_ID | 1 << SDEXT_SYMLINK_ID)
 
 static errno_t sym40_extensions(reiser4_place_t *stat) {
 	uint64_t extmask;
 	
 	extmask = obj40_extmask(stat);
 	
-	/* Check that there is no one unknown extension. */
-	/*
-	if (extmask & ~(sym40_exts | 1 << SDEXT_PLUG_ID))
-		return RE_FATAL;
-	*/
 	/* Check that LW, UNIX and SYMLINK extensions exist. */
-	return ((extmask & sym40_exts) == sym40_exts) ? 0 : RE_FATAL;
+	return ((extmask & SYM40_EXTS_MUST) == SYM40_EXTS_MUST) ? 0 : RE_FATAL;
 }
 
 /* Check SD extensions and that mode in LW extension is DIRFILE. */
@@ -92,7 +87,7 @@
 	place = STAT_PLACE(&sym->obj);
 	
 	if ((res = obj40_launch_stat(&sym->obj, sym40_extensions, 
-				     sym40_exts, 1, S_IFLNK, mode)))
+				     1, S_IFLNK, mode)))
 		return res;
 	
 	/* Try to register SD as an item of this file. */

Reply via email to