diff options
Diffstat (limited to 'drivers/ide/ide-floppy.c')
-rw-r--r-- | drivers/ide/ide-floppy.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 3d8e6dd0f41e..ca11a26746f1 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
@@ -158,23 +158,29 @@ static DEFINE_MUTEX(idefloppy_ref_mutex); | |||
158 | #define ide_floppy_g(disk) \ | 158 | #define ide_floppy_g(disk) \ |
159 | container_of((disk)->private_data, struct ide_floppy_obj, driver) | 159 | container_of((disk)->private_data, struct ide_floppy_obj, driver) |
160 | 160 | ||
161 | static void idefloppy_cleanup_obj(struct kref *); | ||
162 | |||
161 | static struct ide_floppy_obj *ide_floppy_get(struct gendisk *disk) | 163 | static struct ide_floppy_obj *ide_floppy_get(struct gendisk *disk) |
162 | { | 164 | { |
163 | struct ide_floppy_obj *floppy = NULL; | 165 | struct ide_floppy_obj *floppy = NULL; |
164 | 166 | ||
165 | mutex_lock(&idefloppy_ref_mutex); | 167 | mutex_lock(&idefloppy_ref_mutex); |
166 | floppy = ide_floppy_g(disk); | 168 | floppy = ide_floppy_g(disk); |
167 | if (floppy) | 169 | if (floppy) { |
168 | kref_get(&floppy->kref); | 170 | kref_get(&floppy->kref); |
171 | if (ide_device_get(floppy->drive)) { | ||
172 | kref_put(&floppy->kref, idefloppy_cleanup_obj); | ||
173 | floppy = NULL; | ||
174 | } | ||
175 | } | ||
169 | mutex_unlock(&idefloppy_ref_mutex); | 176 | mutex_unlock(&idefloppy_ref_mutex); |
170 | return floppy; | 177 | return floppy; |
171 | } | 178 | } |
172 | 179 | ||
173 | static void idefloppy_cleanup_obj(struct kref *); | ||
174 | |||
175 | static void ide_floppy_put(struct ide_floppy_obj *floppy) | 180 | static void ide_floppy_put(struct ide_floppy_obj *floppy) |
176 | { | 181 | { |
177 | mutex_lock(&idefloppy_ref_mutex); | 182 | mutex_lock(&idefloppy_ref_mutex); |
183 | ide_device_put(floppy->drive); | ||
178 | kref_put(&floppy->kref, idefloppy_cleanup_obj); | 184 | kref_put(&floppy->kref, idefloppy_cleanup_obj); |
179 | mutex_unlock(&idefloppy_ref_mutex); | 185 | mutex_unlock(&idefloppy_ref_mutex); |
180 | } | 186 | } |