Bug 9881 - udevsettle race during startup
Summary: udevsettle race during startup
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: udev (show other bugs)
Version: unstable
Hardware: all Linux
: P2 major
Assignee: Anton Farygin
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-08-15 20:17 MSD by Sergey Vlasov
Modified: 2006-08-28 18:32 MSD (History)
2 users (show)

See Also:


Attachments
fake /dev/.udev/uevent_seqnum for udevsettle (827 bytes, patch)
2006-08-15 20:20 MSD, Sergey Vlasov
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
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.