From: hooanon05@yahoo.co.jp Subject: Re: [Iscsitarget-devel] scsi multimedia command set To: iscsitarget-devel@lists.sourceforge.net References: <20050619132508.11599.qmail@web3510.mail.bbt.yahoo.co.jp> <1119456190.5499.8.camel@dhcpc226.office.pivotlink.com> Date: Sat, 25 Jun 2005 17:12:25 +0900 > > ietadm --op show > > I tried adding such feature, but i am not sure you like it. > check the attached patch. additonally, i wrote another patch which is using an array for parameters. since tomof had already written the enum values, using the enums as an index of the array make our code simple and stupid. you can apply this patch after the patch i sent yesterday. Junjiro Okajima diff -ru r1185/kernel/iscsi.h proc-0.4.10/kernel/iscsi.h --- r1185/kernel/iscsi.h 2005-06-25 17:03:40.913474240 +0900 +++ proc-0.4.10/kernel/iscsi.h 2005-06-25 17:01:13.132940296 +0900 @@ -17,30 +17,33 @@ #include "iet_u.h" struct iscsi_sess_param { - int initial_r2t; - int immediate_data; - int max_connections; - int max_data_pdu_length; - int max_burst_length; - int first_burst_length; - int default_wait_time; - int default_retain_time; - int max_outstanding_r2t; - int data_pdu_inorder; - int data_sequence_inorder; - int error_recovery_level; - int header_digest; - int data_digest; - int ofmarker; - int ifmarker; - int ofmarkint; - int ifmarkint; + int val[session_key_last]; + +#define sp_initial_r2t val[key_initial_r2t] +#define sp_immediate_data val[key_immediate_data] +#define sp_max_connections val[key_max_connections] +#define sp_max_data_pdu_length val[key_max_data_pdu_length] +#define sp_max_burst_length val[key_max_burst_length] +#define sp_first_burst_length val[key_first_burst_length] +#define sp_default_wait_time val[key_default_wait_time] +#define sp_default_retain_time val[key_default_retain_time] +#define sp_max_outstanding_r2t val[key_max_outstanding_r2t] +#define sp_data_pdu_inorder val[key_data_pdu_inorder] +#define sp_data_sequence_inorder val[key_data_sequence_inorder] +#define sp_error_recovery_level val[key_error_recovery_level] +#define sp_header_digest val[key_header_digest] +#define sp_data_digest val[key_data_digest] +#define sp_ofmarker val[key_ofmarker] +#define sp_ifmarker val[key_ifmarker] +#define sp_ofmarkint val[key_ofmarkint] +#define sp_ifmarkint val[key_ifmarkint] }; struct iscsi_trgt_param { - int wthreads; - int target_type; - int queued_cmnds; + int val[target_key_last]; +#define tp_wthreads val[key_wthreads] +#define tp_target_type val[key_target_type] +#define tp_queued_cmnds val[key_queued_cmnds] }; struct tio { diff -ru r1185/include/iet_u.h proc-0.4.10/include/iet_u.h --- r1185/include/iet_u.h 2005-06-25 17:03:40.900476216 +0900 +++ proc-0.4.10/include/iet_u.h 2005-06-25 16:27:42.013676896 +0900 @@ -47,6 +47,7 @@ int fd; }; +/* do not set the value manually, since they used as indexing */ enum { key_initial_r2t, key_immediate_data, diff -ru r1185/kernel/iscsi.c proc-0.4.10/kernel/iscsi.c --- r1185/kernel/iscsi.c 2005-06-10 23:29:41.000000000 +0900 +++ proc-0.4.10/kernel/iscsi.c 2005-06-25 16:31:55.634120728 +0900 @@ -238,7 +238,7 @@ LIST_HEAD(send); dprintk(D_GENERIC, "%p\n", cmnd); - pdusize = conn->session->param.max_data_pdu_length; + pdusize = conn->session->param.sp_max_data_pdu_length; expsize = cmnd_read_size(cmnd); size = min(expsize, tio->size); offset = 0; @@ -745,7 +745,7 @@ LIST_HEAD(send); length = req->r2t_length; - burst = req->conn->session->param.max_burst_length; + burst = req->conn->session->param.sp_max_burst_length; offset = be32_to_cpu(cmnd_hdr(req)->data_length) - length; do { @@ -775,7 +775,7 @@ list_add_tail(&rsp->list, &send); - if (++req->outstanding_r2t >= req->conn->session->param.max_outstanding_r2t) + if (++req->outstanding_r2t >= req->conn->session->param.sp_max_outstanding_r2t) break; } while (length); @@ -951,10 +951,10 @@ req->is_unsolicited_data = !(req_hdr->flags & ISCSI_CMD_FINAL); req->target_task_tag = get_next_ttt(conn->session); - if (!param->immediate_data && req->pdu.datasize) + if (!param->sp_immediate_data && req->pdu.datasize) eprintk("%x %x\n", cmnd_itt(req), req_hdr->scb[0]); - if (param->initial_r2t && !(req_hdr->flags & ISCSI_CMD_FINAL)) + if (param->sp_initial_r2t && !(req_hdr->flags & ISCSI_CMD_FINAL)) eprintk("%x %x\n", cmnd_itt(req), req_hdr->scb[0]); if (req_hdr->scb[0] == WRITE_VERIFY && req_hdr->scb[1] & 0x02) @@ -1531,9 +1531,9 @@ struct iscsi_conn *conn = cmnd->conn; struct iscsi_sess_param *param = &conn->session->param; - if (cmnd->pdu.datasize > param->max_data_pdu_length) { + if (cmnd->pdu.datasize > param->sp_max_data_pdu_length) { eprintk("too lond data %x %u %u\n", cmnd_itt(cmnd), - cmnd->pdu.datasize, param->max_data_pdu_length); + cmnd->pdu.datasize, param->sp_max_data_pdu_length); if (get_pgcnt(cmnd->pdu.datasize, 0) > ISCSI_CONN_IOV_MAX) { conn_close(conn); diff -ru r1185/kernel/iscsi_dbg.h proc-0.4.10/kernel/iscsi_dbg.h --- r1185/kernel/iscsi_dbg.h 2005-06-10 23:29:41.000000000 +0900 +++ proc-0.4.10/kernel/iscsi_dbg.h 2005-06-25 17:01:13.135939840 +0900 @@ -105,20 +105,20 @@ #define show_param(param)\ {\ eprintk("%d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",\ - (param)->initial_r2t,\ - (param)->immediate_data,\ - (param)->max_connections,\ - (param)->max_data_pdu_length,\ - (param)->max_burst_length,\ - (param)->first_burst_length,\ - (param)->default_wait_time,\ - (param)->default_retain_time,\ - (param)->max_outstanding_r2t,\ - (param)->data_pdu_inorder,\ - (param)->data_sequence_inorder,\ - (param)->error_recovery_level,\ - (param)->header_digest,\ - (param)->data_digest);\ + (param)->sp_initial_r2t,\ + (param)->sp_immediate_data,\ + (param)->sp_max_connections,\ + (param)->sp_max_data_pdu_length,\ + (param)->sp_max_burst_length,\ + (param)->sp_first_burst_length,\ + (param)->sp_default_wait_time,\ + (param)->sp_default_retain_time,\ + (param)->sp_max_outstanding_r2t,\ + (param)->sp_data_pdu_inorder,\ + (param)->sp_data_sequence_inorder,\ + (param)->sp_error_recovery_level,\ + (param)->sp_header_digest,\ + (param)->sp_data_digest);\ } #endif diff -ru r1185/kernel/param.c proc-0.4.10/kernel/param.c --- r1185/kernel/param.c 2005-06-10 23:29:41.000000000 +0900 +++ proc-0.4.10/kernel/param.c 2005-06-25 17:01:13.139939232 +0900 @@ -23,20 +23,20 @@ } \ } while (0) -#define SET_PARAM(param, info, iparam, word) \ +#define SET_PARAM(param, info, iparam, idx) \ ({ \ int changed = 0; \ - if (!info->partial || (info->partial & 1 << key_##word)) { \ - if (param->word != iparam[key_##word]) \ + if (!info->partial || (info->partial & 1 << idx)) { \ + if (param->val[idx] != iparam[idx]) \ changed = 1; \ - param->word = iparam[key_##word]; \ + param->val[idx] = iparam[idx]; \ } \ changed; \ }) -#define GET_PARAM(param, info, iparam, word) \ +#define GET_PARAM(param, info, iparam, idx) \ do { \ - iparam[key_##word] = param->word; \ + iparam[idx] = param->val[idx]; \ } while (0) static void sess_param_check(struct iscsi_param_info *info) @@ -60,49 +60,17 @@ static void sess_param_set(struct iscsi_sess_param *param, struct iscsi_param_info *info) { u32 *iparam = info->session_param; - - SET_PARAM(param, info, iparam, initial_r2t); - SET_PARAM(param, info, iparam, immediate_data); - SET_PARAM(param, info, iparam, max_connections); - SET_PARAM(param, info, iparam, max_data_pdu_length); - SET_PARAM(param, info, iparam, max_burst_length); - SET_PARAM(param, info, iparam, first_burst_length); - SET_PARAM(param, info, iparam, default_wait_time); - SET_PARAM(param, info, iparam, default_retain_time); - SET_PARAM(param, info, iparam, max_outstanding_r2t); - SET_PARAM(param, info, iparam, data_pdu_inorder); - SET_PARAM(param, info, iparam, data_sequence_inorder); - SET_PARAM(param, info, iparam, error_recovery_level); - SET_PARAM(param, info, iparam, header_digest); - SET_PARAM(param, info, iparam, data_digest); - SET_PARAM(param, info, iparam, ofmarker); - SET_PARAM(param, info, iparam, ifmarker); - SET_PARAM(param, info, iparam, ofmarkint); - SET_PARAM(param, info, iparam, ifmarkint); + int i; + for (i = 0; i < session_key_last; i++) + SET_PARAM(param, info, iparam, i); } static void sess_param_get(struct iscsi_sess_param *param, struct iscsi_param_info *info) { u32 *iparam = info->session_param; - - GET_PARAM(param, info, iparam, initial_r2t); - GET_PARAM(param, info, iparam, immediate_data); - GET_PARAM(param, info, iparam, max_connections); - GET_PARAM(param, info, iparam, max_data_pdu_length); - GET_PARAM(param, info, iparam, max_burst_length); - GET_PARAM(param, info, iparam, first_burst_length); - GET_PARAM(param, info, iparam, default_wait_time); - GET_PARAM(param, info, iparam, default_retain_time); - GET_PARAM(param, info, iparam, max_outstanding_r2t); - GET_PARAM(param, info, iparam, data_pdu_inorder); - GET_PARAM(param, info, iparam, data_sequence_inorder); - GET_PARAM(param, info, iparam, error_recovery_level); - GET_PARAM(param, info, iparam, header_digest); - GET_PARAM(param, info, iparam, data_digest); - GET_PARAM(param, info, iparam, ofmarker); - GET_PARAM(param, info, iparam, ifmarker); - GET_PARAM(param, info, iparam, ofmarkint); - GET_PARAM(param, info, iparam, ifmarkint); + int i; + for (i = 0; i < session_key_last; i++) + GET_PARAM(param, info, iparam, i); } static void trgt_param_check(struct iscsi_param_info *info) @@ -119,20 +87,19 @@ { struct iscsi_trgt_param *param = &target->trgt_param; u32 *iparam = info->target_param; - - if (SET_PARAM(param, info, iparam, wthreads)) - wthread_start(target); - SET_PARAM(param, info, iparam, target_type); - SET_PARAM(param, info, iparam, queued_cmnds); + int i; + for (i = 0; i < target_key_last; i++) + if (SET_PARAM(param, info, iparam, i) + && i == key_wthreads) + wthread_start(target); } static void trgt_param_get(struct iscsi_trgt_param *param, struct iscsi_param_info *info) { u32 *iparam = info->target_param; - - GET_PARAM(param, info, iparam, wthreads); - GET_PARAM(param, info, iparam, target_type); - SET_PARAM(param, info, iparam, queued_cmnds); + int i; + for (i = 0; i < target_key_last; i++) + GET_PARAM(param, info, iparam, i); } static int trgt_param(struct iscsi_target *target, struct iscsi_param_info *info, int set) diff -ru r1185/kernel/session.c proc-0.4.10/kernel/session.c --- r1185/kernel/session.c 2005-06-10 23:29:41.000000000 +0900 +++ proc-0.4.10/kernel/session.c 2005-06-25 17:01:13.141938928 +0900 @@ -33,7 +33,7 @@ session->target = target; session->sid = info->sid; memcpy(&session->param, &target->sess_param, sizeof(session->param)); - session->max_queued_cmnds = target->trgt_param.queued_cmnds; + session->max_queued_cmnds = target->trgt_param.tp_queued_cmnds; session->exp_cmd_sn = info->exp_cmd_sn; session->max_cmd_sn = info->max_cmd_sn; diff -ru r1185/kernel/target.c proc-0.4.10/kernel/target.c --- r1185/kernel/target.c 2005-06-25 17:03:40.917473632 +0900 +++ proc-0.4.10/kernel/target.c 2005-06-25 17:01:13.144938472 +0900 @@ -17,30 +17,30 @@ static u32 nr_targets; static struct iscsi_sess_param default_session_param = { - .initial_r2t = 1, - .immediate_data = 1, - .max_connections = 1, - .max_data_pdu_length = 8192, - .max_burst_length = 262144, - .first_burst_length = 65536, - .default_wait_time = 2, - .default_retain_time = 20, - .max_outstanding_r2t = 1, - .data_pdu_inorder = 1, - .data_sequence_inorder = 1, - .error_recovery_level = 0, - .header_digest = DIGEST_NONE, - .data_digest = DIGEST_NONE, - .ofmarker = 0, - .ifmarker = 0, - .ofmarkint = 2048, - .ifmarkint = 2048, + .sp_initial_r2t = 1, + .sp_immediate_data = 1, + .sp_max_connections = 1, + .sp_max_data_pdu_length = 8192, + .sp_max_burst_length = 262144, + .sp_first_burst_length = 65536, + .sp_default_wait_time = 2, + .sp_default_retain_time = 20, + .sp_max_outstanding_r2t = 1, + .sp_data_pdu_inorder = 1, + .sp_data_sequence_inorder = 1, + .sp_error_recovery_level = 0, + .sp_header_digest = DIGEST_NONE, + .sp_data_digest = DIGEST_NONE, + .sp_ofmarker = 0, + .sp_ifmarker = 0, + .sp_ofmarkint = 2048, + .sp_ifmarkint = 2048, }; static struct iscsi_trgt_param default_target_param = { - .wthreads = DEFAULT_NR_WTHREADS, - .target_type = 0, - .queued_cmnds = DEFAULT_NR_QUEUED_CMNDS, + .tp_wthreads = DEFAULT_NR_WTHREADS, + .tp_target_type = 0, + .tp_queued_cmnds = DEFAULT_NR_QUEUED_CMNDS, }; inline int target_lock(struct iscsi_target *target, int interruptible) @@ -283,16 +283,16 @@ int iet_proc_tgtcfg(struct seq_file *seq, void *v) { - int err, tmp; + int err, tmp, i; struct iscsi_target *target; struct iet_volume *vol; if ((err = down_interruptible(&target_list_sem)) < 0) return err; -#define P(ptr, name) seq_printf(seq, "%d %d,", key_##name, (ptr)->name) -#define PrintTrgtParam(name) P(&target->trgt_param, name) -#define PrintSessParam(name) P(&target->sess_param, name) +#define P(ptr, idx) seq_printf(seq, "%d,", (ptr)->val[idx]) +#define PrintTrgtParam(idx) P(&target->trgt_param, idx) +#define PrintSessParam(idx) P(&target->sess_param, idx) /* * loose checking the return value of seq_printf(), @@ -318,9 +318,8 @@ * target parameters */ seq_printf(seq, PROC_TRGT_PARAM_TAG "{"); - PrintTrgtParam(wthreads); - PrintTrgtParam(target_type); - PrintTrgtParam(queued_cmnds); + for (i = 0; i < target_key_last; i++) + PrintTrgtParam(i); tmp = seq_printf(seq, "},"); if (tmp) goto end_of_loop; @@ -328,24 +327,8 @@ * session parameters */ seq_printf(seq, PROC_SESS_PARAM_TAG "{"); - PrintSessParam(initial_r2t); - PrintSessParam(immediate_data); - PrintSessParam(max_connections); - PrintSessParam(max_data_pdu_length); - PrintSessParam(max_burst_length); - PrintSessParam(first_burst_length); - PrintSessParam(default_wait_time); - PrintSessParam(default_retain_time); - PrintSessParam(max_outstanding_r2t); - PrintSessParam(data_pdu_inorder); - PrintSessParam(data_sequence_inorder); - PrintSessParam(error_recovery_level); - PrintSessParam(header_digest); - PrintSessParam(data_digest); - PrintSessParam(ofmarker); - PrintSessParam(ifmarker); - PrintSessParam(ofmarkint); - PrintSessParam(ifmarkint); + for (i = 0; i < session_key_last; i++) + PrintTrgtParam(i); tmp = seq_printf(seq, "}\n"); end_of_loop: diff -ru r1185/kernel/wthread.c proc-0.4.10/kernel/wthread.c --- r1185/kernel/wthread.c 2005-06-10 23:29:41.000000000 +0900 +++ proc-0.4.10/kernel/wthread.c 2005-06-25 16:32:25.683552520 +0900 @@ -150,14 +150,14 @@ int err = 0; struct worker_thread_info *info = &target->wthread_info; - while (info->nr_running_wthreads < target->trgt_param.wthreads) { + while (info->nr_running_wthreads < target->trgt_param.tp_wthreads) { if ((err = start_one_worker_thread(target)) < 0) { eprintk("Fail to create a worker thread %d\n", err); goto out; } } - while (info->nr_running_wthreads > target->trgt_param.wthreads) { + while (info->nr_running_wthreads > target->trgt_param.tp_wthreads) { struct worker_thread *wt; wt = list_entry(info->wthread_list.next, struct worker_thread, w_list); if ((err = stop_one_worker_thread(wt)) < 0) { diff -ru r1185/usr/ietadm.c proc-0.4.10/usr/ietadm.c --- r1185/usr/ietadm.c 2005-06-25 17:03:40.921473024 +0900 +++ proc-0.4.10/usr/ietadm.c 2005-06-25 16:34:55.258813624 +0900 @@ -278,9 +278,6 @@ *(a+sizeof(a)-1) = 0; while (*head != '}') { errno = 0; - i = strtoul(head, &p, 10); - if (errno) goto err; - head = p+1; val = strtoul(head, &p, 10); if (errno) goto err; head = p+1; @@ -292,7 +289,7 @@ errno = E2BIG; goto err; } - printf("\t%s %s\n", keys[i].name, a); + printf("\t%s %s\n", keys[i++].name, a); } *tail = head+2; return 0;