X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/c3adf4f9af7ee68df8bb65fafa4dbcbdcc4895ba..fdf877c54ec2598864f6193e8e1fbaedb5c05efb:/lincan/src/close.c diff --git a/lincan/src/close.c b/lincan/src/close.c index a69247c..157acfa 100644 --- a/lincan/src/close.c +++ b/lincan/src/close.c @@ -45,6 +45,7 @@ int can_close(struct inode *inode, struct file *file) { struct canuser_t *canuser = (struct canuser_t*)(file->private_data); + struct canchip_t *chip; struct canque_ends_t *qends; struct msgobj_t *obj; can_spin_irqflags_t iflags; @@ -53,6 +54,10 @@ int can_close(struct inode *inode, struct file *file) CANMSG("can_close: bad canuser magic\n"); return -ENODEV; } + if ((chip=objects_p[MINOR_NR]->hostchip) == NULL) { + CANMSG("There is no hardware support for the device file with minor nr.: %d\n",MINOR_NR); + return -ENODEV; + } obj = canuser->msgobj; qends = canuser->qends; @@ -80,5 +85,10 @@ int can_close(struct inode *inode, struct file *file) #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,50)) MOD_DEC_USE_COUNT; #endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)) + if (chip->hostdevice->hwspecops->release_device) + kref_put(&chip->hostdevice->refcount,chip->hostdevice->hwspecops->release_device); +#endif return 0; }