int xxclose(dev_t dev, int flag, int otyp, cred_t *credp)
The arguments of the close(9E) entry point are identical to arguments of open(9E), except that dev is the device number, as opposed to a pointer to the device number.
The close(9E) routine should verify otyp in the same way as was described for the open(9E) entry point. In Example 10-3, close(9E) must determine when the device can really be closed based on the number of block opens and layered opens.
static int xxclose(dev_t dev, int flag, int otyp, cred_t *credp) { minor_t instance; struct xxstate *xsp; instance = getminor(dev); xsp = ddi_get_soft_state(statep, instance); if (xsp == NULL) return (ENXIO); mutex_enter(&xsp->mu); switch (otyp) { case OTYP_LYR: xsp->nlayered--; break; case OTYP_BLK: xsp->open = 0; break; default: mutex_exit(&xsp->mu); return (EINVAL); } if (xsp->open || xsp->nlayered) { /* not done yet */ mutex_exit(&xsp->mu); return (0); } /* cleanup (rewind tape, free memory, etc.) */ /* wait for I/O to drain */ mutex_exit(&xsp->mu); return (0); }