--- 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);