int drm_agp_alloc_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { drm_file_t *priv = filp->private_data; drm_device_t *dev = priv->head->dev; drm_agp_buffer_t request; drm_agp_buffer_t __user *argp = (void __user *)arg; int err; if (copy_from_user(&request, argp, sizeof(request))) return -EFAULT; err = drm_agp_alloc(dev, &request); if (err) return err; if (copy_to_user(argp, &request, sizeof(request))) { drm_agp_mem_t *entry = dev->agp->memory; dev->agp->memory = entry->next; dev->agp->memory->prev = NULL; drm_free_agp(entry->memory, entry->pages); drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS); return -EFAULT; } return 0; }
int drm_agp_alloc_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) { struct drm_agp_buffer request; int retcode; request = *(struct drm_agp_buffer *) data; retcode = drm_agp_alloc(dev, &request); *(struct drm_agp_buffer *) data = request; return retcode; }
int drm_agp_alloc_ioctl(DRM_IOCTL_ARGS) { DRM_DEVICE; drm_agp_buffer_t request; int retcode; request = *(drm_agp_buffer_t *) data; DRM_LOCK(); retcode = drm_agp_alloc(dev, &request); DRM_UNLOCK(); *(drm_agp_buffer_t *) data = request; return retcode; }