[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Что почитать о монтировании сменных носителей?



On Tue, Oct 06, 2009 at 11:16:20PM +0400, Stanislav Maslovski wrote:
> On Tue, Oct 06, 2009 at 08:49:50PM +0400, Alexander Galanin wrote:
> > On Tue, 6 Oct 2009 00:40:26 +0400
> > Stanislav Maslovski <stanislav.maslovski@gmail.com> wrote:
> > 
> > > Тут сначала надо бы разобраться необходимо ли вообще предохраняться
> > > от race. В документации не очень внятно написано про порядок вызова
> > > callouts для _разных_ устройств. Т.е., может ли быть так, что cleanup
> > > скрипт еще не завершился (стартует по факту создания записи
> > > /org/freedesktop/Hal/devices/computer), а hal-autofs(add) уже
> > > выполняется (стартует по факту втыкания флешки).
> > > 
> > > Кстати, как я сейчас вижу, мое "решение" вовсе не избавляет от этого
> > > race condition, если на момент запуска hal-autofs(add) в /media/
> > > _отсутствует_ симлинк c именем `basename $UDI`. Нужен семафор.
> > > 
> > > Второй момент -- может ли по каким-то причинам реализоваться ситуация,
> > > когда hal-autofs(remove) еще не завершился, а hal-autofs(add) уже
> > > стартовал для того же девайса (выдернули и тут же воткнули флешку).
> > > От этого мое "решение" предохраняет (даже если удаление не отработает
> > > то и зацикливание на ожидании не страшно -- hald прибивает подвисшие
> > > callouts, и симлинк уже есть).
> > 
> > (ехидно) Вот примерно об этом я и говорил, когда употребил слова
> > "простой" и "понятный".
> 
> Это как раз-таки ерунда. Сугубо техническая деталь. Решается одним
> вопросом в рассылке hal@lists.freedesktop.org или прямым
> экспериментом.

Поэкспериментировал. hald _сериализует_ вызов add/remove callouts для
одного девайса, следовательно, сценарий 2 исключается. Вызов callouts
для разных девайсов не сериализован (что разумно, иначе бы hald
нещадно тупил при старте), поэтому сценарий 1 возможен.

Но хитрость в том, что find в скрипте cleanup вызывается у меня с
опцией -L (следовать симлинкам, про что я совсем забыл), поэтому, если
по каким-то причинам скрипт cleanup протормозит и hal-autofs(add)
отработает раньше и положит в /media свой симлинк, то когда find -L на
него наткнется, произойдет активация механизма autofs в ядре, файловая
система подмонтируется, симлинк окажется указывающим на корневой
каталог устройства (т.е. на объект -type d, a не -type l) и в список
на удаление не попадет. То есть, даже если cleanup скрипт отработает
позже hal-autofs(add), это не приведет к удалению только что
созданного симлинка.

Так что все проще некуда и while со sleep-ом из скрипта можно смело
удалить ;)

-- 
Stanislav


Reply to: