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. > > 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. 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 >