Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 42239
b: refs/heads/master
c: f9df68e
h: refs/heads/master
i:
  42237: 9c8cff9
  42235: 6175248
  42231: 8b4a73d
  42223: aaacb50
  42207: b4da6dc
  42175: 5c7eecb
  42111: 7dad468
  41983: 132395c
v: v3
  • Loading branch information
Stephen Rothwell authored and Paul Mackerras committed Dec 4, 2006
1 parent 42fb33e commit 7e3b039
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6ad4e70cafc43155d3a7e6e796e8b6b6967fc9e2
refs/heads/master: f9df68ec7bf49e37b46aa0a5d9e7938c060dba52
49 changes: 36 additions & 13 deletions trunk/drivers/block/viodasd.c
Original file line number Diff line number Diff line change
Expand Up @@ -759,6 +759,8 @@ static struct vio_driver viodasd_driver = {
}
};

static int need_delete_probe;

/*
* Initialize the whole device driver. Handle module and non-module
* versions
Expand All @@ -773,46 +775,67 @@ static int __init viodasd_init(void)

if (viopath_hostLp == HvLpIndexInvalid) {
printk(VIOD_KERN_WARNING "invalid hosting partition\n");
return -EIO;
rc = -EIO;
goto early_fail;
}

printk(VIOD_KERN_INFO "vers " VIOD_VERS ", hosting partition %d\n",
viopath_hostLp);

/* register the block device */
if (register_blkdev(VIODASD_MAJOR, VIOD_GENHD_NAME)) {
rc = register_blkdev(VIODASD_MAJOR, VIOD_GENHD_NAME);
if (rc) {
printk(VIOD_KERN_WARNING
"Unable to get major number %d for %s\n",
VIODASD_MAJOR, VIOD_GENHD_NAME);
return -EIO;
goto early_fail;
}
/* Actually open the path to the hosting partition */
if (viopath_open(viopath_hostLp, viomajorsubtype_blockio,
VIOMAXREQ + 2)) {
rc = viopath_open(viopath_hostLp, viomajorsubtype_blockio,
VIOMAXREQ + 2);
if (rc) {
printk(VIOD_KERN_WARNING
"error opening path to host partition %d\n",
viopath_hostLp);
unregister_blkdev(VIODASD_MAJOR, VIOD_GENHD_NAME);
return -EIO;
goto unregister_blk;
}

/* Initialize our request handler */
vio_setHandler(viomajorsubtype_blockio, handle_block_event);

rc = vio_register_driver(&viodasd_driver);
if (rc == 0)
driver_create_file(&viodasd_driver.driver, &driver_attr_probe);
if (rc) {
printk(VIOD_KERN_WARNING "vio_register_driver failed\n");
goto unset_handler;
}

/*
* If this call fails, it just means that we cannot dynamically
* add virtual disks, but the driver will still work fine for
* all existing disk, so ignore the failure.
*/
if (!driver_create_file(&viodasd_driver.driver, &driver_attr_probe))
need_delete_probe = 1;

return 0;

unset_handler:
vio_clearHandler(viomajorsubtype_blockio);
viopath_close(viopath_hostLp, viomajorsubtype_blockio, VIOMAXREQ + 2);
unregister_blk:
unregister_blkdev(VIODASD_MAJOR, VIOD_GENHD_NAME);
early_fail:
return rc;
}
module_init(viodasd_init);

void viodasd_exit(void)
void __exit viodasd_exit(void)
{
driver_remove_file(&viodasd_driver.driver, &driver_attr_probe);
if (need_delete_probe)
driver_remove_file(&viodasd_driver.driver, &driver_attr_probe);
vio_unregister_driver(&viodasd_driver);
vio_clearHandler(viomajorsubtype_blockio);
unregister_blkdev(VIODASD_MAJOR, VIOD_GENHD_NAME);
viopath_close(viopath_hostLp, viomajorsubtype_blockio, VIOMAXREQ + 2);
unregister_blkdev(VIODASD_MAJOR, VIOD_GENHD_NAME);
}

module_exit(viodasd_exit);

0 comments on commit 7e3b039

Please sign in to comment.