Skip to content

Commit

Permalink
uml: handle block device hotplug errors
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jeff Dike authored and Linus Torvalds committed May 7, 2007
1 parent 1d94cda commit b47d2de
Showing 1 changed file with 7 additions and 6 deletions.
13 changes: 7 additions & 6 deletions arch/um/drivers/ubd_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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]);
Expand Down

0 comments on commit b47d2de

Please sign in to comment.