diff options
Diffstat (limited to 'include/linux/fs.h')
| -rw-r--r-- | include/linux/fs.h | 41 | 
1 files changed, 32 insertions, 9 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h index 7a049fd2aa4..0c4df261af7 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -768,14 +768,25 @@ struct inode {  	/* Stat data, not accessed from path walking */  	unsigned long		i_ino; -	unsigned int		i_nlink; +	/* +	 * Filesystems may only read i_nlink directly.  They shall use the +	 * following functions for modification: +	 * +	 *    (set|clear|inc|drop)_nlink +	 *    inode_(inc|dec)_link_count +	 */ +	union { +		const unsigned int i_nlink; +		unsigned int __i_nlink; +	};  	dev_t			i_rdev; -	loff_t			i_size;  	struct timespec		i_atime;  	struct timespec		i_mtime;  	struct timespec		i_ctime; -	unsigned int		i_blkbits; +	spinlock_t		i_lock;	/* i_blocks, i_bytes, maybe i_size */ +	unsigned short          i_bytes;  	blkcnt_t		i_blocks; +	loff_t			i_size;  #ifdef __NEED_I_SIZE_ORDERED  	seqcount_t		i_size_seqcount; @@ -783,7 +794,6 @@ struct inode {  	/* Misc */  	unsigned long		i_state; -	spinlock_t		i_lock;	/* i_blocks, i_bytes, maybe i_size */  	struct mutex		i_mutex;  	unsigned long		dirtied_when;	/* jiffies of first dirtying */ @@ -797,9 +807,10 @@ struct inode {  		struct rcu_head		i_rcu;  	};  	atomic_t		i_count; +	unsigned int		i_blkbits;  	u64			i_version; -	unsigned short          i_bytes;  	atomic_t		i_dio_count; +	atomic_t		i_writecount;  	const struct file_operations	*i_fop;	/* former ->i_op->default_file_ops */  	struct file_lock	*i_flock;  	struct address_space	i_data; @@ -823,7 +834,6 @@ struct inode {  #ifdef CONFIG_IMA  	atomic_t		i_readcount; /* struct files open RO */  #endif -	atomic_t		i_writecount;  	void			*i_private; /* fs or device private pointer */  }; @@ -1755,6 +1765,19 @@ static inline void mark_inode_dirty_sync(struct inode *inode)  }  /** + * set_nlink - directly set an inode's link count + * @inode: inode + * @nlink: new nlink (should be non-zero) + * + * This is a low-level filesystem helper to replace any + * direct filesystem manipulation of i_nlink. + */ +static inline void set_nlink(struct inode *inode, unsigned int nlink) +{ +	inode->__i_nlink = nlink; +} + +/**   * inc_nlink - directly increment an inode's link count   * @inode: inode   * @@ -1764,7 +1787,7 @@ static inline void mark_inode_dirty_sync(struct inode *inode)   */  static inline void inc_nlink(struct inode *inode)  { -	inode->i_nlink++; +	inode->__i_nlink++;  }  static inline void inode_inc_link_count(struct inode *inode) @@ -1786,7 +1809,7 @@ static inline void inode_inc_link_count(struct inode *inode)   */  static inline void drop_nlink(struct inode *inode)  { -	inode->i_nlink--; +	inode->__i_nlink--;  }  /** @@ -1799,7 +1822,7 @@ static inline void drop_nlink(struct inode *inode)   */  static inline void clear_nlink(struct inode *inode)  { -	inode->i_nlink = 0; +	inode->__i_nlink = 0;  }  static inline void inode_dec_link_count(struct inode *inode)  |