aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/char
diff options
context:
space:
mode:
authorMichael Holzheu <holzheu@de.ibm.com>2008-04-17 01:46:05 -0400
committerHeiko Carstens <heiko.carstens@de.ibm.com>2008-04-17 01:46:59 -0400
commit92bf435f383a6193d59c687ce87ccca3529c68a1 (patch)
tree90ad17f1017103984c7f1aee20be7637b861e636 /drivers/s390/char
parent00966c0a5b00bc0afdc0bd0446adec271f8b098b (diff)
[S390] tape: duplicate sysfs filename when setting tape device online
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>
Diffstat (limited to 'drivers/s390/char')
-rw-r--r--drivers/s390/char/tape_char.c4
-rw-r--r--drivers/s390/char/tape_class.c5
-rw-r--r--drivers/s390/char/tape_class.h2
3 files changed, 5 insertions, 6 deletions
diff --git a/drivers/s390/char/tape_char.c b/drivers/s390/char/tape_char.c
index b830a8cbef78..ebe84067bae9 100644
--- a/drivers/s390/char/tape_char.c
+++ b/drivers/s390/char/tape_char.c
@@ -83,9 +83,9 @@ tapechar_setup_device(struct tape_device * device)
83void 83void
84tapechar_cleanup_device(struct tape_device *device) 84tapechar_cleanup_device(struct tape_device *device)
85{ 85{
86 unregister_tape_dev(device->rt); 86 unregister_tape_dev(&device->cdev->dev, device->rt);
87 device->rt = NULL; 87 device->rt = NULL;
88 unregister_tape_dev(device->nt); 88 unregister_tape_dev(&device->cdev->dev, device->nt);
89 device->nt = NULL; 89 device->nt = NULL;
90} 90}
91 91
diff --git a/drivers/s390/char/tape_class.c b/drivers/s390/char/tape_class.c
index aa7f166f4034..6dfdb7c17981 100644
--- a/drivers/s390/char/tape_class.c
+++ b/drivers/s390/char/tape_class.c
@@ -99,11 +99,10 @@ fail_with_tcd:
99} 99}
100EXPORT_SYMBOL(register_tape_dev); 100EXPORT_SYMBOL(register_tape_dev);
101 101
102void unregister_tape_dev(struct tape_class_device *tcd) 102void unregister_tape_dev(struct device *device, struct tape_class_device *tcd)
103{ 103{
104 if (tcd != NULL && !IS_ERR(tcd)) { 104 if (tcd != NULL && !IS_ERR(tcd)) {
105 sysfs_remove_link(&tcd->class_device->kobj, 105 sysfs_remove_link(&device->kobj, tcd->mode_name);
106 tcd->mode_name);
107 device_destroy(tape_class, tcd->char_device->dev); 106 device_destroy(tape_class, tcd->char_device->dev);
108 cdev_del(tcd->char_device); 107 cdev_del(tcd->char_device);
109 kfree(tcd); 108 kfree(tcd);
diff --git a/drivers/s390/char/tape_class.h b/drivers/s390/char/tape_class.h
index e2b5ac918acf..707b7f48c232 100644
--- a/drivers/s390/char/tape_class.h
+++ b/drivers/s390/char/tape_class.h
@@ -56,6 +56,6 @@ struct tape_class_device *register_tape_dev(
56 char * device_name, 56 char * device_name,
57 char * node_name 57 char * node_name
58); 58);
59void unregister_tape_dev(struct tape_class_device *tcd); 59void unregister_tape_dev(struct device *device, struct tape_class_device *tcd);
60 60
61#endif /* __TAPE_CLASS_H__ */ 61#endif /* __TAPE_CLASS_H__ */