Skip to content

Commit a54a52c

Browse files
Mike ChristieJames Bottomley
authored andcommitted
[SCSI] iscsi: fixup set/get param functions
Reduce duplication in the software iscsi_transport modules by adding a libiscsi function to handle the common grunt work. This also has the drivers return specifc -EXXX values for different errors so userspace can finally handle them in a sane way. Also just pass the sysfs buffers to the drivers so HW iscsi can get/set its string values, like targetname, and initiatorname. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
1 parent 01cb225 commit a54a52c

File tree

4 files changed

+246
-187
lines changed

4 files changed

+246
-187
lines changed

drivers/scsi/libiscsi.c

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1697,6 +1697,185 @@ int iscsi_conn_bind(struct iscsi_cls_session *cls_session,
16971697
}
16981698
EXPORT_SYMBOL_GPL(iscsi_conn_bind);
16991699

1700+
1701+
int 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+
}
1789+
EXPORT_SYMBOL_GPL(iscsi_set_param);
1790+
1791+
int 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+
}
1835+
EXPORT_SYMBOL_GPL(iscsi_session_get_param);
1836+
1837+
int 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+
}
1877+
EXPORT_SYMBOL_GPL(iscsi_conn_get_param);
1878+
17001879
MODULE_AUTHOR("Mike Christie");
17011880
MODULE_DESCRIPTION("iSCSI library functions");
17021881
MODULE_LICENSE("GPL");

0 commit comments

Comments
 (0)