int bdevsw_module_handler(module_t mod, int what, void* arg) { struct bdevsw_module_data* data = (struct bdevsw_module_data*) arg; int error; switch (what) { case MOD_LOAD: error = cdevsw_add(&data->cdev, data->cdevsw, NULL); if (!error) error = bdevsw_add(&data->bdev, data->cdevsw, NULL); if (!error && data->chainevh) error = data->chainevh(mod, what, data->chainarg); return error; case MOD_UNLOAD: if (data->chainevh) { error = data->chainevh(mod, what, data->chainarg); if (error) return error; } error = bdevsw_add(&data->bdev, NULL, NULL); if (!error) error = cdevsw_add(&data->cdev, NULL, NULL); return error; } if (data->chainevh) return data->chainevh(mod, what, data->chainarg); else return 0; }
static void vndevice_do_init( void ) { int i; vndevice_bdev_major = bdevsw_add(BDEV_MAJOR, &vn_bdevsw); if (vndevice_bdev_major < 0) { printf("vndevice_init: bdevsw_add() returned %d\n", vndevice_bdev_major); return; } vndevice_cdev_major = cdevsw_add_with_bdev(CDEV_MAJOR, &vn_cdevsw, vndevice_bdev_major); if (vndevice_cdev_major < 0) { printf("vndevice_init: cdevsw_add() returned %d\n", vndevice_cdev_major); return; } for (i = 0; i < NVNDEVICE; i++) { dev_t dev = makedev(vndevice_bdev_major, i); vn_table[i].sc_bdev = devfs_make_node(dev, DEVFS_BLOCK, UID_ROOT, GID_OPERATOR, 0600, "vn%d", i); if (vn_table[i].sc_bdev == NULL) printf("vninit: devfs_make_node failed!\n"); } }
/* * note must call cdevsw_add before bdevsw_add due to d_bmaj hack. */ void cdevsw_add_generic(int bdev, int cdev, struct cdevsw *cdevsw) { dev_t dev; dev = makedev(cdev, 0); cdevsw_add(&dev, cdevsw, NULL); dev = makedev(bdev, 0); bdevsw_add(&dev, cdevsw, NULL); }