void
tapdisk_nbdserver_free_client(td_nbdserver_client_t *client)
{
	INFO("Free client");

	ASSERT(client);

	if (client->client_event_id >= 0)
		tapdisk_nbdserver_disable_client(client);

	if (likely(!tapdisk_nbdserver_reqs_pending(client))) {
		list_del(&client->clientlist);
		tapdisk_nbdserver_reqs_free(client);
		free(client);
	} else
		client->dead = true;
}
static void
tapdisk_nbdserver_free_client(td_nbdserver_client_t *client)
{
	INFO("Free client");

	if (!client) {
		ERROR("Attempt to free NULL pointer!");
		return;
	}

	if (client->client_event_id >= 0)
		tapdisk_nbdserver_disable_client(client);

	list_del(&client->clientlist);
	tapdisk_nbdserver_reqs_free(client);
	free(client);
}
int
tapdisk_nbdserver_reqs_init(td_nbdserver_client_t *client, int n_reqs)
{
	int i, err;

	ASSERT(client);
	ASSERT(n_reqs > 0);

	INFO("Reqs init");

	client->reqs = malloc(n_reqs * sizeof(td_nbdserver_req_t));
	if (!client->reqs) {
		err = -errno;
		goto fail;
	}

	client->iovecs = malloc(n_reqs * sizeof(struct td_iovec));
	if (!client->iovecs) {
		err = - errno;
		goto fail;
	}

	client->reqs_free = malloc(n_reqs * sizeof(td_nbdserver_req_t*));
	if (!client->reqs_free) {
		err = -errno;
		goto fail;
	}

	client->n_reqs      = n_reqs;
	client->n_reqs_free = 0;

	for (i = 0; i < n_reqs; i++) {
		client->reqs[i].vreq.iov = &client->iovecs[i];
		tapdisk_nbdserver_set_free_request(client, &client->reqs[i]);
	}

	return 0;

fail:
	tapdisk_nbdserver_reqs_free(client);
	return err;
}