[Yaffs] Hard Link problem

Top Page
Attachments:
Message as email
+ (text/plain)
+ (text/html)
Delete this message
Reply to this message
Author: Yong Kwan Park
Date:  
To: yaffs
Subject: [Yaffs] Hard Link problem
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?