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 11–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); }