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?