static int tegra_overlay_ioctl_close(struct overlay_client *client, void __user *arg) { int err = 0; int idx; if (copy_from_user(&idx, arg, sizeof(idx))) return -EFAULT; if (idx < 0 || idx > client->dev->dc->n_windows) return -EINVAL; mutex_lock(&client->dev->overlays_lock); if (client->dev->overlays[idx].owner == client) tegra_overlay_put_locked(client, idx); else err = -EINVAL; mutex_unlock(&client->dev->overlays_lock); return err; }
static int tegra_overlay_release(struct inode *inode, struct file *filp) { struct overlay_client *client = filp->private_data; unsigned long flags; int i; mutex_lock(&client->dev->overlays_lock); for (i = 0; i < client->dev->dc->n_windows; i++) if (client->dev->overlays[i].owner == client) tegra_overlay_put_locked(client, i); mutex_unlock(&client->dev->overlays_lock); spin_lock_irqsave(&client->dev->clients_lock, flags); list_del(&client->list); spin_unlock_irqrestore(&client->dev->clients_lock, flags); put_task_struct(client->task); kfree(client); return 0; }
static void tegra_overlay_put(struct overlay_client *client, int idx) { mutex_lock(&client->dev->overlays_lock); tegra_overlay_put_locked(client, idx); mutex_unlock(&client->dev->overlays_lock); }