summaryrefslogtreecommitdiffstats
path: root/arch/um/drivers
diff options
context:
space:
mode:
authorJeff Dike <jdike@addtoit.com>2007-05-06 14:51:01 -0700
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-07 12:13:00 -0700
commitb47d2debf229469c78af4145ee7ad35a0f21b67f (patch)
tree6bca064260d56701b799282b40586277278996b4 /arch/um/drivers
parent1d94cda04eb82feb87c932ac3d4aef1e9dc78a43 (diff)
downloadlinux-b47d2debf229469c78af4145ee7ad35a0f21b67f.tar.gz
linux-b47d2debf229469c78af4145ee7ad35a0f21b67f.tar.bz2
linux-b47d2debf229469c78af4145ee7ad35a0f21b67f.zip
uml: handle block device hotplug errors
If a disk fails to open, i.e. its host file doesn't exist, it won't be removable because the hot-unplug code checks the existence of its gendisk. This won't exist because it is only allocated for successfully opened disks. Thus, a typo on the command line can result in a unusable and unfixable disk. This is fixed by freeing the gendisk if it's there, but not letting that affect the removal. Signed-off-by: Jeff Dike <jdike@linux.intel.com> Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/um/drivers')
-rw-r--r--arch/um/drivers/ubd_kern.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c
index 8bd9204ac1ab..53c36d1770c5 100644
--- a/arch/um/drivers/ubd_kern.c
+++ b/arch/um/drivers/ubd_kern.c
@@ -788,14 +788,12 @@ static int ubd_id(char **str, int *start_out, int *end_out)
static int ubd_remove(int n, char **error_out)
{
+ struct gendisk *disk;
struct ubd *ubd_dev;
int err = -ENODEV;
mutex_lock(&ubd_lock);
- if(ubd_gendisk[n] == NULL)
- goto out;
-
ubd_dev = &ubd_devs[n];
if(ubd_dev->file == NULL)
@@ -806,9 +804,12 @@ static int ubd_remove(int n, char **error_out)
if(ubd_dev->count > 0)
goto out;
- del_gendisk(ubd_gendisk[n]);
- put_disk(ubd_gendisk[n]);
- ubd_gendisk[n] = NULL;
+ disk = ubd_gendisk[n];
+ ubd_gendisk[n] = NULL;
+ if(disk != NULL){
+ del_gendisk(disk);
+ put_disk(disk);
+ }
if(fake_gendisk[n] != NULL){
del_gendisk(fake_gendisk[n]);