static int mon_text_open(struct inode *inode, struct file *file) { struct mon_bus *mbus; struct usb_bus *ubus; struct mon_reader_text *rp; int rc; down(&mon_lock); mbus = inode->u.generic_ip; ubus = mbus->u_bus; rp = kmalloc(sizeof(struct mon_reader_text), GFP_KERNEL); if (rp == NULL) { rc = -ENOMEM; goto err_alloc; } memset(rp, 0, sizeof(struct mon_reader_text)); INIT_LIST_HEAD(&rp->e_list); init_waitqueue_head(&rp->wait); init_MUTEX(&rp->printf_lock); rp->printf_size = PRINTF_DFL; rp->printf_buf = kmalloc(rp->printf_size, GFP_KERNEL); if (rp->printf_buf == NULL) { rc = -ENOMEM; goto err_alloc_pr; } rp->r.m_bus = mbus; rp->r.r_data = rp; rp->r.rnf_submit = mon_text_submit; rp->r.rnf_complete = mon_text_complete; snprintf(rp->slab_name, SLAB_NAME_SZ, "mon%dt_%lx", ubus->busnum, (long)rp); rp->e_slab = kmem_cache_create(rp->slab_name, sizeof(struct mon_event_text), sizeof(long), 0, mon_text_ctor, mon_text_dtor); if (rp->e_slab == NULL) { rc = -ENOMEM; goto err_slab; } mon_reader_add(mbus, &rp->r); file->private_data = rp; up(&mon_lock); return 0; // err_busy: // kmem_cache_destroy(rp->e_slab); err_slab: kfree(rp->printf_buf); err_alloc_pr: kfree(rp); err_alloc: up(&mon_lock); return rc; }
static int mon_text_open(struct inode *inode, struct file *file) { struct mon_bus *mbus; struct mon_reader_text *rp; int rc; mutex_lock(&mon_lock); mbus = inode->i_private; rp = kzalloc(sizeof(struct mon_reader_text), GFP_KERNEL); if (rp == NULL) { rc = -ENOMEM; goto err_alloc; } INIT_LIST_HEAD(&rp->e_list); init_waitqueue_head(&rp->wait); mutex_init(&rp->printf_lock); rp->printf_size = PRINTF_DFL; rp->printf_buf = kmalloc(rp->printf_size, GFP_KERNEL); if (rp->printf_buf == NULL) { rc = -ENOMEM; goto err_alloc_pr; } rp->r.m_bus = mbus; rp->r.r_data = rp; rp->r.rnf_submit = mon_text_submit; rp->r.rnf_error = mon_text_error; rp->r.rnf_complete = mon_text_complete; snprintf(rp->slab_name, SLAB_NAME_SZ, "mon_text_%p", rp); rp->e_slab = kmem_cache_create(rp->slab_name, sizeof(struct mon_event_text), sizeof(long), 0, mon_text_ctor); if (rp->e_slab == NULL) { rc = -ENOMEM; goto err_slab; } mon_reader_add(mbus, &rp->r); file->private_data = rp; mutex_unlock(&mon_lock); return 0; // err_busy: // kmem_cache_destroy(rp->e_slab); err_slab: kfree(rp->printf_buf); err_alloc_pr: kfree(rp); err_alloc: mutex_unlock(&mon_lock); return rc; }