summaryrefslogtreecommitdiff
path: root/target/linux
diff options
context:
space:
mode:
authorjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>2008-05-28 13:33:45 +0000
committerjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>2008-05-28 13:33:45 +0000
commit3e48995e83c54aec036d9f9486755c35f641051b (patch)
tree8487c287c201eb3000d303161ca1d1a436021a0c /target/linux
parent512f1628d2757d5103315dcc896b8b402b7b3b04 (diff)
[kernel] fix yaffs on 2.6.25
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@11278 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux')
-rw-r--r--target/linux/generic-2.6/patches-2.6.25/511-yaffs_2.6.25_fix.patch94
1 files changed, 94 insertions, 0 deletions
diff --git a/target/linux/generic-2.6/patches-2.6.25/511-yaffs_2.6.25_fix.patch b/target/linux/generic-2.6/patches-2.6.25/511-yaffs_2.6.25_fix.patch
new file mode 100644
index 0000000000..83db1b8a2e
--- /dev/null
+++ b/target/linux/generic-2.6/patches-2.6.25/511-yaffs_2.6.25_fix.patch
@@ -0,0 +1,94 @@
+Index: linux-2.6.25.4/fs/yaffs2/yaffs_fs.c
+===================================================================
+--- linux-2.6.25.4.orig/fs/yaffs2/yaffs_fs.c
++++ linux-2.6.25.4/fs/yaffs2/yaffs_fs.c
+@@ -181,7 +181,13 @@ static int yaffs_statfs(struct super_blo
+ #else
+ static int yaffs_statfs(struct super_block *sb, struct statfs *buf);
+ #endif
++
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25))
++static struct inode *yaffs_iget(struct super_block *sb, unsigned long ino);
++#else
+ static void yaffs_read_inode(struct inode *inode);
++#endif
++
+
+ static void yaffs_put_inode(struct inode *inode);
+ static void yaffs_delete_inode(struct inode *);
+@@ -284,7 +290,9 @@ static struct file_operations yaffs_dir_
+
+ static struct super_operations yaffs_super_ops = {
+ .statfs = yaffs_statfs,
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25))
+ .read_inode = yaffs_read_inode,
++#endif
+ .put_inode = yaffs_put_inode,
+ .put_super = yaffs_put_super,
+ .delete_inode = yaffs_delete_inode,
+@@ -844,11 +852,17 @@ struct inode *yaffs_get_inode(struct sup
+ T(YAFFS_TRACE_OS,
+ (KERN_DEBUG "yaffs_get_inode for object %d\n", obj->objectId));
+
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25))
++ inode = yaffs_iget(sb, obj->objectId);
++ if (IS_ERR(inode))
++ return NULL;
++#else
+ inode = iget(sb, obj->objectId);
+
+ /* NB Side effect: iget calls back to yaffs_read_inode(). */
+ /* iget also increments the inode's i_count */
+ /* NB You can't be holding grossLock or deadlock will happen! */
++#endif
+
+ return inode;
+ }
+@@ -1427,6 +1441,39 @@ static int yaffs_sync_fs(struct super_bl
+ }
+
+
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25))
++static struct inode *yaffs_iget(struct super_block *sb, unsigned long ino)
++{
++ yaffs_Object *obj;
++ yaffs_Device *dev = yaffs_SuperToDevice(sb);
++ struct inode *inode;
++
++ T(YAFFS_TRACE_OS,
++ (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);
++
++ yaffs_FillInodeFromObject(inode, obj);
++
++ yaffs_GrossUnlock(dev);
++
++ unlock_new_inode(inode);
++ return inode;
++}
++#else
+ static void yaffs_read_inode(struct inode *inode)
+ {
+ /* NB This is called as a side effect of other functions, but
+@@ -1448,6 +1495,7 @@ static void yaffs_read_inode(struct inod
+
+ yaffs_GrossUnlock(dev);
+ }
++#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)) */
+
+ static LIST_HEAD(yaffs_dev_list);
+