From: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
To: Baokun Li <libaokun1@huawei.com>, linux-ext4@vger.kernel.org
Cc: tytso@mit.edu, adilger.kernel@dilger.ca, jack@suse.cz,
ojaswin@linux.ibm.com, linux-kernel@vger.kernel.org,
yi.zhang@huawei.com, yangerkun@huawei.com, yukuai3@huawei.com,
libaokun1@huawei.com
Subject: Re: [PATCH 3/4] ext4: avoid overlapping preallocations due to overflow
Date: Fri, 21 Jul 2023 00:54:47 +0530 [thread overview]
Message-ID: <87351io074.fsf@doe.com> (raw)
In-Reply-To: <20230718131052.283350-4-libaokun1@huawei.com>
Baokun Li <libaokun1@huawei.com> writes:
> Let's say we want to allocate 2 blocks starting from 4294966386, after
> predicting the file size, start is aligned to 4294965248, len is changed
> to 2048, then end = start + size = 0x100000000. Since end is of
> type ext4_lblk_t, i.e. uint, end is truncated to 0.
>
> This causes (pa->pa_lstart >= end) to always hold when checking if the
> current extent to be allocated crosses already preallocated blocks, so the
> resulting ac_g_ex may cross already preallocated blocks.
>
> Hence we convert the end type to loff_t and use pa_end() to avoid overflow.
>
> Signed-off-by: Baokun Li <libaokun1@huawei.com>
Thanks again for spotting. Looks good to me (with pa_end() dropped).
-ritesh
> ---
> fs/ext4/mballoc.c | 21 ++++++++++-----------
> 1 file changed, 10 insertions(+), 11 deletions(-)
>
> diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
> index 2090e5e7ba58..77d47af525d9 100644
> --- a/fs/ext4/mballoc.c
> +++ b/fs/ext4/mballoc.c
> @@ -4222,12 +4222,13 @@ ext4_mb_pa_rb_next_iter(ext4_lblk_t new_start, ext4_lblk_t cur_start, struct rb_
>
> static inline void
> ext4_mb_pa_assert_overlap(struct ext4_allocation_context *ac,
> - ext4_lblk_t start, ext4_lblk_t end)
> + ext4_lblk_t start, loff_t end)
> {
> struct ext4_sb_info *sbi = EXT4_SB(ac->ac_sb);
> struct ext4_inode_info *ei = EXT4_I(ac->ac_inode);
> struct ext4_prealloc_space *tmp_pa;
> - ext4_lblk_t tmp_pa_start, tmp_pa_end;
> + ext4_lblk_t tmp_pa_start;
> + loff_t tmp_pa_end;
> struct rb_node *iter;
>
> read_lock(&ei->i_prealloc_lock);
> @@ -4236,7 +4237,7 @@ ext4_mb_pa_assert_overlap(struct ext4_allocation_context *ac,
> tmp_pa = rb_entry(iter, struct ext4_prealloc_space,
> pa_node.inode_node);
> tmp_pa_start = tmp_pa->pa_lstart;
> - tmp_pa_end = tmp_pa->pa_lstart + EXT4_C2B(sbi, tmp_pa->pa_len);
> + tmp_pa_end = pa_end(sbi, tmp_pa);
>
> spin_lock(&tmp_pa->pa_lock);
> if (tmp_pa->pa_deleted == 0)
> @@ -4258,14 +4259,14 @@ ext4_mb_pa_assert_overlap(struct ext4_allocation_context *ac,
> */
> static inline void
> ext4_mb_pa_adjust_overlap(struct ext4_allocation_context *ac,
> - ext4_lblk_t *start, ext4_lblk_t *end)
> + ext4_lblk_t *start, loff_t *end)
> {
> struct ext4_inode_info *ei = EXT4_I(ac->ac_inode);
> struct ext4_sb_info *sbi = EXT4_SB(ac->ac_sb);
> struct ext4_prealloc_space *tmp_pa = NULL, *left_pa = NULL, *right_pa = NULL;
> struct rb_node *iter;
> - ext4_lblk_t new_start, new_end;
> - ext4_lblk_t tmp_pa_start, tmp_pa_end, left_pa_end = -1, right_pa_start = -1;
> + ext4_lblk_t new_start, tmp_pa_start, right_pa_start = -1;
> + loff_t new_end, tmp_pa_end, left_pa_end = -1;
>
> new_start = *start;
> new_end = *end;
> @@ -4284,7 +4285,7 @@ ext4_mb_pa_adjust_overlap(struct ext4_allocation_context *ac,
> tmp_pa = rb_entry(iter, struct ext4_prealloc_space,
> pa_node.inode_node);
> tmp_pa_start = tmp_pa->pa_lstart;
> - tmp_pa_end = tmp_pa->pa_lstart + EXT4_C2B(sbi, tmp_pa->pa_len);
> + tmp_pa_end = pa_end(sbi, tmp_pa);
>
> /* PA must not overlap original request */
> spin_lock(&tmp_pa->pa_lock);
> @@ -4364,8 +4365,7 @@ ext4_mb_pa_adjust_overlap(struct ext4_allocation_context *ac,
> }
>
> if (left_pa) {
> - left_pa_end =
> - left_pa->pa_lstart + EXT4_C2B(sbi, left_pa->pa_len);
> + left_pa_end = pa_end(sbi, left_pa);
> BUG_ON(left_pa_end > ac->ac_o_ex.fe_logical);
> }
>
> @@ -4404,8 +4404,7 @@ ext4_mb_normalize_request(struct ext4_allocation_context *ac,
> struct ext4_sb_info *sbi = EXT4_SB(ac->ac_sb);
> struct ext4_super_block *es = sbi->s_es;
> int bsbits, max;
> - ext4_lblk_t end;
> - loff_t size, start_off;
> + loff_t size, start_off, end;
> loff_t orig_size __maybe_unused;
> ext4_lblk_t start;
>
> --
> 2.31.1
next prev parent reply other threads:[~2023-07-20 19:24 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-18 13:10 [PATCH 0/4] ext4: fix some ext4_lblk_t overflow issues Baokun Li
2023-07-18 13:10 ` [PATCH 1/4] ext4: add two helper functions fex_end() and pa_end() Baokun Li
2023-07-20 17:48 ` Ritesh Harjani
2023-07-18 13:10 ` [PATCH 2/4] ext4: fix BUG in ext4_mb_new_inode_pa() due to overflow Baokun Li
2023-07-20 12:44 ` Ritesh Harjani
2023-07-20 13:42 ` Baokun Li
2023-07-20 19:30 ` Ritesh Harjani
2023-07-21 7:29 ` Baokun Li
2023-07-21 8:24 ` Ritesh Harjani
2023-07-21 9:13 ` Baokun Li
2023-07-21 17:15 ` Theodore Ts'o
2023-07-22 3:16 ` Baokun Li
2023-07-20 19:07 ` Ritesh Harjani
2023-07-21 8:01 ` Baokun Li
2023-07-18 13:10 ` [PATCH 3/4] ext4: avoid overlapping preallocations " Baokun Li
2023-07-20 19:24 ` Ritesh Harjani [this message]
2023-07-18 13:10 ` [PATCH 4/4] ext4: avoid prealloc space being skipped " Baokun Li
2023-07-20 19:22 ` Ritesh Harjani
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87351io074.fsf@doe.com \
--to=ritesh.list@gmail.com \
--cc=adilger.kernel@dilger.ca \
--cc=jack@suse.cz \
--cc=libaokun1@huawei.com \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ojaswin@linux.ibm.com \
--cc=tytso@mit.edu \
--cc=yangerkun@huawei.com \
--cc=yi.zhang@huawei.com \
--cc=yukuai3@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.