Почему номер индекса равен нулю для механизма обратной записи в ядре Linux

Я исследую kernel ​​Linux. Прямо сейчас только для v3.10.61, это просто доказательство концепции.

Мне нужно передать некоторые аппаратные подсказки о том, какие данные в частности операции WRITE \ READ. Например, читать растровые изображения inodes или записывать блок журнала или записывать пользовательские данные или что-то еще …

Я предполагаю, что на уровне драйвера я могу достичь bio struct из request_queue struct .

  1. Я создал FS с помощью этой команды: mkfs.ext4 -b 4096 -E lazy_itable_init=0,lazy_journal_init=0 -m 0 /dev/vda
  2. Я смонтировал его с помощью этой команды: mount -o rw,nosuid,nodev,discard,noauto_da_alloc,data=ordered /dev/vda /mnt
  3. Добавлена ​​точка останова в virtio_blk.c:377 и будет пропускать записи, связанные с журналом
  4. Выполните эту команду dd: dd if=/dev/urandom of=/mnt/foo2 bs=764 count=34
  5. Дождитесь попадания в точку останова и проанализируете обратную трассировку в подсистеме обратной записи.

Вот обратный след:

 #0 virtblk_request (q=0x87ab8000) at drivers/block/virtio_blk.c:377 #1 0x801c0b4c in __blk_run_queue_uncond (q=) at block/blk-core.c:312 #2 __blk_run_queue (q=0x87ab8000) at block/blk-core.c:329 #3 0x801c0c94 in queue_unplugged (q=0x87ab8000, depth=, from_schedule=) at block/blk-core.c:2920 #4 0x801c3a98 in blk_flush_plug_list (plug=, from_schedule=false) at block/blk-core.c:3030 #5 0x801c3d9c in blk_finish_plug (plug=0x8785fd8c) at block/blk-core.c:3037 #6 0x80091644 in generic_writepages (mapping=, wbc=0x8785fde0) at mm/page-writeback.c:1910 #7 0x80092a88 in do_writepages (mapping=, wbc=) at mm/page-writeback.c:1923 #8 0x800e7084 in __writeback_single_inode (inode=0x8740c290, wbc=0x8785fde0) at fs/fs-writeback.c:454 #9 0x800e7360 in writeback_sb_inodes (sb=0x87811000, wb=0x87ab81b0, work=0x8785fea4) at fs/fs-writeback.c:678 #10 0x800e757c in __writeback_inodes_wb (wb=0x1 , work=0x3ff) at fs/fs-writeback.c:723 #11 0x800e7760 in wb_writeback (wb=0x87ab81b0, work=0x8785fea4) at fs/fs-writeback.c:854 #12 0x800e838c in wb_check_old_data_flush (wb=) at fs/fs-writeback.c:969 #13 wb_do_writeback (wb=0x87ab81b0, force_wait=0) at fs/fs-writeback.c:1010 #14 0x800e848c in bdi_writeback_workfn (work=0x87ab81bc) at fs/fs-writeback.c:1040 #15 0x80039d34 in process_one_work (worker=0x87816180, work=0x87ab81bc) at kernel/workqueue.c:2189 #16 0x8003a40c in worker_thread (__worker=0x1 ) at kernel/workqueue.c:2313 #17 0x8003f714 in kthread (_create=0x87845e20) at kernel/kthread.c:200 #18 0x8000dfb8 in ret_from_fork () at arch/arm/kernel/entry-common.S:91 

Итак, мы идем … В кадре № 8 мы не оптимизировали переменную inode для проверки:

 p (*inode)->i_ino $7 = 0 

Может кто-нибудь объяснить мне, о чем этот инод? Где я могу найти информацию об этом типе inode? И как я могу отследить номер инода для операций обратной записи?

One Solution collect form web for “Почему номер индекса равен нулю для механизма обратной записи в ядре Linux”

Отказ от ответственности: я не пробовал ни одну из этих функций, и я работаю над документацией и комментариями. Мои наблюдения могут быть неверными!

Единственная функция, которую я вижу, которая использует значение i_ino в fs/writeback.c это внутренняя функция block_dump___mark_inode_dirty , которая помечает block_dump___mark_inode_dirty как грязный, если он хеширован (и еще не отмечен), и устанавливает метку времени (для будущих операций обратной записи .) Текущий список инодов, подлежащих обратной записи, представляется доступным в виде списка ( struct bdi_writeback *wb ), переданного wb_writeback() .

Поскольку вы использовали data=ordered order в параметрах монтирования, я не верю, что происходит какая-либо обратная запись данных, поэтому никакие inode не следует считать «грязными». Согласно документации ext4 :

data=ordered (*)

Все данные передаются напрямую в основную файловую систему до того, как ее метаданные будут переданы в журнал.

Далее описание того, как работает обратная запись в ext4:

Режим данных

  • режим обратной записи

В режиме data=writeback ext4 вообще не data=writeback данные. Этот режим обеспечивает уровень ведения журнала, аналогичный уровню ведения журналов XFS, JFS и ReiserFS, в режиме по умолчанию – ведение журнала метаданных. Авария + восстановление может привести к появлению неверных данных в файлах, которые были записаны незадолго до сбоя. Этот режим обычно обеспечивает лучшую производительность ext4.

  • упорядоченный режим

В режиме data=ordered ext4 только официально регистрирует метаданные, но логически группирует информацию метаданных, связанную с изменениями данных с блоками данных, в один блок, называемый транзакцией. Когда пришло время записать новые метаданные на диск, соответствующие блоки данных записываются первыми. В общем, этот режим работает немного медленнее, чем обратная запись, но значительно быстрее, чем режим журнала.

Если вы хотите отслеживать события в разделе ext4, вам может быть интересно посмотреть, как интерфейс ext4-JBD2 работает в fs/ext4/ext4_jbd2.c и интерфейсы трассировки, доступные в include/trace/events/ext4.h .

  • Значение префикса амперсанда в дереве устройств
  • Есть ли способ временно отключить сообщения segfault в dmesg?
  • Трассировка пакета в сетевом стеке Linux
  • Как указать U-Boot не использовать uramdisk
  • Является ли ядро ​​удалять записи в / dev на initramfs?
  • gnupg 2.1.16 блоки, ожидающие энтропии
  • Что такое подсистема (например, подсистема netfilter)?
  • Получите количество быстрых повторных передач из информации TCP
  • Невозможно скомпилировать ядро ​​Linux для платы ARM
  • Unix STREAMS против стандартных streamов
  • Высокая загрузка процессора с помощью CFS?
  • Interesting Posts

    Как закончить пароль? (Для создания основной учетной записи)

    Должна ли служба отменить и прекратить неполную работу над SIGTERM?

    Сценарий оболочки возвращает 126 код выхода из crontab

    smartctl: приостановить чтение-проверку оставшейся части диска

    Как исправить ошибку суперблока BTRFS после изменения размера / сжатия (BTRFS: невозможно получить супербуферную головку для bytenr 274877906944)

    цветной выход

    Какие сценарии bash выполняются при запуске терминала?

    Легкая голосовая связь между двумя компьютерами в двух странах?

    Отменить сборку трубопровода, если никаких новых коммитов

    Поиск и замена VIM

    Как извлечь второй и третий столбцы из файла CSV с помощью awk?

    Ошибка распаковки, возможно ли восстановление?

    Дождитесь завершения процесса, прежде чем перейти к следующей строке в сценарии оболочки

    Как преобразовать относительный к абсолютному пути, портативно и надежно?

    Каковы некоторые распространенные случаи использования файлов файлов блоков / символов из оболочки с помощью mknod?

    Linux и Unix - лучшая ОС в мире.