diff options
author | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2007-07-17 06:20:46 -0400 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2007-07-17 06:20:46 -0400 |
commit | 9b9f770cef0037fd0e4d623f31ddfa8acda38205 (patch) | |
tree | a0b8937223df1e5a519375d1fa797157b4a930a2 /block/bsg.c | |
parent | 5cdf7f7678493996a835ef2e627976de8f9d1f40 (diff) |
bsg: fix initialization error handling bugs
This fixes the following bugs and cleans up the initialization code:
- cdev_del is missing.
- unregister_chrdev_region should be used instead of unregister_chrdev.
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'block/bsg.c')
-rw-r--r-- | block/bsg.c | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/block/bsg.c b/block/bsg.c index cdb00e5544b1..b25378459ff0 100644 --- a/block/bsg.c +++ b/block/bsg.c | |||
@@ -1057,39 +1057,37 @@ static int __init bsg_init(void) | |||
1057 | 1057 | ||
1058 | bsg_class = class_create(THIS_MODULE, "bsg"); | 1058 | bsg_class = class_create(THIS_MODULE, "bsg"); |
1059 | if (IS_ERR(bsg_class)) { | 1059 | if (IS_ERR(bsg_class)) { |
1060 | kmem_cache_destroy(bsg_cmd_cachep); | 1060 | ret = PTR_ERR(bsg_class); |
1061 | return PTR_ERR(bsg_class); | 1061 | goto destroy_kmemcache; |
1062 | } | 1062 | } |
1063 | 1063 | ||
1064 | ret = alloc_chrdev_region(&devid, 0, BSG_MAX_DEVS, "bsg"); | 1064 | ret = alloc_chrdev_region(&devid, 0, BSG_MAX_DEVS, "bsg"); |
1065 | if (ret) { | 1065 | if (ret) |
1066 | kmem_cache_destroy(bsg_cmd_cachep); | 1066 | goto destroy_bsg_class; |
1067 | class_destroy(bsg_class); | ||
1068 | return ret; | ||
1069 | } | ||
1070 | 1067 | ||
1071 | bsg_major = MAJOR(devid); | 1068 | bsg_major = MAJOR(devid); |
1072 | 1069 | ||
1073 | cdev_init(&bsg_cdev, &bsg_fops); | 1070 | cdev_init(&bsg_cdev, &bsg_fops); |
1074 | ret = cdev_add(&bsg_cdev, MKDEV(bsg_major, 0), BSG_MAX_DEVS); | 1071 | ret = cdev_add(&bsg_cdev, MKDEV(bsg_major, 0), BSG_MAX_DEVS); |
1075 | if (ret) { | 1072 | if (ret) |
1076 | kmem_cache_destroy(bsg_cmd_cachep); | 1073 | goto unregister_chrdev; |
1077 | class_destroy(bsg_class); | ||
1078 | unregister_chrdev_region(MKDEV(bsg_major, 0), BSG_MAX_DEVS); | ||
1079 | return ret; | ||
1080 | } | ||
1081 | 1074 | ||
1082 | ret = scsi_register_interface(&bsg_intf); | 1075 | ret = scsi_register_interface(&bsg_intf); |
1083 | if (ret) { | 1076 | if (ret) |
1084 | printk(KERN_ERR "bsg: failed register scsi interface %d\n", ret); | 1077 | goto remove_cdev; |
1085 | kmem_cache_destroy(bsg_cmd_cachep); | ||
1086 | class_destroy(bsg_class); | ||
1087 | unregister_chrdev(bsg_major, "bsg"); | ||
1088 | return ret; | ||
1089 | } | ||
1090 | 1078 | ||
1091 | printk(KERN_INFO "%s loaded (major %d)\n", bsg_version, bsg_major); | 1079 | printk(KERN_INFO "%s loaded (major %d)\n", bsg_version, bsg_major); |
1092 | return 0; | 1080 | return 0; |
1081 | remove_cdev: | ||
1082 | printk(KERN_ERR "bsg: failed register scsi interface %d\n", ret); | ||
1083 | cdev_del(&bsg_cdev); | ||
1084 | unregister_chrdev: | ||
1085 | unregister_chrdev_region(MKDEV(bsg_major, 0), BSG_MAX_DEVS); | ||
1086 | destroy_bsg_class: | ||
1087 | class_destroy(bsg_class); | ||
1088 | destroy_kmemcache: | ||
1089 | kmem_cache_destroy(bsg_cmd_cachep); | ||
1090 | return ret; | ||
1093 | } | 1091 | } |
1094 | 1092 | ||
1095 | MODULE_AUTHOR("Jens Axboe"); | 1093 | MODULE_AUTHOR("Jens Axboe"); |