[S390] tape: duplicate sysfs filename when setting tape device online
authorMichael Holzheu <holzheu@de.ibm.com>
Thu, 17 Apr 2008 05:46:05 +0000 (07:46 +0200)
committerHeiko Carstens <heiko.carstens@de.ibm.com>
Thu, 17 Apr 2008 05:46:59 +0000 (07:46 +0200)
When a tape device is set online, offline and online again, the following
error message is printed on the console: "sysfs: duplicate filename
'non-rewinding' can not be created". The reason is that when setting a
device online, the tape driver creates a sysfs symlink from the tape device
to the tape class device. Unfortunately the symlink is not removed
correctly, when the device is set offline. Instead of passing the
tape device object to sysfs_remove_link, the class device object is used.
This patch fixes this problem and uses the correct tape device object now.

Signed-off-by: Michael Holzheu <holzheu@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
drivers/s390/char/tape_char.c
drivers/s390/char/tape_class.c
drivers/s390/char/tape_class.h

index b830a8cbef7873baca2b68f886df21e0c044855e..ebe84067bae928bddf9b9770e8eb994a9f6ceb76 100644 (file)
@@ -83,9 +83,9 @@ tapechar_setup_device(struct tape_device * device)
 void
 tapechar_cleanup_device(struct tape_device *device)
 {
-       unregister_tape_dev(device->rt);
+       unregister_tape_dev(&device->cdev->dev, device->rt);
        device->rt = NULL;
-       unregister_tape_dev(device->nt);
+       unregister_tape_dev(&device->cdev->dev, device->nt);
        device->nt = NULL;
 }
 
index aa7f166f40340dd4c77a99cf9e86428e174ca2d2..6dfdb7c179819a121e8514db89daf6eb35811f8c 100644 (file)
@@ -99,11 +99,10 @@ fail_with_tcd:
 }
 EXPORT_SYMBOL(register_tape_dev);
 
-void unregister_tape_dev(struct tape_class_device *tcd)
+void unregister_tape_dev(struct device *device, struct tape_class_device *tcd)
 {
        if (tcd != NULL && !IS_ERR(tcd)) {
-               sysfs_remove_link(&tcd->class_device->kobj,
-                                 tcd->mode_name);
+               sysfs_remove_link(&device->kobj, tcd->mode_name);
                device_destroy(tape_class, tcd->char_device->dev);
                cdev_del(tcd->char_device);
                kfree(tcd);
index e2b5ac918acf6e987cc3d8c06aa271c540f32bbf..707b7f48c232d78bd56dd44fee580921ad1169d9 100644 (file)
@@ -56,6 +56,6 @@ struct tape_class_device *register_tape_dev(
        char *                  device_name,
        char *                  node_name
 );
-void unregister_tape_dev(struct tape_class_device *tcd);
+void unregister_tape_dev(struct device *device, struct tape_class_device *tcd);
 
 #endif /* __TAPE_CLASS_H__ */