From: Baokun Li <libaokun@huaweicloud.com>
To: Ojaswin Mujoo <ojaswin@linux.ibm.com>
Cc: linux-ext4@vger.kernel.org, tytso@mit.edu,
adilger.kernel@dilger.ca, jack@suse.cz, ritesh.list@gmail.com,
linux-kernel@vger.kernel.org, yi.zhang@huawei.com,
yangerkun@huawei.com, Baokun Li <libaokun1@huawei.com>,
zhanchengbin <zhanchengbin1@huawei.com>,
Baokun Li <libaokun@huaweicloud.com>
Subject: Re: [PATCH 02/20] ext4: prevent partial update of the extents path
Date: Thu, 25 Jul 2024 13:35:10 +0800 [thread overview]
Message-ID: <6df79e24-df1a-43da-8d1d-6bd0f8dd2edf@huaweicloud.com> (raw)
In-Reply-To: <ZqCd0fjFzZt00h6N@li-bb2b2a4c-3307-11b2-a85c-8fa5c3a69313.ibm.com>
On 2024/7/24 14:23, Ojaswin Mujoo wrote:
> On Wed, Jul 17, 2024 at 02:11:27PM +0800, Baokun Li wrote:
>> On 2024/7/17 13:29, Ojaswin Mujoo wrote:
>>> On Tue, Jul 16, 2024 at 07:54:43PM +0800, Baokun Li wrote:
>>>> Hi Ojaswin,
>>>>
>>>> On 2024/7/16 17:54, Ojaswin Mujoo wrote:
>>>>>>> But the journal will ensure the consistency of the extents path after
>>>>>>> this patch.
>>>>>>>
>>>>>>> When ext4_ext_get_access() or ext4_ext_dirty() returns an error in
>>>>>>> ext4_ext_rm_idx() and ext4_ext_correct_indexes(), this may cause
>>>>>>> the extents tree to be inconsistent. But the inconsistency just
>>>>>>> exists in memory and doesn't land on disk.
>>>>>>>
>>>>>>> For ext4_ext_get_access(), the handle must have been aborted
>>>>>>> when it returned an error, as follows:
>>>>>> ext4_ext_get_access
>>>>>> ext4_journal_get_write_access
>>>>>> __ext4_journal_get_write_access
>>>>>> err = jbd2_journal_get_write_access
>>>>>> if (err)
>>>>>> ext4_journal_abort_handle
>>>>>>> For ext4_ext_dirty(), since path->p_bh must not be null and handle
>>>>>>> must be valid, handle is aborted anyway when an error is returned:
>>>>>> ext4_ext_dirty
>>>>>> __ext4_ext_dirty
>>>>>> if (path->p_bh)
>>>>>> __ext4_handle_dirty_metadata
>>>>>> if (ext4_handle_valid(handle))
>>>>>> err = jbd2_journal_dirty_metadata
>>>>>> if (!is_handle_aborted(handle) && WARN_ON_ONCE(err))
>>>>>> ext4_journal_abort_handle
>>>>>>> Thus the extents tree will only be inconsistent in memory, so only
>>>>>>> the verified bit of the modified buffer needs to be cleared to avoid
>>>>>>> these inconsistent data being used in memory.
>>>>>>>
>>>>>> Regards,
>>>>>> Baokun
>>>>> Thanks for the explanation Baokun, so basically we only have the
>>>>> inconsitency in the memory.
>>>>>
>>>>> I do have a followup questions:
>>>>>
>>>>> So in the above example, after we have the error, we'll have the buffer
>>>>> for depth=0 marked as valid but pointing to the wrong ei_block.
>>>> It looks wrong here. When there is an error, the ei_block of the
>>>> unmodified buffer with depth=0 is the correct one, it is indeed
>>>> 'valid' and it is consistent with the disk. Only buffers that were
>>> Hey Baokun,
>>>
>>> Ahh I see now, I was looking at it the wrong way. So basically since
>>> depth 1 to 4 is inconsistent to the disk we mark then non verified so
>>> then subsequent lookups can act accordingly.
>>>
>>> Thanks for the explanation! I am in the middle of testing this patchset
>>> with xfstests on a POWERPC system with 64k page size. I'll let you know
>>> how that goes!
>>>
>>> Regards,
>>> Ojaswin
>> Hi Ojaswin,
>>
>> Thank you for the test and feedback!
>>
>> Cheers,
>> Baokun
> Hey Baokun,
Hi Ojaswin,
Sorry for the slow reply, I'm currently on a business trip.
> The xfstests pass for sub page size as well as bs = page size for
> POWERPC with no new regressions.
Thank you very much for your test!
>
> Although for this particular patch I doubt if we would be able to
> exersice the error path using xfstests. We might need to artifically
> inject error in ext4_ext_get_access or ext4_ext_dirty. Do you have any
> other way of testing this?
The issues in this patch set can all be triggered by injecting EIO or
ENOMEM into ext4_find_extent(). So not only did I test kvm-xftests
several times on x86 to make sure there weren't any regressions,
but I also tested that running kvm-xfstests while randomly injecting
faults into ext4_find_extent() didn't crash the system.
>
> Also, just curious whether you came across this bug during code reading
> or were you actually hitting it?
The initial issue was that e2fsck was always reporting some sort of
extents tree exception after testing, so the processes in question
were troubleshooting and hardening, i.e. the first two patches.
The other issues were discovered during fault injection testing of
the processes in question.
Regards,
Baokun
next prev parent reply other threads:[~2024-07-25 5:35 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-10 4:06 [PATCH 00/20] ext4: some bugfixes and cleanups for ext4 " libaokun
2024-07-10 4:06 ` [PATCH 01/20] ext4: refactor ext4_ext_rm_idx() to index 'path' libaokun
2024-07-24 18:44 ` Jan Kara
2024-07-25 9:14 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 02/20] ext4: prevent partial update of the extents path libaokun
2024-07-14 15:42 ` Ojaswin Mujoo
2024-07-15 12:33 ` Baokun Li
2024-07-15 12:41 ` Baokun Li
2024-07-16 9:54 ` Ojaswin Mujoo
2024-07-16 11:54 ` Baokun Li
2024-07-17 5:29 ` Ojaswin Mujoo
2024-07-17 6:11 ` Baokun Li
2024-07-24 6:23 ` Ojaswin Mujoo
2024-07-25 5:35 ` Baokun Li [this message]
2024-07-25 8:48 ` Ojaswin Mujoo
2024-07-24 18:53 ` Jan Kara
2024-07-10 4:06 ` [PATCH 03/20] ext4: fix double brelse() the buffer " libaokun
2024-07-24 19:01 ` Jan Kara
2024-07-26 11:45 ` Ojaswin Mujoo
2024-07-30 8:47 ` Baokun Li
2024-08-01 6:26 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 04/20] ext4: add new ext4_ext_path_brelse() helper libaokun
2024-07-24 19:02 ` Jan Kara
2024-07-26 11:53 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 05/20] ext4: fix slab-use-after-free in ext4_split_extent_at() libaokun
2024-07-24 19:13 ` Jan Kara
2024-07-27 10:36 ` Ojaswin Mujoo
2024-07-30 8:57 ` Baokun Li
2024-07-30 9:26 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 06/20] ext4: avoid use-after-free in ext4_ext_show_leaf() libaokun
2024-07-24 19:16 ` Jan Kara
2024-07-25 5:41 ` Baokun Li
2024-07-27 10:43 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 07/20] ext4: drop ppath from ext4_ext_replay_update_ex() to avoid double-free libaokun
2024-07-25 10:31 ` Jan Kara
2024-07-27 11:18 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 08/20] ext4: get rid of ppath in ext4_find_extent() libaokun
2024-07-25 10:38 ` Jan Kara
2024-07-27 6:18 ` Baokun Li
2024-07-29 11:28 ` Jan Kara
2024-07-30 10:03 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 09/20] ext4: get rid of ppath in get_ext_path() libaokun
2024-07-25 10:41 ` Jan Kara
2024-08-01 7:16 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 10/20] ext4: get rid of ppath in ext4_ext_create_new_leaf() libaokun
2024-07-25 10:46 ` Jan Kara
2024-07-27 6:35 ` Baokun Li
2024-08-02 7:34 ` Ojaswin Mujoo
2024-08-02 13:07 ` Baokun Li
2024-07-10 4:06 ` [PATCH 11/20] ext4: get rid of ppath in ext4_ext_insert_extent() libaokun
2024-07-25 10:59 ` Jan Kara
2024-08-02 8:01 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 12/20] ext4: get rid of ppath in ext4_split_extent_at() libaokun
2024-07-25 11:07 ` Jan Kara
2024-07-27 6:42 ` Baokun Li
2024-08-21 3:19 ` Theodore Ts'o
2024-08-21 3:29 ` Baokun Li
2024-08-02 8:12 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 13/20] ext4: get rid of ppath in ext4_force_split_extent_at() libaokun
2024-07-25 11:14 ` Jan Kara
2024-08-02 20:01 ` Ojaswin Mujoo
2024-08-03 2:23 ` Baokun Li
2024-07-10 4:06 ` [PATCH 14/20] ext4: get rid of ppath in ext4_split_extent() libaokun
2024-07-25 12:07 ` Jan Kara
2024-08-02 20:17 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 15/20] ext4: get rid of ppath in ext4_split_convert_extents() libaokun
2024-07-25 12:12 ` Jan Kara
2024-08-02 20:26 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 16/20] ext4: get rid of ppath in ext4_convert_unwritten_extents_endio() libaokun
2024-07-25 12:14 ` Jan Kara
2024-08-02 20:28 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 17/20] ext4: get rid of ppath in ext4_ext_convert_to_initialized() libaokun
2024-07-25 12:18 ` Jan Kara
2024-08-02 20:38 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 18/20] ext4: get rid of ppath in ext4_ext_handle_unwritten_extents() libaokun
2024-07-25 12:22 ` Jan Kara
2024-08-02 20:44 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 19/20] ext4: get rid of ppath in convert_initialized_extent() libaokun
2024-07-25 12:23 ` Jan Kara
2024-08-02 20:46 ` Ojaswin Mujoo
2024-07-10 4:06 ` [PATCH 20/20] ext4: avoid unnecessary extent path frees and allocations libaokun
2024-07-25 12:31 ` Jan Kara
2024-08-02 20:58 ` Ojaswin Mujoo
2024-07-25 9:02 ` [PATCH 00/20] ext4: some bugfixes and cleanups for ext4 extents path Ojaswin Mujoo
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=6df79e24-df1a-43da-8d1d-6bd0f8dd2edf@huaweicloud.com \
--to=libaokun@huaweicloud.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=ritesh.list@gmail.com \
--cc=tytso@mit.edu \
--cc=yangerkun@huawei.com \
--cc=yi.zhang@huawei.com \
--cc=zhanchengbin1@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®