Message ID | 20220908002616.3189675-10-shr@fb.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | io-uring/btrfs: support async buffered writes | expand |
On Thu, Sep 8, 2022 at 1:26 AM Stefan Roesch <shr@fb.com> wrote: > > We have everywhere setup for nowait, plumb NOWAIT through the write path. Note, there's a double "btrfs: " prefix in the subject line. > > Signed-off-by: Josef Bacik <josef@toxicpanda.com> > Signed-off-by: Stefan Roesch <shr@fb.com> > --- > fs/btrfs/file.c | 19 +++++++++++++------ > 1 file changed, 13 insertions(+), 6 deletions(-) > > diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c > index 4e1745e585cb..6e191e353b22 100644 > --- a/fs/btrfs/file.c > +++ b/fs/btrfs/file.c > @@ -1653,8 +1653,9 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb, > bool force_page_uptodate = false; > loff_t old_isize = i_size_read(inode); > unsigned int ilock_flags = 0; > + bool nowait = iocb->ki_flags & IOCB_NOWAIT; Can be made const. Thanks. > > - if (iocb->ki_flags & IOCB_NOWAIT) > + if (nowait) > ilock_flags |= BTRFS_ILOCK_TRY; > > ret = btrfs_inode_lock(inode, ilock_flags); > @@ -1710,17 +1711,22 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb, > extent_changeset_release(data_reserved); > ret = btrfs_check_data_free_space(BTRFS_I(inode), > &data_reserved, pos, > - write_bytes, false); > + write_bytes, nowait); > if (ret < 0) { > int tmp; > > + if (nowait && (ret == -ENOSPC || ret == -EAGAIN)) { > + ret = -EAGAIN; > + break; > + } > + > /* > * If we don't have to COW at the offset, reserve > * metadata only. write_bytes may get smaller than > * requested here. > */ > tmp = btrfs_check_nocow_lock(BTRFS_I(inode), pos, > - &write_bytes, false); > + &write_bytes, nowait); > if (tmp < 0) > ret = tmp; > if (tmp > 0) > @@ -1737,7 +1743,7 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb, > WARN_ON(reserve_bytes == 0); > ret = btrfs_delalloc_reserve_metadata(BTRFS_I(inode), > reserve_bytes, > - reserve_bytes, false); > + reserve_bytes, nowait); > if (ret) { > if (!only_release_metadata) > btrfs_free_reserved_data_space(BTRFS_I(inode), > @@ -1767,10 +1773,11 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb, > extents_locked = lock_and_cleanup_extent_if_need( > BTRFS_I(inode), pages, > num_pages, pos, write_bytes, &lockstart, > - &lockend, false, &cached_state); > + &lockend, nowait, &cached_state); > if (extents_locked < 0) { > - if (extents_locked == -EAGAIN) > + if (!nowait && extents_locked == -EAGAIN) > goto again; > + > btrfs_delalloc_release_extents(BTRFS_I(inode), > reserve_bytes); > ret = extents_locked; > -- > 2.30.2 >
On 9/8/22 3:16 AM, Filipe Manana wrote: > > > On Thu, Sep 8, 2022 at 1:26 AM Stefan Roesch <shr@fb.com> wrote: >> >> We have everywhere setup for nowait, plumb NOWAIT through the write path. > > Note, there's a double "btrfs: " prefix in the subject line. > Fixed, thanks for catching it. >> >> Signed-off-by: Josef Bacik <josef@toxicpanda.com> >> Signed-off-by: Stefan Roesch <shr@fb.com> >> --- >> fs/btrfs/file.c | 19 +++++++++++++------ >> 1 file changed, 13 insertions(+), 6 deletions(-) >> >> diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c >> index 4e1745e585cb..6e191e353b22 100644 >> --- a/fs/btrfs/file.c >> +++ b/fs/btrfs/file.c >> @@ -1653,8 +1653,9 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb, >> bool force_page_uptodate = false; >> loff_t old_isize = i_size_read(inode); >> unsigned int ilock_flags = 0; >> + bool nowait = iocb->ki_flags & IOCB_NOWAIT; > > Can be made const. > In the next version of the patch series it will be const. > Thanks. > >> >> - if (iocb->ki_flags & IOCB_NOWAIT) >> + if (nowait) >> ilock_flags |= BTRFS_ILOCK_TRY; >> >> ret = btrfs_inode_lock(inode, ilock_flags); >> @@ -1710,17 +1711,22 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb, >> extent_changeset_release(data_reserved); >> ret = btrfs_check_data_free_space(BTRFS_I(inode), >> &data_reserved, pos, >> - write_bytes, false); >> + write_bytes, nowait); >> if (ret < 0) { >> int tmp; >> >> + if (nowait && (ret == -ENOSPC || ret == -EAGAIN)) { >> + ret = -EAGAIN; >> + break; >> + } >> + >> /* >> * If we don't have to COW at the offset, reserve >> * metadata only. write_bytes may get smaller than >> * requested here. >> */ >> tmp = btrfs_check_nocow_lock(BTRFS_I(inode), pos, >> - &write_bytes, false); >> + &write_bytes, nowait); >> if (tmp < 0) >> ret = tmp; >> if (tmp > 0) >> @@ -1737,7 +1743,7 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb, >> WARN_ON(reserve_bytes == 0); >> ret = btrfs_delalloc_reserve_metadata(BTRFS_I(inode), >> reserve_bytes, >> - reserve_bytes, false); >> + reserve_bytes, nowait); >> if (ret) { >> if (!only_release_metadata) >> btrfs_free_reserved_data_space(BTRFS_I(inode), >> @@ -1767,10 +1773,11 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb, >> extents_locked = lock_and_cleanup_extent_if_need( >> BTRFS_I(inode), pages, >> num_pages, pos, write_bytes, &lockstart, >> - &lockend, false, &cached_state); >> + &lockend, nowait, &cached_state); >> if (extents_locked < 0) { >> - if (extents_locked == -EAGAIN) >> + if (!nowait && extents_locked == -EAGAIN) >> goto again; >> + >> btrfs_delalloc_release_extents(BTRFS_I(inode), >> reserve_bytes); >> ret = extents_locked; >> -- >> 2.30.2 >>
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 4e1745e585cb..6e191e353b22 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -1653,8 +1653,9 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb, bool force_page_uptodate = false; loff_t old_isize = i_size_read(inode); unsigned int ilock_flags = 0; + bool nowait = iocb->ki_flags & IOCB_NOWAIT; - if (iocb->ki_flags & IOCB_NOWAIT) + if (nowait) ilock_flags |= BTRFS_ILOCK_TRY; ret = btrfs_inode_lock(inode, ilock_flags); @@ -1710,17 +1711,22 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb, extent_changeset_release(data_reserved); ret = btrfs_check_data_free_space(BTRFS_I(inode), &data_reserved, pos, - write_bytes, false); + write_bytes, nowait); if (ret < 0) { int tmp; + if (nowait && (ret == -ENOSPC || ret == -EAGAIN)) { + ret = -EAGAIN; + break; + } + /* * If we don't have to COW at the offset, reserve * metadata only. write_bytes may get smaller than * requested here. */ tmp = btrfs_check_nocow_lock(BTRFS_I(inode), pos, - &write_bytes, false); + &write_bytes, nowait); if (tmp < 0) ret = tmp; if (tmp > 0) @@ -1737,7 +1743,7 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb, WARN_ON(reserve_bytes == 0); ret = btrfs_delalloc_reserve_metadata(BTRFS_I(inode), reserve_bytes, - reserve_bytes, false); + reserve_bytes, nowait); if (ret) { if (!only_release_metadata) btrfs_free_reserved_data_space(BTRFS_I(inode), @@ -1767,10 +1773,11 @@ static noinline ssize_t btrfs_buffered_write(struct kiocb *iocb, extents_locked = lock_and_cleanup_extent_if_need( BTRFS_I(inode), pages, num_pages, pos, write_bytes, &lockstart, - &lockend, false, &cached_state); + &lockend, nowait, &cached_state); if (extents_locked < 0) { - if (extents_locked == -EAGAIN) + if (!nowait && extents_locked == -EAGAIN) goto again; + btrfs_delalloc_release_extents(BTRFS_I(inode), reserve_bytes); ret = extents_locked;