aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/scsi_transport_iscsi.c29
-rw-r--r--include/scsi/iscsi_if.h6
-rw-r--r--include/scsi/scsi_transport_iscsi.h3
3 files changed, 37 insertions, 1 deletions
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index 59287601bd41..3fd2da451fe1 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -968,6 +968,30 @@ iscsi_tgt_dscvr(struct iscsi_transport *transport,
968} 968}
969 969
970static int 970static int
971iscsi_set_host_param(struct iscsi_transport *transport,
972 struct iscsi_uevent *ev)
973{
974 char *data = (char*)ev + sizeof(*ev);
975 struct Scsi_Host *shost;
976 int err;
977
978 if (!transport->set_host_param)
979 return -ENOSYS;
980
981 shost = scsi_host_lookup(ev->u.set_host_param.host_no);
982 if (IS_ERR(shost)) {
983 printk(KERN_ERR "set_host_param could not find host no %u\n",
984 ev->u.set_host_param.host_no);
985 return -ENODEV;
986 }
987
988 err = transport->set_host_param(shost, ev->u.set_host_param.param,
989 data, ev->u.set_host_param.len);
990 scsi_host_put(shost);
991 return err;
992}
993
994static int
971iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) 995iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
972{ 996{
973 int err = 0; 997 int err = 0;
@@ -1058,8 +1082,11 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
1058 case ISCSI_UEVENT_TGT_DSCVR: 1082 case ISCSI_UEVENT_TGT_DSCVR:
1059 err = iscsi_tgt_dscvr(transport, ev); 1083 err = iscsi_tgt_dscvr(transport, ev);
1060 break; 1084 break;
1085 case ISCSI_UEVENT_SET_HOST_PARAM:
1086 err = iscsi_set_host_param(transport, ev);
1087 break;
1061 default: 1088 default:
1062 err = -EINVAL; 1089 err = -ENOSYS;
1063 break; 1090 break;
1064 } 1091 }
1065 1092
diff --git a/include/scsi/iscsi_if.h b/include/scsi/iscsi_if.h
index fba211743729..3d0372e30ca1 100644
--- a/include/scsi/iscsi_if.h
+++ b/include/scsi/iscsi_if.h
@@ -48,6 +48,7 @@ enum iscsi_uevent_e {
48 ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT = UEVENT_BASE + 14, 48 ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT = UEVENT_BASE + 14,
49 49
50 ISCSI_UEVENT_TGT_DSCVR = UEVENT_BASE + 15, 50 ISCSI_UEVENT_TGT_DSCVR = UEVENT_BASE + 15,
51 ISCSI_UEVENT_SET_HOST_PARAM = UEVENT_BASE + 16,
51 52
52 /* up events */ 53 /* up events */
53 ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1, 54 ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1,
@@ -136,6 +137,11 @@ struct iscsi_uevent {
136 */ 137 */
137 uint32_t enable; 138 uint32_t enable;
138 } tgt_dscvr; 139 } tgt_dscvr;
140 struct msg_set_host_param {
141 uint32_t host_no;
142 uint32_t param; /* enum iscsi_host_param */
143 uint32_t len;
144 } set_host_param;
139 } u; 145 } u;
140 union { 146 union {
141 /* messages k -> u */ 147 /* messages k -> u */
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h
index 902e69f0272c..1ac450b06909 100644
--- a/include/scsi/scsi_transport_iscsi.h
+++ b/include/scsi/scsi_transport_iscsi.h
@@ -108,6 +108,9 @@ struct iscsi_transport {
108 enum iscsi_param param, char *buf); 108 enum iscsi_param param, char *buf);
109 int (*get_host_param) (struct Scsi_Host *shost, 109 int (*get_host_param) (struct Scsi_Host *shost,
110 enum iscsi_host_param param, char *buf); 110 enum iscsi_host_param param, char *buf);
111 int (*set_host_param) (struct Scsi_Host *shost,
112 enum iscsi_host_param param, char *buf,
113 int buflen);
111 int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, 114 int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
112 char *data, uint32_t data_size); 115 char *data, uint32_t data_size);
113 void (*get_stats) (struct iscsi_cls_conn *conn, 116 void (*get_stats) (struct iscsi_cls_conn *conn,