Bug 9881

Summary: udevsettle race during startup
Product: Sisyphus Reporter: Sergey Vlasov <vsu>
Component: udevAssignee: Anton Farygin <rider>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: major    
Priority: P2 CC: arseny, shaba
Version: unstable   
Hardware: all   
OS: Linux   
Attachments:
Description Flags
fake /dev/.udev/uevent_seqnum for udevsettle none

Description Sergey Vlasov 2006-08-15 20:17:27 MSD
При загрузке системы с установленным udev-096-alt1 вызов udevsettle иногда
завершается аварийно (Populating /dev [FAILED]), в результате дальнейшая
загрузка продолжается, не дожидаясь завершения создания всех файлов устройств,
что в дальнейшем приводит к различным проблемам.  Кроме того, скрипт
/etc/init.d/udevd при ошибке udevsettle отмонтирует tmpfs, ранее смонтированный
в /dev, но перед этим не останавливает запущенный udevd, в результате udevd
продолжает писать в /dev на корне вместо tmpfs.

Как выяснилось, причина ненадёжной работы udevsettle - race при инициализации. 
В udevsettle предполагается, что запуск udevd выполняется с ключом --daemon;
запущенный таким образом udevd сначала создаёт файл /dev/.udev/uevent_seqnum, и
только потом выполняет fork() и начинает работать как демон.  Однако в
/etc/init.d/udevd запуск udevd выполняется без ключа --daemon, вместо этого
используется ключ --make-pidfile функции start_daemon.  В результате после
завершения выполнения функции start_daemon инициализация демона может быть ещё
не завершена, и последующий вызов udevsettle может обнаружить отсутствие файла
/dev/.udev/uevent_seqnum, в этом случае он завершается с ошибкой.

Наиболее правильный способ решения данной проблемы - добавить создание pid-файла
в сам udevd и не использовать ключ --make-pidfile.  Однако есть более простой
способ обхода проблемы - создать файл /dev/.udev/uevent_seqnum заранее, чтобы
при вызове udevsettle он гарантированно существовал.
Comment 1 Sergey Vlasov 2006-08-15 20:20:03 MSD
Created attachment 1583 [details]
fake /dev/.udev/uevent_seqnum for udevsettle

Можно просто записать 0 в /dev/.udev/uevent_seqnum. Вызовы sync, которые были
вставлены при попытке скрыть race, теперь можно удалить (они всё равно не
давали требуемого эффекта).
Comment 2 Dmitry V. Levin 2006-08-17 19:14:48 MSD
Сергей, мне кажется что лучше тебя никто эту ошибку всё равно не исправит.
Comment 3 Sergey Vlasov 2006-08-28 18:31:57 MSD
Fixed in udev-097-alt1.