lkml.org 
[lkml]   [2023]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 6.1 14/35] btrfs: factor out scratching of one regular super block
    Date
    From: Christoph Hellwig <hch@lst.de>

    [ Upstream commit 0e0078f72be81bbb2a02b229fd2cec8ad63e4fb1 ]

    btrfs_scratch_superblocks open codes scratching super block of a
    non-zoned super block. Split the code to read, zero and write the
    superblock for regular devices into a separate helper.

    Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: David Sterba <dsterba@suse.com>
    [ update changelog ]
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/btrfs/volumes.c | 51 +++++++++++++++++++++++-----------------------
    1 file changed, 26 insertions(+), 25 deletions(-)

    diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
    index dba087ad40ea..8fd14dc7f667 100644
    --- a/fs/btrfs/volumes.c
    +++ b/fs/btrfs/volumes.c
    @@ -2017,42 +2017,43 @@ static u64 btrfs_num_devices(struct btrfs_fs_info *fs_info)
    return num_devices;
    }

    +static void btrfs_scratch_superblock(struct btrfs_fs_info *fs_info,
    + struct block_device *bdev, int copy_num)
    +{
    + struct btrfs_super_block *disk_super;
    + struct page *page;
    + int ret;
    +
    + disk_super = btrfs_read_dev_one_super(bdev, copy_num, false);
    + if (IS_ERR(disk_super))
    + return;
    +
    + memset(&disk_super->magic, 0, sizeof(disk_super->magic));
    + page = virt_to_page(disk_super);
    + set_page_dirty(page);
    + lock_page(page);
    + /* write_on_page() unlocks the page */
    + ret = write_one_page(page);
    + if (ret)
    + btrfs_warn(fs_info, "error clearing superblock number %d (%d)",
    + copy_num, ret);
    + btrfs_release_disk_super(disk_super);
    +}
    +
    void btrfs_scratch_superblocks(struct btrfs_fs_info *fs_info,
    struct block_device *bdev,
    const char *device_path)
    {
    - struct btrfs_super_block *disk_super;
    int copy_num;

    if (!bdev)
    return;

    for (copy_num = 0; copy_num < BTRFS_SUPER_MIRROR_MAX; copy_num++) {
    - struct page *page;
    - int ret;
    -
    - disk_super = btrfs_read_dev_one_super(bdev, copy_num, false);
    - if (IS_ERR(disk_super))
    - continue;
    -
    - if (bdev_is_zoned(bdev)) {
    + if (bdev_is_zoned(bdev))
    btrfs_reset_sb_log_zones(bdev, copy_num);
    - continue;
    - }
    -
    - memset(&disk_super->magic, 0, sizeof(disk_super->magic));
    -
    - page = virt_to_page(disk_super);
    - set_page_dirty(page);
    - lock_page(page);
    - /* write_on_page() unlocks the page */
    - ret = write_one_page(page);
    - if (ret)
    - btrfs_warn(fs_info,
    - "error clearing superblock number %d (%d)",
    - copy_num, ret);
    - btrfs_release_disk_super(disk_super);
    -
    + else
    + btrfs_scratch_superblock(fs_info, bdev, copy_num);
    }

    /* Notify udev that device has changed */
    --
    2.39.0
    \
     
     \ /
      Last update: 2023-03-26 23:54    [W:7.882 / U:0.144 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site