Commit b47d2deb authored by Jeff Dike's avatar Jeff Dike Committed by Linus Torvalds

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: default avatarJeff Dike <jdike@linux.intel.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 1d94cda0
...@@ -788,14 +788,12 @@ static int ubd_id(char **str, int *start_out, int *end_out) ...@@ -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) static int ubd_remove(int n, char **error_out)
{ {
struct gendisk *disk;
struct ubd *ubd_dev; struct ubd *ubd_dev;
int err = -ENODEV; int err = -ENODEV;
mutex_lock(&ubd_lock); mutex_lock(&ubd_lock);
if(ubd_gendisk[n] == NULL)
goto out;
ubd_dev = &ubd_devs[n]; ubd_dev = &ubd_devs[n];
if(ubd_dev->file == NULL) if(ubd_dev->file == NULL)
...@@ -806,9 +804,12 @@ static int ubd_remove(int n, char **error_out) ...@@ -806,9 +804,12 @@ static int ubd_remove(int n, char **error_out)
if(ubd_dev->count > 0) if(ubd_dev->count > 0)
goto out; goto out;
del_gendisk(ubd_gendisk[n]); disk = ubd_gendisk[n];
put_disk(ubd_gendisk[n]);
ubd_gendisk[n] = NULL; ubd_gendisk[n] = NULL;
if(disk != NULL){
del_gendisk(disk);
put_disk(disk);
}
if(fake_gendisk[n] != NULL){ if(fake_gendisk[n] != NULL){
del_gendisk(fake_gendisk[n]); del_gendisk(fake_gendisk[n]);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment