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 3d8e6dd0f41..ca11a26746f 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -158,23 +158,29 @@ static DEFINE_MUTEX(idefloppy_ref_mutex);  #define ide_floppy_g(disk) \  	container_of((disk)->private_data, struct ide_floppy_obj, driver) +static void idefloppy_cleanup_obj(struct kref *); +  static struct ide_floppy_obj *ide_floppy_get(struct gendisk *disk)  {  	struct ide_floppy_obj *floppy = NULL;  	mutex_lock(&idefloppy_ref_mutex);  	floppy = ide_floppy_g(disk); -	if (floppy) +	if (floppy) {  		kref_get(&floppy->kref); +		if (ide_device_get(floppy->drive)) { +			kref_put(&floppy->kref, idefloppy_cleanup_obj); +			floppy = NULL; +		} +	}  	mutex_unlock(&idefloppy_ref_mutex);  	return floppy;  } -static void idefloppy_cleanup_obj(struct kref *); -  static void ide_floppy_put(struct ide_floppy_obj *floppy)  {  	mutex_lock(&idefloppy_ref_mutex); +	ide_device_put(floppy->drive);  	kref_put(&floppy->kref, idefloppy_cleanup_obj);  	mutex_unlock(&idefloppy_ref_mutex);  }  | 
