int __init isert_init_login_devs(unsigned int ndevs) { int res; unsigned int i; TRACE_ENTRY(); n_devs = ndevs; res = alloc_chrdev_region(&devno, 0, n_devs, "isert_scst"); isert_major = MAJOR(devno); if (unlikely(res < 0)) { PRINT_ERROR("isert: can't get major %d\n", isert_major); goto out; } /* * allocate the devices -- we can't have them static, as the number * can be specified at load time */ isert_conn_devices = kzalloc(n_devs * sizeof(struct isert_conn_dev), GFP_KERNEL); if (unlikely(!isert_conn_devices)) { res = -ENOMEM; goto fail; /* Make this more graceful */ } isert_class = class_create(THIS_MODULE, "isert_scst"); isert_setup_listener_cdev(&isert_listen_dev); /* Initialize each device. */ for (i = 0; i < n_devs; i++) isert_setup_cdev(&isert_conn_devices[i], i); res = isert_datamover_init(); if (unlikely(res)) { PRINT_ERROR("Unable to initialize datamover: %d\n", res); goto fail; } out: TRACE_EXIT_RES(res); return res; fail: isert_cleanup_login_devs(); goto out; }
static void isert_cleanup_module(void) { iscsit_unreg_transport(&isert_transport); isert_cleanup_login_devs(); }