Re: [Yaffs] NFS and YAFFS

Top Page
Attachments:
Message as email
+ (text/plain)
+ (text/html)
Delete this message
Reply to this message
Author: Jean-Loup Sabatier
Date:  
To: yaffs
Subject: Re: [Yaffs] NFS and YAFFS
Good Morning, all,



Charles, you'll find below the patch in a more standard form.



With this fix: YAFFS does not try anymore to take the semaphore if the
caller is the same process that already reserved it (in order to prevent
deadlocks). There should be a better solution, but this one works and
fixes our problem, so, for now, we live with it.



I hope it might be of some help...



Best regards, and have a nice day,



Jean-Loup





fs/yaffs2/yaffs_fs.c



diff -Naur yaffs_fs.c.v1_4 yaffs_fs.c.v1_5





--- yaffs_fs.c.v1_4     2008-02-18 15:16:35.000000000 +0100


+++ yaffs_fs.c.v1_5     2008-02-18 15:16:49.000000000 +0100


@@ -31,7 +31,7 @@

*/



const char *yaffs_fs_c_version =

-    "$Id: yaffs_fs.c,v 1.4 2007/10/22 13:12:16 ngenevrier Exp $";


+    "$Id: yaffs_fs.c,v 1.5 2008/01/14 10:38:57 jlsabatier Exp $";


extern const char *yaffs_guts_c_version;



#include <linux/config.h>

@@ -310,7 +310,8 @@



        yaffs_Device *dev = yaffs_InodeToObject(dir)->myDev;




-       yaffs_GrossLock(dev);


+       if (current != dev->readdirProcess)


+               yaffs_GrossLock(dev);




        T(YAFFS_TRACE_OS,


          (KERN_DEBUG "yaffs_lookup for %d:%s\n",


@@ -322,8 +323,10 @@



        obj = yaffs_GetEquivalentObject(obj);   /* in case it was a
hardlink */




+

        /* Can't hold gross lock when calling yaffs_get_inode() */


-       yaffs_GrossUnlock(dev);


+       if (current != dev->readdirProcess)


+               yaffs_GrossUnlock(dev);




        if (obj) {


                T(YAFFS_TRACE_OS,


@@ -814,6 +817,7 @@

        dev = obj->myDev;




        yaffs_GrossLock(dev);


+       dev->readdirProcess = current ;




        offset = f->f_pos;




@@ -883,6 +887,7 @@

       up_and_out:


       out:




+       dev->readdirProcess = NULL ;


        yaffs_GrossUnlock(dev);




        return 0;


@@ -1285,13 +1290,15 @@

        T(YAFFS_TRACE_OS,


          (KERN_DEBUG "yaffs_read_inode for %d\n", (int)inode->i_ino));




-       yaffs_GrossLock(dev);


+       if (current != dev->readdirProcess)


+               yaffs_GrossLock(dev);




        obj = yaffs_FindObjectByNumber(dev, inode->i_ino);




        yaffs_FillInodeFromObject(inode, obj);




-       yaffs_GrossUnlock(dev);


+       if (current != dev->readdirProcess)


+               yaffs_GrossUnlock(dev);


}



static LIST_HEAD(yaffs_dev_list);





fs/yaffs2/yaffs_guts.h



diff -Naur yaffs_guts.h.v1_1 yaffs_guts.h.v1_2





--- yaffs_guts.h.v1_1 2008-02-18 15:23:44.000000000 +0100

+++ yaffs_guts.h.v1_2 2008-02-18 15:23:32.000000000 +0100

@@ -14,7 +14,7 @@

*

* Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.

*

- * $Id: yaffs_guts.h,v 1.1 2006/06/09 06:42:35 pvillet Exp $

+ * $Id: yaffs_guts.h,v 1.2 2008/01/14 10:38:57 jlsabatier Exp $

*/



#ifndef __YAFFS_GUTS_H__

@@ -653,6 +653,8 @@

        unsigned sequenceNumber;        /* Sequence number of currently
allocating block */


        unsigned oldestDirtySequence;




+       struct task_struct *readdirProcess;


+

};



typedef struct yaffs_DeviceStruct yaffs_Device;