[S390] dasd: Fix cleanup in dasd_{fba,diag}_check_characteristics().
authorCornelia Huck <cornelia.huck@de.ibm.com>
Thu, 17 Jul 2008 15:16:43 +0000 (17:16 +0200)
committerHeiko Carstens <heiko.carstens@de.ibm.com>
Thu, 17 Jul 2008 15:22:08 +0000 (17:22 +0200)
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/block/dasd_diag.c
drivers/s390/block/dasd_fba.c

index d91df38..ab5c5b4 100644 (file)
@@ -333,7 +333,8 @@ dasd_diag_check_device(struct dasd_device *device)
        if (IS_ERR(block)) {
                DEV_MESSAGE(KERN_WARNING, device, "%s",
                            "could not allocate dasd block structure");
-               kfree(device->private);
+               device->private = NULL;
+               kfree(private);
                return PTR_ERR(block);
        }
        device->block = block;
@@ -348,7 +349,8 @@ dasd_diag_check_device(struct dasd_device *device)
        if (rc) {
                DEV_MESSAGE(KERN_WARNING, device, "failed to retrieve device "
                            "information (rc=%d)", rc);
-               return -ENOTSUPP;
+               rc = -ENOTSUPP;
+               goto out;
        }
 
        /* Figure out position of label block */
@@ -362,7 +364,8 @@ dasd_diag_check_device(struct dasd_device *device)
        default:
                DEV_MESSAGE(KERN_WARNING, device, "unsupported device class "
                            "(class=%d)", private->rdc_data.vdev_class);
-               return -ENOTSUPP;
+               rc = -ENOTSUPP;
+               goto out;
        }
 
        DBF_DEV_EVENT(DBF_INFO, device,
@@ -379,7 +382,8 @@ dasd_diag_check_device(struct dasd_device *device)
        if (label == NULL)  {
                DEV_MESSAGE(KERN_WARNING, device, "%s",
                            "No memory to allocate initialization request");
-               return -ENOMEM;
+               rc = -ENOMEM;
+               goto out;
        }
        rc = 0;
        end_block = 0;
@@ -403,7 +407,7 @@ dasd_diag_check_device(struct dasd_device *device)
                        DEV_MESSAGE(KERN_WARNING, device, "%s",
                                "DIAG call failed");
                        rc = -EOPNOTSUPP;
-                       goto out;
+                       goto out_label;
                }
                mdsk_term_io(device);
                if (rc == 0)
@@ -413,7 +417,7 @@ dasd_diag_check_device(struct dasd_device *device)
                DEV_MESSAGE(KERN_WARNING, device, "device access failed "
                            "(rc=%d)", rc);
                rc = -EIO;
-               goto out;
+               goto out_label;
        }
        /* check for label block */
        if (memcmp(label->label_id, DASD_DIAG_CMS1,
@@ -439,8 +443,15 @@ dasd_diag_check_device(struct dasd_device *device)
                            (unsigned long) (block->blocks <<
                                block->s2b_shift) >> 1);
        }
-out:
+out_label:
        free_page((long) label);
+out:
+       if (rc) {
+               device->block = NULL;
+               dasd_free_block(block);
+               device->private = NULL;
+               kfree(private);
+       }
        return rc;
 }
 
index aee4656..aa0c533 100644 (file)
@@ -139,7 +139,8 @@ dasd_fba_check_characteristics(struct dasd_device *device)
        if (IS_ERR(block)) {
                DEV_MESSAGE(KERN_WARNING, device, "%s",
                            "could not allocate dasd block structure");
-               kfree(device->private);
+               device->private = NULL;
+               kfree(private);
                return PTR_ERR(block);
        }
        device->block = block;
@@ -152,6 +153,10 @@ dasd_fba_check_characteristics(struct dasd_device *device)
                DEV_MESSAGE(KERN_WARNING, device,
                            "Read device characteristics returned error %d",
                            rc);
+               device->block = NULL;
+               dasd_free_block(block);
+               device->private = NULL;
+               kfree(private);
                return rc;
        }