aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/patches-3.8/506-yaffs-3.2-dont-use-i_nlink-directly.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/patches-3.8/506-yaffs-3.2-dont-use-i_nlink-directly.patch')
-rw-r--r--target/linux/generic/patches-3.8/506-yaffs-3.2-dont-use-i_nlink-directly.patch78
1 files changed, 78 insertions, 0 deletions
diff --git a/target/linux/generic/patches-3.8/506-yaffs-3.2-dont-use-i_nlink-directly.patch b/target/linux/generic/patches-3.8/506-yaffs-3.2-dont-use-i_nlink-directly.patch
new file mode 100644
index 0000000000..91e8281196
--- /dev/null
+++ b/target/linux/generic/patches-3.8/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);