diff options
author | Matthias Kaehlcke <matthias.kaehlcke@gmail.com> | 2007-07-09 17:17:56 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2007-07-09 17:17:56 -0400 |
commit | f9383c4269d264c3cf563bd2de365891f6592ebd (patch) | |
tree | 7f1f3525c51237dc5806d17dd2c68c19d47a493b | |
parent | 1b9da32a2855afa3c5f27690e03a33dc97410c42 (diff) |
ide: use mutex instead of ide_setting_sem semaphore in IDE driver
The IDE driver uses a semaphore as mutex.
Use the mutex API instead of the (binary) semaphore.
Signed-off-by: Matthias Kaehlcke <matthias.kaehlcke@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
--
-rw-r--r-- | drivers/ide/ide-disk.c | 8 | ||||
-rw-r--r-- | drivers/ide/ide-proc.c | 34 | ||||
-rw-r--r-- | drivers/ide/ide.c | 12 | ||||
-rw-r--r-- | include/linux/ide.h | 3 |
4 files changed, 29 insertions, 28 deletions
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index dc2175c81f5e..b1304a7f3e0a 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
@@ -1190,11 +1190,11 @@ static int idedisk_ioctl(struct inode *inode, struct file *file, | |||
1190 | return generic_ide_ioctl(drive, file, bdev, cmd, arg); | 1190 | return generic_ide_ioctl(drive, file, bdev, cmd, arg); |
1191 | 1191 | ||
1192 | read_val: | 1192 | read_val: |
1193 | down(&ide_setting_sem); | 1193 | mutex_lock(&ide_setting_mtx); |
1194 | spin_lock_irqsave(&ide_lock, flags); | 1194 | spin_lock_irqsave(&ide_lock, flags); |
1195 | err = *val; | 1195 | err = *val; |
1196 | spin_unlock_irqrestore(&ide_lock, flags); | 1196 | spin_unlock_irqrestore(&ide_lock, flags); |
1197 | up(&ide_setting_sem); | 1197 | mutex_unlock(&ide_setting_mtx); |
1198 | return err >= 0 ? put_user(err, (long __user *)arg) : err; | 1198 | return err >= 0 ? put_user(err, (long __user *)arg) : err; |
1199 | 1199 | ||
1200 | set_val: | 1200 | set_val: |
@@ -1204,9 +1204,9 @@ set_val: | |||
1204 | if (!capable(CAP_SYS_ADMIN)) | 1204 | if (!capable(CAP_SYS_ADMIN)) |
1205 | err = -EACCES; | 1205 | err = -EACCES; |
1206 | else { | 1206 | else { |
1207 | down(&ide_setting_sem); | 1207 | mutex_lock(&ide_setting_mtx); |
1208 | err = setfunc(drive, arg); | 1208 | err = setfunc(drive, arg); |
1209 | up(&ide_setting_sem); | 1209 | mutex_unlock(&ide_setting_mtx); |
1210 | } | 1210 | } |
1211 | } | 1211 | } |
1212 | return err; | 1212 | return err; |
diff --git a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c index ea94c9aa1220..fc1d8ae6a803 100644 --- a/drivers/ide/ide-proc.c +++ b/drivers/ide/ide-proc.c | |||
@@ -156,7 +156,7 @@ static int __ide_add_setting(ide_drive_t *drive, const char *name, int rw, int d | |||
156 | { | 156 | { |
157 | ide_settings_t **p = (ide_settings_t **) &drive->settings, *setting = NULL; | 157 | ide_settings_t **p = (ide_settings_t **) &drive->settings, *setting = NULL; |
158 | 158 | ||
159 | down(&ide_setting_sem); | 159 | mutex_lock(&ide_setting_mtx); |
160 | while ((*p) && strcmp((*p)->name, name) < 0) | 160 | while ((*p) && strcmp((*p)->name, name) < 0) |
161 | p = &((*p)->next); | 161 | p = &((*p)->next); |
162 | if ((setting = kzalloc(sizeof(*setting), GFP_KERNEL)) == NULL) | 162 | if ((setting = kzalloc(sizeof(*setting), GFP_KERNEL)) == NULL) |
@@ -177,10 +177,10 @@ static int __ide_add_setting(ide_drive_t *drive, const char *name, int rw, int d | |||
177 | if (auto_remove) | 177 | if (auto_remove) |
178 | setting->auto_remove = 1; | 178 | setting->auto_remove = 1; |
179 | *p = setting; | 179 | *p = setting; |
180 | up(&ide_setting_sem); | 180 | mutex_unlock(&ide_setting_mtx); |
181 | return 0; | 181 | return 0; |
182 | abort: | 182 | abort: |
183 | up(&ide_setting_sem); | 183 | mutex_unlock(&ide_setting_mtx); |
184 | kfree(setting); | 184 | kfree(setting); |
185 | return -1; | 185 | return -1; |
186 | } | 186 | } |
@@ -224,7 +224,7 @@ static void __ide_remove_setting (ide_drive_t *drive, char *name) | |||
224 | * | 224 | * |
225 | * Automatically remove all the driver specific settings for this | 225 | * Automatically remove all the driver specific settings for this |
226 | * drive. This function may not be called from IRQ context. The | 226 | * drive. This function may not be called from IRQ context. The |
227 | * caller must hold ide_setting_sem. | 227 | * caller must hold ide_setting_mtx. |
228 | */ | 228 | */ |
229 | 229 | ||
230 | static void auto_remove_settings (ide_drive_t *drive) | 230 | static void auto_remove_settings (ide_drive_t *drive) |
@@ -269,7 +269,7 @@ static ide_settings_t *ide_find_setting_by_name(ide_drive_t *drive, char *name) | |||
269 | * @setting: drive setting | 269 | * @setting: drive setting |
270 | * | 270 | * |
271 | * Read a drive setting and return the value. The caller | 271 | * Read a drive setting and return the value. The caller |
272 | * must hold the ide_setting_sem when making this call. | 272 | * must hold the ide_setting_mtx when making this call. |
273 | * | 273 | * |
274 | * BUGS: the data return and error are the same return value | 274 | * BUGS: the data return and error are the same return value |
275 | * so an error -EINVAL and true return of the same value cannot | 275 | * so an error -EINVAL and true return of the same value cannot |
@@ -306,7 +306,7 @@ static int ide_read_setting(ide_drive_t *drive, ide_settings_t *setting) | |||
306 | * @val: value | 306 | * @val: value |
307 | * | 307 | * |
308 | * Write a drive setting if it is possible. The caller | 308 | * Write a drive setting if it is possible. The caller |
309 | * must hold the ide_setting_sem when making this call. | 309 | * must hold the ide_setting_mtx when making this call. |
310 | * | 310 | * |
311 | * BUGS: the data return and error are the same return value | 311 | * BUGS: the data return and error are the same return value |
312 | * so an error -EINVAL and true return of the same value cannot | 312 | * so an error -EINVAL and true return of the same value cannot |
@@ -367,7 +367,7 @@ static int set_xfer_rate (ide_drive_t *drive, int arg) | |||
367 | * @drive: drive being configured | 367 | * @drive: drive being configured |
368 | * | 368 | * |
369 | * Add the generic parts of the system settings to the /proc files. | 369 | * Add the generic parts of the system settings to the /proc files. |
370 | * The caller must not be holding the ide_setting_sem. | 370 | * The caller must not be holding the ide_setting_mtx. |
371 | */ | 371 | */ |
372 | 372 | ||
373 | void ide_add_generic_settings (ide_drive_t *drive) | 373 | void ide_add_generic_settings (ide_drive_t *drive) |
@@ -408,7 +408,7 @@ static int proc_ide_read_settings | |||
408 | 408 | ||
409 | proc_ide_settings_warn(); | 409 | proc_ide_settings_warn(); |
410 | 410 | ||
411 | down(&ide_setting_sem); | 411 | mutex_lock(&ide_setting_mtx); |
412 | out += sprintf(out, "name\t\t\tvalue\t\tmin\t\tmax\t\tmode\n"); | 412 | out += sprintf(out, "name\t\t\tvalue\t\tmin\t\tmax\t\tmode\n"); |
413 | out += sprintf(out, "----\t\t\t-----\t\t---\t\t---\t\t----\n"); | 413 | out += sprintf(out, "----\t\t\t-----\t\t---\t\t---\t\t----\n"); |
414 | while(setting) { | 414 | while(setting) { |
@@ -428,7 +428,7 @@ static int proc_ide_read_settings | |||
428 | setting = setting->next; | 428 | setting = setting->next; |
429 | } | 429 | } |
430 | len = out - page; | 430 | len = out - page; |
431 | up(&ide_setting_sem); | 431 | mutex_unlock(&ide_setting_mtx); |
432 | PROC_IDE_READ_RETURN(page,start,off,count,eof,len); | 432 | PROC_IDE_READ_RETURN(page,start,off,count,eof,len); |
433 | } | 433 | } |
434 | 434 | ||
@@ -508,16 +508,16 @@ static int proc_ide_write_settings(struct file *file, const char __user *buffer, | |||
508 | ++p; | 508 | ++p; |
509 | } | 509 | } |
510 | 510 | ||
511 | down(&ide_setting_sem); | 511 | mutex_lock(&ide_setting_mtx); |
512 | setting = ide_find_setting_by_name(drive, name); | 512 | setting = ide_find_setting_by_name(drive, name); |
513 | if (!setting) | 513 | if (!setting) |
514 | { | 514 | { |
515 | up(&ide_setting_sem); | 515 | mutex_unlock(&ide_setting_mtx); |
516 | goto parse_error; | 516 | goto parse_error; |
517 | } | 517 | } |
518 | if (for_real) | 518 | if (for_real) |
519 | ide_write_setting(drive, setting, val * setting->div_factor / setting->mul_factor); | 519 | ide_write_setting(drive, setting, val * setting->div_factor / setting->mul_factor); |
520 | up(&ide_setting_sem); | 520 | mutex_unlock(&ide_setting_mtx); |
521 | } | 521 | } |
522 | } while (!for_real++); | 522 | } while (!for_real++); |
523 | free_page((unsigned long)buf); | 523 | free_page((unsigned long)buf); |
@@ -705,7 +705,7 @@ EXPORT_SYMBOL(ide_proc_register_driver); | |||
705 | * Clean up the driver specific /proc files and IDE settings | 705 | * Clean up the driver specific /proc files and IDE settings |
706 | * for a given drive. | 706 | * for a given drive. |
707 | * | 707 | * |
708 | * Takes ide_setting_sem and ide_lock. | 708 | * Takes ide_setting_mtx and ide_lock. |
709 | * Caller must hold none of the locks. | 709 | * Caller must hold none of the locks. |
710 | */ | 710 | */ |
711 | 711 | ||
@@ -715,10 +715,10 @@ void ide_proc_unregister_driver(ide_drive_t *drive, ide_driver_t *driver) | |||
715 | 715 | ||
716 | ide_remove_proc_entries(drive->proc, driver->proc); | 716 | ide_remove_proc_entries(drive->proc, driver->proc); |
717 | 717 | ||
718 | down(&ide_setting_sem); | 718 | mutex_lock(&ide_setting_mtx); |
719 | spin_lock_irqsave(&ide_lock, flags); | 719 | spin_lock_irqsave(&ide_lock, flags); |
720 | /* | 720 | /* |
721 | * ide_setting_sem protects the settings list | 721 | * ide_setting_mtx protects the settings list |
722 | * ide_lock protects the use of settings | 722 | * ide_lock protects the use of settings |
723 | * | 723 | * |
724 | * so we need to hold both, ide_settings_sem because we want to | 724 | * so we need to hold both, ide_settings_sem because we want to |
@@ -726,11 +726,11 @@ void ide_proc_unregister_driver(ide_drive_t *drive, ide_driver_t *driver) | |||
726 | * a setting out that is being used. | 726 | * a setting out that is being used. |
727 | * | 727 | * |
728 | * OTOH both ide_{read,write}_setting are only ever used under | 728 | * OTOH both ide_{read,write}_setting are only ever used under |
729 | * ide_setting_sem. | 729 | * ide_setting_mtx. |
730 | */ | 730 | */ |
731 | auto_remove_settings(drive); | 731 | auto_remove_settings(drive); |
732 | spin_unlock_irqrestore(&ide_lock, flags); | 732 | spin_unlock_irqrestore(&ide_lock, flags); |
733 | up(&ide_setting_sem); | 733 | mutex_unlock(&ide_setting_mtx); |
734 | } | 734 | } |
735 | 735 | ||
736 | EXPORT_SYMBOL(ide_proc_unregister_driver); | 736 | EXPORT_SYMBOL(ide_proc_unregister_driver); |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 14ac7c2049e9..574414689253 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
@@ -817,9 +817,9 @@ EXPORT_SYMBOL(ide_register_hw); | |||
817 | * Locks for IDE setting functionality | 817 | * Locks for IDE setting functionality |
818 | */ | 818 | */ |
819 | 819 | ||
820 | DECLARE_MUTEX(ide_setting_sem); | 820 | DEFINE_MUTEX(ide_setting_mtx); |
821 | 821 | ||
822 | EXPORT_SYMBOL_GPL(ide_setting_sem); | 822 | EXPORT_SYMBOL_GPL(ide_setting_mtx); |
823 | 823 | ||
824 | /** | 824 | /** |
825 | * ide_spin_wait_hwgroup - wait for group | 825 | * ide_spin_wait_hwgroup - wait for group |
@@ -1192,11 +1192,11 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device | |||
1192 | } | 1192 | } |
1193 | 1193 | ||
1194 | read_val: | 1194 | read_val: |
1195 | down(&ide_setting_sem); | 1195 | mutex_lock(&ide_setting_mtx); |
1196 | spin_lock_irqsave(&ide_lock, flags); | 1196 | spin_lock_irqsave(&ide_lock, flags); |
1197 | err = *val; | 1197 | err = *val; |
1198 | spin_unlock_irqrestore(&ide_lock, flags); | 1198 | spin_unlock_irqrestore(&ide_lock, flags); |
1199 | up(&ide_setting_sem); | 1199 | mutex_unlock(&ide_setting_mtx); |
1200 | return err >= 0 ? put_user(err, (long __user *)arg) : err; | 1200 | return err >= 0 ? put_user(err, (long __user *)arg) : err; |
1201 | 1201 | ||
1202 | set_val: | 1202 | set_val: |
@@ -1206,9 +1206,9 @@ set_val: | |||
1206 | if (!capable(CAP_SYS_ADMIN)) | 1206 | if (!capable(CAP_SYS_ADMIN)) |
1207 | err = -EACCES; | 1207 | err = -EACCES; |
1208 | else { | 1208 | else { |
1209 | down(&ide_setting_sem); | 1209 | mutex_lock(&ide_setting_mtx); |
1210 | err = setfunc(drive, arg); | 1210 | err = setfunc(drive, arg); |
1211 | up(&ide_setting_sem); | 1211 | mutex_unlock(&ide_setting_mtx); |
1212 | } | 1212 | } |
1213 | } | 1213 | } |
1214 | return err; | 1214 | return err; |
diff --git a/include/linux/ide.h b/include/linux/ide.h index 16ae68857f57..b6546f442fa4 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <asm/system.h> | 25 | #include <asm/system.h> |
26 | #include <asm/io.h> | 26 | #include <asm/io.h> |
27 | #include <asm/semaphore.h> | 27 | #include <asm/semaphore.h> |
28 | #include <asm/mutex.h> | ||
28 | 29 | ||
29 | /****************************************************************************** | 30 | /****************************************************************************** |
30 | * IDE driver configuration options (play with these as desired): | 31 | * IDE driver configuration options (play with these as desired): |
@@ -863,7 +864,7 @@ typedef struct hwgroup_s { | |||
863 | 864 | ||
864 | typedef struct ide_driver_s ide_driver_t; | 865 | typedef struct ide_driver_s ide_driver_t; |
865 | 866 | ||
866 | extern struct semaphore ide_setting_sem; | 867 | extern struct mutex ide_setting_mtx; |
867 | 868 | ||
868 | int set_io_32bit(ide_drive_t *, int); | 869 | int set_io_32bit(ide_drive_t *, int); |
869 | int set_pio_mode(ide_drive_t *, int); | 870 | int set_pio_mode(ide_drive_t *, int); |