diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-08-15 12:15:17 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-08-15 12:15:17 -0400 |
commit | f3efbe582b5396d134024c03a5fa253f2a85d9a6 (patch) | |
tree | e4e15b7567b82d24cb1e7327398286a2b88df04c /drivers/ide/ide-disk.c | |
parent | 05d3ed0a1fe3ea05ab9f3b8d32576a0bc2e19660 (diff) | |
parent | b635acec48bcaa9183fcbf4e3955616b0d4119b5 (diff) |
Merge branch 'linus' into x86/gart
Diffstat (limited to 'drivers/ide/ide-disk.c')
-rw-r--r-- | drivers/ide/ide-disk.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 3a2e80237c10..68b9cf0138b0 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
@@ -56,24 +56,31 @@ static DEFINE_MUTEX(idedisk_ref_mutex); | |||
56 | #define ide_disk_g(disk) \ | 56 | #define ide_disk_g(disk) \ |
57 | container_of((disk)->private_data, struct ide_disk_obj, driver) | 57 | container_of((disk)->private_data, struct ide_disk_obj, driver) |
58 | 58 | ||
59 | static void ide_disk_release(struct kref *); | ||
60 | |||
59 | static struct ide_disk_obj *ide_disk_get(struct gendisk *disk) | 61 | static struct ide_disk_obj *ide_disk_get(struct gendisk *disk) |
60 | { | 62 | { |
61 | struct ide_disk_obj *idkp = NULL; | 63 | struct ide_disk_obj *idkp = NULL; |
62 | 64 | ||
63 | mutex_lock(&idedisk_ref_mutex); | 65 | mutex_lock(&idedisk_ref_mutex); |
64 | idkp = ide_disk_g(disk); | 66 | idkp = ide_disk_g(disk); |
65 | if (idkp) | 67 | if (idkp) { |
66 | kref_get(&idkp->kref); | 68 | if (ide_device_get(idkp->drive)) |
69 | idkp = NULL; | ||
70 | else | ||
71 | kref_get(&idkp->kref); | ||
72 | } | ||
67 | mutex_unlock(&idedisk_ref_mutex); | 73 | mutex_unlock(&idedisk_ref_mutex); |
68 | return idkp; | 74 | return idkp; |
69 | } | 75 | } |
70 | 76 | ||
71 | static void ide_disk_release(struct kref *); | ||
72 | |||
73 | static void ide_disk_put(struct ide_disk_obj *idkp) | 77 | static void ide_disk_put(struct ide_disk_obj *idkp) |
74 | { | 78 | { |
79 | ide_drive_t *drive = idkp->drive; | ||
80 | |||
75 | mutex_lock(&idedisk_ref_mutex); | 81 | mutex_lock(&idedisk_ref_mutex); |
76 | kref_put(&idkp->kref, ide_disk_release); | 82 | kref_put(&idkp->kref, ide_disk_release); |
83 | ide_device_put(drive); | ||
77 | mutex_unlock(&idedisk_ref_mutex); | 84 | mutex_unlock(&idedisk_ref_mutex); |
78 | } | 85 | } |
79 | 86 | ||
@@ -158,7 +165,7 @@ static void ide_tf_set_cmd(ide_drive_t *drive, ide_task_t *task, u8 dma) | |||
158 | write = (task->tf_flags & IDE_TFLAG_WRITE) ? 1 : 0; | 165 | write = (task->tf_flags & IDE_TFLAG_WRITE) ? 1 : 0; |
159 | 166 | ||
160 | if (dma) | 167 | if (dma) |
161 | index = drive->vdma ? 4 : 8; | 168 | index = 8; |
162 | else | 169 | else |
163 | index = drive->mult_count ? 0 : 4; | 170 | index = drive->mult_count ? 0 : 4; |
164 | 171 | ||