Пример #1
0
static int trgt_mgmt_params(int tid, uint64_t sid, char *params)
{
	char *p, *q;
	uint32_t s_partial = 0, t_partial = 0;
	struct iscsi_param s_param[session_key_last];
	struct iscsi_param t_param[target_key_last];

	while ((p = strsep(&params, ",")) != NULL) {
		int idx;
		uint32_t val;
		if (!*p)
			continue;
		if (!(q = strchr(p, '=')))
			continue;
		*q++ = '\0';
		val = strtol(q, NULL, 0);

		if (!((idx = param_index_by_name(p, target_keys)) < 0)) {
			if (!param_check_val(target_keys, idx, &val))
				t_partial |= (1 << idx);
			else
				eprintf("invalid val %s, %u\n",
					target_keys[idx].name, val);
			t_param[idx].val = val;

			continue;
		}

		if (!((idx = param_index_by_name(p, session_keys)) < 0)) {
			if (!param_check_val(session_keys, idx, &val))
				s_partial |= (1 << idx);
			else
				eprintf("invalid val %s, %u\n",
					session_keys[idx].name, val);
			s_param[idx].val = val;
		}
	}

	if (t_partial && s_partial) {
		eprintf("%s", "Cannot change both at the same time\n");
		return -EINVAL;
	} else if (t_partial)
		return iscsi_param_set(tid, sid, key_target, t_partial, t_param);
	else if (s_partial)
		return iscsi_param_set(tid, sid, key_session, s_partial, s_param);
	else
		eprintf("%s", "Nothing to do\n");

	return 0;
}
Пример #2
0
static int iscsi_param_partial_set(int tid, uint64_t sid, int type, int key,
				   uint32_t val)
{
	struct iscsi_param *param;
	struct iscsi_param s_param[session_key_last];
	struct iscsi_param t_param[target_key_last];

	if (type == key_session)
		param = s_param;
	else
		param = t_param;

	param[key].val = val;

	return iscsi_param_set(tid, sid, type, 1 << key, param);
}
Пример #3
0
static int iscsi_param_config(struct iscsi_target *target, unsigned long ptr, int set)
{
	int err;
	struct iscsi_param_info info;

	if ((err = copy_from_user(&info, (void *) ptr, sizeof(info))) < 0)
		goto out;

	if ((err = iscsi_param_set(target, &info, set)) < 0)
		goto out;

	if (!set)
		err = copy_to_user((void *) ptr, &info, sizeof(info));

out:
	return err;
}
Пример #4
0
static int iscsi_param_config(struct iscsi_target *target, unsigned long ptr, int set)
{
	struct iscsi_param_info info;
	int err;

	err = copy_from_user(&info, (void *) ptr, sizeof(info));
	if (err)
		return -EFAULT;

	err = iscsi_param_set(target, &info, set);
	if (err < 0 || set)
		return err;

	err = copy_to_user((void *) ptr, &info, sizeof(info));
	if (err)
		return -EFAULT;

	return 0;
}