mirror of https://github.com/hak5/openwrt.git
79 lines
2.2 KiB
Diff
79 lines
2.2 KiB
Diff
|
--- 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);
|