From fe4ade81bb7a1242b18b84e012c1a293eea0420b Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Sat, 1 Jan 2005 12:07:51 +0000 Subject: i810/i830 bug with Jon's file operations changes --- linux-core/i830_dma.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'linux-core/i830_dma.c') 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(¤t->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"); -- cgit v1.2.3