drivers/ide/ide.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff -puN drivers/ide/ide.c~ide_setting_sem-fix drivers/ide/ide.c --- 25/drivers/ide/ide.c~ide_setting_sem-fix 2003-05-11 14:46:22.000000000 -0700 +++ 25-akpm/drivers/ide/ide.c 2003-05-11 14:46:22.000000000 -0700 @@ -1142,13 +1142,12 @@ ide_settings_t *ide_find_setting_by_name * * Automatically remove all the driver specific settings for this * drive. This function may sleep and must not be called from IRQ - * context. Takes the settings_lock + * context. The caller must hold ide_setting_sem. */ static void auto_remove_settings (ide_drive_t *drive) { ide_settings_t *setting; - down(&ide_setting_sem); repeat: setting = drive->settings; while (setting) { @@ -1158,7 +1157,6 @@ repeat: } setting = setting->next; } - up(&ide_setting_sem); } /** @@ -2361,9 +2359,11 @@ int ide_unregister_subdriver (ide_drive_ { unsigned long flags; + down(&ide_setting_sem); spin_lock_irqsave(&ide_lock, flags); if (drive->usage || drive->driver == &idedefault_driver || DRIVER(drive)->busy) { spin_unlock_irqrestore(&ide_lock, flags); + up(&ide_setting_sem); return 1; } #if defined(CONFIG_BLK_DEV_IDEPNP) && defined(CONFIG_PNP) && defined(MODULE) @@ -2374,6 +2374,7 @@ int ide_unregister_subdriver (ide_drive_ ide_remove_proc_entries(drive->proc, generic_subdriver_entries); #endif auto_remove_settings(drive); + up(&ide_setting_sem); drive->driver = &idedefault_driver; setup_driver_defaults(drive); spin_unlock_irqrestore(&ide_lock, flags); _