X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fs390%2Fchar%2Ftape_core.c;h=e51046ab8adc2d33a10c053c861102b3935a1a2e;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=668fe3f11586ba5543f743b6fdc82e12d6073e30;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/drivers/s390/char/tape_core.c b/drivers/s390/char/tape_core.c index 668fe3f11..e51046ab8 100644 --- a/drivers/s390/char/tape_core.c +++ b/drivers/s390/char/tape_core.c @@ -36,7 +36,7 @@ static void __tape_remove_request(struct tape_device *, struct tape_request *); * The list is protected by the rwlock */ static struct list_head tape_device_list = LIST_HEAD_INIT(tape_device_list); -static rwlock_t tape_device_lock = RW_LOCK_UNLOCKED; +static DEFINE_RWLOCK(tape_device_lock); /* * Pointer to debug area. @@ -349,6 +349,11 @@ tape_generic_online(struct tape_device *device, /* Let the discipline have a go at the device. */ device->discipline = discipline; + if (!try_module_get(discipline->owner)) { + PRINT_ERR("Cannot get module. Module gone.\n"); + return -EINVAL; + } + rc = discipline->setup_device(device); if (rc) goto out; @@ -377,6 +382,7 @@ out_discipline: out_minor: tape_remove_minor(device); out: + module_put(discipline->owner); return rc; } @@ -386,6 +392,7 @@ tape_cleanup_device(struct tape_device *device) tapeblock_cleanup_device(device); tapechar_cleanup_device(device); device->discipline->cleanup_device(device); + module_put(device->discipline->owner); tape_remove_minor(device); tape_med_state_set(device, MS_UNKNOWN); } @@ -1184,7 +1191,7 @@ tape_init (void) #ifdef DBF_LIKE_HELL debug_set_level(TAPE_DBF_AREA, 6); #endif - DBF_EVENT(3, "tape init: ($Revision: 1.50 $)\n"); + DBF_EVENT(3, "tape init: ($Revision: 1.51 $)\n"); tape_proc_init(); tapechar_init (); tapeblock_init (); @@ -1209,7 +1216,7 @@ tape_exit(void) MODULE_AUTHOR("(C) 2001 IBM Deutschland Entwicklung GmbH by Carsten Otte and " "Michael Holzheu (cotte@de.ibm.com,holzheu@de.ibm.com)"); MODULE_DESCRIPTION("Linux on zSeries channel attached " - "tape device driver ($Revision: 1.50 $)"); + "tape device driver ($Revision: 1.51 $)"); MODULE_LICENSE("GPL"); module_init(tape_init);