aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/libiscsi.c179
-rw-r--r--drivers/scsi/scsi_transport_iscsi.c210
-rw-r--r--include/scsi/libiscsi.h15
-rw-r--r--include/scsi/scsi_transport_iscsi.h29
4 files changed, 246 insertions, 187 deletions
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index 2673a11a9495..7c76a989b218 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -1697,6 +1697,185 @@ int iscsi_conn_bind(struct iscsi_cls_session *cls_session,
1697} 1697}
1698EXPORT_SYMBOL_GPL(iscsi_conn_bind); 1698EXPORT_SYMBOL_GPL(iscsi_conn_bind);
1699 1699
1700
1701int iscsi_set_param(struct iscsi_cls_conn *cls_conn,
1702 enum iscsi_param param, char *buf, int buflen)
1703{
1704 struct iscsi_conn *conn = cls_conn->dd_data;
1705 struct iscsi_session *session = conn->session;
1706 uint32_t value;
1707
1708 switch(param) {
1709 case ISCSI_PARAM_MAX_RECV_DLENGTH:
1710 sscanf(buf, "%d", &conn->max_recv_dlength);
1711 break;
1712 case ISCSI_PARAM_MAX_XMIT_DLENGTH:
1713 sscanf(buf, "%d", &conn->max_xmit_dlength);
1714 break;
1715 case ISCSI_PARAM_HDRDGST_EN:
1716 sscanf(buf, "%d", &conn->hdrdgst_en);
1717 break;
1718 case ISCSI_PARAM_DATADGST_EN:
1719 sscanf(buf, "%d", &conn->datadgst_en);
1720 break;
1721 case ISCSI_PARAM_INITIAL_R2T_EN:
1722 sscanf(buf, "%d", &session->initial_r2t_en);
1723 break;
1724 case ISCSI_PARAM_MAX_R2T:
1725 sscanf(buf, "%d", &session->max_r2t);
1726 break;
1727 case ISCSI_PARAM_IMM_DATA_EN:
1728 sscanf(buf, "%d", &session->imm_data_en);
1729 break;
1730 case ISCSI_PARAM_FIRST_BURST:
1731 sscanf(buf, "%d", &session->first_burst);
1732 break;
1733 case ISCSI_PARAM_MAX_BURST:
1734 sscanf(buf, "%d", &session->max_burst);
1735 break;
1736 case ISCSI_PARAM_PDU_INORDER_EN:
1737 sscanf(buf, "%d", &session->pdu_inorder_en);
1738 break;
1739 case ISCSI_PARAM_DATASEQ_INORDER_EN:
1740 sscanf(buf, "%d", &session->dataseq_inorder_en);
1741 break;
1742 case ISCSI_PARAM_ERL:
1743 sscanf(buf, "%d", &session->erl);
1744 break;
1745 case ISCSI_PARAM_IFMARKER_EN:
1746 sscanf(buf, "%d", &value);
1747 BUG_ON(value);
1748 break;
1749 case ISCSI_PARAM_OFMARKER_EN:
1750 sscanf(buf, "%d", &value);
1751 BUG_ON(value);
1752 break;
1753 case ISCSI_PARAM_EXP_STATSN:
1754 sscanf(buf, "%u", &conn->exp_statsn);
1755 break;
1756 case ISCSI_PARAM_TARGET_NAME:
1757 /* this should not change between logins */
1758 if (session->targetname)
1759 break;
1760
1761 session->targetname = kstrdup(buf, GFP_KERNEL);
1762 if (!session->targetname)
1763 return -ENOMEM;
1764 break;
1765 case ISCSI_PARAM_TPGT:
1766 sscanf(buf, "%d", &session->tpgt);
1767 break;
1768 case ISCSI_PARAM_PERSISTENT_PORT:
1769 sscanf(buf, "%d", &conn->persistent_port);
1770 break;
1771 case ISCSI_PARAM_PERSISTENT_ADDRESS:
1772 /*
1773 * this is the address returned in discovery so it should
1774 * not change between logins.
1775 */
1776 if (conn->persistent_address)
1777 break;
1778
1779 conn->persistent_address = kstrdup(buf, GFP_KERNEL);
1780 if (!conn->persistent_address)
1781 return -ENOMEM;
1782 break;
1783 default:
1784 return -ENOSYS;
1785 }
1786
1787 return 0;
1788}
1789EXPORT_SYMBOL_GPL(iscsi_set_param);
1790
1791int iscsi_session_get_param(struct iscsi_cls_session *cls_session,
1792 enum iscsi_param param, char *buf)
1793{
1794 struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
1795 struct iscsi_session *session = iscsi_hostdata(shost->hostdata);
1796 int len;
1797
1798 switch(param) {
1799 case ISCSI_PARAM_INITIAL_R2T_EN:
1800 len = sprintf(buf, "%d\n", session->initial_r2t_en);
1801 break;
1802 case ISCSI_PARAM_MAX_R2T:
1803 len = sprintf(buf, "%hu\n", session->max_r2t);
1804 break;
1805 case ISCSI_PARAM_IMM_DATA_EN:
1806 len = sprintf(buf, "%d\n", session->imm_data_en);
1807 break;
1808 case ISCSI_PARAM_FIRST_BURST:
1809 len = sprintf(buf, "%u\n", session->first_burst);
1810 break;
1811 case ISCSI_PARAM_MAX_BURST:
1812 len = sprintf(buf, "%u\n", session->max_burst);
1813 break;
1814 case ISCSI_PARAM_PDU_INORDER_EN:
1815 len = sprintf(buf, "%d\n", session->pdu_inorder_en);
1816 break;
1817 case ISCSI_PARAM_DATASEQ_INORDER_EN:
1818 len = sprintf(buf, "%d\n", session->dataseq_inorder_en);
1819 break;
1820 case ISCSI_PARAM_ERL:
1821 len = sprintf(buf, "%d\n", session->erl);
1822 break;
1823 case ISCSI_PARAM_TARGET_NAME:
1824 len = sprintf(buf, "%s\n", session->targetname);
1825 break;
1826 case ISCSI_PARAM_TPGT:
1827 len = sprintf(buf, "%d\n", session->tpgt);
1828 break;
1829 default:
1830 return -ENOSYS;
1831 }
1832
1833 return len;
1834}
1835EXPORT_SYMBOL_GPL(iscsi_session_get_param);
1836
1837int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn,
1838 enum iscsi_param param, char *buf)
1839{
1840 struct iscsi_conn *conn = cls_conn->dd_data;
1841 int len;
1842
1843 switch(param) {
1844 case ISCSI_PARAM_MAX_RECV_DLENGTH:
1845 len = sprintf(buf, "%u\n", conn->max_recv_dlength);
1846 break;
1847 case ISCSI_PARAM_MAX_XMIT_DLENGTH:
1848 len = sprintf(buf, "%u\n", conn->max_xmit_dlength);
1849 break;
1850 case ISCSI_PARAM_HDRDGST_EN:
1851 len = sprintf(buf, "%d\n", conn->hdrdgst_en);
1852 break;
1853 case ISCSI_PARAM_DATADGST_EN:
1854 len = sprintf(buf, "%d\n", conn->datadgst_en);
1855 break;
1856 case ISCSI_PARAM_IFMARKER_EN:
1857 len = sprintf(buf, "%d\n", conn->ifmarker_en);
1858 break;
1859 case ISCSI_PARAM_OFMARKER_EN:
1860 len = sprintf(buf, "%d\n", conn->ofmarker_en);
1861 break;
1862 case ISCSI_PARAM_EXP_STATSN:
1863 len = sprintf(buf, "%u\n", conn->exp_statsn);
1864 break;
1865 case ISCSI_PARAM_PERSISTENT_PORT:
1866 len = sprintf(buf, "%d\n", conn->persistent_port);
1867 break;
1868 case ISCSI_PARAM_PERSISTENT_ADDRESS:
1869 len = sprintf(buf, "%s\n", conn->persistent_address);
1870 break;
1871 default:
1872 return -ENOSYS;
1873 }
1874
1875 return len;
1876}
1877EXPORT_SYMBOL_GPL(iscsi_conn_get_param);
1878
1700MODULE_AUTHOR("Mike Christie"); 1879MODULE_AUTHOR("Mike Christie");
1701MODULE_DESCRIPTION("iSCSI library functions"); 1880MODULE_DESCRIPTION("iSCSI library functions");
1702MODULE_LICENSE("GPL"); 1881MODULE_LICENSE("GPL");
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index 99e76d458290..147c854e1d4d 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -233,7 +233,6 @@ static void iscsi_session_release(struct device *dev)
233 233
234 shost = iscsi_session_to_shost(session); 234 shost = iscsi_session_to_shost(session);
235 scsi_host_put(shost); 235 scsi_host_put(shost);
236 kfree(session->targetname);
237 kfree(session); 236 kfree(session);
238 module_put(transport->owner); 237 module_put(transport->owner);
239} 238}
@@ -388,7 +387,6 @@ static void iscsi_conn_release(struct device *dev)
388 struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev); 387 struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev);
389 struct device *parent = conn->dev.parent; 388 struct device *parent = conn->dev.parent;
390 389
391 kfree(conn->persistent_address);
392 kfree(conn); 390 kfree(conn);
393 put_device(parent); 391 put_device(parent);
394} 392}
@@ -877,23 +875,13 @@ iscsi_if_destroy_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev
877 return 0; 875 return 0;
878} 876}
879 877
880static void
881iscsi_copy_param(struct iscsi_uevent *ev, uint32_t *value, char *data)
882{
883 if (ev->u.set_param.len != sizeof(uint32_t))
884 BUG();
885 memcpy(value, data, min_t(uint32_t, sizeof(uint32_t),
886 ev->u.set_param.len));
887}
888
889static int 878static int
890iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev) 879iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)
891{ 880{
892 char *data = (char*)ev + sizeof(*ev); 881 char *data = (char*)ev + sizeof(*ev);
893 struct iscsi_cls_conn *conn; 882 struct iscsi_cls_conn *conn;
894 struct iscsi_cls_session *session; 883 struct iscsi_cls_session *session;
895 int err = 0; 884 int err = 0, value = 0;
896 uint32_t value = 0;
897 885
898 session = iscsi_session_lookup(ev->u.set_param.sid); 886 session = iscsi_session_lookup(ev->u.set_param.sid);
899 conn = iscsi_conn_lookup(ev->u.set_param.sid, ev->u.set_param.cid); 887 conn = iscsi_conn_lookup(ev->u.set_param.sid, ev->u.set_param.cid);
@@ -902,42 +890,13 @@ iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)
902 890
903 switch (ev->u.set_param.param) { 891 switch (ev->u.set_param.param) {
904 case ISCSI_PARAM_SESS_RECOVERY_TMO: 892 case ISCSI_PARAM_SESS_RECOVERY_TMO:
905 iscsi_copy_param(ev, &value, data); 893 sscanf(data, "%d", &value);
906 if (value != 0) 894 if (value != 0)
907 session->recovery_tmo = value; 895 session->recovery_tmo = value;
908 break; 896 break;
909 case ISCSI_PARAM_TARGET_NAME:
910 /* this should not change between logins */
911 if (session->targetname)
912 return 0;
913
914 session->targetname = kstrdup(data, GFP_KERNEL);
915 if (!session->targetname)
916 return -ENOMEM;
917 break;
918 case ISCSI_PARAM_TPGT:
919 iscsi_copy_param(ev, &value, data);
920 session->tpgt = value;
921 break;
922 case ISCSI_PARAM_PERSISTENT_PORT:
923 iscsi_copy_param(ev, &value, data);
924 conn->persistent_port = value;
925 break;
926 case ISCSI_PARAM_PERSISTENT_ADDRESS:
927 /*
928 * this is the address returned in discovery so it should
929 * not change between logins.
930 */
931 if (conn->persistent_address)
932 return 0;
933
934 conn->persistent_address = kstrdup(data, GFP_KERNEL);
935 if (!conn->persistent_address)
936 return -ENOMEM;
937 break;
938 default: 897 default:
939 iscsi_copy_param(ev, &value, data); 898 err = transport->set_param(conn, ev->u.set_param.param,
940 err = transport->set_param(conn, ev->u.set_param.param, value); 899 data, ev->u.set_param.len);
941 } 900 }
942 901
943 return err; 902 return err;
@@ -1165,49 +1124,31 @@ struct class_device_attribute class_device_attr_##_prefix##_##_name = \
1165/* 1124/*
1166 * iSCSI connection attrs 1125 * iSCSI connection attrs
1167 */ 1126 */
1168#define iscsi_conn_int_attr_show(param, format) \ 1127#define iscsi_conn_attr_show(param) \
1169static ssize_t \ 1128static ssize_t \
1170show_conn_int_param_##param(struct class_device *cdev, char *buf) \ 1129show_conn_param_##param(struct class_device *cdev, char *buf) \
1171{ \ 1130{ \
1172 uint32_t value = 0; \
1173 struct iscsi_cls_conn *conn = iscsi_cdev_to_conn(cdev); \ 1131 struct iscsi_cls_conn *conn = iscsi_cdev_to_conn(cdev); \
1174 struct iscsi_transport *t = conn->transport; \ 1132 struct iscsi_transport *t = conn->transport; \
1175 \ 1133 return t->get_conn_param(conn, param, buf); \
1176 t->get_conn_param(conn, param, &value); \
1177 return snprintf(buf, 20, format"\n", value); \
1178} 1134}
1179 1135
1180#define iscsi_conn_int_attr(field, param, format) \ 1136#define iscsi_conn_attr(field, param) \
1181 iscsi_conn_int_attr_show(param, format) \ 1137 iscsi_conn_attr_show(param) \
1182static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, show_conn_int_param_##param, \ 1138static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, show_conn_param_##param, \
1183 NULL); 1139 NULL);
1184 1140
1185iscsi_conn_int_attr(max_recv_dlength, ISCSI_PARAM_MAX_RECV_DLENGTH, "%u"); 1141iscsi_conn_attr(max_recv_dlength, ISCSI_PARAM_MAX_RECV_DLENGTH);
1186iscsi_conn_int_attr(max_xmit_dlength, ISCSI_PARAM_MAX_XMIT_DLENGTH, "%u"); 1142iscsi_conn_attr(max_xmit_dlength, ISCSI_PARAM_MAX_XMIT_DLENGTH);
1187iscsi_conn_int_attr(header_digest, ISCSI_PARAM_HDRDGST_EN, "%d"); 1143iscsi_conn_attr(header_digest, ISCSI_PARAM_HDRDGST_EN);
1188iscsi_conn_int_attr(data_digest, ISCSI_PARAM_DATADGST_EN, "%d"); 1144iscsi_conn_attr(data_digest, ISCSI_PARAM_DATADGST_EN);
1189iscsi_conn_int_attr(ifmarker, ISCSI_PARAM_IFMARKER_EN, "%d"); 1145iscsi_conn_attr(ifmarker, ISCSI_PARAM_IFMARKER_EN);
1190iscsi_conn_int_attr(ofmarker, ISCSI_PARAM_OFMARKER_EN, "%d"); 1146iscsi_conn_attr(ofmarker, ISCSI_PARAM_OFMARKER_EN);
1191iscsi_conn_int_attr(persistent_port, ISCSI_PARAM_PERSISTENT_PORT, "%d"); 1147iscsi_conn_attr(persistent_port, ISCSI_PARAM_PERSISTENT_PORT);
1192iscsi_conn_int_attr(port, ISCSI_PARAM_CONN_PORT, "%d"); 1148iscsi_conn_attr(port, ISCSI_PARAM_CONN_PORT);
1193iscsi_conn_int_attr(exp_statsn, ISCSI_PARAM_EXP_STATSN, "%u"); 1149iscsi_conn_attr(exp_statsn, ISCSI_PARAM_EXP_STATSN);
1194 1150iscsi_conn_attr(persistent_address, ISCSI_PARAM_PERSISTENT_ADDRESS);
1195#define iscsi_conn_str_attr_show(param) \ 1151iscsi_conn_attr(address, ISCSI_PARAM_CONN_ADDRESS);
1196static ssize_t \
1197show_conn_str_param_##param(struct class_device *cdev, char *buf) \
1198{ \
1199 struct iscsi_cls_conn *conn = iscsi_cdev_to_conn(cdev); \
1200 struct iscsi_transport *t = conn->transport; \
1201 return t->get_conn_str_param(conn, param, buf); \
1202}
1203
1204#define iscsi_conn_str_attr(field, param) \
1205 iscsi_conn_str_attr_show(param) \
1206static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, show_conn_str_param_##param, \
1207 NULL);
1208
1209iscsi_conn_str_attr(persistent_address, ISCSI_PARAM_PERSISTENT_ADDRESS);
1210iscsi_conn_str_attr(address, ISCSI_PARAM_CONN_ADDRESS);
1211 1152
1212#define iscsi_cdev_to_session(_cdev) \ 1153#define iscsi_cdev_to_session(_cdev) \
1213 iscsi_dev_to_session(_cdev->dev) 1154 iscsi_dev_to_session(_cdev->dev)
@@ -1215,61 +1156,36 @@ iscsi_conn_str_attr(address, ISCSI_PARAM_CONN_ADDRESS);
1215/* 1156/*
1216 * iSCSI session attrs 1157 * iSCSI session attrs
1217 */ 1158 */
1218#define iscsi_session_int_attr_show(param, format) \ 1159#define iscsi_session_attr_show(param) \
1219static ssize_t \
1220show_session_int_param_##param(struct class_device *cdev, char *buf) \
1221{ \
1222 uint32_t value = 0; \
1223 struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \
1224 struct iscsi_transport *t = session->transport; \
1225 \
1226 t->get_session_param(session, param, &value); \
1227 return snprintf(buf, 20, format"\n", value); \
1228}
1229
1230#define iscsi_session_int_attr(field, param, format) \
1231 iscsi_session_int_attr_show(param, format) \
1232static ISCSI_CLASS_ATTR(sess, field, S_IRUGO, show_session_int_param_##param, \
1233 NULL);
1234
1235iscsi_session_int_attr(initial_r2t, ISCSI_PARAM_INITIAL_R2T_EN, "%d");
1236iscsi_session_int_attr(max_outstanding_r2t, ISCSI_PARAM_MAX_R2T, "%hu");
1237iscsi_session_int_attr(immediate_data, ISCSI_PARAM_IMM_DATA_EN, "%d");
1238iscsi_session_int_attr(first_burst_len, ISCSI_PARAM_FIRST_BURST, "%u");
1239iscsi_session_int_attr(max_burst_len, ISCSI_PARAM_MAX_BURST, "%u");
1240iscsi_session_int_attr(data_pdu_in_order, ISCSI_PARAM_PDU_INORDER_EN, "%d");
1241iscsi_session_int_attr(data_seq_in_order, ISCSI_PARAM_DATASEQ_INORDER_EN, "%d");
1242iscsi_session_int_attr(erl, ISCSI_PARAM_ERL, "%d");
1243iscsi_session_int_attr(tpgt, ISCSI_PARAM_TPGT, "%d");
1244
1245#define iscsi_session_str_attr_show(param) \
1246static ssize_t \ 1160static ssize_t \
1247show_session_str_param_##param(struct class_device *cdev, char *buf) \ 1161show_session_param_##param(struct class_device *cdev, char *buf) \
1248{ \ 1162{ \
1249 struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \ 1163 struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \
1250 struct iscsi_transport *t = session->transport; \ 1164 struct iscsi_transport *t = session->transport; \
1251 return t->get_session_str_param(session, param, buf); \ 1165 return t->get_session_param(session, param, buf); \
1252} 1166}
1253 1167
1254#define iscsi_session_str_attr(field, param) \ 1168#define iscsi_session_attr(field, param) \
1255 iscsi_session_str_attr_show(param) \ 1169 iscsi_session_attr_show(param) \
1256static ISCSI_CLASS_ATTR(sess, field, S_IRUGO, show_session_str_param_##param, \ 1170static ISCSI_CLASS_ATTR(sess, field, S_IRUGO, show_session_param_##param, \
1257 NULL); 1171 NULL);
1258 1172
1259iscsi_session_str_attr(targetname, ISCSI_PARAM_TARGET_NAME); 1173iscsi_session_attr(targetname, ISCSI_PARAM_TARGET_NAME);
1174iscsi_session_attr(initial_r2t, ISCSI_PARAM_INITIAL_R2T_EN);
1175iscsi_session_attr(max_outstanding_r2t, ISCSI_PARAM_MAX_R2T);
1176iscsi_session_attr(immediate_data, ISCSI_PARAM_IMM_DATA_EN);
1177iscsi_session_attr(first_burst_len, ISCSI_PARAM_FIRST_BURST);
1178iscsi_session_attr(max_burst_len, ISCSI_PARAM_MAX_BURST);
1179iscsi_session_attr(data_pdu_in_order, ISCSI_PARAM_PDU_INORDER_EN);
1180iscsi_session_attr(data_seq_in_order, ISCSI_PARAM_DATASEQ_INORDER_EN);
1181iscsi_session_attr(erl, ISCSI_PARAM_ERL);
1182iscsi_session_attr(tpgt, ISCSI_PARAM_TPGT);
1260 1183
1261/*
1262 * Private session and conn attrs. userspace uses several iscsi values
1263 * to identify each session between reboots. Some of these values may not
1264 * be present in the iscsi_transport/LLD driver becuase userspace handles
1265 * login (and failback for login redirect) so for these type of drivers
1266 * the class manages the attrs and values for the iscsi_transport/LLD
1267 */
1268#define iscsi_priv_session_attr_show(field, format) \ 1184#define iscsi_priv_session_attr_show(field, format) \
1269static ssize_t \ 1185static ssize_t \
1270show_priv_session_##field(struct class_device *cdev, char *buf) \ 1186show_priv_session_##field(struct class_device *cdev, char *buf) \
1271{ \ 1187{ \
1272 struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \ 1188 struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev);\
1273 return sprintf(buf, format"\n", session->field); \ 1189 return sprintf(buf, format"\n", session->field); \
1274} 1190}
1275 1191
@@ -1277,31 +1193,15 @@ show_priv_session_##field(struct class_device *cdev, char *buf) \
1277 iscsi_priv_session_attr_show(field, format) \ 1193 iscsi_priv_session_attr_show(field, format) \
1278static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO, show_priv_session_##field, \ 1194static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO, show_priv_session_##field, \
1279 NULL) 1195 NULL)
1280iscsi_priv_session_attr(targetname, "%s");
1281iscsi_priv_session_attr(tpgt, "%d");
1282iscsi_priv_session_attr(recovery_tmo, "%d"); 1196iscsi_priv_session_attr(recovery_tmo, "%d");
1283 1197
1284#define iscsi_priv_conn_attr_show(field, format) \
1285static ssize_t \
1286show_priv_conn_##field(struct class_device *cdev, char *buf) \
1287{ \
1288 struct iscsi_cls_conn *conn = iscsi_cdev_to_conn(cdev); \
1289 return sprintf(buf, format"\n", conn->field); \
1290}
1291
1292#define iscsi_priv_conn_attr(field, format) \
1293 iscsi_priv_conn_attr_show(field, format) \
1294static ISCSI_CLASS_ATTR(priv_conn, field, S_IRUGO, show_priv_conn_##field, \
1295 NULL)
1296iscsi_priv_conn_attr(persistent_address, "%s");
1297iscsi_priv_conn_attr(persistent_port, "%d");
1298
1299#define SETUP_PRIV_SESSION_RD_ATTR(field) \ 1198#define SETUP_PRIV_SESSION_RD_ATTR(field) \
1300do { \ 1199do { \
1301 priv->session_attrs[count] = &class_device_attr_priv_sess_##field; \ 1200 priv->session_attrs[count] = &class_device_attr_priv_sess_##field; \
1302 count++; \ 1201 count++; \
1303} while (0) 1202} while (0)
1304 1203
1204
1305#define SETUP_SESSION_RD_ATTR(field, param_flag) \ 1205#define SETUP_SESSION_RD_ATTR(field, param_flag) \
1306do { \ 1206do { \
1307 if (tt->param_mask & param_flag) { \ 1207 if (tt->param_mask & param_flag) { \
@@ -1310,12 +1210,6 @@ do { \
1310 } \ 1210 } \
1311} while (0) 1211} while (0)
1312 1212
1313#define SETUP_PRIV_CONN_RD_ATTR(field) \
1314do { \
1315 priv->conn_attrs[count] = &class_device_attr_priv_conn_##field; \
1316 count++; \
1317} while (0)
1318
1319#define SETUP_CONN_RD_ATTR(field, param_flag) \ 1213#define SETUP_CONN_RD_ATTR(field, param_flag) \
1320do { \ 1214do { \
1321 if (tt->param_mask & param_flag) { \ 1215 if (tt->param_mask & param_flag) { \
@@ -1442,16 +1336,8 @@ iscsi_register_transport(struct iscsi_transport *tt)
1442 SETUP_CONN_RD_ATTR(address, ISCSI_CONN_ADDRESS); 1336 SETUP_CONN_RD_ATTR(address, ISCSI_CONN_ADDRESS);
1443 SETUP_CONN_RD_ATTR(port, ISCSI_CONN_PORT); 1337 SETUP_CONN_RD_ATTR(port, ISCSI_CONN_PORT);
1444 SETUP_CONN_RD_ATTR(exp_statsn, ISCSI_EXP_STATSN); 1338 SETUP_CONN_RD_ATTR(exp_statsn, ISCSI_EXP_STATSN);
1445 1339 SETUP_CONN_RD_ATTR(persistent_address, ISCSI_PERSISTENT_ADDRESS);
1446 if (tt->param_mask & ISCSI_PERSISTENT_ADDRESS) 1340 SETUP_CONN_RD_ATTR(persistent_port, ISCSI_PERSISTENT_PORT);
1447 SETUP_CONN_RD_ATTR(persistent_address, ISCSI_PERSISTENT_ADDRESS);
1448 else
1449 SETUP_PRIV_CONN_RD_ATTR(persistent_address);
1450
1451 if (tt->param_mask & ISCSI_PERSISTENT_PORT)
1452 SETUP_CONN_RD_ATTR(persistent_port, ISCSI_PERSISTENT_PORT);
1453 else
1454 SETUP_PRIV_CONN_RD_ATTR(persistent_port);
1455 1341
1456 BUG_ON(count > ISCSI_CONN_ATTRS); 1342 BUG_ON(count > ISCSI_CONN_ATTRS);
1457 priv->conn_attrs[count] = NULL; 1343 priv->conn_attrs[count] = NULL;
@@ -1471,18 +1357,10 @@ iscsi_register_transport(struct iscsi_transport *tt)
1471 SETUP_SESSION_RD_ATTR(data_pdu_in_order, ISCSI_PDU_INORDER_EN); 1357 SETUP_SESSION_RD_ATTR(data_pdu_in_order, ISCSI_PDU_INORDER_EN);
1472 SETUP_SESSION_RD_ATTR(data_seq_in_order, ISCSI_DATASEQ_INORDER_EN); 1358 SETUP_SESSION_RD_ATTR(data_seq_in_order, ISCSI_DATASEQ_INORDER_EN);
1473 SETUP_SESSION_RD_ATTR(erl, ISCSI_ERL); 1359 SETUP_SESSION_RD_ATTR(erl, ISCSI_ERL);
1360 SETUP_SESSION_RD_ATTR(targetname, ISCSI_TARGET_NAME);
1361 SETUP_SESSION_RD_ATTR(tpgt, ISCSI_TPGT);
1474 SETUP_PRIV_SESSION_RD_ATTR(recovery_tmo); 1362 SETUP_PRIV_SESSION_RD_ATTR(recovery_tmo);
1475 1363
1476 if (tt->param_mask & ISCSI_TARGET_NAME)
1477 SETUP_SESSION_RD_ATTR(targetname, ISCSI_TARGET_NAME);
1478 else
1479 SETUP_PRIV_SESSION_RD_ATTR(targetname);
1480
1481 if (tt->param_mask & ISCSI_TPGT)
1482 SETUP_SESSION_RD_ATTR(tpgt, ISCSI_TPGT);
1483 else
1484 SETUP_PRIV_SESSION_RD_ATTR(tpgt);
1485
1486 BUG_ON(count > ISCSI_SESSION_ATTRS); 1364 BUG_ON(count > ISCSI_SESSION_ATTRS);
1487 priv->session_attrs[count] = NULL; 1365 priv->session_attrs[count] = NULL;
1488 1366
diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h
index cbf7e58bd6f9..ba2760802ded 100644
--- a/include/scsi/libiscsi.h
+++ b/include/scsi/libiscsi.h
@@ -157,6 +157,11 @@ struct iscsi_conn {
157 int max_xmit_dlength; /* target_max_recv_dsl */ 157 int max_xmit_dlength; /* target_max_recv_dsl */
158 int hdrdgst_en; 158 int hdrdgst_en;
159 int datadgst_en; 159 int datadgst_en;
160 int ifmarker_en;
161 int ofmarker_en;
162 /* values userspace uses to id a conn */
163 int persistent_port;
164 char *persistent_address;
160 165
161 /* MIB-statistics */ 166 /* MIB-statistics */
162 uint64_t txdata_octets; 167 uint64_t txdata_octets;
@@ -196,8 +201,8 @@ struct iscsi_session {
196 int pdu_inorder_en; 201 int pdu_inorder_en;
197 int dataseq_inorder_en; 202 int dataseq_inorder_en;
198 int erl; 203 int erl;
199 int ifmarker_en; 204 int tpgt;
200 int ofmarker_en; 205 char *targetname;
201 206
202 /* control data */ 207 /* control data */
203 struct iscsi_transport *tt; 208 struct iscsi_transport *tt;
@@ -240,6 +245,10 @@ iscsi_session_setup(struct iscsi_transport *, struct scsi_transport_template *,
240extern void iscsi_session_teardown(struct iscsi_cls_session *); 245extern void iscsi_session_teardown(struct iscsi_cls_session *);
241extern struct iscsi_session *class_to_transport_session(struct iscsi_cls_session *); 246extern struct iscsi_session *class_to_transport_session(struct iscsi_cls_session *);
242extern void iscsi_session_recovery_timedout(struct iscsi_cls_session *); 247extern void iscsi_session_recovery_timedout(struct iscsi_cls_session *);
248extern int iscsi_set_param(struct iscsi_cls_conn *cls_conn,
249 enum iscsi_param param, char *buf, int buflen);
250extern int iscsi_session_get_param(struct iscsi_cls_session *cls_session,
251 enum iscsi_param param, char *buf);
243 252
244#define session_to_cls(_sess) \ 253#define session_to_cls(_sess) \
245 hostdata_session(_sess->host->hostdata) 254 hostdata_session(_sess->host->hostdata)
@@ -255,6 +264,8 @@ extern void iscsi_conn_stop(struct iscsi_cls_conn *, int);
255extern int iscsi_conn_bind(struct iscsi_cls_session *, struct iscsi_cls_conn *, 264extern int iscsi_conn_bind(struct iscsi_cls_session *, struct iscsi_cls_conn *,
256 int); 265 int);
257extern void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err); 266extern void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err);
267extern int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn,
268 enum iscsi_param param, char *buf);
258 269
259/* 270/*
260 * pdu and task processing 271 * pdu and task processing
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h
index b95151aec602..05397058a9b8 100644
--- a/include/scsi/scsi_transport_iscsi.h
+++ b/include/scsi/scsi_transport_iscsi.h
@@ -34,6 +34,7 @@ struct iscsi_cls_conn;
34struct iscsi_conn; 34struct iscsi_conn;
35struct iscsi_cmd_task; 35struct iscsi_cmd_task;
36struct iscsi_mgmt_task; 36struct iscsi_mgmt_task;
37struct sockaddr;
37 38
38/** 39/**
39 * struct iscsi_transport - iSCSI Transport template 40 * struct iscsi_transport - iSCSI Transport template
@@ -46,7 +47,12 @@ struct iscsi_mgmt_task;
46 * @bind_conn: associate this connection with existing iSCSI session 47 * @bind_conn: associate this connection with existing iSCSI session
47 * and specified transport descriptor 48 * and specified transport descriptor
48 * @destroy_conn: destroy inactive iSCSI connection 49 * @destroy_conn: destroy inactive iSCSI connection
49 * @set_param: set iSCSI Data-Path operational parameter 50 * @set_param: set iSCSI parameter. Return 0 on success, -ENODATA
51 * when param is not supported, and a -Exx value on other
52 * error.
53 * @get_param get iSCSI parameter. Must return number of bytes
54 * copied to buffer on success, -ENODATA when param
55 * is not supported, and a -Exx value on other error
50 * @start_conn: set connection to be operational 56 * @start_conn: set connection to be operational
51 * @stop_conn: suspend/recover/terminate connection 57 * @stop_conn: suspend/recover/terminate connection
52 * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text. 58 * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text.
@@ -97,15 +103,11 @@ struct iscsi_transport {
97 void (*stop_conn) (struct iscsi_cls_conn *conn, int flag); 103 void (*stop_conn) (struct iscsi_cls_conn *conn, int flag);
98 void (*destroy_conn) (struct iscsi_cls_conn *conn); 104 void (*destroy_conn) (struct iscsi_cls_conn *conn);
99 int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param, 105 int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param,
100 uint32_t value); 106 char *buf, int buflen);
101 int (*get_conn_param) (struct iscsi_cls_conn *conn, 107 int (*get_conn_param) (struct iscsi_cls_conn *conn,
102 enum iscsi_param param, uint32_t *value); 108 enum iscsi_param param, char *buf);
103 int (*get_session_param) (struct iscsi_cls_session *session, 109 int (*get_session_param) (struct iscsi_cls_session *session,
104 enum iscsi_param param, uint32_t *value); 110 enum iscsi_param param, char *buf);
105 int (*get_conn_str_param) (struct iscsi_cls_conn *conn,
106 enum iscsi_param param, char *buf);
107 int (*get_session_str_param) (struct iscsi_cls_session *session,
108 enum iscsi_param param, char *buf);
109 int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, 111 int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
110 char *data, uint32_t data_size); 112 char *data, uint32_t data_size);
111 void (*get_stats) (struct iscsi_cls_conn *conn, 113 void (*get_stats) (struct iscsi_cls_conn *conn,
@@ -157,13 +159,6 @@ struct iscsi_cls_conn {
157 struct iscsi_transport *transport; 159 struct iscsi_transport *transport;
158 uint32_t cid; /* connection id */ 160 uint32_t cid; /* connection id */
159 161
160 /* portal/group values we got during discovery */
161 char *persistent_address;
162 int persistent_port;
163 /* portal/group values we are currently using */
164 char *address;
165 int port;
166
167 int active; /* must be accessed with the connlock */ 162 int active; /* must be accessed with the connlock */
168 struct device dev; /* sysfs transport/container device */ 163 struct device dev; /* sysfs transport/container device */
169 struct mempool_zone *z_error; 164 struct mempool_zone *z_error;
@@ -187,10 +182,6 @@ struct iscsi_cls_session {
187 struct list_head host_list; 182 struct list_head host_list;
188 struct iscsi_transport *transport; 183 struct iscsi_transport *transport;
189 184
190 /* iSCSI values used as unique id by userspace. */
191 char *targetname;
192 int tpgt;
193
194 /* recovery fields */ 185 /* recovery fields */
195 int recovery_tmo; 186 int recovery_tmo;
196 struct work_struct recovery_work; 187 struct work_struct recovery_work;