Bug 9881 - udevsettle race during startup
: udevsettle race during startup
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/udev)
: unstable
: all Linux
: P2 major
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2006-08-15 20:17 by
Modified: 2006-08-28 18:32 (History)


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


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2006-08-15 20:17:27
При загрузке системы с установленным 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 From 2006-08-15 20:20:03 -------
Created an attachment (id=1583) [details]
fake /dev/.udev/uevent_seqnum for udevsettle

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