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 |