summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/iscsi_if.h2
-rw-r--r--kernel/iscsi_tcp.c6
-rw-r--r--kernel/scsi_transport_iscsi.c7
-rwxr-xr-xtest/regression.sh2
-rw-r--r--usr/initiator.c3
-rw-r--r--usr/initiator.h1
-rw-r--r--usr/iscsid.c2
7 files changed, 17 insertions, 6 deletions
diff --git a/include/iscsi_if.h b/include/iscsi_if.h
index 65b86a6..b85bac4 100644
--- a/include/iscsi_if.h
+++ b/include/iscsi_if.h
@@ -121,6 +121,8 @@ struct iscsi_uevent {
struct msg_trans_list {
struct {
uint64_t trans_handle;
+ uint32_t caps_mask;
+ uint32_t unused;
char name[ISCSI_TRANSPORT_NAME_MAXLEN];
} elements[ISCSI_TRANSPORT_MAX];
} t_list;
diff --git a/kernel/iscsi_tcp.c b/kernel/iscsi_tcp.c
index 614049f..d8afd8a 100644
--- a/kernel/iscsi_tcp.c
+++ b/kernel/iscsi_tcp.c
@@ -2975,9 +2975,7 @@ iscsi_conn_set_param(iscsi_connh_t connh, enum iscsi_param param,
}
break;
case ISCSI_PARAM_DATADGST_EN:
- /* FIXME: DataDigest is not implemented yet */
- if (value) /* != ISCSI_DIGEST_NONE) */
- return -EPERM;
+ BUG_ON(value); /* not implemented yet */
conn->datadgst_en = value;
break;
case ISCSI_PARAM_INITIAL_R2T_EN:
@@ -3012,9 +3010,11 @@ iscsi_conn_set_param(iscsi_connh_t connh, enum iscsi_param param,
session->erl = value;
break;
case ISCSI_PARAM_IFMARKER_EN:
+ BUG_ON(value);
session->ifmarker_en = value;
break;
case ISCSI_PARAM_OFMARKER_EN:
+ BUG_ON(value);
session->ifmarker_en = value;
break;
default:
diff --git a/kernel/scsi_transport_iscsi.c b/kernel/scsi_transport_iscsi.c
index d24cd42..7cb6410 100644
--- a/kernel/scsi_transport_iscsi.c
+++ b/kernel/scsi_transport_iscsi.c
@@ -756,6 +756,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
switch (nlh->nlmsg_type) {
case ISCSI_UEVENT_TRANS_LIST: {
unsigned long flags;
+ int i = 0;
/*
* this will always succeed for now since there
@@ -765,11 +766,13 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
*/
spin_lock_irqsave(&iscsi_transport_lock, flags);
list_for_each_entry(priv, &iscsi_transports, list) {
- ev->r.t_list.elements[0].trans_handle =
+ ev->r.t_list.elements[i].trans_handle =
iscsi_handle(priv->iscsi_transport);
- strncpy(ev->r.t_list.elements[0].name,
+ strncpy(ev->r.t_list.elements[i].name,
priv->iscsi_transport->name,
ISCSI_TRANSPORT_NAME_MAXLEN);
+ ev->r.t_list.elements[i].caps_mask = priv->param_mask;
+ i++;
}
spin_unlock_irqrestore(&iscsi_transport_lock, flags);
diff --git a/test/regression.sh b/test/regression.sh
index 58730fa..8033ba4 100755
--- a/test/regression.sh
+++ b/test/regression.sh
@@ -77,7 +77,7 @@ function disktest_run() {
}
function fdisk_run() {
- echo "fdisk $device: "
+ echo -n "fdisk $device: "
if ! echo "
p
d
diff --git a/usr/initiator.c b/usr/initiator.c
index 1a82fc9..d9554ff 100644
--- a/usr/initiator.c
+++ b/usr/initiator.c
@@ -754,6 +754,9 @@ __session_conn_recv_pdu(queue_item_t *item)
for (i = 0; i < ISCSI_PARAM_MAX; i++) {
if (conn->id != 0 && !conntbl[i].conn_only)
continue;
+ if (!(provider[0].caps_mask &
+ (1 << conntbl[i].param)))
+ continue;
if (ipc->set_param(
session->transport_handle,
conn->handle, conntbl[i].param,
diff --git a/usr/initiator.h b/usr/initiator.h
index 2799b16..78e7ca8 100644
--- a/usr/initiator.h
+++ b/usr/initiator.h
@@ -271,6 +271,7 @@ typedef enum iscsi_provider_status_e {
/* represents data path provider */
typedef struct iscsi_provider_t {
uint64_t handle;
+ uint32_t caps_mask;
iscsi_provider_status_e status;
char name[ISCSI_TRANSPORT_NAME_MAXLEN];
struct qelem sessions;
diff --git a/usr/iscsid.c b/usr/iscsid.c
index 21be1fa..0dc2b5c 100644
--- a/usr/iscsid.c
+++ b/usr/iscsid.c
@@ -133,6 +133,8 @@ int trans_sync(void)
ev.r.t_list.elements[i].trans_handle;
strncpy(provider[i].name, ev.r.t_list.elements[i].name,
ISCSI_TRANSPORT_NAME_MAXLEN);
+ provider[i].caps_mask =
+ ev.r.t_list.elements[i].caps_mask;
/* FIXME: implement session/connection sync up logic */
provider[i].sessions.q_forw = &provider[i].sessions;