diff options
Diffstat (limited to 'drivers/scsi/libiscsi.c')
-rw-r--r-- | drivers/scsi/libiscsi.c | 187 |
1 files changed, 186 insertions, 1 deletions
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index 2673a11a9495..7e6e031cc41b 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c | |||
@@ -1287,13 +1287,18 @@ iscsi_session_setup(struct iscsi_transport *iscsit, | |||
1287 | if (scsi_add_host(shost, NULL)) | 1287 | if (scsi_add_host(shost, NULL)) |
1288 | goto add_host_fail; | 1288 | goto add_host_fail; |
1289 | 1289 | ||
1290 | if (!try_module_get(iscsit->owner)) | ||
1291 | goto cls_session_fail; | ||
1292 | |||
1290 | cls_session = iscsi_create_session(shost, iscsit, 0); | 1293 | cls_session = iscsi_create_session(shost, iscsit, 0); |
1291 | if (!cls_session) | 1294 | if (!cls_session) |
1292 | goto cls_session_fail; | 1295 | goto module_put; |
1293 | *(unsigned long*)shost->hostdata = (unsigned long)cls_session; | 1296 | *(unsigned long*)shost->hostdata = (unsigned long)cls_session; |
1294 | 1297 | ||
1295 | return cls_session; | 1298 | return cls_session; |
1296 | 1299 | ||
1300 | module_put: | ||
1301 | module_put(iscsit->owner); | ||
1297 | cls_session_fail: | 1302 | cls_session_fail: |
1298 | scsi_remove_host(shost); | 1303 | scsi_remove_host(shost); |
1299 | add_host_fail: | 1304 | add_host_fail: |
@@ -1325,6 +1330,7 @@ void iscsi_session_teardown(struct iscsi_cls_session *cls_session) | |||
1325 | 1330 | ||
1326 | iscsi_destroy_session(cls_session); | 1331 | iscsi_destroy_session(cls_session); |
1327 | scsi_host_put(shost); | 1332 | scsi_host_put(shost); |
1333 | module_put(cls_session->transport->owner); | ||
1328 | } | 1334 | } |
1329 | EXPORT_SYMBOL_GPL(iscsi_session_teardown); | 1335 | EXPORT_SYMBOL_GPL(iscsi_session_teardown); |
1330 | 1336 | ||
@@ -1697,6 +1703,185 @@ int iscsi_conn_bind(struct iscsi_cls_session *cls_session, | |||
1697 | } | 1703 | } |
1698 | EXPORT_SYMBOL_GPL(iscsi_conn_bind); | 1704 | EXPORT_SYMBOL_GPL(iscsi_conn_bind); |
1699 | 1705 | ||
1706 | |||
1707 | int iscsi_set_param(struct iscsi_cls_conn *cls_conn, | ||
1708 | enum iscsi_param param, char *buf, int buflen) | ||
1709 | { | ||
1710 | struct iscsi_conn *conn = cls_conn->dd_data; | ||
1711 | struct iscsi_session *session = conn->session; | ||
1712 | uint32_t value; | ||
1713 | |||
1714 | switch(param) { | ||
1715 | case ISCSI_PARAM_MAX_RECV_DLENGTH: | ||
1716 | sscanf(buf, "%d", &conn->max_recv_dlength); | ||
1717 | break; | ||
1718 | case ISCSI_PARAM_MAX_XMIT_DLENGTH: | ||
1719 | sscanf(buf, "%d", &conn->max_xmit_dlength); | ||
1720 | break; | ||
1721 | case ISCSI_PARAM_HDRDGST_EN: | ||
1722 | sscanf(buf, "%d", &conn->hdrdgst_en); | ||
1723 | break; | ||
1724 | case ISCSI_PARAM_DATADGST_EN: | ||
1725 | sscanf(buf, "%d", &conn->datadgst_en); | ||
1726 | break; | ||
1727 | case ISCSI_PARAM_INITIAL_R2T_EN: | ||
1728 | sscanf(buf, "%d", &session->initial_r2t_en); | ||
1729 | break; | ||
1730 | case ISCSI_PARAM_MAX_R2T: | ||
1731 | sscanf(buf, "%d", &session->max_r2t); | ||
1732 | break; | ||
1733 | case ISCSI_PARAM_IMM_DATA_EN: | ||
1734 | sscanf(buf, "%d", &session->imm_data_en); | ||
1735 | break; | ||
1736 | case ISCSI_PARAM_FIRST_BURST: | ||
1737 | sscanf(buf, "%d", &session->first_burst); | ||
1738 | break; | ||
1739 | case ISCSI_PARAM_MAX_BURST: | ||
1740 | sscanf(buf, "%d", &session->max_burst); | ||
1741 | break; | ||
1742 | case ISCSI_PARAM_PDU_INORDER_EN: | ||
1743 | sscanf(buf, "%d", &session->pdu_inorder_en); | ||
1744 | break; | ||
1745 | case ISCSI_PARAM_DATASEQ_INORDER_EN: | ||
1746 | sscanf(buf, "%d", &session->dataseq_inorder_en); | ||
1747 | break; | ||
1748 | case ISCSI_PARAM_ERL: | ||
1749 | sscanf(buf, "%d", &session->erl); | ||
1750 | break; | ||
1751 | case ISCSI_PARAM_IFMARKER_EN: | ||
1752 | sscanf(buf, "%d", &value); | ||
1753 | BUG_ON(value); | ||
1754 | break; | ||
1755 | case ISCSI_PARAM_OFMARKER_EN: | ||
1756 | sscanf(buf, "%d", &value); | ||
1757 | BUG_ON(value); | ||
1758 | break; | ||
1759 | case ISCSI_PARAM_EXP_STATSN: | ||
1760 | sscanf(buf, "%u", &conn->exp_statsn); | ||
1761 | break; | ||
1762 | case ISCSI_PARAM_TARGET_NAME: | ||
1763 | /* this should not change between logins */ | ||
1764 | if (session->targetname) | ||
1765 | break; | ||
1766 | |||
1767 | session->targetname = kstrdup(buf, GFP_KERNEL); | ||
1768 | if (!session->targetname) | ||
1769 | return -ENOMEM; | ||
1770 | break; | ||
1771 | case ISCSI_PARAM_TPGT: | ||
1772 | sscanf(buf, "%d", &session->tpgt); | ||
1773 | break; | ||
1774 | case ISCSI_PARAM_PERSISTENT_PORT: | ||
1775 | sscanf(buf, "%d", &conn->persistent_port); | ||
1776 | break; | ||
1777 | case ISCSI_PARAM_PERSISTENT_ADDRESS: | ||
1778 | /* | ||
1779 | * this is the address returned in discovery so it should | ||
1780 | * not change between logins. | ||
1781 | */ | ||
1782 | if (conn->persistent_address) | ||
1783 | break; | ||
1784 | |||
1785 | conn->persistent_address = kstrdup(buf, GFP_KERNEL); | ||
1786 | if (!conn->persistent_address) | ||
1787 | return -ENOMEM; | ||
1788 | break; | ||
1789 | default: | ||
1790 | return -ENOSYS; | ||
1791 | } | ||
1792 | |||
1793 | return 0; | ||
1794 | } | ||
1795 | EXPORT_SYMBOL_GPL(iscsi_set_param); | ||
1796 | |||
1797 | int iscsi_session_get_param(struct iscsi_cls_session *cls_session, | ||
1798 | enum iscsi_param param, char *buf) | ||
1799 | { | ||
1800 | struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); | ||
1801 | struct iscsi_session *session = iscsi_hostdata(shost->hostdata); | ||
1802 | int len; | ||
1803 | |||
1804 | switch(param) { | ||
1805 | case ISCSI_PARAM_INITIAL_R2T_EN: | ||
1806 | len = sprintf(buf, "%d\n", session->initial_r2t_en); | ||
1807 | break; | ||
1808 | case ISCSI_PARAM_MAX_R2T: | ||
1809 | len = sprintf(buf, "%hu\n", session->max_r2t); | ||
1810 | break; | ||
1811 | case ISCSI_PARAM_IMM_DATA_EN: | ||
1812 | len = sprintf(buf, "%d\n", session->imm_data_en); | ||
1813 | break; | ||
1814 | case ISCSI_PARAM_FIRST_BURST: | ||
1815 | len = sprintf(buf, "%u\n", session->first_burst); | ||
1816 | break; | ||
1817 | case ISCSI_PARAM_MAX_BURST: | ||
1818 | len = sprintf(buf, "%u\n", session->max_burst); | ||
1819 | break; | ||
1820 | case ISCSI_PARAM_PDU_INORDER_EN: | ||
1821 | len = sprintf(buf, "%d\n", session->pdu_inorder_en); | ||
1822 | break; | ||
1823 | case ISCSI_PARAM_DATASEQ_INORDER_EN: | ||
1824 | len = sprintf(buf, "%d\n", session->dataseq_inorder_en); | ||
1825 | break; | ||
1826 | case ISCSI_PARAM_ERL: | ||
1827 | len = sprintf(buf, "%d\n", session->erl); | ||
1828 | break; | ||
1829 | case ISCSI_PARAM_TARGET_NAME: | ||
1830 | len = sprintf(buf, "%s\n", session->targetname); | ||
1831 | break; | ||
1832 | case ISCSI_PARAM_TPGT: | ||
1833 | len = sprintf(buf, "%d\n", session->tpgt); | ||
1834 | break; | ||
1835 | default: | ||
1836 | return -ENOSYS; | ||
1837 | } | ||
1838 | |||
1839 | return len; | ||
1840 | } | ||
1841 | EXPORT_SYMBOL_GPL(iscsi_session_get_param); | ||
1842 | |||
1843 | int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn, | ||
1844 | enum iscsi_param param, char *buf) | ||
1845 | { | ||
1846 | struct iscsi_conn *conn = cls_conn->dd_data; | ||
1847 | int len; | ||
1848 | |||
1849 | switch(param) { | ||
1850 | case ISCSI_PARAM_MAX_RECV_DLENGTH: | ||
1851 | len = sprintf(buf, "%u\n", conn->max_recv_dlength); | ||
1852 | break; | ||
1853 | case ISCSI_PARAM_MAX_XMIT_DLENGTH: | ||
1854 | len = sprintf(buf, "%u\n", conn->max_xmit_dlength); | ||
1855 | break; | ||
1856 | case ISCSI_PARAM_HDRDGST_EN: | ||
1857 | len = sprintf(buf, "%d\n", conn->hdrdgst_en); | ||
1858 | break; | ||
1859 | case ISCSI_PARAM_DATADGST_EN: | ||
1860 | len = sprintf(buf, "%d\n", conn->datadgst_en); | ||
1861 | break; | ||
1862 | case ISCSI_PARAM_IFMARKER_EN: | ||
1863 | len = sprintf(buf, "%d\n", conn->ifmarker_en); | ||
1864 | break; | ||
1865 | case ISCSI_PARAM_OFMARKER_EN: | ||
1866 | len = sprintf(buf, "%d\n", conn->ofmarker_en); | ||
1867 | break; | ||
1868 | case ISCSI_PARAM_EXP_STATSN: | ||
1869 | len = sprintf(buf, "%u\n", conn->exp_statsn); | ||
1870 | break; | ||
1871 | case ISCSI_PARAM_PERSISTENT_PORT: | ||
1872 | len = sprintf(buf, "%d\n", conn->persistent_port); | ||
1873 | break; | ||
1874 | case ISCSI_PARAM_PERSISTENT_ADDRESS: | ||
1875 | len = sprintf(buf, "%s\n", conn->persistent_address); | ||
1876 | break; | ||
1877 | default: | ||
1878 | return -ENOSYS; | ||
1879 | } | ||
1880 | |||
1881 | return len; | ||
1882 | } | ||
1883 | EXPORT_SYMBOL_GPL(iscsi_conn_get_param); | ||
1884 | |||
1700 | MODULE_AUTHOR("Mike Christie"); | 1885 | MODULE_AUTHOR("Mike Christie"); |
1701 | MODULE_DESCRIPTION("iSCSI library functions"); | 1886 | MODULE_DESCRIPTION("iSCSI library functions"); |
1702 | MODULE_LICENSE("GPL"); | 1887 | MODULE_LICENSE("GPL"); |