void scullc_cleanup(void) { int i; #ifdef SCULLC_USE_PROC remove_proc_entry("scullcmem", NULL); #endif for (i = 0; i < scullc_devs; i++) { cdev_del(&scullc_devices[i].cdev); scullc_trim(scullc_devices + i); } kfree(scullc_devices); if (scullc_cache) kmem_cache_destroy(scullc_cache); unregister_chrdev_region(MKDEV (scullc_major, 0), scullc_devs); }
int scullc_open (struct inode *inode, struct file *filp) { struct scullc_dev *dev; /* device information */ /* Find the device */ dev = container_of(inode->i_cdev, struct scullc_dev, cdev); /* now trim to 0 the length of the device if open was write-only */ if ( (filp->f_flags & O_ACCMODE) == O_WRONLY) { if (down_interruptible (&dev->sem)) return -ERESTARTSYS; scullc_trim(dev); /* ignore errors */ up (&dev->sem); } /* and use filp->private_data to point to the device data */ filp->private_data = dev; return 0; /* success */ }