On Wed, Aug 31, 2005 at 07:32:59PM +0400, Alexey I. Froloff wrote: > * Alexey I.Froloff [050830 19:06]: > > Ну, у volume'а есть два пропертя - is_mounted и mount_point, при > > чём обновляются они оба сразу. Вот первую проперть надо > > обновлять уже после освобождения устройства, впихнув в ядро ещё > > одно сообщение и в hal ещё один обработчик... > А вот и патчик для 2.6.12-почтиstd26-alt3. Untested, лучшего > названия кроме FREE не нашёл ;-) > diff -Naurp kernel-source-2.6.12-orig/fs/super.c kernel-source-2.6.12/fs/super.c > --- kernel-source-2.6.12-orig/fs/super.c 2005-06-17 23:48:29 +0400 > +++ kernel-source-2.6.12/fs/super.c 2005-08-31 19:17:54 +0400 > @@ -734,6 +734,7 @@ void kill_block_super(struct super_block > generic_shutdown_super(sb); > sync_blockdev(bdev); > close_bdev_excl(bdev); > + bdev_uevent(bdev, KOBJ_FREE); Так делать нельзя - close_bdev_excl() вызывает blkdev_put(), и после этого bdev может быть уже уничтожено (если этот umount выполняется после отсоединения устройства). Нужно либо ставить bdev_uevent() перед close_bdev_excl() (но тогда получается race - до выполнения bd_release(), вызываемого в close_bdev_excl(), устройство невозможно открыть с O_EXCL или смонтировать, так что объявлять о его освобождении ещё рано), либо вместо close_bdev_excl() вызывать отдельно bd_release() и blkdev_put(), вставив между ними вызов bdev_uevent() (что тоже не совсем красиво, поскольку исчезает явный вызов функции, соответствующей open_bdev_excl()). С другой стороны, если сначала вызвать bd_release(), получается race другого вида - кто-то может выполнить bd_claim() и объявить о занятии устройства до того, как будет сгенерировано сообщение об освобождении устройства. Возможно, первый вариант race лучше, поскольку в этом случае хотя бы гарантируется правильный порядок событий, а нарваться на занятость устройства новым монтированием обработчик KOBJ_FREE может в любом случае. > } > > EXPORT_SYMBOL(kill_block_super); > diff -Naurp kernel-source-2.6.12-orig/include/linux/kobject_uevent.h kernel-source-2.6.12/include/linux/kobject_uevent.h > --- kernel-source-2.6.12-orig/include/linux/kobject_uevent.h 2005-06-17 23:48:29 +0400 > +++ kernel-source-2.6.12/include/linux/kobject_uevent.h 2005-08-31 19:16:50 +0400 > @@ -29,6 +29,7 @@ enum kobject_action { > KOBJ_UMOUNT = (__force kobject_action_t) 0x05, /* umount event for block devices */ > KOBJ_OFFLINE = (__force kobject_action_t) 0x06, /* offline event for hotplug devices */ > KOBJ_ONLINE = (__force kobject_action_t) 0x07, /* online event for hotplug devices */ > + KOBJ_FREE = (__force kobject_action_t) 0x08, /* free device event for block devices */ Имя слишком общее, и не совсем отражает суть события. Если это именно освобождение, тогда получается, что это событие должно выдаваться и при закрытии устройства, открытого с O_EXCL (т.е., где-то в bd_release()).