diff options
Diffstat (limited to 'fs/btrfs/btrfs_inode.h')
| -rw-r--r-- | fs/btrfs/btrfs_inode.h | 19 | 
1 files changed, 19 insertions, 0 deletions
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h index c935a774a9f..d9b97d4960e 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h @@ -41,6 +41,7 @@  #define BTRFS_INODE_NEEDS_FULL_SYNC		7  #define BTRFS_INODE_COPY_EVERYTHING		8  #define BTRFS_INODE_IN_DELALLOC_LIST		9 +#define BTRFS_INODE_READDIO_NEED_LOCK		10  /* in memory btrfs inode */  struct btrfs_inode { @@ -217,4 +218,22 @@ static inline int btrfs_inode_in_log(struct inode *inode, u64 generation)  	return 0;  } +/* + * Disable DIO read nolock optimization, so new dio readers will be forced + * to grab i_mutex. It is used to avoid the endless truncate due to + * nonlocked dio read. + */ +static inline void btrfs_inode_block_unlocked_dio(struct inode *inode) +{ +	set_bit(BTRFS_INODE_READDIO_NEED_LOCK, &BTRFS_I(inode)->runtime_flags); +	smp_mb(); +} + +static inline void btrfs_inode_resume_unlocked_dio(struct inode *inode) +{ +	smp_mb__before_clear_bit(); +	clear_bit(BTRFS_INODE_READDIO_NEED_LOCK, +		  &BTRFS_I(inode)->runtime_flags); +} +  #endif  |