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(¶ms, ",")) != 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; }
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); }
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; }
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; }