diff options
-rw-r--r-- | drivers/scsi/scsi_transport_iscsi.c | 29 | ||||
-rw-r--r-- | include/scsi/iscsi_if.h | 6 | ||||
-rw-r--r-- | include/scsi/scsi_transport_iscsi.h | 3 |
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 | ||
970 | static int | 970 | static int |
971 | iscsi_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 | |||
994 | static int | ||
971 | iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | 995 | iscsi_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, |