summaryrefslogtreecommitdiff
path: root/linux-core/i830_dma.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@linux.ie>2005-01-01 12:07:51 +0000
committerDave Airlie <airlied@linux.ie>2005-01-01 12:07:51 +0000
commitfe4ade81bb7a1242b18b84e012c1a293eea0420b (patch)
treeab155f82d7bd2342154ce8c570aa6851d7c6ca34 /linux-core/i830_dma.c
parente19fa7ada122a68d6bedf3d678e96545ed41a39f (diff)
i810/i830 bug with Jon's file operations changes
Diffstat (limited to 'linux-core/i830_dma.c')
-rw-r--r--linux-core/i830_dma.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/linux-core/i830_dma.c b/linux-core/i830_dma.c
index 1ff1b5a2..454d82a3 100644
--- a/linux-core/i830_dma.c
+++ b/linux-core/i830_dma.c
@@ -111,7 +111,8 @@ static int i830_freelist_put(drm_device_t * dev, drm_buf_t * buf)
return 0;
}
-int i830_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
+
+static int i830_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
{
drm_file_t *priv = filp->private_data;
drm_device_t *dev;
@@ -139,12 +140,21 @@ int i830_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
return 0;
}
+static struct file_operations i830_buffer_fops = {
+ .open = drm_open,
+ .release = drm_release,
+ .ioctl = drm_ioctl,
+ .mmap = i830_mmap_buffers,
+ .fasync = drm_fasync,
+};
+
static int i830_map_buffer(drm_buf_t * buf, struct file *filp)
{
drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->head->dev;
drm_i830_buf_priv_t *buf_priv = buf->dev_private;
drm_i830_private_t *dev_priv = dev->dev_private;
+ struct file_operations *old_fops;
unsigned long virtual;
int retcode = 0;
@@ -152,11 +162,13 @@ static int i830_map_buffer(drm_buf_t * buf, struct file *filp)
return -EINVAL;
down_write(&current->mm->mmap_sem);
+ old_fops = filp->f_op;
+ filp->f_op = &i830_buffer_fops;
dev_priv->mmap_buffer = buf;
virtual = do_mmap(filp, 0, buf->total, PROT_READ | PROT_WRITE,
MAP_SHARED, buf->bus_address);
dev_priv->mmap_buffer = NULL;
-
+ filp->f_op = old_fops;
if (IS_ERR((void *)virtual)) { /* ugh */
/* Real error */
DRM_ERROR("mmap error\n");