lkml.org 
[lkml]   [2022]   [Aug]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 093/101] ext4: avoid resizing to a partial cluster size
    Date
    From: Kiselev, Oleg <okiselev@amazon.com>

    [ Upstream commit 69cb8e9d8cd97cdf5e293b26d70a9dee3e35e6bd ]

    This patch avoids an attempt to resize the filesystem to an
    unaligned cluster boundary. An online resize to a size that is not
    integral to cluster size results in the last iteration attempting to
    grow the fs by a negative amount, which trips a BUG_ON and leaves the fs
    with a corrupted in-memory superblock.

    Signed-off-by: Oleg Kiselev <okiselev@amazon.com>
    Link: https://lore.kernel.org/r/0E92A0AB-4F16-4F1A-94B7-702CC6504FDE@amazon.com
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/ext4/resize.c | 10 ++++++++++
    1 file changed, 10 insertions(+)

    diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
    index 60984bc54d55..e4f02572f69d 100644
    --- a/fs/ext4/resize.c
    +++ b/fs/ext4/resize.c
    @@ -1941,6 +1941,16 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count)
    }
    brelse(bh);

    + /*
    + * For bigalloc, trim the requested size to the nearest cluster
    + * boundary to avoid creating an unusable filesystem. We do this
    + * silently, instead of returning an error, to avoid breaking
    + * callers that blindly resize the filesystem to the full size of
    + * the underlying block device.
    + */
    + if (ext4_has_feature_bigalloc(sb))
    + n_blocks_count &= ~((1 << EXT4_CLUSTER_BITS(sb)) - 1);
    +
    retry:
    o_blocks_count = ext4_blocks_count(es);

    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-23 10:37    [W:4.025 / U:0.164 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site