[SCSI] SCSI megaraid_sas: handle thrown errors

- handle clear_user() error

- handle and properly unwind from sysfs errors thrown during mod init

- adjust order of calls in megasas_exit() to precisely match
registration order in megasas_init()

Signed-off-by: Jeff Garzik <jeff@garzik.org>

Updated for extra attribute and
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>

authored by Jeff Garzik and committed by James Bottomley 83aabc1b bb076620

+28 -10
+28 -10
drivers/scsi/megaraid/megaraid_sas.c
··· 2864 2864 int i; 2865 2865 int error = 0; 2866 2866 2867 - clear_user(ioc, sizeof(*ioc)); 2867 + if (clear_user(ioc, sizeof(*ioc))) 2868 + return -EFAULT; 2868 2869 2869 2870 if (copy_in_user(&ioc->host_no, &cioc->host_no, sizeof(u16)) || 2870 2871 copy_in_user(&ioc->sgl_off, &cioc->sgl_off, sizeof(u32)) || ··· 3011 3010 3012 3011 if (rval) { 3013 3012 printk(KERN_DEBUG "megasas: PCI hotplug regisration failed \n"); 3014 - unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl"); 3013 + goto err_pcidrv; 3015 3014 } 3016 3015 3017 - driver_create_file(&megasas_pci_driver.driver, &driver_attr_version); 3018 - driver_create_file(&megasas_pci_driver.driver, 3019 - &driver_attr_release_date); 3020 - driver_create_file(&megasas_pci_driver.driver, 3021 - &driver_attr_dbg_lvl); 3016 + rval = driver_create_file(&megasas_pci_driver.driver, 3017 + &driver_attr_version); 3018 + if (rval) 3019 + goto err_dcf_attr_ver; 3020 + rval = driver_create_file(&megasas_pci_driver.driver, 3021 + &driver_attr_release_date); 3022 + if (rval) 3023 + goto err_dcf_rel_date; 3024 + rval = driver_create_file(&megasas_pci_driver.driver, 3025 + &driver_attr_dbg_lvl); 3026 + if (rval) 3027 + goto err_dcf_dbg_lvl; 3022 3028 3023 3029 return rval; 3030 + err_dcf_dbg_lvl: 3031 + driver_remove_file(&megasas_pci_driver.driver, 3032 + &driver_attr_release_date); 3033 + err_dcf_rel_date: 3034 + driver_remove_file(&megasas_pci_driver.driver, &driver_attr_version); 3035 + err_dcf_attr_ver: 3036 + pci_unregister_driver(&megasas_pci_driver); 3037 + err_pcidrv: 3038 + unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl"); 3039 + return rval; 3024 3040 } 3025 3041 3026 3042 /** ··· 3045 3027 */ 3046 3028 static void __exit megasas_exit(void) 3047 3029 { 3048 - driver_remove_file(&megasas_pci_driver.driver, &driver_attr_version); 3049 - driver_remove_file(&megasas_pci_driver.driver, 3050 - &driver_attr_release_date); 3051 3030 driver_remove_file(&megasas_pci_driver.driver, 3052 3031 &driver_attr_dbg_lvl); 3032 + driver_remove_file(&megasas_pci_driver.driver, 3033 + &driver_attr_release_date); 3034 + driver_remove_file(&megasas_pci_driver.driver, &driver_attr_version); 3053 3035 3054 3036 pci_unregister_driver(&megasas_pci_driver); 3055 3037 unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl");