On 11.12.19 г. 1:01 ч., Goldwyn Rodrigues wrote: > From: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx> > > Since we now perform direct reads using i_rwsem, we can remove this > inode flag used to co-ordinate unlocked reads. > > The truncate call chain gets the i_rwsem which may conflict with direct nit: Truncating taking i_rwsem means it's correctly synchronized with concurrent DIO reads. So it's protected, just the wording needs to be tweaked. > reads: > do_truncate <-- calls inode_lock > notify_change > ->setattr/btrfs_setattr > btrfs_setsize > > Signed-off-by: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx> > Reviewed-by: Nikolay Borisov <nborisov@xxxxxxxx> > --- > fs/btrfs/btrfs_inode.h | 18 ------------------ > fs/btrfs/inode.c | 5 ----- > 2 files changed, 23 deletions(-) > > diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h > index 4e12a477d32e..cd8f378ed8e7 100644 > --- a/fs/btrfs/btrfs_inode.h > +++ b/fs/btrfs/btrfs_inode.h > @@ -27,7 +27,6 @@ enum { > BTRFS_INODE_NEEDS_FULL_SYNC, > BTRFS_INODE_COPY_EVERYTHING, > BTRFS_INODE_IN_DELALLOC_LIST, > - BTRFS_INODE_READDIO_NEED_LOCK, > BTRFS_INODE_HAS_PROPS, > BTRFS_INODE_SNAPSHOT_FLUSH, > }; > @@ -317,23 +316,6 @@ struct btrfs_dio_private { > blk_status_t); > }; > > -/* > - * 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 btrfs_inode *inode) > -{ > - set_bit(BTRFS_INODE_READDIO_NEED_LOCK, &inode->runtime_flags); > - smp_mb(); > -} > - > -static inline void btrfs_inode_resume_unlocked_dio(struct btrfs_inode *inode) > -{ > - smp_mb__before_atomic(); > - clear_bit(BTRFS_INODE_READDIO_NEED_LOCK, &inode->runtime_flags); > -} > - > /* Array of bytes with variable length, hexadecimal format 0x1234 */ > #define CSUM_FMT "0x%*phN" > #define CSUM_FMT_VALUE(size, bytes) size, bytes > diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c > index ce53f2889673..4c76a6d5e6a4 100644 > --- a/fs/btrfs/inode.c > +++ b/fs/btrfs/inode.c > @@ -5273,11 +5273,6 @@ static int btrfs_setsize(struct inode *inode, struct iattr *attr) > > truncate_setsize(inode, newsize); > > - /* Disable nonlocked read DIO to avoid the endless truncate */ > - btrfs_inode_block_unlocked_dio(BTRFS_I(inode)); > - inode_dio_wait(inode); > - btrfs_inode_resume_unlocked_dio(BTRFS_I(inode)); > - > ret = btrfs_truncate(inode, newsize == oldsize); > if (ret && inode->i_nlink) { > int err; >