scsi_sysfs.c (46557bef3f3834ac33031c7be27d39d90d507442) | scsi_sysfs.c (860dc73608a091e0b325218acc2701709d5f221a) |
---|---|
1/* 2 * scsi_sysfs.c 3 * 4 * SCSI sysfs interface routines. 5 * 6 * Created to pull SCSI mid layer sysfs routines into one file. 7 */ 8 --- 840 unchanged lines hidden (view full) --- 849 850 error = scsi_target_add(starget); 851 if (error) 852 return error; 853 854 transport_configure_device(&starget->dev); 855 error = device_add(&sdev->sdev_gendev); 856 if (error) { | 1/* 2 * scsi_sysfs.c 3 * 4 * SCSI sysfs interface routines. 5 * 6 * Created to pull SCSI mid layer sysfs routines into one file. 7 */ 8 --- 840 unchanged lines hidden (view full) --- 849 850 error = scsi_target_add(starget); 851 if (error) 852 return error; 853 854 transport_configure_device(&starget->dev); 855 error = device_add(&sdev->sdev_gendev); 856 if (error) { |
857 put_device(sdev->sdev_gendev.parent); | |
858 printk(KERN_INFO "error 1\n"); | 857 printk(KERN_INFO "error 1\n"); |
859 return error; | 858 goto out_remove; |
860 } 861 error = device_add(&sdev->sdev_dev); 862 if (error) { 863 printk(KERN_INFO "error 2\n"); | 859 } 860 error = device_add(&sdev->sdev_dev); 861 if (error) { 862 printk(KERN_INFO "error 2\n"); |
864 goto clean_device; | 863 device_del(&sdev->sdev_gendev); 864 goto out_remove; |
865 } | 865 } |
866 transport_add_device(&sdev->sdev_gendev); 867 sdev->is_visible = 1; |
|
866 867 /* create queue files, which may be writable, depending on the host */ 868 if (sdev->host->hostt->change_queue_depth) 869 error = device_create_file(&sdev->sdev_gendev, &sdev_attr_queue_depth_rw); 870 else 871 error = device_create_file(&sdev->sdev_gendev, &dev_attr_queue_depth); | 868 869 /* create queue files, which may be writable, depending on the host */ 870 if (sdev->host->hostt->change_queue_depth) 871 error = device_create_file(&sdev->sdev_gendev, &sdev_attr_queue_depth_rw); 872 else 873 error = device_create_file(&sdev->sdev_gendev, &dev_attr_queue_depth); |
872 if (error) { 873 __scsi_remove_device(sdev); 874 goto out; 875 } | 874 if (error) 875 goto out_remove; 876 |
876 if (sdev->host->hostt->change_queue_type) 877 error = device_create_file(&sdev->sdev_gendev, &sdev_attr_queue_type_rw); 878 else 879 error = device_create_file(&sdev->sdev_gendev, &dev_attr_queue_type); | 877 if (sdev->host->hostt->change_queue_type) 878 error = device_create_file(&sdev->sdev_gendev, &sdev_attr_queue_type_rw); 879 else 880 error = device_create_file(&sdev->sdev_gendev, &dev_attr_queue_type); |
880 if (error) { 881 __scsi_remove_device(sdev); 882 goto out; 883 } | 881 if (error) 882 goto out_remove; |
884 885 error = bsg_register_queue(rq, &sdev->sdev_gendev, NULL, NULL); 886 887 if (error) | 883 884 error = bsg_register_queue(rq, &sdev->sdev_gendev, NULL, NULL); 885 886 if (error) |
887 /* we're treating error on bsg register as non-fatal, 888 * so pretend nothing went wrong */ |
|
888 sdev_printk(KERN_INFO, sdev, 889 "Failed to register bsg queue, errno=%d\n", error); 890 | 889 sdev_printk(KERN_INFO, sdev, 890 "Failed to register bsg queue, errno=%d\n", error); 891 |
891 /* we're treating error on bsg register as non-fatal, so pretend 892 * nothing went wrong */ 893 error = 0; 894 | |
895 /* add additional host specific attributes */ 896 if (sdev->host->hostt->sdev_attrs) { 897 for (i = 0; sdev->host->hostt->sdev_attrs[i]; i++) { 898 error = device_create_file(&sdev->sdev_gendev, 899 sdev->host->hostt->sdev_attrs[i]); | 892 /* add additional host specific attributes */ 893 if (sdev->host->hostt->sdev_attrs) { 894 for (i = 0; sdev->host->hostt->sdev_attrs[i]; i++) { 895 error = device_create_file(&sdev->sdev_gendev, 896 sdev->host->hostt->sdev_attrs[i]); |
900 if (error) { 901 __scsi_remove_device(sdev); 902 goto out; 903 } | 897 if (error) 898 goto out_remove; |
904 } 905 } 906 | 899 } 900 } 901 |
907 transport_add_device(&sdev->sdev_gendev); 908 out: 909 return error; | 902 return 0; |
910 | 903 |
911 clean_device: 912 scsi_device_set_state(sdev, SDEV_CANCEL); 913 914 device_del(&sdev->sdev_gendev); 915 transport_destroy_device(&sdev->sdev_gendev); 916 put_device(&sdev->sdev_dev); 917 put_device(&sdev->sdev_gendev); 918 | 904 out_remove: 905 __scsi_remove_device(sdev); |
919 return error; | 906 return error; |
907 |
|
920} 921 922void __scsi_remove_device(struct scsi_device *sdev) 923{ 924 struct device *dev = &sdev->sdev_gendev; 925 | 908} 909 910void __scsi_remove_device(struct scsi_device *sdev) 911{ 912 struct device *dev = &sdev->sdev_gendev; 913 |
926 if (scsi_device_set_state(sdev, SDEV_CANCEL) != 0) 927 return; | 914 if (sdev->is_visible) { 915 if (scsi_device_set_state(sdev, SDEV_CANCEL) != 0) 916 return; |
928 | 917 |
929 bsg_unregister_queue(sdev->request_queue); 930 device_unregister(&sdev->sdev_dev); 931 transport_remove_device(dev); 932 device_del(dev); | 918 bsg_unregister_queue(sdev->request_queue); 919 device_unregister(&sdev->sdev_dev); 920 transport_remove_device(dev); 921 device_del(dev); 922 } else 923 put_device(&sdev->sdev_dev); |
933 scsi_device_set_state(sdev, SDEV_DEL); 934 if (sdev->host->hostt->slave_destroy) 935 sdev->host->hostt->slave_destroy(sdev); 936 transport_destroy_device(dev); 937 put_device(dev); 938} 939 940/** --- 145 unchanged lines hidden --- | 924 scsi_device_set_state(sdev, SDEV_DEL); 925 if (sdev->host->hostt->slave_destroy) 926 sdev->host->hostt->slave_destroy(sdev); 927 transport_destroy_device(dev); 928 put_device(dev); 929} 930 931/** --- 145 unchanged lines hidden --- |