[SCSI] SCSI st: fix error handling in module init, sysfs

- Notice and handle sysfs errors in module init, tape init

- Properly unwind errors in module init

- Remove bogus st_sysfs_class==NULL test, it is guaranteed !NULL at that point

Signed-off-by: Jeff Garzik <jeff@garzik.org>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>

authored by Jeff Garzik and committed by James Bottomley 13026a6b 5e4009ba

+78 -37
+78 -37
drivers/scsi/st.c
··· 195 195 static int st_probe(struct device *); 196 196 static int st_remove(struct device *); 197 197 198 - static void do_create_driverfs_files(void); 198 + static int do_create_driverfs_files(void); 199 199 static void do_remove_driverfs_files(void); 200 - static void do_create_class_files(struct scsi_tape *, int, int); 200 + static int do_create_class_files(struct scsi_tape *, int, int); 201 201 202 202 static struct scsi_driver st_template = { 203 203 .owner = THIS_MODULE, ··· 4048 4048 STm->cdevs[j] = cdev; 4049 4049 4050 4050 } 4051 - do_create_class_files(tpnt, dev_num, mode); 4051 + error = do_create_class_files(tpnt, dev_num, mode); 4052 + if (error) 4053 + goto out_free_tape; 4052 4054 } 4053 4055 4054 4056 sdev_printk(KERN_WARNING, SDp, ··· 4159 4157 4160 4158 static int __init init_st(void) 4161 4159 { 4160 + int err; 4161 + 4162 4162 validate_options(); 4163 4163 4164 - printk(KERN_INFO 4165 - "st: Version %s, fixed bufsize %d, s/g segs %d\n", 4164 + printk(KERN_INFO "st: Version %s, fixed bufsize %d, s/g segs %d\n", 4166 4165 verstr, st_fixed_buffer_size, st_max_sg_segs); 4167 4166 4168 4167 st_sysfs_class = class_create(THIS_MODULE, "scsi_tape"); 4169 4168 if (IS_ERR(st_sysfs_class)) { 4170 - st_sysfs_class = NULL; 4171 4169 printk(KERN_ERR "Unable create sysfs class for SCSI tapes\n"); 4172 - return 1; 4170 + return PTR_ERR(st_sysfs_class); 4173 4171 } 4174 4172 4175 - if (!register_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0), 4176 - ST_MAX_TAPE_ENTRIES, "st")) { 4177 - if (scsi_register_driver(&st_template.gendrv) == 0) { 4178 - do_create_driverfs_files(); 4179 - return 0; 4180 - } 4181 - unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0), 4182 - ST_MAX_TAPE_ENTRIES); 4173 + err = register_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0), 4174 + ST_MAX_TAPE_ENTRIES, "st"); 4175 + if (err) { 4176 + printk(KERN_ERR "Unable to get major %d for SCSI tapes\n", 4177 + SCSI_TAPE_MAJOR); 4178 + goto err_class; 4183 4179 } 4180 + 4181 + err = scsi_register_driver(&st_template.gendrv); 4182 + if (err) 4183 + goto err_chrdev; 4184 + 4185 + err = do_create_driverfs_files(); 4186 + if (err) 4187 + goto err_scsidrv; 4188 + 4189 + return 0; 4190 + 4191 + err_scsidrv: 4192 + scsi_unregister_driver(&st_template.gendrv); 4193 + err_chrdev: 4194 + unregister_chrdev_region(MKDEV(SCSI_TAPE_MAJOR, 0), 4195 + ST_MAX_TAPE_ENTRIES); 4196 + err_class: 4184 4197 class_destroy(st_sysfs_class); 4185 - 4186 - printk(KERN_ERR "Unable to get major %d for SCSI tapes\n", SCSI_TAPE_MAJOR); 4187 - return 1; 4198 + return err; 4188 4199 } 4189 4200 4190 4201 static void __exit exit_st(void) ··· 4240 4225 } 4241 4226 static DRIVER_ATTR(version, S_IRUGO, st_version_show, NULL); 4242 4227 4243 - static void do_create_driverfs_files(void) 4228 + static int do_create_driverfs_files(void) 4244 4229 { 4245 4230 struct device_driver *driverfs = &st_template.gendrv; 4231 + int err; 4246 4232 4247 - driver_create_file(driverfs, &driver_attr_try_direct_io); 4248 - driver_create_file(driverfs, &driver_attr_fixed_buffer_size); 4249 - driver_create_file(driverfs, &driver_attr_max_sg_segs); 4250 - driver_create_file(driverfs, &driver_attr_version); 4233 + err = driver_create_file(driverfs, &driver_attr_try_direct_io); 4234 + if (err) 4235 + return err; 4236 + err = driver_create_file(driverfs, &driver_attr_fixed_buffer_size); 4237 + if (err) 4238 + goto err_try_direct_io; 4239 + err = driver_create_file(driverfs, &driver_attr_max_sg_segs); 4240 + if (err) 4241 + goto err_attr_fixed_buf; 4242 + err = driver_create_file(driverfs, &driver_attr_version); 4243 + if (err) 4244 + goto err_attr_max_sg; 4245 + 4246 + return 0; 4247 + 4248 + err_attr_max_sg: 4249 + driver_remove_file(driverfs, &driver_attr_max_sg_segs); 4250 + err_attr_fixed_buf: 4251 + driver_remove_file(driverfs, &driver_attr_fixed_buffer_size); 4252 + err_try_direct_io: 4253 + driver_remove_file(driverfs, &driver_attr_try_direct_io); 4254 + return err; 4251 4255 } 4252 4256 4253 4257 static void do_remove_driverfs_files(void) ··· 4327 4293 4328 4294 CLASS_DEVICE_ATTR(default_compression, S_IRUGO, st_defcompression_show, NULL); 4329 4295 4330 - static void do_create_class_files(struct scsi_tape *STp, int dev_num, int mode) 4296 + static int do_create_class_files(struct scsi_tape *STp, int dev_num, int mode) 4331 4297 { 4332 4298 int i, rew, error; 4333 4299 char name[10]; 4334 4300 struct class_device *st_class_member; 4335 - 4336 - if (!st_sysfs_class) 4337 - return; 4338 4301 4339 4302 for (rew=0; rew < 2; rew++) { 4340 4303 /* Make sure that the minor numbers corresponding to the four ··· 4347 4316 if (IS_ERR(st_class_member)) { 4348 4317 printk(KERN_WARNING "st%d: class_device_create failed\n", 4349 4318 dev_num); 4319 + error = PTR_ERR(st_class_member); 4350 4320 goto out; 4351 4321 } 4352 4322 class_set_devdata(st_class_member, &STp->modes[mode]); 4353 4323 4354 - class_device_create_file(st_class_member, 4355 - &class_device_attr_defined); 4356 - class_device_create_file(st_class_member, 4357 - &class_device_attr_default_blksize); 4358 - class_device_create_file(st_class_member, 4359 - &class_device_attr_default_density); 4360 - class_device_create_file(st_class_member, 4361 - &class_device_attr_default_compression); 4324 + error = class_device_create_file(st_class_member, 4325 + &class_device_attr_defined); 4326 + if (error) goto out; 4327 + error = class_device_create_file(st_class_member, 4328 + &class_device_attr_default_blksize); 4329 + if (error) goto out; 4330 + error = class_device_create_file(st_class_member, 4331 + &class_device_attr_default_density); 4332 + if (error) goto out; 4333 + error = class_device_create_file(st_class_member, 4334 + &class_device_attr_default_compression); 4335 + if (error) goto out; 4336 + 4362 4337 if (mode == 0 && rew == 0) { 4363 4338 error = sysfs_create_link(&STp->device->sdev_gendev.kobj, 4364 4339 &st_class_member->kobj, ··· 4373 4336 printk(KERN_ERR 4374 4337 "st%d: Can't create sysfs link from SCSI device.\n", 4375 4338 dev_num); 4339 + goto out; 4376 4340 } 4377 4341 } 4378 4342 } 4379 - out: 4380 - return; 4343 + 4344 + return 0; 4345 + 4346 + out: 4347 + return error; 4381 4348 } 4382 4349 4383 4350 /* The following functions may be useful for a larger audience. */