Writing Device Drivers

close(9E)

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.


Example 10-3 Block Device close(9E) Routine

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