On 9/8/22 3:16 AM, Filipe Manana wrote: > > > On Thu, Sep 8, 2022 at 1:26 AM Stefan Roesch <shr@xxxxxx> 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@xxxxxxxxxxxxxx> >> Signed-off-by: Stefan Roesch <shr@xxxxxx> >> --- >> 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 >>