Linux-Fsdevel Archive on lore.kernel.org help / color / mirror / Atom feed
From: Goldwyn Rodrigues <rgoldwyn@suse.de> To: linux-fsdevel@vger.kernel.org Cc: linux-btrfs@vger.kernel.org, david@fromorbit.com, hch@lst.de, johannes.thumshirn@wdc.com, dsterba@suse.com, darrick.wong@oracle.com, josef@toxicpanda.com, Goldwyn Rodrigues <rgoldwyn@suse.com> Subject: [PATCH 13/15] btrfs: Call iomap_dio_complete() without inode_lock Date: Mon, 21 Sep 2020 09:43:51 -0500 [thread overview] Message-ID: <20200921144353.31319-14-rgoldwyn@suse.de> (raw) In-Reply-To: <20200921144353.31319-1-rgoldwyn@suse.de> From: Goldwyn Rodrigues <rgoldwyn@suse.com> If direct writes are called with O_DIRECT | O_DSYNC, it will result in a deadlock because iomap_dio_rw() is called under i_rwsem which calls iomap_dio_complete() generic_write_sync() btrfs_sync_file(). btrfs_sync_file() requires i_rwsem, so call __iomap_dio_rw() with the i_rwsem locked, and call iomap_dio_complete() after unlocking i_rwsem. Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com> --- fs/btrfs/file.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 193af84f5405..9c7a2d4b4148 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -1981,6 +1981,7 @@ static ssize_t btrfs_direct_write(struct kiocb *iocb, struct iov_iter *from) loff_t endbyte; int err; int ilock_flags = 0; + struct iomap_dio *dio = NULL; if (iocb->ki_flags & IOCB_NOWAIT) ilock_flags |= BTRFS_ILOCK_TRY; @@ -2022,22 +2023,19 @@ static ssize_t btrfs_direct_write(struct kiocb *iocb, struct iov_iter *from) goto buffered; } - /* - * We have are actually a sync iocb, so we need our fancy endio to know - * if we need to sync. - */ - if (current->journal_info) - written = iomap_dio_rw(iocb, from, &btrfs_dio_iomap_ops, - &btrfs_sync_dops, is_sync_kiocb(iocb)); - else - written = iomap_dio_rw(iocb, from, &btrfs_dio_iomap_ops, - &btrfs_dio_ops, is_sync_kiocb(iocb)); - - if (written == -ENOTBLK) - written = 0; + dio = __iomap_dio_rw(iocb, from, &btrfs_dio_iomap_ops, + &btrfs_dio_ops, is_sync_kiocb(iocb)); btrfs_inode_unlock(inode, ilock_flags); + if (IS_ERR_OR_NULL(dio)) { + err = PTR_ERR_OR_ZERO(dio); + if (err < 0 && err != -ENOTBLK) + goto out; + } else { + written = iomap_dio_complete(dio); + } + if (written < 0 || !iov_iter_count(from)) { err = written; goto out; -- 2.26.2
next prev parent reply other threads:[~2020-09-21 14:44 UTC|newest] Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-09-21 14:43 [PATCH 0/15 v2] BTRFS DIO inode locking/D_SYNC fix Goldwyn Rodrigues 2020-09-21 14:43 ` [PATCH 01/15] fs: remove dio_end_io() Goldwyn Rodrigues 2020-09-22 14:17 ` Josef Bacik 2020-09-21 14:43 ` [PATCH 02/15] btrfs: remove BTRFS_INODE_READDIO_NEED_LOCK Goldwyn Rodrigues 2020-09-22 13:18 ` Christoph Hellwig 2020-09-22 14:17 ` Josef Bacik 2020-09-21 14:43 ` [PATCH 03/15] iomap: Allow filesystem to call iomap_dio_complete without i_rwsem Goldwyn Rodrigues 2020-09-21 15:09 ` Johannes Thumshirn 2020-09-22 13:19 ` hch 2020-09-22 14:17 ` Josef Bacik 2020-09-21 14:43 ` [PATCH 04/15] iomap: Call inode_dio_end() before generic_write_sync() Goldwyn Rodrigues 2020-09-21 15:11 ` Johannes Thumshirn 2020-09-22 13:21 ` Christoph Hellwig 2020-09-22 14:20 ` Josef Bacik 2020-09-22 16:31 ` Darrick J. Wong 2020-09-22 17:25 ` Goldwyn Rodrigues 2020-09-22 21:49 ` Dave Chinner 2020-09-23 5:16 ` Christoph Hellwig 2020-09-23 5:31 ` Darrick J. Wong 2020-09-23 5:49 ` Christoph Hellwig 2020-09-23 5:59 ` Dave Chinner 2020-09-21 14:43 ` [PATCH 05/15] btrfs: split btrfs_direct_IO to read and write Goldwyn Rodrigues 2020-09-22 13:22 ` Christoph Hellwig 2020-09-22 14:27 ` Josef Bacik 2020-09-21 14:43 ` [PATCH 06/15] btrfs: Move pos increment and pagecache extension to btrfs_buffered_write() Goldwyn Rodrigues 2020-09-22 13:22 ` Christoph Hellwig 2020-09-22 14:30 ` Josef Bacik 2020-09-21 14:43 ` [PATCH 07/15] btrfs: Move FS error state bit early during write Goldwyn Rodrigues 2020-09-22 14:38 ` Josef Bacik 2020-09-23 9:10 ` Nikolay Borisov 2020-09-23 14:07 ` Goldwyn Rodrigues 2020-09-21 14:43 ` [PATCH 08/15] btrfs: Introduce btrfs_write_check() Goldwyn Rodrigues 2020-09-22 13:26 ` Christoph Hellwig 2020-09-22 14:42 ` Josef Bacik 2020-09-21 14:43 ` [PATCH 09/15] btrfs: Introduce btrfs_inode_lock()/unlock() Goldwyn Rodrigues 2020-09-22 14:45 ` Josef Bacik 2020-09-21 14:43 ` [PATCH 10/15] btrfs: Push inode locking and unlocking into buffered/direct write Goldwyn Rodrigues 2020-09-22 14:48 ` Josef Bacik 2020-09-21 14:43 ` [PATCH 11/15] btrfs: Use inode_lock_shared() for direct writes within EOF Goldwyn Rodrigues 2020-09-22 14:52 ` Josef Bacik 2020-09-22 17:33 ` Goldwyn Rodrigues 2020-09-21 14:43 ` [PATCH 12/15] btrfs: Remove dio_sem Goldwyn Rodrigues 2020-09-22 14:52 ` Josef Bacik 2020-09-21 14:43 ` Goldwyn Rodrigues [this message] 2020-09-22 15:11 ` [PATCH 13/15] btrfs: Call iomap_dio_complete() without inode_lock Josef Bacik 2020-09-21 14:43 ` [PATCH 14/15] btrfs: Revert 09745ff88d93 ("btrfs: dio iomap DSYNC workaround") Goldwyn Rodrigues 2020-09-22 15:12 ` Josef Bacik 2020-09-21 14:43 ` [PATCH 15/15] iomap: Reinstate lockdep_assert_held in iomap_dio_rw() Goldwyn Rodrigues 2020-09-22 13:26 ` Christoph Hellwig
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200921144353.31319-14-rgoldwyn@suse.de \ --to=rgoldwyn@suse.de \ --cc=darrick.wong@oracle.com \ --cc=david@fromorbit.com \ --cc=dsterba@suse.com \ --cc=hch@lst.de \ --cc=johannes.thumshirn@wdc.com \ --cc=josef@toxicpanda.com \ --cc=linux-btrfs@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=rgoldwyn@suse.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).