From aa6a7df89f1b4850d6005220f912240b8daeece7 Mon Sep 17 00:00:00 2001 From: mav Date: Thu, 19 Feb 2015 14:31:16 +0000 Subject: MFC r278037: CTL LUN mapping rewrite. Replace iSCSI-specific LUN mapping mechanism with new one, working for any ports. By default all ports are created without LUN mapping, exposing all CTL LUNs as before. But, if needed, LUN mapping can be manually set on per-port basis via ctladm. For its iSCSI ports ctld does it via ioctl(2). The next step will be to teach ctld to work with FibreChannel ports also. Respecting additional flexibility of the new mechanism, ctl.conf now allows alternative syntax for LUN definition. LUNs can now be defined in global context, and then referenced from targets by unique name, as needed. It allows same LUN to be exposed several times via multiple targets. While there, increase limit for LUNs per target in ctld from 256 to 1024. Some initiators do not support LUNs above 255, but that is not our problem. Relnotes: yes Sponsored by: iXsystems, Inc. --- usr.sbin/ctld/parse.y | 72 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 13 deletions(-) (limited to 'usr.sbin/ctld/parse.y') diff --git a/usr.sbin/ctld/parse.y b/usr.sbin/ctld/parse.y index a6519dd..fead2ea 100644 --- a/usr.sbin/ctld/parse.y +++ b/usr.sbin/ctld/parse.y @@ -99,6 +99,8 @@ statement: | portal_group | + lun + | target ; @@ -407,6 +409,22 @@ portal_group_redirect: REDIRECT STR } ; +lun: LUN lun_name + OPENING_BRACKET lun_entries CLOSING_BRACKET + { + lun = NULL; + } + ; + +lun_name: STR + { + lun = lun_new(conf, $1); + free($1); + if (lun == NULL) + return (1); + } + ; + target: TARGET target_name OPENING_BRACKET target_entries CLOSING_BRACKET { @@ -450,6 +468,8 @@ target_entry: target_redirect | target_lun + | + target_lun_ref ; target_alias: ALIAS STR @@ -672,6 +692,7 @@ target_lun: LUN lun_number lun_number: STR { uint64_t tmp; + char *name; if (expand_number($1, &tmp) != 0) { yyerror("invalid numeric value"); @@ -679,9 +700,34 @@ lun_number: STR return (1); } - lun = lun_new(target, tmp); + asprintf(&name, "%s,lun,%ju", target->t_name, tmp); + lun = lun_new(conf, name); if (lun == NULL) return (1); + + lun_set_scsiname(lun, name); + target->t_luns[tmp] = lun; + } + ; + +target_lun_ref: LUN STR STR + { + uint64_t tmp; + + if (expand_number($2, &tmp) != 0) { + yyerror("invalid numeric value"); + free($2); + free($3); + return (1); + } + free($2); + + lun = lun_find(conf, $3); + free($3); + if (lun == NULL) + return (1); + + target->t_luns[tmp] = lun; } ; @@ -711,9 +757,9 @@ lun_entry: lun_backend: BACKEND STR { if (lun->l_backend != NULL) { - log_warnx("backend for lun %d, target \"%s\" " + log_warnx("backend for lun \"%s\" " "specified more than once", - lun->l_lun, target->t_name); + lun->l_name); free($2); return (1); } @@ -733,9 +779,9 @@ lun_blocksize: BLOCKSIZE STR } if (lun->l_blocksize != 0) { - log_warnx("blocksize for lun %d, target \"%s\" " + log_warnx("blocksize for lun \"%s\" " "specified more than once", - lun->l_lun, target->t_name); + lun->l_name); return (1); } lun_set_blocksize(lun, tmp); @@ -745,9 +791,9 @@ lun_blocksize: BLOCKSIZE STR lun_device_id: DEVICE_ID STR { if (lun->l_device_id != NULL) { - log_warnx("device_id for lun %d, target \"%s\" " + log_warnx("device_id for lun \"%s\" " "specified more than once", - lun->l_lun, target->t_name); + lun->l_name); free($2); return (1); } @@ -771,9 +817,9 @@ lun_option: OPTION STR STR lun_path: PATH STR { if (lun->l_path != NULL) { - log_warnx("path for lun %d, target \"%s\" " + log_warnx("path for lun \"%s\" " "specified more than once", - lun->l_lun, target->t_name); + lun->l_name); free($2); return (1); } @@ -785,9 +831,9 @@ lun_path: PATH STR lun_serial: SERIAL STR { if (lun->l_serial != NULL) { - log_warnx("serial for lun %d, target \"%s\" " + log_warnx("serial for lun \"%s\" " "specified more than once", - lun->l_lun, target->t_name); + lun->l_name); free($2); return (1); } @@ -807,9 +853,9 @@ lun_size: SIZE STR } if (lun->l_size != 0) { - log_warnx("size for lun %d, target \"%s\" " + log_warnx("size for lun \"%s\" " "specified more than once", - lun->l_lun, target->t_name); + lun->l_name); return (1); } lun_set_size(lun, tmp); -- cgit v1.1