Подробности

[В начало]

Проблема в реализации № F0009

Краткое описание

ext4: Удаление ext4_groupinfo_caches во время монтирования вызывает BUG_ON для других примонтированных файловых систем ext4

Подробное описание

Драйвер Ext4 использует ext4_groupinfo_caches как глобальный массив из кэшей для объектов с различными размерами.

Изначально ни один из кэшей не создан. Когда функций ext4_mb_init(), вызванная во время процесса монтирования, обнаруживает, что кэш для объектов размера sb->sb_blocksize не создан, она создает этот кэш. После этого, кэш может свободно использоваться примонтированной файловой системой.

Если по некоторым причинам ext4_mb_init() завершается с ошибкой, то перед выходом из функции уничтожаются все кэши, созданные на этот момент.

Такое поведение корректно, если выполняется первое монтирование ФС ext4. В этом случае сам процесс монтирования завершается с ошибкой, и после этого кэши объектов не используются никем..

Но если на момент возникновения ошибки в процессе вызова ext4_mb_init() существуют уже примонтированные ФС ext4, то кэши, используемые в этих ФС уничтожаются. Что ведет к срабатыванию BUG_ON() при вызове get_groupinfo_cache() из этих ФС.

Способ воспроизведения

  1. Монтируем одну ФС ext4.
  2. Во время монтирования другой ФС ext4 симулируем ошибку в процессе выполнения ext4_mb_init(). Это повлечет ошибку в самом процессе монтирования.
  3. Выполняем любое действие с первой файловой системой (например, размонтируем ее).
  4. Это приводит к падению (BUG_ON в get_groupinfo_cache()).

Компонент

linux-kernel 3.14

Принято

https://lkml.org/lkml/2014/5/12/147
commit

Статус

Исправлено в 3.16-rc1

[В начало]