m-chrzan.xyz
aboutsummaryrefslogtreecommitdiff
path: root/surface.c
diff options
context:
space:
mode:
Diffstat (limited to 'surface.c')
-rw-r--r--surface.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/surface.c b/surface.c
index a54ca6f..688223a 100644
--- a/surface.c
+++ b/surface.c
@@ -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: