int tdfx_release(struct inode *inode, struct file *filp) { drm_file_t *priv = filp->private_data; drm_device_t *dev; int retcode = 0; lock_kernel(); dev = priv->dev; DRM_DEBUG("open_count = %d\n", dev->open_count); if (!(retcode = drm_release(inode, filp))) { #if LINUX_VERSION_CODE < 0x020333 MOD_DEC_USE_COUNT; /* Needed before Linux 2.3.51 */ #endif atomic_inc(&dev->total_close); spin_lock(&dev->count_lock); if (!--dev->open_count) { if (atomic_read(&dev->ioctl_count) || dev->blocked) { DRM_ERROR("Device busy: %d %d\n", atomic_read(&dev->ioctl_count), dev->blocked); spin_unlock(&dev->count_lock); unlock_kernel(); return -EBUSY; } spin_unlock(&dev->count_lock); unlock_kernel(); return tdfx_takedown(dev); } spin_unlock(&dev->count_lock); } unlock_kernel(); return retcode; }
DRI_DRM_STATIC IMG_INT PVRSRVDrmRelease(struct inode *inode, struct file *filp) { struct drm_file *file_priv = filp->private_data; void *psDriverPriv = file_priv->driver_priv; IMG_INT ret; ret = drm_release(inode, filp); if (ret != 0) { PVR_DPF((PVR_DBG_ERROR, "%s : drm_release failed: %d", __FUNCTION__, ret)); } PVRSRVRelease(psDriverPriv); return 0; }
DRI_DRM_STATIC int PVRSRVDrmRelease(struct inode *inode, struct file *filp) { struct drm_file *file_priv = filp->private_data; void *psDriverPriv = get_private(file_priv); int ret; ret = drm_release(inode, filp); if (ret != 0) { /* * An error means drm_release didn't call drm_lastclose, * but it will have freed file_priv. */ PVR_DPF((PVR_DBG_ERROR, "%s : drm_release failed: %d", __FUNCTION__, ret)); } PVRSRVRelease(psDriverPriv); return 0; }