scsi_transport_iscsi.c 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626
  1. /*
  2. * iSCSI transport class definitions
  3. *
  4. * Copyright (C) IBM Corporation, 2004
  5. * Copyright (C) Mike Christie, 2004 - 2005
  6. * Copyright (C) Dmitry Yusupov, 2004 - 2005
  7. * Copyright (C) Alex Aizman, 2004 - 2005
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 2 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  22. */
  23. #include <linux/module.h>
  24. #include <linux/mempool.h>
  25. #include <linux/mutex.h>
  26. #include <net/tcp.h>
  27. #include <scsi/scsi.h>
  28. #include <scsi/scsi_host.h>
  29. #include <scsi/scsi_device.h>
  30. #include <scsi/scsi_transport.h>
  31. #include <scsi/scsi_transport_iscsi.h>
  32. #include <scsi/iscsi_if.h>
  33. #define ISCSI_SESSION_ATTRS 11
  34. #define ISCSI_CONN_ATTRS 11
  35. #define ISCSI_HOST_ATTRS 0
  36. struct iscsi_internal {
  37. int daemon_pid;
  38. struct scsi_transport_template t;
  39. struct iscsi_transport *iscsi_transport;
  40. struct list_head list;
  41. struct class_device cdev;
  42. struct class_device_attribute *host_attrs[ISCSI_HOST_ATTRS + 1];
  43. struct transport_container conn_cont;
  44. struct class_device_attribute *conn_attrs[ISCSI_CONN_ATTRS + 1];
  45. struct transport_container session_cont;
  46. struct class_device_attribute *session_attrs[ISCSI_SESSION_ATTRS + 1];
  47. };
  48. static int iscsi_session_nr; /* sysfs session id for next new session */
  49. /*
  50. * list of registered transports and lock that must
  51. * be held while accessing list. The iscsi_transport_lock must
  52. * be acquired after the rx_queue_mutex.
  53. */
  54. static LIST_HEAD(iscsi_transports);
  55. static DEFINE_SPINLOCK(iscsi_transport_lock);
  56. #define to_iscsi_internal(tmpl) \
  57. container_of(tmpl, struct iscsi_internal, t)
  58. #define cdev_to_iscsi_internal(_cdev) \
  59. container_of(_cdev, struct iscsi_internal, cdev)
  60. static void iscsi_transport_release(struct class_device *cdev)
  61. {
  62. struct iscsi_internal *priv = cdev_to_iscsi_internal(cdev);
  63. kfree(priv);
  64. }
  65. /*
  66. * iscsi_transport_class represents the iscsi_transports that are
  67. * registered.
  68. */
  69. static struct class iscsi_transport_class = {
  70. .name = "iscsi_transport",
  71. .release = iscsi_transport_release,
  72. };
  73. static ssize_t
  74. show_transport_handle(struct class_device *cdev, char *buf)
  75. {
  76. struct iscsi_internal *priv = cdev_to_iscsi_internal(cdev);
  77. return sprintf(buf, "%llu\n", (unsigned long long)iscsi_handle(priv->iscsi_transport));
  78. }
  79. static CLASS_DEVICE_ATTR(handle, S_IRUGO, show_transport_handle, NULL);
  80. #define show_transport_attr(name, format) \
  81. static ssize_t \
  82. show_transport_##name(struct class_device *cdev, char *buf) \
  83. { \
  84. struct iscsi_internal *priv = cdev_to_iscsi_internal(cdev); \
  85. return sprintf(buf, format"\n", priv->iscsi_transport->name); \
  86. } \
  87. static CLASS_DEVICE_ATTR(name, S_IRUGO, show_transport_##name, NULL);
  88. show_transport_attr(caps, "0x%x");
  89. show_transport_attr(max_lun, "%d");
  90. show_transport_attr(max_conn, "%d");
  91. show_transport_attr(max_cmd_len, "%d");
  92. static struct attribute *iscsi_transport_attrs[] = {
  93. &class_device_attr_handle.attr,
  94. &class_device_attr_caps.attr,
  95. &class_device_attr_max_lun.attr,
  96. &class_device_attr_max_conn.attr,
  97. &class_device_attr_max_cmd_len.attr,
  98. NULL,
  99. };
  100. static struct attribute_group iscsi_transport_group = {
  101. .attrs = iscsi_transport_attrs,
  102. };
  103. static int iscsi_setup_host(struct transport_container *tc, struct device *dev,
  104. struct class_device *cdev)
  105. {
  106. struct Scsi_Host *shost = dev_to_shost(dev);
  107. struct iscsi_host *ihost = shost->shost_data;
  108. memset(ihost, 0, sizeof(*ihost));
  109. INIT_LIST_HEAD(&ihost->sessions);
  110. mutex_init(&ihost->mutex);
  111. return 0;
  112. }
  113. static DECLARE_TRANSPORT_CLASS(iscsi_host_class,
  114. "iscsi_host",
  115. iscsi_setup_host,
  116. NULL,
  117. NULL);
  118. static DECLARE_TRANSPORT_CLASS(iscsi_session_class,
  119. "iscsi_session",
  120. NULL,
  121. NULL,
  122. NULL);
  123. static DECLARE_TRANSPORT_CLASS(iscsi_connection_class,
  124. "iscsi_connection",
  125. NULL,
  126. NULL,
  127. NULL);
  128. static struct sock *nls;
  129. static DEFINE_MUTEX(rx_queue_mutex);
  130. struct mempool_zone {
  131. mempool_t *pool;
  132. atomic_t allocated;
  133. int size;
  134. int hiwat;
  135. struct list_head freequeue;
  136. spinlock_t freelock;
  137. };
  138. static struct mempool_zone *z_reply;
  139. /*
  140. * Z_MAX_* - actual mempool size allocated at the mempool_zone_init() time
  141. * Z_HIWAT_* - zone's high watermark when if_error bit will be set to -ENOMEM
  142. * so daemon will notice OOM on NETLINK tranposrt level and will
  143. * be able to predict or change operational behavior
  144. */
  145. #define Z_MAX_REPLY 8
  146. #define Z_HIWAT_REPLY 6
  147. #define Z_MAX_PDU 8
  148. #define Z_HIWAT_PDU 6
  149. #define Z_MAX_ERROR 16
  150. #define Z_HIWAT_ERROR 12
  151. static LIST_HEAD(sesslist);
  152. static DEFINE_SPINLOCK(sesslock);
  153. static LIST_HEAD(connlist);
  154. static DEFINE_SPINLOCK(connlock);
  155. static uint32_t iscsi_conn_get_sid(struct iscsi_cls_conn *conn)
  156. {
  157. struct iscsi_cls_session *sess = iscsi_dev_to_session(conn->dev.parent);
  158. return sess->sid;
  159. }
  160. /*
  161. * Returns the matching session to a given sid
  162. */
  163. static struct iscsi_cls_session *iscsi_session_lookup(uint32_t sid)
  164. {
  165. unsigned long flags;
  166. struct iscsi_cls_session *sess;
  167. spin_lock_irqsave(&sesslock, flags);
  168. list_for_each_entry(sess, &sesslist, sess_list) {
  169. if (sess->sid == sid) {
  170. spin_unlock_irqrestore(&sesslock, flags);
  171. return sess;
  172. }
  173. }
  174. spin_unlock_irqrestore(&sesslock, flags);
  175. return NULL;
  176. }
  177. /*
  178. * Returns the matching connection to a given sid / cid tuple
  179. */
  180. static struct iscsi_cls_conn *iscsi_conn_lookup(uint32_t sid, uint32_t cid)
  181. {
  182. unsigned long flags;
  183. struct iscsi_cls_conn *conn;
  184. spin_lock_irqsave(&connlock, flags);
  185. list_for_each_entry(conn, &connlist, conn_list) {
  186. if ((conn->cid == cid) && (iscsi_conn_get_sid(conn) == sid)) {
  187. spin_unlock_irqrestore(&connlock, flags);
  188. return conn;
  189. }
  190. }
  191. spin_unlock_irqrestore(&connlock, flags);
  192. return NULL;
  193. }
  194. /*
  195. * The following functions can be used by LLDs that allocate
  196. * their own scsi_hosts or by software iscsi LLDs
  197. */
  198. static void iscsi_session_release(struct device *dev)
  199. {
  200. struct iscsi_cls_session *session = iscsi_dev_to_session(dev);
  201. struct iscsi_transport *transport = session->transport;
  202. struct Scsi_Host *shost;
  203. shost = iscsi_session_to_shost(session);
  204. scsi_host_put(shost);
  205. kfree(session->targetname);
  206. kfree(session);
  207. module_put(transport->owner);
  208. }
  209. static int iscsi_is_session_dev(const struct device *dev)
  210. {
  211. return dev->release == iscsi_session_release;
  212. }
  213. static int iscsi_user_scan(struct Scsi_Host *shost, uint channel,
  214. uint id, uint lun)
  215. {
  216. struct iscsi_host *ihost = shost->shost_data;
  217. struct iscsi_cls_session *session;
  218. mutex_lock(&ihost->mutex);
  219. list_for_each_entry(session, &ihost->sessions, host_list) {
  220. if ((channel == SCAN_WILD_CARD ||
  221. channel == session->channel) &&
  222. (id == SCAN_WILD_CARD || id == session->target_id))
  223. scsi_scan_target(&session->dev, session->channel,
  224. session->target_id, lun, 1);
  225. }
  226. mutex_unlock(&ihost->mutex);
  227. return 0;
  228. }
  229. static void session_recovery_timedout(void *data)
  230. {
  231. struct iscsi_cls_session *session = data;
  232. dev_printk(KERN_INFO, &session->dev, "iscsi: session recovery timed "
  233. "out after %d secs\n", session->recovery_tmo);
  234. if (session->transport->session_recovery_timedout)
  235. session->transport->session_recovery_timedout(session);
  236. scsi_target_unblock(&session->dev);
  237. }
  238. void iscsi_unblock_session(struct iscsi_cls_session *session)
  239. {
  240. if (!cancel_delayed_work(&session->recovery_work))
  241. flush_scheduled_work();
  242. scsi_target_unblock(&session->dev);
  243. }
  244. EXPORT_SYMBOL_GPL(iscsi_unblock_session);
  245. void iscsi_block_session(struct iscsi_cls_session *session)
  246. {
  247. scsi_target_block(&session->dev);
  248. schedule_delayed_work(&session->recovery_work,
  249. session->recovery_tmo * HZ);
  250. }
  251. EXPORT_SYMBOL_GPL(iscsi_block_session);
  252. /**
  253. * iscsi_create_session - create iscsi class session
  254. * @shost: scsi host
  255. * @transport: iscsi transport
  256. *
  257. * This can be called from a LLD or iscsi_transport.
  258. **/
  259. struct iscsi_cls_session *
  260. iscsi_create_session(struct Scsi_Host *shost,
  261. struct iscsi_transport *transport, int channel)
  262. {
  263. struct iscsi_host *ihost;
  264. struct iscsi_cls_session *session;
  265. int err;
  266. if (!try_module_get(transport->owner))
  267. return NULL;
  268. session = kzalloc(sizeof(*session) + transport->sessiondata_size,
  269. GFP_KERNEL);
  270. if (!session)
  271. goto module_put;
  272. session->transport = transport;
  273. session->recovery_tmo = 120;
  274. INIT_WORK(&session->recovery_work, session_recovery_timedout, session);
  275. INIT_LIST_HEAD(&session->host_list);
  276. INIT_LIST_HEAD(&session->sess_list);
  277. if (transport->sessiondata_size)
  278. session->dd_data = &session[1];
  279. /* this is released in the dev's release function */
  280. scsi_host_get(shost);
  281. ihost = shost->shost_data;
  282. session->sid = iscsi_session_nr++;
  283. session->channel = channel;
  284. session->target_id = ihost->next_target_id++;
  285. snprintf(session->dev.bus_id, BUS_ID_SIZE, "session%u",
  286. session->sid);
  287. session->dev.parent = &shost->shost_gendev;
  288. session->dev.release = iscsi_session_release;
  289. err = device_register(&session->dev);
  290. if (err) {
  291. dev_printk(KERN_ERR, &session->dev, "iscsi: could not "
  292. "register session's dev\n");
  293. goto free_session;
  294. }
  295. transport_register_device(&session->dev);
  296. mutex_lock(&ihost->mutex);
  297. list_add(&session->host_list, &ihost->sessions);
  298. mutex_unlock(&ihost->mutex);
  299. return session;
  300. free_session:
  301. kfree(session);
  302. module_put:
  303. module_put(transport->owner);
  304. return NULL;
  305. }
  306. EXPORT_SYMBOL_GPL(iscsi_create_session);
  307. /**
  308. * iscsi_destroy_session - destroy iscsi session
  309. * @session: iscsi_session
  310. *
  311. * Can be called by a LLD or iscsi_transport. There must not be
  312. * any running connections.
  313. **/
  314. int iscsi_destroy_session(struct iscsi_cls_session *session)
  315. {
  316. struct Scsi_Host *shost = iscsi_session_to_shost(session);
  317. struct iscsi_host *ihost = shost->shost_data;
  318. if (!cancel_delayed_work(&session->recovery_work))
  319. flush_scheduled_work();
  320. mutex_lock(&ihost->mutex);
  321. list_del(&session->host_list);
  322. mutex_unlock(&ihost->mutex);
  323. transport_unregister_device(&session->dev);
  324. device_unregister(&session->dev);
  325. return 0;
  326. }
  327. EXPORT_SYMBOL_GPL(iscsi_destroy_session);
  328. static void iscsi_conn_release(struct device *dev)
  329. {
  330. struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev);
  331. struct device *parent = conn->dev.parent;
  332. kfree(conn->persistent_address);
  333. kfree(conn);
  334. put_device(parent);
  335. }
  336. static int iscsi_is_conn_dev(const struct device *dev)
  337. {
  338. return dev->release == iscsi_conn_release;
  339. }
  340. /**
  341. * iscsi_create_conn - create iscsi class connection
  342. * @session: iscsi cls session
  343. * @cid: connection id
  344. *
  345. * This can be called from a LLD or iscsi_transport. The connection
  346. * is child of the session so cid must be unique for all connections
  347. * on the session.
  348. *
  349. * Since we do not support MCS, cid will normally be zero. In some cases
  350. * for software iscsi we could be trying to preallocate a connection struct
  351. * in which case there could be two connection structs and cid would be
  352. * non-zero.
  353. **/
  354. struct iscsi_cls_conn *
  355. iscsi_create_conn(struct iscsi_cls_session *session, uint32_t cid)
  356. {
  357. struct iscsi_transport *transport = session->transport;
  358. struct iscsi_cls_conn *conn;
  359. int err;
  360. conn = kzalloc(sizeof(*conn) + transport->conndata_size, GFP_KERNEL);
  361. if (!conn)
  362. return NULL;
  363. if (transport->conndata_size)
  364. conn->dd_data = &conn[1];
  365. INIT_LIST_HEAD(&conn->conn_list);
  366. conn->transport = transport;
  367. conn->cid = cid;
  368. /* this is released in the dev's release function */
  369. if (!get_device(&session->dev))
  370. goto free_conn;
  371. snprintf(conn->dev.bus_id, BUS_ID_SIZE, "connection%d:%u",
  372. session->sid, cid);
  373. conn->dev.parent = &session->dev;
  374. conn->dev.release = iscsi_conn_release;
  375. err = device_register(&conn->dev);
  376. if (err) {
  377. dev_printk(KERN_ERR, &conn->dev, "iscsi: could not register "
  378. "connection's dev\n");
  379. goto release_parent_ref;
  380. }
  381. transport_register_device(&conn->dev);
  382. return conn;
  383. release_parent_ref:
  384. put_device(&session->dev);
  385. free_conn:
  386. kfree(conn);
  387. return NULL;
  388. }
  389. EXPORT_SYMBOL_GPL(iscsi_create_conn);
  390. /**
  391. * iscsi_destroy_conn - destroy iscsi class connection
  392. * @session: iscsi cls session
  393. *
  394. * This can be called from a LLD or iscsi_transport.
  395. **/
  396. int iscsi_destroy_conn(struct iscsi_cls_conn *conn)
  397. {
  398. transport_unregister_device(&conn->dev);
  399. device_unregister(&conn->dev);
  400. return 0;
  401. }
  402. EXPORT_SYMBOL_GPL(iscsi_destroy_conn);
  403. /*
  404. * iscsi interface functions
  405. */
  406. static struct iscsi_internal *
  407. iscsi_if_transport_lookup(struct iscsi_transport *tt)
  408. {
  409. struct iscsi_internal *priv;
  410. unsigned long flags;
  411. spin_lock_irqsave(&iscsi_transport_lock, flags);
  412. list_for_each_entry(priv, &iscsi_transports, list) {
  413. if (tt == priv->iscsi_transport) {
  414. spin_unlock_irqrestore(&iscsi_transport_lock, flags);
  415. return priv;
  416. }
  417. }
  418. spin_unlock_irqrestore(&iscsi_transport_lock, flags);
  419. return NULL;
  420. }
  421. static inline struct list_head *skb_to_lh(struct sk_buff *skb)
  422. {
  423. return (struct list_head *)&skb->cb;
  424. }
  425. static void*
  426. mempool_zone_alloc_skb(gfp_t gfp_mask, void *pool_data)
  427. {
  428. struct mempool_zone *zone = pool_data;
  429. return alloc_skb(zone->size, gfp_mask);
  430. }
  431. static void
  432. mempool_zone_free_skb(void *element, void *pool_data)
  433. {
  434. kfree_skb(element);
  435. }
  436. static void
  437. mempool_zone_complete(struct mempool_zone *zone)
  438. {
  439. unsigned long flags;
  440. struct list_head *lh, *n;
  441. spin_lock_irqsave(&zone->freelock, flags);
  442. list_for_each_safe(lh, n, &zone->freequeue) {
  443. struct sk_buff *skb = (struct sk_buff *)((char *)lh -
  444. offsetof(struct sk_buff, cb));
  445. if (!skb_shared(skb)) {
  446. list_del(skb_to_lh(skb));
  447. mempool_free(skb, zone->pool);
  448. atomic_dec(&zone->allocated);
  449. }
  450. }
  451. spin_unlock_irqrestore(&zone->freelock, flags);
  452. }
  453. static struct mempool_zone *
  454. mempool_zone_init(unsigned max, unsigned size, unsigned hiwat)
  455. {
  456. struct mempool_zone *zp;
  457. zp = kzalloc(sizeof(*zp), GFP_KERNEL);
  458. if (!zp)
  459. return NULL;
  460. zp->size = size;
  461. zp->hiwat = hiwat;
  462. INIT_LIST_HEAD(&zp->freequeue);
  463. spin_lock_init(&zp->freelock);
  464. atomic_set(&zp->allocated, 0);
  465. zp->pool = mempool_create(max, mempool_zone_alloc_skb,
  466. mempool_zone_free_skb, zp);
  467. if (!zp->pool) {
  468. kfree(zp);
  469. return NULL;
  470. }
  471. return zp;
  472. }
  473. static void mempool_zone_destroy(struct mempool_zone *zp)
  474. {
  475. mempool_destroy(zp->pool);
  476. kfree(zp);
  477. }
  478. static struct sk_buff*
  479. mempool_zone_get_skb(struct mempool_zone *zone)
  480. {
  481. struct sk_buff *skb;
  482. skb = mempool_alloc(zone->pool, GFP_ATOMIC);
  483. if (skb)
  484. atomic_inc(&zone->allocated);
  485. return skb;
  486. }
  487. static int
  488. iscsi_unicast_skb(struct mempool_zone *zone, struct sk_buff *skb, int pid)
  489. {
  490. unsigned long flags;
  491. int rc;
  492. skb_get(skb);
  493. rc = netlink_unicast(nls, skb, pid, MSG_DONTWAIT);
  494. if (rc < 0) {
  495. mempool_free(skb, zone->pool);
  496. printk(KERN_ERR "iscsi: can not unicast skb (%d)\n", rc);
  497. return rc;
  498. }
  499. spin_lock_irqsave(&zone->freelock, flags);
  500. INIT_LIST_HEAD(skb_to_lh(skb));
  501. list_add(skb_to_lh(skb), &zone->freequeue);
  502. spin_unlock_irqrestore(&zone->freelock, flags);
  503. return 0;
  504. }
  505. int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
  506. char *data, uint32_t data_size)
  507. {
  508. struct nlmsghdr *nlh;
  509. struct sk_buff *skb;
  510. struct iscsi_uevent *ev;
  511. char *pdu;
  512. struct iscsi_internal *priv;
  513. int len = NLMSG_SPACE(sizeof(*ev) + sizeof(struct iscsi_hdr) +
  514. data_size);
  515. priv = iscsi_if_transport_lookup(conn->transport);
  516. if (!priv)
  517. return -EINVAL;
  518. mempool_zone_complete(conn->z_pdu);
  519. skb = mempool_zone_get_skb(conn->z_pdu);
  520. if (!skb) {
  521. iscsi_conn_error(conn, ISCSI_ERR_CONN_FAILED);
  522. dev_printk(KERN_ERR, &conn->dev, "iscsi: can not deliver "
  523. "control PDU: OOM\n");
  524. return -ENOMEM;
  525. }
  526. nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0);
  527. ev = NLMSG_DATA(nlh);
  528. memset(ev, 0, sizeof(*ev));
  529. ev->transport_handle = iscsi_handle(conn->transport);
  530. ev->type = ISCSI_KEVENT_RECV_PDU;
  531. if (atomic_read(&conn->z_pdu->allocated) >= conn->z_pdu->hiwat)
  532. ev->iferror = -ENOMEM;
  533. ev->r.recv_req.cid = conn->cid;
  534. ev->r.recv_req.sid = iscsi_conn_get_sid(conn);
  535. pdu = (char*)ev + sizeof(*ev);
  536. memcpy(pdu, hdr, sizeof(struct iscsi_hdr));
  537. memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size);
  538. return iscsi_unicast_skb(conn->z_pdu, skb, priv->daemon_pid);
  539. }
  540. EXPORT_SYMBOL_GPL(iscsi_recv_pdu);
  541. void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error)
  542. {
  543. struct nlmsghdr *nlh;
  544. struct sk_buff *skb;
  545. struct iscsi_uevent *ev;
  546. struct iscsi_internal *priv;
  547. int len = NLMSG_SPACE(sizeof(*ev));
  548. priv = iscsi_if_transport_lookup(conn->transport);
  549. if (!priv)
  550. return;
  551. mempool_zone_complete(conn->z_error);
  552. skb = mempool_zone_get_skb(conn->z_error);
  553. if (!skb) {
  554. dev_printk(KERN_ERR, &conn->dev, "iscsi: gracefully ignored "
  555. "conn error (%d)\n", error);
  556. return;
  557. }
  558. nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0);
  559. ev = NLMSG_DATA(nlh);
  560. ev->transport_handle = iscsi_handle(conn->transport);
  561. ev->type = ISCSI_KEVENT_CONN_ERROR;
  562. if (atomic_read(&conn->z_error->allocated) >= conn->z_error->hiwat)
  563. ev->iferror = -ENOMEM;
  564. ev->r.connerror.error = error;
  565. ev->r.connerror.cid = conn->cid;
  566. ev->r.connerror.sid = iscsi_conn_get_sid(conn);
  567. iscsi_unicast_skb(conn->z_error, skb, priv->daemon_pid);
  568. dev_printk(KERN_INFO, &conn->dev, "iscsi: detected conn error (%d)\n",
  569. error);
  570. }
  571. EXPORT_SYMBOL_GPL(iscsi_conn_error);
  572. static int
  573. iscsi_if_send_reply(int pid, int seq, int type, int done, int multi,
  574. void *payload, int size)
  575. {
  576. struct sk_buff *skb;
  577. struct nlmsghdr *nlh;
  578. int len = NLMSG_SPACE(size);
  579. int flags = multi ? NLM_F_MULTI : 0;
  580. int t = done ? NLMSG_DONE : type;
  581. mempool_zone_complete(z_reply);
  582. skb = mempool_zone_get_skb(z_reply);
  583. /*
  584. * FIXME:
  585. * user is supposed to react on iferror == -ENOMEM;
  586. * see iscsi_if_rx().
  587. */
  588. BUG_ON(!skb);
  589. nlh = __nlmsg_put(skb, pid, seq, t, (len - sizeof(*nlh)), 0);
  590. nlh->nlmsg_flags = flags;
  591. memcpy(NLMSG_DATA(nlh), payload, size);
  592. return iscsi_unicast_skb(z_reply, skb, pid);
  593. }
  594. static int
  595. iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)
  596. {
  597. struct iscsi_uevent *ev = NLMSG_DATA(nlh);
  598. struct iscsi_stats *stats;
  599. struct sk_buff *skbstat;
  600. struct iscsi_cls_conn *conn;
  601. struct nlmsghdr *nlhstat;
  602. struct iscsi_uevent *evstat;
  603. struct iscsi_internal *priv;
  604. int len = NLMSG_SPACE(sizeof(*ev) +
  605. sizeof(struct iscsi_stats) +
  606. sizeof(struct iscsi_stats_custom) *
  607. ISCSI_STATS_CUSTOM_MAX);
  608. int err = 0;
  609. priv = iscsi_if_transport_lookup(transport);
  610. if (!priv)
  611. return -EINVAL;
  612. conn = iscsi_conn_lookup(ev->u.get_stats.sid, ev->u.get_stats.cid);
  613. if (!conn)
  614. return -EEXIST;
  615. do {
  616. int actual_size;
  617. mempool_zone_complete(conn->z_pdu);
  618. skbstat = mempool_zone_get_skb(conn->z_pdu);
  619. if (!skbstat) {
  620. dev_printk(KERN_ERR, &conn->dev, "iscsi: can not "
  621. "deliver stats: OOM\n");
  622. return -ENOMEM;
  623. }
  624. nlhstat = __nlmsg_put(skbstat, priv->daemon_pid, 0, 0,
  625. (len - sizeof(*nlhstat)), 0);
  626. evstat = NLMSG_DATA(nlhstat);
  627. memset(evstat, 0, sizeof(*evstat));
  628. evstat->transport_handle = iscsi_handle(conn->transport);
  629. evstat->type = nlh->nlmsg_type;
  630. if (atomic_read(&conn->z_pdu->allocated) >= conn->z_pdu->hiwat)
  631. evstat->iferror = -ENOMEM;
  632. evstat->u.get_stats.cid =
  633. ev->u.get_stats.cid;
  634. evstat->u.get_stats.sid =
  635. ev->u.get_stats.sid;
  636. stats = (struct iscsi_stats *)
  637. ((char*)evstat + sizeof(*evstat));
  638. memset(stats, 0, sizeof(*stats));
  639. transport->get_stats(conn, stats);
  640. actual_size = NLMSG_SPACE(sizeof(struct iscsi_uevent) +
  641. sizeof(struct iscsi_stats) +
  642. sizeof(struct iscsi_stats_custom) *
  643. stats->custom_length);
  644. actual_size -= sizeof(*nlhstat);
  645. actual_size = NLMSG_LENGTH(actual_size);
  646. skb_trim(skbstat, NLMSG_ALIGN(actual_size));
  647. nlhstat->nlmsg_len = actual_size;
  648. err = iscsi_unicast_skb(conn->z_pdu, skbstat, priv->daemon_pid);
  649. } while (err < 0 && err != -ECONNREFUSED);
  650. return err;
  651. }
  652. static int
  653. iscsi_if_create_session(struct iscsi_internal *priv, struct iscsi_uevent *ev)
  654. {
  655. struct iscsi_transport *transport = priv->iscsi_transport;
  656. struct iscsi_cls_session *session;
  657. unsigned long flags;
  658. uint32_t hostno;
  659. session = transport->create_session(transport, &priv->t,
  660. ev->u.c_session.initial_cmdsn,
  661. &hostno);
  662. if (!session)
  663. return -ENOMEM;
  664. spin_lock_irqsave(&sesslock, flags);
  665. list_add(&session->sess_list, &sesslist);
  666. spin_unlock_irqrestore(&sesslock, flags);
  667. ev->r.c_session_ret.host_no = hostno;
  668. ev->r.c_session_ret.sid = session->sid;
  669. return 0;
  670. }
  671. static int
  672. iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev)
  673. {
  674. struct iscsi_cls_conn *conn;
  675. struct iscsi_cls_session *session;
  676. unsigned long flags;
  677. session = iscsi_session_lookup(ev->u.c_conn.sid);
  678. if (!session) {
  679. printk(KERN_ERR "iscsi: invalid session %d\n",
  680. ev->u.c_conn.sid);
  681. return -EINVAL;
  682. }
  683. conn = transport->create_conn(session, ev->u.c_conn.cid);
  684. if (!conn) {
  685. printk(KERN_ERR "iscsi: couldn't create a new "
  686. "connection for session %d\n",
  687. session->sid);
  688. return -ENOMEM;
  689. }
  690. conn->z_pdu = mempool_zone_init(Z_MAX_PDU,
  691. NLMSG_SPACE(sizeof(struct iscsi_uevent) +
  692. sizeof(struct iscsi_hdr) +
  693. DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH),
  694. Z_HIWAT_PDU);
  695. if (!conn->z_pdu) {
  696. dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate "
  697. "pdu zone for new conn\n");
  698. goto destroy_conn;
  699. }
  700. conn->z_error = mempool_zone_init(Z_MAX_ERROR,
  701. NLMSG_SPACE(sizeof(struct iscsi_uevent)),
  702. Z_HIWAT_ERROR);
  703. if (!conn->z_error) {
  704. dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate "
  705. "error zone for new conn\n");
  706. goto free_pdu_pool;
  707. }
  708. ev->r.c_conn_ret.sid = session->sid;
  709. ev->r.c_conn_ret.cid = conn->cid;
  710. spin_lock_irqsave(&connlock, flags);
  711. list_add(&conn->conn_list, &connlist);
  712. conn->active = 1;
  713. spin_unlock_irqrestore(&connlock, flags);
  714. return 0;
  715. free_pdu_pool:
  716. mempool_zone_destroy(conn->z_pdu);
  717. destroy_conn:
  718. if (transport->destroy_conn)
  719. transport->destroy_conn(conn->dd_data);
  720. return -ENOMEM;
  721. }
  722. static int
  723. iscsi_if_destroy_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev)
  724. {
  725. unsigned long flags;
  726. struct iscsi_cls_conn *conn;
  727. struct mempool_zone *z_error, *z_pdu;
  728. conn = iscsi_conn_lookup(ev->u.d_conn.sid, ev->u.d_conn.cid);
  729. if (!conn)
  730. return -EINVAL;
  731. spin_lock_irqsave(&connlock, flags);
  732. conn->active = 0;
  733. list_del(&conn->conn_list);
  734. spin_unlock_irqrestore(&connlock, flags);
  735. z_pdu = conn->z_pdu;
  736. z_error = conn->z_error;
  737. if (transport->destroy_conn)
  738. transport->destroy_conn(conn);
  739. mempool_zone_destroy(z_pdu);
  740. mempool_zone_destroy(z_error);
  741. return 0;
  742. }
  743. static void
  744. iscsi_copy_param(struct iscsi_uevent *ev, uint32_t *value, char *data)
  745. {
  746. if (ev->u.set_param.len != sizeof(uint32_t))
  747. BUG();
  748. memcpy(value, data, min_t(uint32_t, sizeof(uint32_t),
  749. ev->u.set_param.len));
  750. }
  751. static int
  752. iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)
  753. {
  754. char *data = (char*)ev + sizeof(*ev);
  755. struct iscsi_cls_conn *conn;
  756. struct iscsi_cls_session *session;
  757. int err = 0;
  758. uint32_t value = 0;
  759. session = iscsi_session_lookup(ev->u.set_param.sid);
  760. conn = iscsi_conn_lookup(ev->u.set_param.sid, ev->u.set_param.cid);
  761. if (!conn || !session)
  762. return -EINVAL;
  763. switch (ev->u.set_param.param) {
  764. case ISCSI_PARAM_SESS_RECOVERY_TMO:
  765. iscsi_copy_param(ev, &value, data);
  766. if (value != 0)
  767. session->recovery_tmo = value;
  768. break;
  769. case ISCSI_PARAM_TARGET_NAME:
  770. /* this should not change between logins */
  771. if (session->targetname)
  772. return 0;
  773. session->targetname = kstrdup(data, GFP_KERNEL);
  774. if (!session->targetname)
  775. return -ENOMEM;
  776. break;
  777. case ISCSI_PARAM_TPGT:
  778. iscsi_copy_param(ev, &value, data);
  779. session->tpgt = value;
  780. break;
  781. case ISCSI_PARAM_PERSISTENT_PORT:
  782. iscsi_copy_param(ev, &value, data);
  783. conn->persistent_port = value;
  784. break;
  785. case ISCSI_PARAM_PERSISTENT_ADDRESS:
  786. /*
  787. * this is the address returned in discovery so it should
  788. * not change between logins.
  789. */
  790. if (conn->persistent_address)
  791. return 0;
  792. conn->persistent_address = kstrdup(data, GFP_KERNEL);
  793. if (!conn->persistent_address)
  794. return -ENOMEM;
  795. break;
  796. default:
  797. iscsi_copy_param(ev, &value, data);
  798. err = transport->set_param(conn, ev->u.set_param.param, value);
  799. }
  800. return err;
  801. }
  802. static int
  803. iscsi_if_transport_ep(struct iscsi_transport *transport,
  804. struct iscsi_uevent *ev, int msg_type)
  805. {
  806. struct sockaddr *dst_addr;
  807. int rc = 0;
  808. switch (msg_type) {
  809. case ISCSI_UEVENT_TRANSPORT_EP_CONNECT:
  810. if (!transport->ep_connect)
  811. return -EINVAL;
  812. dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev));
  813. rc = transport->ep_connect(dst_addr,
  814. ev->u.ep_connect.non_blocking,
  815. &ev->r.ep_connect_ret.handle);
  816. break;
  817. case ISCSI_UEVENT_TRANSPORT_EP_POLL:
  818. if (!transport->ep_poll)
  819. return -EINVAL;
  820. ev->r.retcode = transport->ep_poll(ev->u.ep_poll.ep_handle,
  821. ev->u.ep_poll.timeout_ms);
  822. break;
  823. case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
  824. if (!transport->ep_disconnect)
  825. return -EINVAL;
  826. transport->ep_disconnect(ev->u.ep_disconnect.ep_handle);
  827. break;
  828. }
  829. return rc;
  830. }
  831. static int
  832. iscsi_tgt_dscvr(struct iscsi_transport *transport,
  833. struct iscsi_uevent *ev)
  834. {
  835. struct sockaddr *dst_addr;
  836. if (!transport->tgt_dscvr)
  837. return -EINVAL;
  838. dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev));
  839. return transport->tgt_dscvr(ev->u.tgt_dscvr.type,
  840. ev->u.tgt_dscvr.host_no,
  841. ev->u.tgt_dscvr.enable, dst_addr);
  842. }
  843. static int
  844. iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
  845. {
  846. int err = 0;
  847. struct iscsi_uevent *ev = NLMSG_DATA(nlh);
  848. struct iscsi_transport *transport = NULL;
  849. struct iscsi_internal *priv;
  850. struct iscsi_cls_session *session;
  851. struct iscsi_cls_conn *conn;
  852. unsigned long flags;
  853. priv = iscsi_if_transport_lookup(iscsi_ptr(ev->transport_handle));
  854. if (!priv)
  855. return -EINVAL;
  856. transport = priv->iscsi_transport;
  857. if (!try_module_get(transport->owner))
  858. return -EINVAL;
  859. priv->daemon_pid = NETLINK_CREDS(skb)->pid;
  860. switch (nlh->nlmsg_type) {
  861. case ISCSI_UEVENT_CREATE_SESSION:
  862. err = iscsi_if_create_session(priv, ev);
  863. break;
  864. case ISCSI_UEVENT_DESTROY_SESSION:
  865. session = iscsi_session_lookup(ev->u.d_session.sid);
  866. if (session) {
  867. spin_lock_irqsave(&sesslock, flags);
  868. list_del(&session->sess_list);
  869. spin_unlock_irqrestore(&sesslock, flags);
  870. transport->destroy_session(session);
  871. } else
  872. err = -EINVAL;
  873. break;
  874. case ISCSI_UEVENT_CREATE_CONN:
  875. err = iscsi_if_create_conn(transport, ev);
  876. break;
  877. case ISCSI_UEVENT_DESTROY_CONN:
  878. err = iscsi_if_destroy_conn(transport, ev);
  879. break;
  880. case ISCSI_UEVENT_BIND_CONN:
  881. session = iscsi_session_lookup(ev->u.b_conn.sid);
  882. conn = iscsi_conn_lookup(ev->u.b_conn.sid, ev->u.b_conn.cid);
  883. if (session && conn)
  884. ev->r.retcode = transport->bind_conn(session, conn,
  885. ev->u.b_conn.transport_eph,
  886. ev->u.b_conn.is_leading);
  887. else
  888. err = -EINVAL;
  889. break;
  890. case ISCSI_UEVENT_SET_PARAM:
  891. err = iscsi_set_param(transport, ev);
  892. break;
  893. case ISCSI_UEVENT_START_CONN:
  894. conn = iscsi_conn_lookup(ev->u.start_conn.sid, ev->u.start_conn.cid);
  895. if (conn)
  896. ev->r.retcode = transport->start_conn(conn);
  897. else
  898. err = -EINVAL;
  899. break;
  900. case ISCSI_UEVENT_STOP_CONN:
  901. conn = iscsi_conn_lookup(ev->u.stop_conn.sid, ev->u.stop_conn.cid);
  902. if (conn)
  903. transport->stop_conn(conn, ev->u.stop_conn.flag);
  904. else
  905. err = -EINVAL;
  906. break;
  907. case ISCSI_UEVENT_SEND_PDU:
  908. conn = iscsi_conn_lookup(ev->u.send_pdu.sid, ev->u.send_pdu.cid);
  909. if (conn)
  910. ev->r.retcode = transport->send_pdu(conn,
  911. (struct iscsi_hdr*)((char*)ev + sizeof(*ev)),
  912. (char*)ev + sizeof(*ev) + ev->u.send_pdu.hdr_size,
  913. ev->u.send_pdu.data_size);
  914. else
  915. err = -EINVAL;
  916. break;
  917. case ISCSI_UEVENT_GET_STATS:
  918. err = iscsi_if_get_stats(transport, nlh);
  919. break;
  920. case ISCSI_UEVENT_TRANSPORT_EP_CONNECT:
  921. case ISCSI_UEVENT_TRANSPORT_EP_POLL:
  922. case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
  923. err = iscsi_if_transport_ep(transport, ev, nlh->nlmsg_type);
  924. break;
  925. case ISCSI_UEVENT_TGT_DSCVR:
  926. err = iscsi_tgt_dscvr(transport, ev);
  927. break;
  928. default:
  929. err = -EINVAL;
  930. break;
  931. }
  932. module_put(transport->owner);
  933. return err;
  934. }
  935. /*
  936. * Get message from skb (based on rtnetlink_rcv_skb). Each message is
  937. * processed by iscsi_if_recv_msg. Malformed skbs with wrong lengths or
  938. * invalid creds are discarded silently.
  939. */
  940. static void
  941. iscsi_if_rx(struct sock *sk, int len)
  942. {
  943. struct sk_buff *skb;
  944. mutex_lock(&rx_queue_mutex);
  945. while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
  946. if (NETLINK_CREDS(skb)->uid) {
  947. skb_pull(skb, skb->len);
  948. goto free_skb;
  949. }
  950. while (skb->len >= NLMSG_SPACE(0)) {
  951. int err;
  952. uint32_t rlen;
  953. struct nlmsghdr *nlh;
  954. struct iscsi_uevent *ev;
  955. nlh = (struct nlmsghdr *)skb->data;
  956. if (nlh->nlmsg_len < sizeof(*nlh) ||
  957. skb->len < nlh->nlmsg_len) {
  958. break;
  959. }
  960. ev = NLMSG_DATA(nlh);
  961. rlen = NLMSG_ALIGN(nlh->nlmsg_len);
  962. if (rlen > skb->len)
  963. rlen = skb->len;
  964. err = iscsi_if_recv_msg(skb, nlh);
  965. if (err) {
  966. ev->type = ISCSI_KEVENT_IF_ERROR;
  967. ev->iferror = err;
  968. }
  969. do {
  970. /*
  971. * special case for GET_STATS:
  972. * on success - sending reply and stats from
  973. * inside of if_recv_msg(),
  974. * on error - fall through.
  975. */
  976. if (ev->type == ISCSI_UEVENT_GET_STATS && !err)
  977. break;
  978. err = iscsi_if_send_reply(
  979. NETLINK_CREDS(skb)->pid, nlh->nlmsg_seq,
  980. nlh->nlmsg_type, 0, 0, ev, sizeof(*ev));
  981. if (atomic_read(&z_reply->allocated) >=
  982. z_reply->hiwat)
  983. ev->iferror = -ENOMEM;
  984. } while (err < 0 && err != -ECONNREFUSED);
  985. skb_pull(skb, rlen);
  986. }
  987. free_skb:
  988. kfree_skb(skb);
  989. }
  990. mutex_unlock(&rx_queue_mutex);
  991. }
  992. #define iscsi_cdev_to_conn(_cdev) \
  993. iscsi_dev_to_conn(_cdev->dev)
  994. #define ISCSI_CLASS_ATTR(_prefix,_name,_mode,_show,_store) \
  995. struct class_device_attribute class_device_attr_##_prefix##_##_name = \
  996. __ATTR(_name,_mode,_show,_store)
  997. /*
  998. * iSCSI connection attrs
  999. */
  1000. #define iscsi_conn_int_attr_show(param, format) \
  1001. static ssize_t \
  1002. show_conn_int_param_##param(struct class_device *cdev, char *buf) \
  1003. { \
  1004. uint32_t value = 0; \
  1005. struct iscsi_cls_conn *conn = iscsi_cdev_to_conn(cdev); \
  1006. struct iscsi_transport *t = conn->transport; \
  1007. \
  1008. t->get_conn_param(conn, param, &value); \
  1009. return snprintf(buf, 20, format"\n", value); \
  1010. }
  1011. #define iscsi_conn_int_attr(field, param, format) \
  1012. iscsi_conn_int_attr_show(param, format) \
  1013. static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, show_conn_int_param_##param, \
  1014. NULL);
  1015. iscsi_conn_int_attr(max_recv_dlength, ISCSI_PARAM_MAX_RECV_DLENGTH, "%u");
  1016. iscsi_conn_int_attr(max_xmit_dlength, ISCSI_PARAM_MAX_XMIT_DLENGTH, "%u");
  1017. iscsi_conn_int_attr(header_digest, ISCSI_PARAM_HDRDGST_EN, "%d");
  1018. iscsi_conn_int_attr(data_digest, ISCSI_PARAM_DATADGST_EN, "%d");
  1019. iscsi_conn_int_attr(ifmarker, ISCSI_PARAM_IFMARKER_EN, "%d");
  1020. iscsi_conn_int_attr(ofmarker, ISCSI_PARAM_OFMARKER_EN, "%d");
  1021. iscsi_conn_int_attr(persistent_port, ISCSI_PARAM_PERSISTENT_PORT, "%d");
  1022. iscsi_conn_int_attr(port, ISCSI_PARAM_CONN_PORT, "%d");
  1023. iscsi_conn_int_attr(exp_statsn, ISCSI_PARAM_EXP_STATSN, "%u");
  1024. #define iscsi_conn_str_attr_show(param) \
  1025. static ssize_t \
  1026. show_conn_str_param_##param(struct class_device *cdev, char *buf) \
  1027. { \
  1028. struct iscsi_cls_conn *conn = iscsi_cdev_to_conn(cdev); \
  1029. struct iscsi_transport *t = conn->transport; \
  1030. return t->get_conn_str_param(conn, param, buf); \
  1031. }
  1032. #define iscsi_conn_str_attr(field, param) \
  1033. iscsi_conn_str_attr_show(param) \
  1034. static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, show_conn_str_param_##param, \
  1035. NULL);
  1036. iscsi_conn_str_attr(persistent_address, ISCSI_PARAM_PERSISTENT_ADDRESS);
  1037. iscsi_conn_str_attr(address, ISCSI_PARAM_CONN_ADDRESS);
  1038. #define iscsi_cdev_to_session(_cdev) \
  1039. iscsi_dev_to_session(_cdev->dev)
  1040. /*
  1041. * iSCSI session attrs
  1042. */
  1043. #define iscsi_session_int_attr_show(param, format) \
  1044. static ssize_t \
  1045. show_session_int_param_##param(struct class_device *cdev, char *buf) \
  1046. { \
  1047. uint32_t value = 0; \
  1048. struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \
  1049. struct iscsi_transport *t = session->transport; \
  1050. \
  1051. t->get_session_param(session, param, &value); \
  1052. return snprintf(buf, 20, format"\n", value); \
  1053. }
  1054. #define iscsi_session_int_attr(field, param, format) \
  1055. iscsi_session_int_attr_show(param, format) \
  1056. static ISCSI_CLASS_ATTR(sess, field, S_IRUGO, show_session_int_param_##param, \
  1057. NULL);
  1058. iscsi_session_int_attr(initial_r2t, ISCSI_PARAM_INITIAL_R2T_EN, "%d");
  1059. iscsi_session_int_attr(max_outstanding_r2t, ISCSI_PARAM_MAX_R2T, "%hu");
  1060. iscsi_session_int_attr(immediate_data, ISCSI_PARAM_IMM_DATA_EN, "%d");
  1061. iscsi_session_int_attr(first_burst_len, ISCSI_PARAM_FIRST_BURST, "%u");
  1062. iscsi_session_int_attr(max_burst_len, ISCSI_PARAM_MAX_BURST, "%u");
  1063. iscsi_session_int_attr(data_pdu_in_order, ISCSI_PARAM_PDU_INORDER_EN, "%d");
  1064. iscsi_session_int_attr(data_seq_in_order, ISCSI_PARAM_DATASEQ_INORDER_EN, "%d");
  1065. iscsi_session_int_attr(erl, ISCSI_PARAM_ERL, "%d");
  1066. iscsi_session_int_attr(tpgt, ISCSI_PARAM_TPGT, "%d");
  1067. #define iscsi_session_str_attr_show(param) \
  1068. static ssize_t \
  1069. show_session_str_param_##param(struct class_device *cdev, char *buf) \
  1070. { \
  1071. struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \
  1072. struct iscsi_transport *t = session->transport; \
  1073. return t->get_session_str_param(session, param, buf); \
  1074. }
  1075. #define iscsi_session_str_attr(field, param) \
  1076. iscsi_session_str_attr_show(param) \
  1077. static ISCSI_CLASS_ATTR(sess, field, S_IRUGO, show_session_str_param_##param, \
  1078. NULL);
  1079. iscsi_session_str_attr(targetname, ISCSI_PARAM_TARGET_NAME);
  1080. /*
  1081. * Private session and conn attrs. userspace uses several iscsi values
  1082. * to identify each session between reboots. Some of these values may not
  1083. * be present in the iscsi_transport/LLD driver becuase userspace handles
  1084. * login (and failback for login redirect) so for these type of drivers
  1085. * the class manages the attrs and values for the iscsi_transport/LLD
  1086. */
  1087. #define iscsi_priv_session_attr_show(field, format) \
  1088. static ssize_t \
  1089. show_priv_session_##field(struct class_device *cdev, char *buf) \
  1090. { \
  1091. struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \
  1092. return sprintf(buf, format"\n", session->field); \
  1093. }
  1094. #define iscsi_priv_session_attr(field, format) \
  1095. iscsi_priv_session_attr_show(field, format) \
  1096. static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO, show_priv_session_##field, \
  1097. NULL)
  1098. iscsi_priv_session_attr(targetname, "%s");
  1099. iscsi_priv_session_attr(tpgt, "%d");
  1100. iscsi_priv_session_attr(recovery_tmo, "%d");
  1101. #define iscsi_priv_conn_attr_show(field, format) \
  1102. static ssize_t \
  1103. show_priv_conn_##field(struct class_device *cdev, char *buf) \
  1104. { \
  1105. struct iscsi_cls_conn *conn = iscsi_cdev_to_conn(cdev); \
  1106. return sprintf(buf, format"\n", conn->field); \
  1107. }
  1108. #define iscsi_priv_conn_attr(field, format) \
  1109. iscsi_priv_conn_attr_show(field, format) \
  1110. static ISCSI_CLASS_ATTR(priv_conn, field, S_IRUGO, show_priv_conn_##field, \
  1111. NULL)
  1112. iscsi_priv_conn_attr(persistent_address, "%s");
  1113. iscsi_priv_conn_attr(persistent_port, "%d");
  1114. #define SETUP_PRIV_SESSION_RD_ATTR(field) \
  1115. do { \
  1116. priv->session_attrs[count] = &class_device_attr_priv_sess_##field; \
  1117. count++; \
  1118. } while (0)
  1119. #define SETUP_SESSION_RD_ATTR(field, param_flag) \
  1120. do { \
  1121. if (tt->param_mask & param_flag) { \
  1122. priv->session_attrs[count] = &class_device_attr_sess_##field; \
  1123. count++; \
  1124. } \
  1125. } while (0)
  1126. #define SETUP_PRIV_CONN_RD_ATTR(field) \
  1127. do { \
  1128. priv->conn_attrs[count] = &class_device_attr_priv_conn_##field; \
  1129. count++; \
  1130. } while (0)
  1131. #define SETUP_CONN_RD_ATTR(field, param_flag) \
  1132. do { \
  1133. if (tt->param_mask & param_flag) { \
  1134. priv->conn_attrs[count] = &class_device_attr_conn_##field; \
  1135. count++; \
  1136. } \
  1137. } while (0)
  1138. static int iscsi_session_match(struct attribute_container *cont,
  1139. struct device *dev)
  1140. {
  1141. struct iscsi_cls_session *session;
  1142. struct Scsi_Host *shost;
  1143. struct iscsi_internal *priv;
  1144. if (!iscsi_is_session_dev(dev))
  1145. return 0;
  1146. session = iscsi_dev_to_session(dev);
  1147. shost = iscsi_session_to_shost(session);
  1148. if (!shost->transportt)
  1149. return 0;
  1150. priv = to_iscsi_internal(shost->transportt);
  1151. if (priv->session_cont.ac.class != &iscsi_session_class.class)
  1152. return 0;
  1153. return &priv->session_cont.ac == cont;
  1154. }
  1155. static int iscsi_conn_match(struct attribute_container *cont,
  1156. struct device *dev)
  1157. {
  1158. struct iscsi_cls_session *session;
  1159. struct iscsi_cls_conn *conn;
  1160. struct Scsi_Host *shost;
  1161. struct iscsi_internal *priv;
  1162. if (!iscsi_is_conn_dev(dev))
  1163. return 0;
  1164. conn = iscsi_dev_to_conn(dev);
  1165. session = iscsi_dev_to_session(conn->dev.parent);
  1166. shost = iscsi_session_to_shost(session);
  1167. if (!shost->transportt)
  1168. return 0;
  1169. priv = to_iscsi_internal(shost->transportt);
  1170. if (priv->conn_cont.ac.class != &iscsi_connection_class.class)
  1171. return 0;
  1172. return &priv->conn_cont.ac == cont;
  1173. }
  1174. static int iscsi_host_match(struct attribute_container *cont,
  1175. struct device *dev)
  1176. {
  1177. struct Scsi_Host *shost;
  1178. struct iscsi_internal *priv;
  1179. if (!scsi_is_host_device(dev))
  1180. return 0;
  1181. shost = dev_to_shost(dev);
  1182. if (!shost->transportt ||
  1183. shost->transportt->host_attrs.ac.class != &iscsi_host_class.class)
  1184. return 0;
  1185. priv = to_iscsi_internal(shost->transportt);
  1186. return &priv->t.host_attrs.ac == cont;
  1187. }
  1188. struct scsi_transport_template *
  1189. iscsi_register_transport(struct iscsi_transport *tt)
  1190. {
  1191. struct iscsi_internal *priv;
  1192. unsigned long flags;
  1193. int count = 0, err;
  1194. BUG_ON(!tt);
  1195. priv = iscsi_if_transport_lookup(tt);
  1196. if (priv)
  1197. return NULL;
  1198. priv = kzalloc(sizeof(*priv), GFP_KERNEL);
  1199. if (!priv)
  1200. return NULL;
  1201. INIT_LIST_HEAD(&priv->list);
  1202. priv->iscsi_transport = tt;
  1203. priv->t.user_scan = iscsi_user_scan;
  1204. priv->cdev.class = &iscsi_transport_class;
  1205. snprintf(priv->cdev.class_id, BUS_ID_SIZE, "%s", tt->name);
  1206. err = class_device_register(&priv->cdev);
  1207. if (err)
  1208. goto free_priv;
  1209. err = sysfs_create_group(&priv->cdev.kobj, &iscsi_transport_group);
  1210. if (err)
  1211. goto unregister_cdev;
  1212. /* host parameters */
  1213. priv->t.host_attrs.ac.attrs = &priv->host_attrs[0];
  1214. priv->t.host_attrs.ac.class = &iscsi_host_class.class;
  1215. priv->t.host_attrs.ac.match = iscsi_host_match;
  1216. priv->t.host_size = sizeof(struct iscsi_host);
  1217. priv->host_attrs[0] = NULL;
  1218. transport_container_register(&priv->t.host_attrs);
  1219. /* connection parameters */
  1220. priv->conn_cont.ac.attrs = &priv->conn_attrs[0];
  1221. priv->conn_cont.ac.class = &iscsi_connection_class.class;
  1222. priv->conn_cont.ac.match = iscsi_conn_match;
  1223. transport_container_register(&priv->conn_cont);
  1224. SETUP_CONN_RD_ATTR(max_recv_dlength, ISCSI_MAX_RECV_DLENGTH);
  1225. SETUP_CONN_RD_ATTR(max_xmit_dlength, ISCSI_MAX_XMIT_DLENGTH);
  1226. SETUP_CONN_RD_ATTR(header_digest, ISCSI_HDRDGST_EN);
  1227. SETUP_CONN_RD_ATTR(data_digest, ISCSI_DATADGST_EN);
  1228. SETUP_CONN_RD_ATTR(ifmarker, ISCSI_IFMARKER_EN);
  1229. SETUP_CONN_RD_ATTR(ofmarker, ISCSI_OFMARKER_EN);
  1230. SETUP_CONN_RD_ATTR(address, ISCSI_CONN_ADDRESS);
  1231. SETUP_CONN_RD_ATTR(port, ISCSI_CONN_PORT);
  1232. SETUP_CONN_RD_ATTR(exp_statsn, ISCSI_EXP_STATSN);
  1233. if (tt->param_mask & ISCSI_PERSISTENT_ADDRESS)
  1234. SETUP_CONN_RD_ATTR(persistent_address, ISCSI_PERSISTENT_ADDRESS);
  1235. else
  1236. SETUP_PRIV_CONN_RD_ATTR(persistent_address);
  1237. if (tt->param_mask & ISCSI_PERSISTENT_PORT)
  1238. SETUP_CONN_RD_ATTR(persistent_port, ISCSI_PERSISTENT_PORT);
  1239. else
  1240. SETUP_PRIV_CONN_RD_ATTR(persistent_port);
  1241. BUG_ON(count > ISCSI_CONN_ATTRS);
  1242. priv->conn_attrs[count] = NULL;
  1243. count = 0;
  1244. /* session parameters */
  1245. priv->session_cont.ac.attrs = &priv->session_attrs[0];
  1246. priv->session_cont.ac.class = &iscsi_session_class.class;
  1247. priv->session_cont.ac.match = iscsi_session_match;
  1248. transport_container_register(&priv->session_cont);
  1249. SETUP_SESSION_RD_ATTR(initial_r2t, ISCSI_INITIAL_R2T_EN);
  1250. SETUP_SESSION_RD_ATTR(max_outstanding_r2t, ISCSI_MAX_R2T);
  1251. SETUP_SESSION_RD_ATTR(immediate_data, ISCSI_IMM_DATA_EN);
  1252. SETUP_SESSION_RD_ATTR(first_burst_len, ISCSI_FIRST_BURST);
  1253. SETUP_SESSION_RD_ATTR(max_burst_len, ISCSI_MAX_BURST);
  1254. SETUP_SESSION_RD_ATTR(data_pdu_in_order, ISCSI_PDU_INORDER_EN);
  1255. SETUP_SESSION_RD_ATTR(data_seq_in_order, ISCSI_DATASEQ_INORDER_EN);
  1256. SETUP_SESSION_RD_ATTR(erl, ISCSI_ERL);
  1257. SETUP_PRIV_SESSION_RD_ATTR(recovery_tmo);
  1258. if (tt->param_mask & ISCSI_TARGET_NAME)
  1259. SETUP_SESSION_RD_ATTR(targetname, ISCSI_TARGET_NAME);
  1260. else
  1261. SETUP_PRIV_SESSION_RD_ATTR(targetname);
  1262. if (tt->param_mask & ISCSI_TPGT)
  1263. SETUP_SESSION_RD_ATTR(tpgt, ISCSI_TPGT);
  1264. else
  1265. SETUP_PRIV_SESSION_RD_ATTR(tpgt);
  1266. BUG_ON(count > ISCSI_SESSION_ATTRS);
  1267. priv->session_attrs[count] = NULL;
  1268. spin_lock_irqsave(&iscsi_transport_lock, flags);
  1269. list_add(&priv->list, &iscsi_transports);
  1270. spin_unlock_irqrestore(&iscsi_transport_lock, flags);
  1271. printk(KERN_NOTICE "iscsi: registered transport (%s)\n", tt->name);
  1272. return &priv->t;
  1273. unregister_cdev:
  1274. class_device_unregister(&priv->cdev);
  1275. free_priv:
  1276. kfree(priv);
  1277. return NULL;
  1278. }
  1279. EXPORT_SYMBOL_GPL(iscsi_register_transport);
  1280. int iscsi_unregister_transport(struct iscsi_transport *tt)
  1281. {
  1282. struct iscsi_internal *priv;
  1283. unsigned long flags;
  1284. BUG_ON(!tt);
  1285. mutex_lock(&rx_queue_mutex);
  1286. priv = iscsi_if_transport_lookup(tt);
  1287. BUG_ON (!priv);
  1288. spin_lock_irqsave(&iscsi_transport_lock, flags);
  1289. list_del(&priv->list);
  1290. spin_unlock_irqrestore(&iscsi_transport_lock, flags);
  1291. transport_container_unregister(&priv->conn_cont);
  1292. transport_container_unregister(&priv->session_cont);
  1293. transport_container_unregister(&priv->t.host_attrs);
  1294. sysfs_remove_group(&priv->cdev.kobj, &iscsi_transport_group);
  1295. class_device_unregister(&priv->cdev);
  1296. mutex_unlock(&rx_queue_mutex);
  1297. return 0;
  1298. }
  1299. EXPORT_SYMBOL_GPL(iscsi_unregister_transport);
  1300. static int
  1301. iscsi_rcv_nl_event(struct notifier_block *this, unsigned long event, void *ptr)
  1302. {
  1303. struct netlink_notify *n = ptr;
  1304. if (event == NETLINK_URELEASE &&
  1305. n->protocol == NETLINK_ISCSI && n->pid) {
  1306. struct iscsi_cls_conn *conn;
  1307. unsigned long flags;
  1308. mempool_zone_complete(z_reply);
  1309. spin_lock_irqsave(&connlock, flags);
  1310. list_for_each_entry(conn, &connlist, conn_list) {
  1311. mempool_zone_complete(conn->z_error);
  1312. mempool_zone_complete(conn->z_pdu);
  1313. }
  1314. spin_unlock_irqrestore(&connlock, flags);
  1315. }
  1316. return NOTIFY_DONE;
  1317. }
  1318. static struct notifier_block iscsi_nl_notifier = {
  1319. .notifier_call = iscsi_rcv_nl_event,
  1320. };
  1321. static __init int iscsi_transport_init(void)
  1322. {
  1323. int err;
  1324. err = class_register(&iscsi_transport_class);
  1325. if (err)
  1326. return err;
  1327. err = transport_class_register(&iscsi_host_class);
  1328. if (err)
  1329. goto unregister_transport_class;
  1330. err = transport_class_register(&iscsi_connection_class);
  1331. if (err)
  1332. goto unregister_host_class;
  1333. err = transport_class_register(&iscsi_session_class);
  1334. if (err)
  1335. goto unregister_conn_class;
  1336. err = netlink_register_notifier(&iscsi_nl_notifier);
  1337. if (err)
  1338. goto unregister_session_class;
  1339. nls = netlink_kernel_create(NETLINK_ISCSI, 1, iscsi_if_rx,
  1340. THIS_MODULE);
  1341. if (!nls) {
  1342. err = -ENOBUFS;
  1343. goto unregister_notifier;
  1344. }
  1345. z_reply = mempool_zone_init(Z_MAX_REPLY,
  1346. NLMSG_SPACE(sizeof(struct iscsi_uevent)), Z_HIWAT_REPLY);
  1347. if (z_reply)
  1348. return 0;
  1349. sock_release(nls->sk_socket);
  1350. unregister_notifier:
  1351. netlink_unregister_notifier(&iscsi_nl_notifier);
  1352. unregister_session_class:
  1353. transport_class_unregister(&iscsi_session_class);
  1354. unregister_conn_class:
  1355. transport_class_unregister(&iscsi_connection_class);
  1356. unregister_host_class:
  1357. transport_class_unregister(&iscsi_host_class);
  1358. unregister_transport_class:
  1359. class_unregister(&iscsi_transport_class);
  1360. return err;
  1361. }
  1362. static void __exit iscsi_transport_exit(void)
  1363. {
  1364. mempool_zone_destroy(z_reply);
  1365. sock_release(nls->sk_socket);
  1366. netlink_unregister_notifier(&iscsi_nl_notifier);
  1367. transport_class_unregister(&iscsi_connection_class);
  1368. transport_class_unregister(&iscsi_session_class);
  1369. transport_class_unregister(&iscsi_host_class);
  1370. class_unregister(&iscsi_transport_class);
  1371. }
  1372. module_init(iscsi_transport_init);
  1373. module_exit(iscsi_transport_exit);
  1374. MODULE_AUTHOR("Mike Christie <michaelc@cs.wisc.edu>, "
  1375. "Dmitry Yusupov <dmitry_yus@yahoo.com>, "
  1376. "Alex Aizman <itn780@yahoo.com>");
  1377. MODULE_DESCRIPTION("iSCSI Transport Interface");
  1378. MODULE_LICENSE("GPL");