[lvc-project] [PATCH] gfs2: Fix NULL pointer dereference in gfs2_log_flush

Fedor Pchelkin pchelkin at ispras.ru
Mon Apr 13 23:47:37 MSK 2026


On Mon, 13. Apr 22:12, Николай Кузнецов wrote:
>    Здравствуйте!
>    > уверены, что этот коммит валиден?
>    Не знаю, насколько это актуальная информация,
> 
>    но, как я увидел, коммит касается не только log.c,
>    но и super.c, на всякий случай прикладываю:
>    [1]https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/fs/gfs2/super.c?id=35264909e9d1973ab9aaa2a1b07cda70f12bb828
>    Не понял, как на git.kernel.org открыть коммит
>    целиком, а не по отдельному файлу. Вот также
>    он целиком на другой платформе:
>    [2]https://patchew.org/linux/20260205044147.1948143-1-black.hawk@163.com/
>    Не знаю, влияет ли это на актуальность ваших
>    вопросов, но на всякий случай отправляю.

Для оформления ссылки на полный коммит следует убрать путь к конкретному
файлу/директории из URL:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=35264909e9d1973ab9aaa2a1b07cda70f12bb828

> 
>    > стоит изучить, действительно ли возможно
>    > состояние гонки, которое он правит:
>    > где зануляется указатель sdp->sd_jdesc
>    Меняется при размонтировании фс в
>    put_super: вызывается gfs2_jindex_free(),
>    внутри которой под
>    down_write(&sdp->sd_log_flush_lock) и
>    выставляется NULL:
>    ссылка на вызов gfs2_jindex_free() в
>    put_super():
>    [3]https://elixir.bootlin.com/linux/v6.1.164/source/fs/gfs2/super.c#L639

Там ещё вторая часть вопроса была :)  про жизненный цикл асинхронно
выполняемой работы &gl->gl_work.  Для понимания гонки это также важно,
чтобы понимать, как параллельное выполнение потока с размонтированием
ФС, где выполняется gfs2_jindex_free(), коррелирует с выполнением
обработчика этой &gl->gl_work.

Основные понятия про work queues:
https://litux.nl/mirror/kerneldevelopment/0672327201/ch07lev1sec4.html

Правда я смотрю, что своё пояснение строили даже без этого, и на мой
взгляд тоже пришли к обоснованному выводу.

>    Следовательно, если мы имеем нулевой
>    sdp->sd_jdesc в gfs2_log_flush(), то мы
>    тем более имеем и стёртый SDF_JOURNAL_LIVE,
>    а значит, в
>    [9]https://elixir.bootlin.com/linux/v6.1.164/source/fs/gfs2/log.c#L1051
>    выйдем по метке out, где разыменования вроде
>    как не будет. То есть вроде как и добавленная в
>    обсуждаемом коммите проверка указателя на
>    NULL в gfs2_log_flush действительно излишняя -

Да, согласен, спасибо.

Следующим шагом будет подготовка патча [1].  Подготовьте пожалуйста патч,
грамотно составьте его описание, обосновав своё видение (сильно
разжёвывать и размусоливать не надо, главное постараться всё чётко
сформулировать) и сделайте необходимые изменения кода.  Патч стоит
отправить пока только по адресу lvc-patches at linuxtesting.org.

Перед финальной отправкой команда git send-email спрашивает, кому будут
направлены письма и выводит окончательный список адресатов.

Важно. git send-email по умолчанию добавляет в копию адреса, имеющиеся в
тексте патча (например, если указан тег Cc: stable at vger.kernel.org). При
отправке патча для предварительного внутреннего обсуждения внешние
адресаты нежелательны. В таких случаях их можно убрать, передав команде
опцию --suppress-cc=all.

Я постараюсь оперативно ответить.  По результатам этого обсуждения, если
всё в порядке, можете сразу пинговать Алексея Хорошилова, а то дедлайн
близко.

Потом чтобы довести дело до логического конца, надо будет отправить патч
в международное сообщество, чтобы сопровождающий драйвера Andreas
Gruenbacher его также оценил и, если всё ОК, принял.  Это уже возможно
будет более растянутый во времени процесс, а может и нет, зависит от
мэйнтейнера.

[1]: https://portal.linuxtesting.ru/How-to-send-patches-to-kernel.html



More information about the lvc-project mailing list