diff options
Diffstat (limited to 'drivers/ide/ide-tape.c')
| -rw-r--r-- | drivers/ide/ide-tape.c | 51 |
1 files changed, 19 insertions, 32 deletions
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 482544854985..5a3dc46008e6 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
| @@ -4681,21 +4681,12 @@ static void idetape_setup (ide_drive_t *drive, idetape_tape_t *tape, int minor) | |||
| 4681 | idetape_add_settings(drive); | 4681 | idetape_add_settings(drive); |
| 4682 | } | 4682 | } |
| 4683 | 4683 | ||
| 4684 | static int idetape_cleanup (ide_drive_t *drive) | 4684 | static int ide_tape_remove(struct device *dev) |
| 4685 | { | 4685 | { |
| 4686 | ide_drive_t *drive = to_ide_device(dev); | ||
| 4686 | idetape_tape_t *tape = drive->driver_data; | 4687 | idetape_tape_t *tape = drive->driver_data; |
| 4687 | unsigned long flags; | ||
| 4688 | |||
| 4689 | spin_lock_irqsave(&ide_lock, flags); | ||
| 4690 | if (test_bit(IDETAPE_BUSY, &tape->flags) || drive->usage || | ||
| 4691 | tape->first_stage != NULL || tape->merge_stage_size) { | ||
| 4692 | spin_unlock_irqrestore(&ide_lock, flags); | ||
| 4693 | return 1; | ||
| 4694 | } | ||
| 4695 | 4688 | ||
| 4696 | spin_unlock_irqrestore(&ide_lock, flags); | 4689 | ide_unregister_subdriver(drive, tape->driver); |
| 4697 | DRIVER(drive)->busy = 0; | ||
| 4698 | (void) ide_unregister_subdriver(drive); | ||
| 4699 | 4690 | ||
| 4700 | ide_unregister_region(tape->disk); | 4691 | ide_unregister_region(tape->disk); |
| 4701 | 4692 | ||
| @@ -4710,6 +4701,8 @@ static void ide_tape_release(struct kref *kref) | |||
| 4710 | ide_drive_t *drive = tape->drive; | 4701 | ide_drive_t *drive = tape->drive; |
| 4711 | struct gendisk *g = tape->disk; | 4702 | struct gendisk *g = tape->disk; |
| 4712 | 4703 | ||
| 4704 | BUG_ON(tape->first_stage != NULL || tape->merge_stage_size); | ||
| 4705 | |||
| 4713 | drive->dsc_overlap = 0; | 4706 | drive->dsc_overlap = 0; |
| 4714 | drive->driver_data = NULL; | 4707 | drive->driver_data = NULL; |
| 4715 | devfs_remove("%s/mt", drive->devfs_name); | 4708 | devfs_remove("%s/mt", drive->devfs_name); |
| @@ -4747,26 +4740,24 @@ static ide_proc_entry_t idetape_proc[] = { | |||
| 4747 | 4740 | ||
| 4748 | #endif | 4741 | #endif |
| 4749 | 4742 | ||
| 4750 | static int idetape_attach(ide_drive_t *drive); | 4743 | static int ide_tape_probe(struct device *); |
| 4751 | 4744 | ||
| 4752 | /* | ||
| 4753 | * IDE subdriver functions, registered with ide.c | ||
| 4754 | */ | ||
| 4755 | static ide_driver_t idetape_driver = { | 4745 | static ide_driver_t idetape_driver = { |
| 4756 | .owner = THIS_MODULE, | 4746 | .owner = THIS_MODULE, |
| 4757 | .name = "ide-tape", | 4747 | .gen_driver = { |
| 4748 | .name = "ide-tape", | ||
| 4749 | .bus = &ide_bus_type, | ||
| 4750 | .probe = ide_tape_probe, | ||
| 4751 | .remove = ide_tape_remove, | ||
| 4752 | }, | ||
| 4758 | .version = IDETAPE_VERSION, | 4753 | .version = IDETAPE_VERSION, |
| 4759 | .media = ide_tape, | 4754 | .media = ide_tape, |
| 4760 | .busy = 1, | ||
| 4761 | .supports_dsc_overlap = 1, | 4755 | .supports_dsc_overlap = 1, |
| 4762 | .cleanup = idetape_cleanup, | ||
| 4763 | .do_request = idetape_do_request, | 4756 | .do_request = idetape_do_request, |
| 4764 | .end_request = idetape_end_request, | 4757 | .end_request = idetape_end_request, |
| 4765 | .error = __ide_error, | 4758 | .error = __ide_error, |
| 4766 | .abort = __ide_abort, | 4759 | .abort = __ide_abort, |
| 4767 | .proc = idetape_proc, | 4760 | .proc = idetape_proc, |
| 4768 | .attach = idetape_attach, | ||
| 4769 | .drives = LIST_HEAD_INIT(idetape_driver.drives), | ||
| 4770 | }; | 4761 | }; |
| 4771 | 4762 | ||
| 4772 | /* | 4763 | /* |
| @@ -4829,8 +4820,9 @@ static struct block_device_operations idetape_block_ops = { | |||
| 4829 | .ioctl = idetape_ioctl, | 4820 | .ioctl = idetape_ioctl, |
| 4830 | }; | 4821 | }; |
| 4831 | 4822 | ||
| 4832 | static int idetape_attach (ide_drive_t *drive) | 4823 | static int ide_tape_probe(struct device *dev) |
| 4833 | { | 4824 | { |
| 4825 | ide_drive_t *drive = to_ide_device(dev); | ||
| 4834 | idetape_tape_t *tape; | 4826 | idetape_tape_t *tape; |
| 4835 | struct gendisk *g; | 4827 | struct gendisk *g; |
| 4836 | int minor; | 4828 | int minor; |
| @@ -4865,10 +4857,7 @@ static int idetape_attach (ide_drive_t *drive) | |||
| 4865 | 4857 | ||
| 4866 | ide_init_disk(g, drive); | 4858 | ide_init_disk(g, drive); |
| 4867 | 4859 | ||
| 4868 | if (ide_register_subdriver(drive, &idetape_driver)) { | 4860 | ide_register_subdriver(drive, &idetape_driver); |
| 4869 | printk(KERN_ERR "ide-tape: %s: Failed to register the driver with ide.c\n", drive->name); | ||
| 4870 | goto out_put_disk; | ||
| 4871 | } | ||
| 4872 | 4861 | ||
| 4873 | memset(tape, 0, sizeof(*tape)); | 4862 | memset(tape, 0, sizeof(*tape)); |
| 4874 | 4863 | ||
| @@ -4902,12 +4891,11 @@ static int idetape_attach (ide_drive_t *drive) | |||
| 4902 | ide_register_region(g); | 4891 | ide_register_region(g); |
| 4903 | 4892 | ||
| 4904 | return 0; | 4893 | return 0; |
| 4905 | out_put_disk: | 4894 | |
| 4906 | put_disk(g); | ||
| 4907 | out_free_tape: | 4895 | out_free_tape: |
| 4908 | kfree(tape); | 4896 | kfree(tape); |
| 4909 | failed: | 4897 | failed: |
| 4910 | return 1; | 4898 | return -ENODEV; |
| 4911 | } | 4899 | } |
| 4912 | 4900 | ||
| 4913 | MODULE_DESCRIPTION("ATAPI Streaming TAPE Driver"); | 4901 | MODULE_DESCRIPTION("ATAPI Streaming TAPE Driver"); |
| @@ -4915,7 +4903,7 @@ MODULE_LICENSE("GPL"); | |||
| 4915 | 4903 | ||
| 4916 | static void __exit idetape_exit (void) | 4904 | static void __exit idetape_exit (void) |
| 4917 | { | 4905 | { |
| 4918 | ide_unregister_driver(&idetape_driver); | 4906 | driver_unregister(&idetape_driver.gen_driver); |
| 4919 | unregister_chrdev(IDETAPE_MAJOR, "ht"); | 4907 | unregister_chrdev(IDETAPE_MAJOR, "ht"); |
| 4920 | } | 4908 | } |
| 4921 | 4909 | ||
| @@ -4928,8 +4916,7 @@ static int idetape_init (void) | |||
| 4928 | printk(KERN_ERR "ide-tape: Failed to register character device interface\n"); | 4916 | printk(KERN_ERR "ide-tape: Failed to register character device interface\n"); |
| 4929 | return -EBUSY; | 4917 | return -EBUSY; |
| 4930 | } | 4918 | } |
| 4931 | ide_register_driver(&idetape_driver); | 4919 | return driver_register(&idetape_driver.gen_driver); |
| 4932 | return 0; | ||
| 4933 | } | 4920 | } |
| 4934 | 4921 | ||
| 4935 | module_init(idetape_init); | 4922 | module_init(idetape_init); |
