Подробности
[В начало]
Проблема в реализации № 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() из этих ФС.
Способ воспроизведения
- Монтируем одну ФС ext4.
- Во время монтирования другой ФС ext4 симулируем ошибку в процессе выполнения ext4_mb_init(). Это повлечет ошибку в самом процессе монтирования.
- Выполняем любое действие с первой файловой системой (например, размонтируем ее).
- Это приводит к падению (BUG_ON в get_groupinfo_cache()).
Компонент
linux-kernel 3.14
Принято
https://lkml.org/lkml/2014/5/12/147
commit
Статус
Исправлено в 3.16-rc1
[В начало]