diff options
Diffstat (limited to 'surface.c')
-rw-r--r-- | surface.c | 20 |
1 files changed, 15 insertions, 5 deletions
@@ -17,7 +17,7 @@ long draw_lines(struct file *filp, unsigned long arg) struct doomdev_surf_ioctl_draw_lines *param; struct doomdev_line *lines; int i; - + surface_data = filp->private_data; param = (struct doomdev_surf_ioctl_draw_lines *) arg; lines = (struct doomdev_line *) param->lines_ptr; @@ -86,6 +86,8 @@ long copy_rects(struct file *filp, unsigned long arg) mutex_unlock(&dst_data->doom_data->cmd_mutex); + fdput(src_fds); + return param->rects_num; } @@ -125,6 +127,8 @@ long draw_columns(struct file *filp, unsigned long arg) mutex_unlock(&surface_data->doom_data->cmd_mutex); + fdput(texture_fds); + return param->columns_num; } @@ -159,9 +163,8 @@ ssize_t surface_read(struct file *filp, char __user *buf, size_t count, count = surface_data->surface_size - *offset; } - mutex_lock(&surface_data->doom_data->ping_mutex); - ping_sync(surface_data->doom_data->iomem); - + mutex_lock(&surface_data->doom_data->cmd_mutex); + ping_sync(surface_data->doom_data); down(&surface_data->doom_data->pong_sem); not_written = copy_to_user(buf, surface_data->surface_cpu + (*offset), @@ -169,7 +172,7 @@ ssize_t surface_read(struct file *filp, char __user *buf, size_t count, *offset += count - not_written; - mutex_unlock(&surface_data->doom_data->ping_mutex); + mutex_unlock(&surface_data->doom_data->cmd_mutex); return count - not_written; } @@ -212,6 +215,11 @@ int surface_release(struct inode *inode, struct file *filp) surface_data = filp->private_data; + mutex_lock(&surface_data->doom_data->ping_mutex); + ping_sync(surface_data->doom_data); + down(&surface_data->doom_data->pong_sem); + mutex_unlock(&surface_data->doom_data->ping_mutex); + free_surface_buffer(surface_data); kfree(surface_data); @@ -346,6 +354,8 @@ int new_surface(struct file *filp, struct doomdev_ioctl_create_surface *params) fd_s.file->f_mode |= FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE; + fdput(fd_s); + return fd; error_fdget: |