Hi all,
I had a problem related with hard link in yaffs2.
A problem occured in the following two deleted objects.
yaffs_Object obj1
variantType = YAFFS_OBJECT_TYPE_HARDLINK
objectId = 6036
variant.hardLinkVariant.equivalentObjectId = 6010
deleted = 1
yaffs_Object obj2
variantType = YAFFS_OBJECT_TYPE_HARDLINK
objectId = 5816
variant.hardLinkVariant.equivalentObjectId = 6036
deleted = 1
An error took place in the function yaffs_ScanBackwards.
Line 4896
case YAFFS_OBJECT_TYPE_HARDLINK:
in->variant.hardLinkVariant.equivalentObjectId =
oh->equivalentObjectId;
in->hardLinks.next =
(struct list_head *) hardList;
hardList = in;
break;
Obj1 was the first object to be executed in the previous code.
Therefore, obj1->hardLinks.next = NULL;
Because hardList was initialized to NULL in line 4432.
This makes an error in the following code.
Line 4953
if (in) {
/* Add the hardlink pointers */
hl->variant.hardLinkVariant.equivalentObject = in;
list_add(&hl->hardLinks, &in->hardLinks);
} else {
/* Todo Need to report/handle this better.
* Got a problem... hardlink to a non-existant object
*/
hl->variant.hardLinkVariant.equivalentObject = NULL;
INIT_LIST_HEAD(&hl->hardLinks);
}
In line 4956, there is list_add(&hl->hardLinks, &in->hardLinks).
In this case, "in" can be obj1 and "hl" can be obj2.
But obj1->hardLinks.next was initialized to NULL in line 4899.
So NULL pointer is referenced in list_add.
This problem was caused because a deleted hard link referred to
the other deleted hard link.
The other reason is that deleted hard links were set up.
I solved this problem like this.
4897,4901c4897,4904
< in->variant.hardLinkVariant.equivalentObjectId =
< oh->equivalentObjectId;
< in->hardLinks.next =
< (struct list_head *) hardList;
< hardList = in;
---
> if (in->deleted == 0)
> {
> in->variant.hardLinkVariant.equivalentObjectId =
> oh->equivalentObjectId;
> in->hardLinks.next =
> (struct list_head *) hardList;
> hardList = in;
> }
Is it necessary to set up hard links about deleted hard links files?