lkml.org 
[lkml]   [2022]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.19 1096/1157] btrfs: zoned: wait until zone is finished when allocation didnt progress
    Date
    From: Naohiro Aota <naohiro.aota@wdc.com>

    [ Upstream commit 2ce543f478433a0eec0f72090d7e814f1d53d456 ]

    When the allocated position doesn't progress, we cannot submit IOs to
    finish a block group, but there should be ongoing IOs that will finish a
    block group. So, in that case, we wait for a zone to be finished and retry
    the allocation after that.

    Introduce a new flag BTRFS_FS_NEED_ZONE_FINISH for fs_info->flags to
    indicate we need a zone finish to have proceeded. The flag is set when the
    allocator detected it cannot activate a new block group. And, it is cleared
    once a zone is finished.

    CC: stable@vger.kernel.org # 5.16+
    Fixes: afba2bc036b0 ("btrfs: zoned: implement active zone tracking")
    Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/btrfs/ctree.h | 5 +++++
    fs/btrfs/disk-io.c | 1 +
    fs/btrfs/inode.c | 9 +++++++--
    fs/btrfs/zoned.c | 6 ++++++
    4 files changed, 19 insertions(+), 2 deletions(-)

    diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
    index d306db5dbdc2..3a51d0c13a95 100644
    --- a/fs/btrfs/ctree.h
    +++ b/fs/btrfs/ctree.h
    @@ -627,6 +627,9 @@ enum {
    /* Indicate we have half completed snapshot deletions pending. */
    BTRFS_FS_UNFINISHED_DROPS,

    + /* Indicate we have to finish a zone to do next allocation. */
    + BTRFS_FS_NEED_ZONE_FINISH,
    +
    #if BITS_PER_LONG == 32
    /* Indicate if we have error/warn message printed on 32bit systems */
    BTRFS_FS_32BIT_ERROR,
    @@ -1063,6 +1066,8 @@ struct btrfs_fs_info {

    spinlock_t zone_active_bgs_lock;
    struct list_head zone_active_bgs;
    + /* Waiters when BTRFS_FS_NEED_ZONE_FINISH is set */
    + wait_queue_head_t zone_finish_wait;

    #ifdef CONFIG_BTRFS_FS_REF_VERIFY
    spinlock_t ref_verify_lock;
    diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
    index 804dcc69787d..bc3030661583 100644
    --- a/fs/btrfs/disk-io.c
    +++ b/fs/btrfs/disk-io.c
    @@ -3255,6 +3255,7 @@ void btrfs_init_fs_info(struct btrfs_fs_info *fs_info)
    init_waitqueue_head(&fs_info->transaction_blocked_wait);
    init_waitqueue_head(&fs_info->async_submit_wait);
    init_waitqueue_head(&fs_info->delayed_iputs_wait);
    + init_waitqueue_head(&fs_info->zone_finish_wait);

    /* Usable values until the real ones are cached from the superblock */
    fs_info->nodesize = 4096;
    diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
    index 4f5249f5cb34..61496ecb1e20 100644
    --- a/fs/btrfs/inode.c
    +++ b/fs/btrfs/inode.c
    @@ -1642,8 +1642,13 @@ static noinline int run_delalloc_zoned(struct btrfs_inode *inode,
    if (ret == 0)
    done_offset = end;

    - if (done_offset == start)
    - return -ENOSPC;
    + if (done_offset == start) {
    + struct btrfs_fs_info *info = inode->root->fs_info;
    +
    + wait_var_event(&info->zone_finish_wait,
    + !test_bit(BTRFS_FS_NEED_ZONE_FINISH, &info->flags));
    + continue;
    + }

    if (!locked_page_done) {
    __set_page_dirty_nobuffers(locked_page);
    diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c
    index 4df5b36dc574..31cb11daa8e8 100644
    --- a/fs/btrfs/zoned.c
    +++ b/fs/btrfs/zoned.c
    @@ -2007,6 +2007,9 @@ static int do_zone_finish(struct btrfs_block_group *block_group, bool fully_writ
    /* For active_bg_list */
    btrfs_put_block_group(block_group);

    + clear_bit(BTRFS_FS_NEED_ZONE_FINISH, &fs_info->flags);
    + wake_up_all(&fs_info->zone_finish_wait);
    +
    return 0;
    }

    @@ -2043,6 +2046,9 @@ bool btrfs_can_activate_zone(struct btrfs_fs_devices *fs_devices, u64 flags)
    }
    mutex_unlock(&fs_info->chunk_mutex);

    + if (!ret)
    + set_bit(BTRFS_FS_NEED_ZONE_FINISH, &fs_info->flags);
    +
    return ret;
    }

    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-16 03:04    [W:2.832 / U:0.816 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site