Re: [Yaffs] yaffs with kernel 2.6.25: no more iget()

Top Page
Attachments:
Message as email
+ (text/plain)
Delete this message
Reply to this message
Author: Bob Dunlop
Date:  
To: yaffs
Subject: Re: [Yaffs] yaffs with kernel 2.6.25: no more iget()
Hi,

On Mon, Mar 31 at 08:19, Dirk Behme wrote:
> Matthias Fuchs wrote:
>> Hi,
>> did anybody spend some time in compiling yaffs for 2.6.25-rcX?
>> In February the iget() call got lost. So current yaffs does not compile in
>> recent kernels anymore.
>
> Yes, you are right. With 2.6.25-rc6 I get

...
> Looking at the quite good patch comment, fixing this should be easy (?).
>
> Anybody with a patch?


Well I had to put YAFFS2 into the 2.6.25 kernel on Friday and this is the
naive patch I came up with based on the example changes. It compiles and
works for me but I've only been using YAFFS for a total of 2 days. I've
done little more than "it doesn't smoke" testing.


--- linux-2.6.git/fs/yaffs2/yaffs_fs.c-orig    2008-04-17 08:49:19.000000000 +0100
+++ linux-2.6.git/fs/yaffs2/yaffs_fs.c    2008-04-17 10:09:40.000000000 +0100
@@ -181,7 +181,7 @@
 #else
 static int yaffs_statfs(struct super_block *sb, struct statfs *buf);
 #endif
-static void yaffs_read_inode(struct inode *inode);
+static struct inode *yaffs_iget(struct super_block *sb, unsigned long ino);


static void yaffs_put_inode(struct inode *inode);
static void yaffs_delete_inode(struct inode *);
@@ -284,7 +284,6 @@

 static struct super_operations yaffs_super_ops = {
     .statfs = yaffs_statfs,
-    .read_inode = yaffs_read_inode,
     .put_inode = yaffs_put_inode,
     .put_super = yaffs_put_super,
     .delete_inode = yaffs_delete_inode,
@@ -844,7 +843,9 @@
     T(YAFFS_TRACE_OS,
       (KERN_DEBUG "yaffs_get_inode for object %d\n", obj->objectId));


-    inode = iget(sb, obj->objectId);
+    inode = yaffs_iget(sb, obj->objectId);
+    if (IS_ERR(inode))
+        return NULL;


     /* NB Side effect: iget calls back to yaffs_read_inode(). */
     /* iget also increments the inode's i_count */
@@ -1427,19 +1428,25 @@
 }



-static void yaffs_read_inode(struct inode *inode)
+static struct inode *yaffs_iget(struct super_block *sb, unsigned long ino)
 {
-    /* NB This is called as a side effect of other functions, but
-     * we had to release the lock to prevent deadlocks, so
-     * need to lock again.
-     */
-
+    struct inode *inode;
     yaffs_Object *obj;
-    yaffs_Device *dev = yaffs_SuperToDevice(inode->i_sb);
+    yaffs_Device *dev = yaffs_SuperToDevice(sb);


     T(YAFFS_TRACE_OS,
-      (KERN_DEBUG "yaffs_read_inode for %d\n", (int)inode->i_ino));
+      (KERN_DEBUG "yaffs_iget for %lu\n", ino));


+    inode = iget_locked(sb, ino);
+    if (!inode)
+        return ERR_PTR(-ENOMEM);
+    if (!(inode->i_state & I_NEW))
+        return inode;
+
+    /* NB This is called as a side effect of other functions, but
+     * we had to release the lock to prevent deadlocks, so
+     * need to lock again.
+     */
     yaffs_GrossLock(dev);


     obj = yaffs_FindObjectByNumber(dev, inode->i_ino);
@@ -1447,6 +1454,9 @@
     yaffs_FillInodeFromObject(inode, obj);


     yaffs_GrossUnlock(dev);
+
+    unlock_new_inode(inode);
+    return inode;
 }


static LIST_HEAD(yaffs_dev_list);

-- 
        Bob Dunlop
        Guralp Systems Limited
        http://www.guralp.com