[lvc-project] [PATCH] f2fs: Add a flush_work() call before destroying raw_super
aitsygunka at yandex.ru
aitsygunka at yandex.ru
Tue May 5 17:19:08 MSK 2026
> On Thu, 30. Apr 14:44, aitsygunka at yandex.ru wrote:
>
>>> В описании выше стоит подуточнить, что именно за ошибку инициализации
>>> схватил репродьюсер. На пути обработки ошибки в f2fs_fill_super() есть
>>> flush этой работы, но по-видимому он не вызывается (?).
>>>
>>
>> Да, все верно, репродьюсер приводит к трассе в f2fs_fill_super(), где по ошибке
>> выполняется переход на метку free_page_array_cache.
>
> Ок, важно в описании уточнить, что именно там происходит, что приводит к
> постановке работы s_error_work в очередь на выполнение.
>
В очередь s_error_work ставится в
f2fs_iget()->f2fs_handle_error()->schedule_work(&sbi->s_error_work)
> Плюс ещё сейчас заметил, что название патча стоит сделать более чётким,
> например
>
> f2fs: properly flush s_error_work on f2fs_fill_super() error path
>
>>> А в целом почему имеющийся flush_work() не передвинуть на эту позицию,
>>> чтобы он соотносился с INIT_WORK() выше? После INIT_WORK какая-либо
>>> ошибка в какой-нибудь из функций инициализации может поставить
>>> s_error_work в очередь на выполнение, и без flush не обойтись. Не сказал
>>> бы, что дублирование - идеальный вариант, тут есть над чем поразмыслить.
>>>
>>
>> Согласен, не совсем красивое решение, но т.к. многие из обработчиков могут приводить
>> к вызову f2fs_record_error_work(), я пока не придумал какого-то подходящего решения,
>> чтобы избежать дублирования flush_work().
>> Пока есть мысли перенести flush_work() в обработчик ошибки перед переходом на метку.
>
> Обработчик ошибки перед переходом на метку? Это в
>
> if (smth-happens) {
> // <- сюда?
> goto label;
> }
>
> ?
>
Ага, конкретно сюда:
/* get an inode for meta space */
sbi->meta_inode = f2fs_iget(sb, F2FS_META_INO(sbi));
if (IS_ERR(sbi->meta_inode)) {
f2fs_err(sbi, "Failed to read F2FS meta data inode");
err = PTR_ERR(sbi->meta_inode);
// <-- вот сюда, т.к. именно отсюда мы переходим
goto free_page_array_cache;
}
> Ну, я имел ввиду перенос уже имеющегося внутри f2fs_fill_super() вызова
> flush_work() на пути обработки ошибки. Верно ли он поставлен? Может
> быть, его лучше переместить в другое место, ниже по коду?
Да, я понял, оно логично, но у меня нет четкого понимания, что при переходе на метки
выше мы также не получим состояние гонки.
More information about the lvc-project
mailing list