--- sys/dev/drm/drm_drv.c.orig 2006-09-07 19:04:47.000000000 -0400 +++ sys/dev/drm/drm_drv.c 2007-08-31 10:08:28.000000000 -0400 @@ -532,6 +532,7 @@ if (dev->driver.load != NULL) { DRM_LOCK(); + /* Shared code returns -errno. */ retcode = dev->driver.load(dev, dev->id_entry->driver_private); DRM_UNLOCK(); if (retcode != 0) @@ -711,6 +712,9 @@ return EINVAL; } + if (--priv->refs != 0) + goto done; + if (dev->driver.preclose != NULL) dev->driver.preclose(dev, filp); @@ -786,17 +790,16 @@ dev->buf_pgid = 0; #endif /* __NetBSD__ || __OpenBSD__ */ - if (--priv->refs == 0) { - if (dev->driver.postclose != NULL) - dev->driver.postclose(dev, priv); - TAILQ_REMOVE(&dev->files, priv, link); - free(priv, M_DRM); - } + if (dev->driver.postclose != NULL) + dev->driver.postclose(dev, priv); + TAILQ_REMOVE(&dev->files, priv, link); + free(priv, M_DRM); /* ======================================================== * End inline drm_release */ +done: atomic_inc( &dev->counts[_DRM_STAT_CLOSES] ); #ifdef __FreeBSD__ device_unbusy(dev->device);