summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2015-09-15 13:37:48 +0000
committermav <mav@FreeBSD.org>2015-09-15 13:37:48 +0000
commit6e36742bfeb77cdd423bfda6e4071b689671b143 (patch)
tree231ec53043bbb52cd8b583704a929edffc602c24
parent50caf2bee2ab22bc86bc813c719d6041a327c8b0 (diff)
downloadFreeBSD-src-6e36742bfeb77cdd423bfda6e4071b689671b143.zip
FreeBSD-src-6e36742bfeb77cdd423bfda6e4071b689671b143.tar.gz
Add ctl-lun config option for consistency in HA setups.
-rw-r--r--usr.sbin/ctld/ctl.conf.56
-rw-r--r--usr.sbin/ctld/ctld.c1
-rw-r--r--usr.sbin/ctld/kernel.c5
-rw-r--r--usr.sbin/ctld/parse.y26
-rw-r--r--usr.sbin/ctld/token.l1
5 files changed, 36 insertions, 3 deletions
diff --git a/usr.sbin/ctld/ctl.conf.5 b/usr.sbin/ctld/ctl.conf.5
index 121daa7..ea1d07a 100644
--- a/usr.sbin/ctld/ctl.conf.5
+++ b/usr.sbin/ctld/ctl.conf.5
@@ -28,7 +28,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd September 7, 2015
+.Dd September 15, 2015
.Dt CTL.CONF 5
.Os
.Sh NAME
@@ -388,6 +388,10 @@ The default backend is block.
.It Ic blocksize Ar size
The blocksize visible to the initiator.
The default blocksize is 512.
+.It Ic ctl-lun Ar lun_id
+Global numeric identifier to use for a given LUN inside CTL.
+By default CTL allocates those IDs dynamically, but explicit specification
+may be needed for consistency in HA configurations.
.It Ic device-id Ar string
The SCSI Device Identification string presented to the initiator.
.It Ic option Ar name Ar value
diff --git a/usr.sbin/ctld/ctld.c b/usr.sbin/ctld/ctld.c
index 06c8e14..143f2e3 100644
--- a/usr.sbin/ctld/ctld.c
+++ b/usr.sbin/ctld/ctld.c
@@ -1397,6 +1397,7 @@ lun_new(struct conf *conf, const char *name)
lun->l_name = checked_strdup(name);
TAILQ_INIT(&lun->l_options);
TAILQ_INSERT_TAIL(&conf->conf_luns, lun, l_next);
+ lun->l_ctl_lun = -1;
return (lun);
}
diff --git a/usr.sbin/ctld/kernel.c b/usr.sbin/ctld/kernel.c
index 02778a9..2ecc70f 100644
--- a/usr.sbin/ctld/kernel.c
+++ b/usr.sbin/ctld/kernel.c
@@ -656,6 +656,11 @@ kernel_lun_add(struct lun *lun)
if (lun->l_size != 0)
req.reqdata.create.lun_size_bytes = lun->l_size;
+ if (lun->l_ctl_lun >= 0) {
+ req.reqdata.create.req_lun_id = lun->l_ctl_lun;
+ req.reqdata.create.flags |= CTL_LUN_FLAG_ID_REQ;
+ }
+
req.reqdata.create.flags |= CTL_LUN_FLAG_DEV_TYPE;
req.reqdata.create.device_type = T_DIRECT;
diff --git a/usr.sbin/ctld/parse.y b/usr.sbin/ctld/parse.y
index 677b5d5..6907b48 100644
--- a/usr.sbin/ctld/parse.y
+++ b/usr.sbin/ctld/parse.y
@@ -57,8 +57,8 @@ extern void yyrestart(FILE *);
%}
%token ALIAS AUTH_GROUP AUTH_TYPE BACKEND BLOCKSIZE CHAP CHAP_MUTUAL
-%token CLOSING_BRACKET DEBUG DEVICE_ID DISCOVERY_AUTH_GROUP DISCOVERY_FILTER
-%token FOREIGN
+%token CLOSING_BRACKET CTL_LUN DEBUG DEVICE_ID DISCOVERY_AUTH_GROUP
+%token DISCOVERY_FILTER FOREIGN
%token INITIATOR_NAME INITIATOR_PORTAL ISNS_SERVER ISNS_PERIOD ISNS_TIMEOUT
%token LISTEN LISTEN_ISER LUN MAXPROC OFFLOAD OPENING_BRACKET OPTION
%token PATH PIDFILE PORT PORTAL_GROUP REDIRECT SEMICOLON SERIAL SIZE STR
@@ -855,6 +855,8 @@ lun_entry:
|
lun_device_id
|
+ lun_ctl_lun
+ |
lun_option
|
lun_path
@@ -912,6 +914,26 @@ lun_device_id: DEVICE_ID STR
}
;
+lun_ctl_lun: CTL_LUN STR
+ {
+ uint64_t tmp;
+
+ if (expand_number($2, &tmp) != 0) {
+ yyerror("invalid numeric value");
+ free($2);
+ return (1);
+ }
+
+ if (lun->l_ctl_lun >= 0) {
+ log_warnx("ctl_lun for lun \"%s\" "
+ "specified more than once",
+ lun->l_name);
+ return (1);
+ }
+ lun_set_ctl_lun(lun, tmp);
+ }
+ ;
+
lun_option: OPTION STR STR
{
struct lun_option *clo;
diff --git a/usr.sbin/ctld/token.l b/usr.sbin/ctld/token.l
index 19535f7..37989ce 100644
--- a/usr.sbin/ctld/token.l
+++ b/usr.sbin/ctld/token.l
@@ -54,6 +54,7 @@ backend { return BACKEND; }
blocksize { return BLOCKSIZE; }
chap { return CHAP; }
chap-mutual { return CHAP_MUTUAL; }
+ctl-lun { return CTL_LUN; }
debug { return DEBUG; }
device-id { return DEVICE_ID; }
discovery-auth-group { return DISCOVERY_AUTH_GROUP; }
OpenPOWER on IntegriCloud