diff options
Diffstat (limited to 'target/linux/generic/patches-3.12/506-yaffs-3.2-dont-use-i_nlink-directly.patch')
-rw-r--r-- | target/linux/generic/patches-3.12/506-yaffs-3.2-dont-use-i_nlink-directly.patch | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/target/linux/generic/patches-3.12/506-yaffs-3.2-dont-use-i_nlink-directly.patch b/target/linux/generic/patches-3.12/506-yaffs-3.2-dont-use-i_nlink-directly.patch new file mode 100644 index 0000000..91e8281 --- /dev/null +++ b/target/linux/generic/patches-3.12/506-yaffs-3.2-dont-use-i_nlink-directly.patch @@ -0,0 +1,78 @@ +--- a/fs/yaffs2/yaffs_vfs_glue.c ++++ b/fs/yaffs2/yaffs_vfs_glue.c +@@ -220,6 +220,29 @@ static struct inode *yaffs_iget(struct s + #define yaffs_SuperToDevice(sb) ((yaffs_dev_t *)sb->u.generic_sbp) + #endif + ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 2, 0)) ++static inline void yaffs_set_nlink(struct inode *inode, unsigned int nlink) ++{ ++ set_nlink(inode, nlink); ++} ++ ++static inline void yaffs_dec_link_count(struct inode *inode) ++{ ++ inode_dec_link_count(inode); ++} ++#else ++static inline void yaffs_set_nlink(struct inode *inode, unsigned int nlink) ++{ ++ inode->i_nlink = nlink; ++} ++ ++static inline void yaffs_dec_link_count(struct inode *inode) ++{ ++ inode->i_nlink--; ++ mark_inode_dirty(inode) ++} ++#endif ++ + + #define update_dir_time(dir) do {\ + (dir)->i_ctime = (dir)->i_mtime = CURRENT_TIME; \ +@@ -1362,7 +1385,7 @@ static void yaffs_fill_inode_from_obj(st + inode->i_size = yaffs_get_obj_length(obj); + inode->i_blocks = (inode->i_size + 511) >> 9; + +- inode->i_nlink = yaffs_get_obj_link_count(obj); ++ yaffs_set_nlink(inode, yaffs_get_obj_link_count(obj)); + + T(YAFFS_TRACE_OS, + (TSTR("yaffs_fill_inode mode %x uid %d gid %d size %d count %d\n"), +@@ -1784,10 +1807,9 @@ static int yaffs_unlink(struct inode *di + retVal = yaffs_unlinker(obj, dentry->d_name.name); + + if (retVal == YAFFS_OK) { +- dentry->d_inode->i_nlink--; ++ yaffs_dec_link_count(dentry->d_inode); + dir->i_version++; + yaffs_gross_unlock(dev); +- mark_inode_dirty(dentry->d_inode); + update_dir_time(dir); + return 0; + } +@@ -1818,7 +1840,8 @@ static int yaffs_link(struct dentry *old + obj); + + if (link) { +- old_dentry->d_inode->i_nlink = yaffs_get_obj_link_count(obj); ++ yaffs_set_nlink(old_dentry->d_inode, ++ yaffs_get_obj_link_count(obj)); + d_instantiate(dentry, old_dentry->d_inode); + atomic_inc(&old_dentry->d_inode->i_count); + T(YAFFS_TRACE_OS, +@@ -1937,11 +1960,9 @@ static int yaffs_rename(struct inode *ol + yaffs_gross_unlock(dev); + + if (retVal == YAFFS_OK) { +- if (target) { +- new_dentry->d_inode->i_nlink--; +- mark_inode_dirty(new_dentry->d_inode); +- } +- ++ if (target) ++ yaffs_dec_link_count(new_dentry->d_inode); ++ + update_dir_time(old_dir); + if(old_dir != new_dir) + update_dir_time(new_dir); |