Message ID | 20191210230155.22688-9-rgoldwyn@suse.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs direct-io using iomap | expand |
On 11.12.19 г. 1:01 ч., Goldwyn Rodrigues wrote: > From: Goldwyn Rodrigues <rgoldwyn@suse.com> > > 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@suse.com> > Reviewed-by: Nikolay Borisov <nborisov@suse.com> > --- > 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; >
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;