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 7a049fd2aa4c..0c4df261af7e 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -768,14 +768,25 @@ struct inode { | |||
768 | 768 | ||
769 | /* Stat data, not accessed from path walking */ | 769 | /* Stat data, not accessed from path walking */ |
770 | unsigned long i_ino; | 770 | unsigned long i_ino; |
771 | unsigned int i_nlink; | 771 | /* |
772 | * Filesystems may only read i_nlink directly. They shall use the | ||
773 | * following functions for modification: | ||
774 | * | ||
775 | * (set|clear|inc|drop)_nlink | ||
776 | * inode_(inc|dec)_link_count | ||
777 | */ | ||
778 | union { | ||
779 | const unsigned int i_nlink; | ||
780 | unsigned int __i_nlink; | ||
781 | }; | ||
772 | dev_t i_rdev; | 782 | dev_t i_rdev; |
773 | loff_t i_size; | ||
774 | struct timespec i_atime; | 783 | struct timespec i_atime; |
775 | struct timespec i_mtime; | 784 | struct timespec i_mtime; |
776 | struct timespec i_ctime; | 785 | struct timespec i_ctime; |
777 | unsigned int i_blkbits; | 786 | spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ |
787 | unsigned short i_bytes; | ||
778 | blkcnt_t i_blocks; | 788 | blkcnt_t i_blocks; |
789 | loff_t i_size; | ||
779 | 790 | ||
780 | #ifdef __NEED_I_SIZE_ORDERED | 791 | #ifdef __NEED_I_SIZE_ORDERED |
781 | seqcount_t i_size_seqcount; | 792 | seqcount_t i_size_seqcount; |
@@ -783,7 +794,6 @@ struct inode { | |||
783 | 794 | ||
784 | /* Misc */ | 795 | /* Misc */ |
785 | unsigned long i_state; | 796 | unsigned long i_state; |
786 | spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ | ||
787 | struct mutex i_mutex; | 797 | struct mutex i_mutex; |
788 | 798 | ||
789 | unsigned long dirtied_when; /* jiffies of first dirtying */ | 799 | unsigned long dirtied_when; /* jiffies of first dirtying */ |
@@ -797,9 +807,10 @@ struct inode { | |||
797 | struct rcu_head i_rcu; | 807 | struct rcu_head i_rcu; |
798 | }; | 808 | }; |
799 | atomic_t i_count; | 809 | atomic_t i_count; |
810 | unsigned int i_blkbits; | ||
800 | u64 i_version; | 811 | u64 i_version; |
801 | unsigned short i_bytes; | ||
802 | atomic_t i_dio_count; | 812 | atomic_t i_dio_count; |
813 | atomic_t i_writecount; | ||
803 | const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ | 814 | const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ |
804 | struct file_lock *i_flock; | 815 | struct file_lock *i_flock; |
805 | struct address_space i_data; | 816 | struct address_space i_data; |
@@ -823,7 +834,6 @@ struct inode { | |||
823 | #ifdef CONFIG_IMA | 834 | #ifdef CONFIG_IMA |
824 | atomic_t i_readcount; /* struct files open RO */ | 835 | atomic_t i_readcount; /* struct files open RO */ |
825 | #endif | 836 | #endif |
826 | atomic_t i_writecount; | ||
827 | void *i_private; /* fs or device private pointer */ | 837 | void *i_private; /* fs or device private pointer */ |
828 | }; | 838 | }; |
829 | 839 | ||
@@ -1755,6 +1765,19 @@ static inline void mark_inode_dirty_sync(struct inode *inode) | |||
1755 | } | 1765 | } |
1756 | 1766 | ||
1757 | /** | 1767 | /** |
1768 | * set_nlink - directly set an inode's link count | ||
1769 | * @inode: inode | ||
1770 | * @nlink: new nlink (should be non-zero) | ||
1771 | * | ||
1772 | * This is a low-level filesystem helper to replace any | ||
1773 | * direct filesystem manipulation of i_nlink. | ||
1774 | */ | ||
1775 | static inline void set_nlink(struct inode *inode, unsigned int nlink) | ||
1776 | { | ||
1777 | inode->__i_nlink = nlink; | ||
1778 | } | ||
1779 | |||
1780 | /** | ||
1758 | * inc_nlink - directly increment an inode's link count | 1781 | * inc_nlink - directly increment an inode's link count |
1759 | * @inode: inode | 1782 | * @inode: inode |
1760 | * | 1783 | * |
@@ -1764,7 +1787,7 @@ static inline void mark_inode_dirty_sync(struct inode *inode) | |||
1764 | */ | 1787 | */ |
1765 | static inline void inc_nlink(struct inode *inode) | 1788 | static inline void inc_nlink(struct inode *inode) |
1766 | { | 1789 | { |
1767 | inode->i_nlink++; | 1790 | inode->__i_nlink++; |
1768 | } | 1791 | } |
1769 | 1792 | ||
1770 | static inline void inode_inc_link_count(struct inode *inode) | 1793 | static inline void inode_inc_link_count(struct inode *inode) |
@@ -1786,7 +1809,7 @@ static inline void inode_inc_link_count(struct inode *inode) | |||
1786 | */ | 1809 | */ |
1787 | static inline void drop_nlink(struct inode *inode) | 1810 | static inline void drop_nlink(struct inode *inode) |
1788 | { | 1811 | { |
1789 | inode->i_nlink--; | 1812 | inode->__i_nlink--; |
1790 | } | 1813 | } |
1791 | 1814 | ||
1792 | /** | 1815 | /** |
@@ -1799,7 +1822,7 @@ static inline void drop_nlink(struct inode *inode) | |||
1799 | */ | 1822 | */ |
1800 | static inline void clear_nlink(struct inode *inode) | 1823 | static inline void clear_nlink(struct inode *inode) |
1801 | { | 1824 | { |
1802 | inode->i_nlink = 0; | 1825 | inode->__i_nlink = 0; |
1803 | } | 1826 | } |
1804 | 1827 | ||
1805 | static inline void inode_dec_link_count(struct inode *inode) | 1828 | static inline void inode_dec_link_count(struct inode *inode) |