From 36a35908c370bbb9c95ef8feb0b0318ccb33a95b Mon Sep 17 00:00:00 2001 From: Simon Arlott Date: Tue, 1 May 2007 17:54:27 +0100 Subject: dvb-core: Handle failures creating devices --- drivers/media/dvb/dvb-core/dvbdev.c | 17 +++++++++++++++-- 1 files changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c index 7683983..a786c26 100644 --- a/drivers/media/dvb/dvb-core/dvbdev.c +++ b/drivers/media/dvb/dvb-core/dvbdev.c @@ -201,8 +201,14 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, struct dvb_device *dvbdev; struct file_operations *dvbdevfops; + struct class_device *classdev; int id; + if (dvb_class == NULL) { + printk("%s: unable to create devices in the dvb class\n", __FUNCTION__); + return -ENFILE; + } + mutex_lock(&dvbdev_register_lock); if ((id = dvbdev_get_free_id (adap, type)) < 0){ @@ -242,13 +248,19 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, mutex_unlock(&dvbdev_register_lock); - class_device_create(dvb_class, NULL, MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)), + classdev = class_device_create(dvb_class, NULL, MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)), adap->device, "dvb%d.%s%d", adap->num, dnames[type], id); dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n", adap->num, dnames[type], id, nums2minor(adap->num, type, id), nums2minor(adap->num, type, id)); + if (IS_ERR(classdev)) { + printk("%s: failed to create device dvb%d.%s%d\n", __FUNCTION__, + adap->num, dnames[type], id); + return PTR_ERR(classdev); + } + return 0; } EXPORT_SYMBOL(dvb_register_device); @@ -413,6 +425,7 @@ static int __init init_dvbdev(void) dvb_class = class_create(THIS_MODULE, "dvb"); if (IS_ERR(dvb_class)) { retval = PTR_ERR(dvb_class); + dvb_class = NULL; goto error; } return 0; @@ -431,7 +444,7 @@ static void __exit exit_dvbdev(void) unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS); } -module_init(init_dvbdev); +subsys_initcall(init_dvbdev); module_exit(exit_dvbdev); MODULE_DESCRIPTION("DVB Core Driver"); -- 1.5.0.1