[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