diff options
Diffstat (limited to 'fs/btrfs/btrfs_inode.h')
| -rw-r--r-- | fs/btrfs/btrfs_inode.h | 20 | 
1 files changed, 20 insertions, 0 deletions
| diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h index 2a8c242bc4f5..d9b97d4960e6 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h | |||
| @@ -40,6 +40,8 @@ | |||
| 40 | #define BTRFS_INODE_HAS_ASYNC_EXTENT 6 | 40 | #define BTRFS_INODE_HAS_ASYNC_EXTENT 6 | 
| 41 | #define BTRFS_INODE_NEEDS_FULL_SYNC 7 | 41 | #define BTRFS_INODE_NEEDS_FULL_SYNC 7 | 
| 42 | #define BTRFS_INODE_COPY_EVERYTHING 8 | 42 | #define BTRFS_INODE_COPY_EVERYTHING 8 | 
| 43 | #define BTRFS_INODE_IN_DELALLOC_LIST 9 | ||
| 44 | #define BTRFS_INODE_READDIO_NEED_LOCK 10 | ||
| 43 | 45 | ||
| 44 | /* in memory btrfs inode */ | 46 | /* in memory btrfs inode */ | 
| 45 | struct btrfs_inode { | 47 | struct btrfs_inode { | 
| @@ -216,4 +218,22 @@ static inline int btrfs_inode_in_log(struct inode *inode, u64 generation) | |||
| 216 | return 0; | 218 | return 0; | 
| 217 | } | 219 | } | 
| 218 | 220 | ||
| 221 | /* | ||
| 222 | * Disable DIO read nolock optimization, so new dio readers will be forced | ||
| 223 | * to grab i_mutex. It is used to avoid the endless truncate due to | ||
| 224 | * nonlocked dio read. | ||
| 225 | */ | ||
| 226 | static inline void btrfs_inode_block_unlocked_dio(struct inode *inode) | ||
| 227 | { | ||
| 228 | set_bit(BTRFS_INODE_READDIO_NEED_LOCK, &BTRFS_I(inode)->runtime_flags); | ||
| 229 | smp_mb(); | ||
| 230 | } | ||
| 231 | |||
| 232 | static inline void btrfs_inode_resume_unlocked_dio(struct inode *inode) | ||
| 233 | { | ||
| 234 | smp_mb__before_clear_bit(); | ||
| 235 | clear_bit(BTRFS_INODE_READDIO_NEED_LOCK, | ||
| 236 | &BTRFS_I(inode)->runtime_flags); | ||
| 237 | } | ||
| 238 | |||
| 219 | #endif | 239 | #endif | 
