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 ---