mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			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);
 |