[PATCH 3/5] UML - handle block device hotplug errors

From: Jeff Dike
Date: Tue Mar 06 2007 - 13:42:53 EST


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@xxxxxxxxxxxxxxx>
--
arch/um/drivers/ubd_kern.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)

Index: test/arch/um/drivers/ubd_kern.c
===================================================================
--- test.orig/arch/um/drivers/ubd_kern.c 2007-03-05 13:14:50.000000000 -0500
+++ test/arch/um/drivers/ubd_kern.c 2007-03-05 13:40:13.000000000 -0500
@@ -790,14 +790,12 @@ static int ubd_id(char **str, int *start

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)
@@ -808,9 +806,12 @@ static int ubd_remove(int n, char **erro
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]);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/