diff --git a/fs/inode.c b/fs/inode.c index ecbb68dc7e2aef9bbf52d0b94c0dd401a7d50bae..ee4e66b998f40d170b1822db68875df73d445db6 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -142,7 +142,7 @@ int inode_init_always(struct super_block *sb, struct inode *inode) atomic_set(&inode->i_count, 1); inode->i_op = &empty_iops; inode->i_fop = &empty_fops; - inode->i_nlink = 1; + inode->__i_nlink = 1; inode->i_opflags = 0; inode->i_uid = 0; inode->i_gid = 0; diff --git a/include/linux/fs.h b/include/linux/fs.h index 48c1f5fc74117b683382bd6e8205975e464e7be2..23467d768cabcbae764be65bb558e2d53d9c5651 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -768,7 +768,17 @@ 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; @@ -1764,7 +1774,7 @@ static inline void mark_inode_dirty_sync(struct inode *inode) */ static inline void set_nlink(struct inode *inode, unsigned int nlink) { - inode->i_nlink = nlink; + inode->__i_nlink = nlink; } /** @@ -1777,7 +1787,7 @@ static inline void set_nlink(struct inode *inode, unsigned int nlink) */ static inline void inc_nlink(struct inode *inode) { - inode->i_nlink++; + inode->__i_nlink++; } static inline void inode_inc_link_count(struct inode *inode) @@ -1799,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--; } /** @@ -1812,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)