iscsi_tcp.c 93 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627
  1. /*
  2. * iSCSI Initiator over TCP/IP Data-Path
  3. *
  4. * Copyright (C) 2004 Dmitry Yusupov
  5. * Copyright (C) 2004 Alex Aizman
  6. * Copyright (C) 2005 Mike Christie
  7. * maintained by open-iscsi@googlegroups.com
  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
  11. * by 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, but
  15. * WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * General Public License for more details.
  18. *
  19. * See the file COPYING included with this distribution for more details.
  20. *
  21. * Credits:
  22. * Christoph Hellwig
  23. * FUJITA Tomonori
  24. * Arne Redlich
  25. * Zhenyu Wang
  26. */
  27. #include <linux/types.h>
  28. #include <linux/list.h>
  29. #include <linux/inet.h>
  30. #include <linux/blkdev.h>
  31. #include <linux/crypto.h>
  32. #include <linux/delay.h>
  33. #include <linux/kfifo.h>
  34. #include <linux/scatterlist.h>
  35. #include <net/tcp.h>
  36. #include <scsi/scsi_cmnd.h>
  37. #include <scsi/scsi_device.h>
  38. #include <scsi/scsi_eh.h>
  39. #include <scsi/scsi_request.h>
  40. #include <scsi/scsi_tcq.h>
  41. #include <scsi/scsi_host.h>
  42. #include <scsi/scsi.h>
  43. #include <scsi/scsi_transport_iscsi.h>
  44. #include "iscsi_tcp.h"
  45. MODULE_AUTHOR("Dmitry Yusupov <dmitry_yus@yahoo.com>, "
  46. "Alex Aizman <itn780@yahoo.com>");
  47. MODULE_DESCRIPTION("iSCSI/TCP data-path");
  48. MODULE_LICENSE("GPL");
  49. /* #define DEBUG_TCP */
  50. /* #define DEBUG_SCSI */
  51. #define DEBUG_ASSERT
  52. #ifdef DEBUG_TCP
  53. #define debug_tcp(fmt...) printk(KERN_DEBUG "tcp: " fmt)
  54. #else
  55. #define debug_tcp(fmt...)
  56. #endif
  57. #ifdef DEBUG_SCSI
  58. #define debug_scsi(fmt...) printk(KERN_DEBUG "scsi: " fmt)
  59. #else
  60. #define debug_scsi(fmt...)
  61. #endif
  62. #ifndef DEBUG_ASSERT
  63. #ifdef BUG_ON
  64. #undef BUG_ON
  65. #endif
  66. #define BUG_ON(expr)
  67. #endif
  68. #define INVALID_SN_DELTA 0xffff
  69. static unsigned int iscsi_max_lun = 512;
  70. module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO);
  71. /* global data */
  72. static kmem_cache_t *taskcache;
  73. static inline void
  74. iscsi_buf_init_virt(struct iscsi_buf *ibuf, char *vbuf, int size)
  75. {
  76. sg_init_one(&ibuf->sg, (u8 *)vbuf, size);
  77. ibuf->sent = 0;
  78. }
  79. static inline void
  80. iscsi_buf_init_iov(struct iscsi_buf *ibuf, char *vbuf, int size)
  81. {
  82. ibuf->sg.page = (void*)vbuf;
  83. ibuf->sg.offset = (unsigned int)-1;
  84. ibuf->sg.length = size;
  85. ibuf->sent = 0;
  86. }
  87. static inline void*
  88. iscsi_buf_iov_base(struct iscsi_buf *ibuf)
  89. {
  90. return (char*)ibuf->sg.page + ibuf->sent;
  91. }
  92. static inline void
  93. iscsi_buf_init_sg(struct iscsi_buf *ibuf, struct scatterlist *sg)
  94. {
  95. /*
  96. * Fastpath: sg element fits into single page
  97. */
  98. if (sg->length + sg->offset <= PAGE_SIZE && page_count(sg->page) >= 2) {
  99. ibuf->sg.page = sg->page;
  100. ibuf->sg.offset = sg->offset;
  101. ibuf->sg.length = sg->length;
  102. } else
  103. iscsi_buf_init_iov(ibuf, page_address(sg->page), sg->length);
  104. ibuf->sent = 0;
  105. }
  106. static inline int
  107. iscsi_buf_left(struct iscsi_buf *ibuf)
  108. {
  109. int rc;
  110. rc = ibuf->sg.length - ibuf->sent;
  111. BUG_ON(rc < 0);
  112. return rc;
  113. }
  114. static inline void
  115. iscsi_buf_init_hdr(struct iscsi_conn *conn, struct iscsi_buf *ibuf,
  116. char *vbuf, u8 *crc)
  117. {
  118. iscsi_buf_init_virt(ibuf, vbuf, sizeof(struct iscsi_hdr));
  119. if (conn->hdrdgst_en) {
  120. crypto_digest_digest(conn->tx_tfm, &ibuf->sg, 1, crc);
  121. ibuf->sg.length += sizeof(uint32_t);
  122. }
  123. }
  124. static void
  125. iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err)
  126. {
  127. struct iscsi_session *session = conn->session;
  128. unsigned long flags;
  129. spin_lock_irqsave(&session->lock, flags);
  130. if (session->conn_cnt == 1 || session->leadconn == conn)
  131. session->state = ISCSI_STATE_FAILED;
  132. spin_unlock_irqrestore(&session->lock, flags);
  133. set_bit(SUSPEND_BIT, &conn->suspend_tx);
  134. set_bit(SUSPEND_BIT, &conn->suspend_rx);
  135. iscsi_conn_error(iscsi_handle(conn), err);
  136. }
  137. static inline int
  138. iscsi_check_assign_cmdsn(struct iscsi_session *session, struct iscsi_nopin *hdr)
  139. {
  140. uint32_t max_cmdsn = be32_to_cpu(hdr->max_cmdsn);
  141. uint32_t exp_cmdsn = be32_to_cpu(hdr->exp_cmdsn);
  142. if (max_cmdsn < exp_cmdsn -1 &&
  143. max_cmdsn > exp_cmdsn - INVALID_SN_DELTA)
  144. return ISCSI_ERR_MAX_CMDSN;
  145. if (max_cmdsn > session->max_cmdsn ||
  146. max_cmdsn < session->max_cmdsn - INVALID_SN_DELTA)
  147. session->max_cmdsn = max_cmdsn;
  148. if (exp_cmdsn > session->exp_cmdsn ||
  149. exp_cmdsn < session->exp_cmdsn - INVALID_SN_DELTA)
  150. session->exp_cmdsn = exp_cmdsn;
  151. return 0;
  152. }
  153. static inline int
  154. iscsi_hdr_extract(struct iscsi_conn *conn)
  155. {
  156. struct sk_buff *skb = conn->in.skb;
  157. if (conn->in.copy >= conn->hdr_size &&
  158. conn->in_progress == IN_PROGRESS_WAIT_HEADER) {
  159. /*
  160. * Zero-copy PDU Header: using connection context
  161. * to store header pointer.
  162. */
  163. if (skb_shinfo(skb)->frag_list == NULL &&
  164. !skb_shinfo(skb)->nr_frags)
  165. conn->in.hdr = (struct iscsi_hdr *)
  166. ((char*)skb->data + conn->in.offset);
  167. else {
  168. /* ignoring return code since we checked
  169. * in.copy before */
  170. skb_copy_bits(skb, conn->in.offset,
  171. &conn->hdr, conn->hdr_size);
  172. conn->in.hdr = &conn->hdr;
  173. }
  174. conn->in.offset += conn->hdr_size;
  175. conn->in.copy -= conn->hdr_size;
  176. } else {
  177. int hdr_remains;
  178. int copylen;
  179. /*
  180. * PDU header scattered across SKB's,
  181. * copying it... This'll happen quite rarely.
  182. */
  183. if (conn->in_progress == IN_PROGRESS_WAIT_HEADER)
  184. conn->in.hdr_offset = 0;
  185. hdr_remains = conn->hdr_size - conn->in.hdr_offset;
  186. BUG_ON(hdr_remains <= 0);
  187. copylen = min(conn->in.copy, hdr_remains);
  188. skb_copy_bits(skb, conn->in.offset,
  189. (char*)&conn->hdr + conn->in.hdr_offset, copylen);
  190. debug_tcp("PDU gather offset %d bytes %d in.offset %d "
  191. "in.copy %d\n", conn->in.hdr_offset, copylen,
  192. conn->in.offset, conn->in.copy);
  193. conn->in.offset += copylen;
  194. conn->in.copy -= copylen;
  195. if (copylen < hdr_remains) {
  196. conn->in_progress = IN_PROGRESS_HEADER_GATHER;
  197. conn->in.hdr_offset += copylen;
  198. return -EAGAIN;
  199. }
  200. conn->in.hdr = &conn->hdr;
  201. conn->discontiguous_hdr_cnt++;
  202. conn->in_progress = IN_PROGRESS_WAIT_HEADER;
  203. }
  204. return 0;
  205. }
  206. static inline void
  207. iscsi_ctask_cleanup(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
  208. {
  209. struct scsi_cmnd *sc = ctask->sc;
  210. struct iscsi_session *session = conn->session;
  211. spin_lock(&session->lock);
  212. if (unlikely(!sc)) {
  213. spin_unlock(&session->lock);
  214. return;
  215. }
  216. if (sc->sc_data_direction == DMA_TO_DEVICE) {
  217. struct iscsi_data_task *dtask, *n;
  218. /* WRITE: cleanup Data-Out's if any */
  219. spin_lock(&conn->lock);
  220. list_for_each_entry_safe(dtask, n, &ctask->dataqueue, item) {
  221. list_del(&dtask->item);
  222. mempool_free(dtask, ctask->datapool);
  223. }
  224. spin_unlock(&conn->lock);
  225. }
  226. ctask->xmstate = XMSTATE_IDLE;
  227. ctask->r2t = NULL;
  228. ctask->sc = NULL;
  229. __kfifo_put(session->cmdpool.queue, (void*)&ctask, sizeof(void*));
  230. spin_unlock(&session->lock);
  231. }
  232. /**
  233. * iscsi_cmd_rsp - SCSI Command Response processing
  234. * @conn: iscsi connection
  235. * @ctask: scsi command task
  236. **/
  237. static int
  238. iscsi_cmd_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
  239. {
  240. int rc;
  241. struct iscsi_cmd_rsp *rhdr = (struct iscsi_cmd_rsp *)conn->in.hdr;
  242. struct iscsi_session *session = conn->session;
  243. struct scsi_cmnd *sc = ctask->sc;
  244. rc = iscsi_check_assign_cmdsn(session, (struct iscsi_nopin*)rhdr);
  245. if (rc) {
  246. sc->result = (DID_ERROR << 16);
  247. goto out;
  248. }
  249. conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1;
  250. sc->result = (DID_OK << 16) | rhdr->cmd_status;
  251. if (rhdr->response != ISCSI_STATUS_CMD_COMPLETED) {
  252. sc->result = (DID_ERROR << 16);
  253. goto out;
  254. }
  255. if (rhdr->cmd_status == SAM_STAT_CHECK_CONDITION && conn->senselen) {
  256. int sensecopy = min(conn->senselen, SCSI_SENSE_BUFFERSIZE);
  257. memcpy(sc->sense_buffer, conn->data + 2, sensecopy);
  258. debug_scsi("copied %d bytes of sense\n", sensecopy);
  259. }
  260. if (sc->sc_data_direction == DMA_TO_DEVICE)
  261. goto out;
  262. if (rhdr->flags & ISCSI_FLAG_CMD_UNDERFLOW) {
  263. int res_count = be32_to_cpu(rhdr->residual_count);
  264. if (res_count > 0 && res_count <= sc->request_bufflen)
  265. sc->resid = res_count;
  266. else
  267. sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status;
  268. } else if (rhdr->flags & ISCSI_FLAG_CMD_BIDI_UNDERFLOW)
  269. sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status;
  270. else if (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW)
  271. sc->resid = be32_to_cpu(rhdr->residual_count);
  272. out:
  273. debug_scsi("done [sc %lx res %d itt 0x%x]\n",
  274. (long)sc, sc->result, ctask->itt);
  275. conn->scsirsp_pdus_cnt++;
  276. iscsi_ctask_cleanup(conn, ctask);
  277. sc->scsi_done(sc);
  278. return rc;
  279. }
  280. /**
  281. * iscsi_data_rsp - SCSI Data-In Response processing
  282. * @conn: iscsi connection
  283. * @ctask: scsi command task
  284. **/
  285. static int
  286. iscsi_data_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
  287. {
  288. int rc;
  289. struct iscsi_data_rsp *rhdr = (struct iscsi_data_rsp *)conn->in.hdr;
  290. struct iscsi_session *session = conn->session;
  291. int datasn = be32_to_cpu(rhdr->datasn);
  292. rc = iscsi_check_assign_cmdsn(session, (struct iscsi_nopin*)rhdr);
  293. if (rc)
  294. return rc;
  295. /*
  296. * setup Data-In byte counter (gets decremented..)
  297. */
  298. ctask->data_count = conn->in.datalen;
  299. if (conn->in.datalen == 0)
  300. return 0;
  301. if (ctask->datasn != datasn)
  302. return ISCSI_ERR_DATASN;
  303. ctask->datasn++;
  304. ctask->data_offset = be32_to_cpu(rhdr->offset);
  305. if (ctask->data_offset + conn->in.datalen > ctask->total_length)
  306. return ISCSI_ERR_DATA_OFFSET;
  307. if (rhdr->flags & ISCSI_FLAG_DATA_STATUS) {
  308. struct scsi_cmnd *sc = ctask->sc;
  309. conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1;
  310. if (rhdr->flags & ISCSI_FLAG_CMD_UNDERFLOW) {
  311. int res_count = be32_to_cpu(rhdr->residual_count);
  312. if (res_count > 0 &&
  313. res_count <= sc->request_bufflen) {
  314. sc->resid = res_count;
  315. sc->result = (DID_OK << 16) | rhdr->cmd_status;
  316. } else
  317. sc->result = (DID_BAD_TARGET << 16) |
  318. rhdr->cmd_status;
  319. } else if (rhdr->flags & ISCSI_FLAG_CMD_BIDI_UNDERFLOW)
  320. sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status;
  321. else if (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW) {
  322. sc->resid = be32_to_cpu(rhdr->residual_count);
  323. sc->result = (DID_OK << 16) | rhdr->cmd_status;
  324. } else
  325. sc->result = (DID_OK << 16) | rhdr->cmd_status;
  326. }
  327. conn->datain_pdus_cnt++;
  328. return 0;
  329. }
  330. /**
  331. * iscsi_solicit_data_init - initialize first Data-Out
  332. * @conn: iscsi connection
  333. * @ctask: scsi command task
  334. * @r2t: R2T info
  335. *
  336. * Notes:
  337. * Initialize first Data-Out within this R2T sequence and finds
  338. * proper data_offset within this SCSI command.
  339. *
  340. * This function is called with connection lock taken.
  341. **/
  342. static void
  343. iscsi_solicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
  344. struct iscsi_r2t_info *r2t)
  345. {
  346. struct iscsi_data *hdr;
  347. struct iscsi_data_task *dtask;
  348. struct scsi_cmnd *sc = ctask->sc;
  349. dtask = mempool_alloc(ctask->datapool, GFP_ATOMIC);
  350. BUG_ON(!dtask);
  351. hdr = &dtask->hdr;
  352. memset(hdr, 0, sizeof(struct iscsi_data));
  353. hdr->ttt = r2t->ttt;
  354. hdr->datasn = cpu_to_be32(r2t->solicit_datasn);
  355. r2t->solicit_datasn++;
  356. hdr->opcode = ISCSI_OP_SCSI_DATA_OUT;
  357. memcpy(hdr->lun, ctask->hdr.lun, sizeof(hdr->lun));
  358. hdr->itt = ctask->hdr.itt;
  359. hdr->exp_statsn = r2t->exp_statsn;
  360. hdr->offset = cpu_to_be32(r2t->data_offset);
  361. if (r2t->data_length > conn->max_xmit_dlength) {
  362. hton24(hdr->dlength, conn->max_xmit_dlength);
  363. r2t->data_count = conn->max_xmit_dlength;
  364. hdr->flags = 0;
  365. } else {
  366. hton24(hdr->dlength, r2t->data_length);
  367. r2t->data_count = r2t->data_length;
  368. hdr->flags = ISCSI_FLAG_CMD_FINAL;
  369. }
  370. conn->dataout_pdus_cnt++;
  371. r2t->sent = 0;
  372. iscsi_buf_init_hdr(conn, &r2t->headbuf, (char*)hdr,
  373. (u8 *)dtask->hdrext);
  374. r2t->dtask = dtask;
  375. if (sc->use_sg) {
  376. int i, sg_count = 0;
  377. struct scatterlist *sg = sc->request_buffer;
  378. r2t->sg = NULL;
  379. for (i = 0; i < sc->use_sg; i++, sg += 1) {
  380. /* FIXME: prefetch ? */
  381. if (sg_count + sg->length > r2t->data_offset) {
  382. int page_offset;
  383. /* sg page found! */
  384. /* offset within this page */
  385. page_offset = r2t->data_offset - sg_count;
  386. /* fill in this buffer */
  387. iscsi_buf_init_sg(&r2t->sendbuf, sg);
  388. r2t->sendbuf.sg.offset += page_offset;
  389. r2t->sendbuf.sg.length -= page_offset;
  390. /* xmit logic will continue with next one */
  391. r2t->sg = sg + 1;
  392. break;
  393. }
  394. sg_count += sg->length;
  395. }
  396. BUG_ON(r2t->sg == NULL);
  397. } else
  398. iscsi_buf_init_iov(&ctask->sendbuf,
  399. (char*)sc->request_buffer + r2t->data_offset,
  400. r2t->data_count);
  401. list_add(&dtask->item, &ctask->dataqueue);
  402. }
  403. /**
  404. * iscsi_r2t_rsp - iSCSI R2T Response processing
  405. * @conn: iscsi connection
  406. * @ctask: scsi command task
  407. **/
  408. static int
  409. iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
  410. {
  411. struct iscsi_r2t_info *r2t;
  412. struct iscsi_session *session = conn->session;
  413. struct iscsi_r2t_rsp *rhdr = (struct iscsi_r2t_rsp *)conn->in.hdr;
  414. int r2tsn = be32_to_cpu(rhdr->r2tsn);
  415. int rc;
  416. if (conn->in.ahslen)
  417. return ISCSI_ERR_AHSLEN;
  418. if (conn->in.datalen)
  419. return ISCSI_ERR_DATALEN;
  420. if (ctask->exp_r2tsn && ctask->exp_r2tsn != r2tsn)
  421. return ISCSI_ERR_R2TSN;
  422. rc = iscsi_check_assign_cmdsn(session, (struct iscsi_nopin*)rhdr);
  423. if (rc)
  424. return rc;
  425. /* FIXME: use R2TSN to detect missing R2T */
  426. /* fill-in new R2T associated with the task */
  427. spin_lock(&session->lock);
  428. if (!ctask->sc || ctask->mtask ||
  429. session->state != ISCSI_STATE_LOGGED_IN) {
  430. printk(KERN_INFO "iscsi_tcp: dropping R2T itt %d in "
  431. "recovery...\n", ctask->itt);
  432. spin_unlock(&session->lock);
  433. return 0;
  434. }
  435. rc = __kfifo_get(ctask->r2tpool.queue, (void*)&r2t, sizeof(void*));
  436. BUG_ON(!rc);
  437. r2t->exp_statsn = rhdr->statsn;
  438. r2t->data_length = be32_to_cpu(rhdr->data_length);
  439. if (r2t->data_length == 0 ||
  440. r2t->data_length > session->max_burst) {
  441. spin_unlock(&session->lock);
  442. return ISCSI_ERR_DATALEN;
  443. }
  444. r2t->data_offset = be32_to_cpu(rhdr->data_offset);
  445. if (r2t->data_offset + r2t->data_length > ctask->total_length) {
  446. spin_unlock(&session->lock);
  447. return ISCSI_ERR_DATALEN;
  448. }
  449. r2t->ttt = rhdr->ttt; /* no flip */
  450. r2t->solicit_datasn = 0;
  451. iscsi_solicit_data_init(conn, ctask, r2t);
  452. ctask->exp_r2tsn = r2tsn + 1;
  453. ctask->xmstate |= XMSTATE_SOL_HDR;
  454. __kfifo_put(ctask->r2tqueue, (void*)&r2t, sizeof(void*));
  455. __kfifo_put(conn->writequeue, (void*)&ctask, sizeof(void*));
  456. schedule_work(&conn->xmitwork);
  457. conn->r2t_pdus_cnt++;
  458. spin_unlock(&session->lock);
  459. return 0;
  460. }
  461. static int
  462. iscsi_hdr_recv(struct iscsi_conn *conn)
  463. {
  464. int rc = 0;
  465. struct iscsi_hdr *hdr;
  466. struct iscsi_cmd_task *ctask;
  467. struct iscsi_session *session = conn->session;
  468. uint32_t cdgst, rdgst = 0;
  469. hdr = conn->in.hdr;
  470. /* verify PDU length */
  471. conn->in.datalen = ntoh24(hdr->dlength);
  472. if (conn->in.datalen > conn->max_recv_dlength) {
  473. printk(KERN_ERR "iscsi_tcp: datalen %d > %d\n",
  474. conn->in.datalen, conn->max_recv_dlength);
  475. return ISCSI_ERR_DATALEN;
  476. }
  477. conn->data_copied = 0;
  478. /* read AHS */
  479. conn->in.ahslen = hdr->hlength*(4*sizeof(__u16));
  480. conn->in.offset += conn->in.ahslen;
  481. conn->in.copy -= conn->in.ahslen;
  482. if (conn->in.copy < 0) {
  483. printk(KERN_ERR "iscsi_tcp: can't handle AHS with length "
  484. "%d bytes\n", conn->in.ahslen);
  485. return ISCSI_ERR_AHSLEN;
  486. }
  487. /* calculate read padding */
  488. conn->in.padding = conn->in.datalen & (ISCSI_PAD_LEN-1);
  489. if (conn->in.padding) {
  490. conn->in.padding = ISCSI_PAD_LEN - conn->in.padding;
  491. debug_scsi("read padding %d bytes\n", conn->in.padding);
  492. }
  493. if (conn->hdrdgst_en) {
  494. struct scatterlist sg;
  495. sg_init_one(&sg, (u8 *)hdr,
  496. sizeof(struct iscsi_hdr) + conn->in.ahslen);
  497. crypto_digest_digest(conn->rx_tfm, &sg, 1, (u8 *)&cdgst);
  498. rdgst = *(uint32_t*)((char*)hdr + sizeof(struct iscsi_hdr) +
  499. conn->in.ahslen);
  500. }
  501. /* save opcode for later */
  502. conn->in.opcode = hdr->opcode;
  503. /* verify itt (itt encoding: age+cid+itt) */
  504. if (hdr->itt != cpu_to_be32(ISCSI_RESERVED_TAG)) {
  505. if ((hdr->itt & AGE_MASK) !=
  506. (session->age << AGE_SHIFT)) {
  507. printk(KERN_ERR "iscsi_tcp: received itt %x expected "
  508. "session age (%x)\n", hdr->itt,
  509. session->age & AGE_MASK);
  510. return ISCSI_ERR_BAD_ITT;
  511. }
  512. if ((hdr->itt & CID_MASK) != (conn->id << CID_SHIFT)) {
  513. printk(KERN_ERR "iscsi_tcp: received itt %x, expected "
  514. "CID (%x)\n", hdr->itt, conn->id);
  515. return ISCSI_ERR_BAD_ITT;
  516. }
  517. conn->in.itt = hdr->itt & ITT_MASK;
  518. } else
  519. conn->in.itt = hdr->itt;
  520. debug_tcp("opcode 0x%x offset %d copy %d ahslen %d datalen %d\n",
  521. hdr->opcode, conn->in.offset, conn->in.copy,
  522. conn->in.ahslen, conn->in.datalen);
  523. if (conn->in.itt < session->cmds_max) {
  524. if (conn->hdrdgst_en && cdgst != rdgst) {
  525. printk(KERN_ERR "iscsi_tcp: itt %x: hdrdgst error "
  526. "recv 0x%x calc 0x%x\n", conn->in.itt, rdgst,
  527. cdgst);
  528. return ISCSI_ERR_HDR_DGST;
  529. }
  530. ctask = (struct iscsi_cmd_task *)session->cmds[conn->in.itt];
  531. if (!ctask->sc) {
  532. printk(KERN_INFO "iscsi_tcp: dropping ctask with "
  533. "itt 0x%x\n", ctask->itt);
  534. conn->in.datalen = 0; /* force drop */
  535. return 0;
  536. }
  537. if (ctask->sc->SCp.phase != session->age) {
  538. printk(KERN_ERR "iscsi_tcp: ctask's session age %d, "
  539. "expected %d\n", ctask->sc->SCp.phase,
  540. session->age);
  541. return ISCSI_ERR_SESSION_FAILED;
  542. }
  543. conn->in.ctask = ctask;
  544. debug_scsi("rsp [op 0x%x cid %d sc %lx itt 0x%x len %d]\n",
  545. hdr->opcode, conn->id, (long)ctask->sc,
  546. ctask->itt, conn->in.datalen);
  547. switch(conn->in.opcode) {
  548. case ISCSI_OP_SCSI_CMD_RSP:
  549. BUG_ON((void*)ctask != ctask->sc->SCp.ptr);
  550. if (ctask->hdr.flags & ISCSI_FLAG_CMD_WRITE)
  551. rc = iscsi_cmd_rsp(conn, ctask);
  552. else if (!conn->in.datalen)
  553. rc = iscsi_cmd_rsp(conn, ctask);
  554. else
  555. /*
  556. * got sense or response data; copying PDU
  557. * Header to the connection's header
  558. * placeholder
  559. */
  560. memcpy(&conn->hdr, hdr,
  561. sizeof(struct iscsi_hdr));
  562. break;
  563. case ISCSI_OP_SCSI_DATA_IN:
  564. BUG_ON((void*)ctask != ctask->sc->SCp.ptr);
  565. /* save flags for non-exceptional status */
  566. conn->in.flags = hdr->flags;
  567. /* save cmd_status for sense data */
  568. conn->in.cmd_status =
  569. ((struct iscsi_data_rsp*)hdr)->cmd_status;
  570. rc = iscsi_data_rsp(conn, ctask);
  571. break;
  572. case ISCSI_OP_R2T:
  573. BUG_ON((void*)ctask != ctask->sc->SCp.ptr);
  574. if (ctask->hdr.flags & ISCSI_FLAG_CMD_WRITE &&
  575. ctask->sc->sc_data_direction == DMA_TO_DEVICE)
  576. rc = iscsi_r2t_rsp(conn, ctask);
  577. else
  578. rc = ISCSI_ERR_PROTO;
  579. break;
  580. case ISCSI_OP_NOOP_IN:
  581. case ISCSI_OP_TEXT_RSP:
  582. case ISCSI_OP_LOGOUT_RSP:
  583. case ISCSI_OP_ASYNC_EVENT:
  584. case ISCSI_OP_REJECT:
  585. rc = iscsi_check_assign_cmdsn(session,
  586. (struct iscsi_nopin*)hdr);
  587. if (rc)
  588. break;
  589. /* update ExpStatSN */
  590. conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1;
  591. if (!conn->in.datalen) {
  592. struct iscsi_mgmt_task *mtask;
  593. rc = iscsi_recv_pdu(iscsi_handle(conn), hdr,
  594. NULL, 0);
  595. mtask = (struct iscsi_mgmt_task *)
  596. session->mgmt_cmds[conn->in.itt -
  597. ISCSI_MGMT_ITT_OFFSET];
  598. if (conn->login_mtask != mtask) {
  599. spin_lock(&session->lock);
  600. __kfifo_put(session->mgmtpool.queue,
  601. (void*)&mtask, sizeof(void*));
  602. spin_unlock(&session->lock);
  603. }
  604. }
  605. break;
  606. default:
  607. rc = ISCSI_ERR_BAD_OPCODE;
  608. break;
  609. }
  610. } else if (conn->in.itt >= ISCSI_MGMT_ITT_OFFSET &&
  611. conn->in.itt < ISCSI_MGMT_ITT_OFFSET +
  612. session->mgmtpool_max) {
  613. struct iscsi_mgmt_task *mtask = (struct iscsi_mgmt_task *)
  614. session->mgmt_cmds[conn->in.itt -
  615. ISCSI_MGMT_ITT_OFFSET];
  616. debug_scsi("immrsp [op 0x%x cid %d itt 0x%x len %d]\n",
  617. conn->in.opcode, conn->id, mtask->itt,
  618. conn->in.datalen);
  619. switch(conn->in.opcode) {
  620. case ISCSI_OP_LOGIN_RSP:
  621. case ISCSI_OP_TEXT_RSP:
  622. rc = iscsi_check_assign_cmdsn(session,
  623. (struct iscsi_nopin*)hdr);
  624. if (rc)
  625. break;
  626. if (!conn->in.datalen) {
  627. rc = iscsi_recv_pdu(iscsi_handle(conn), hdr,
  628. NULL, 0);
  629. if (conn->login_mtask != mtask) {
  630. spin_lock(&session->lock);
  631. __kfifo_put(session->mgmtpool.queue,
  632. (void*)&mtask, sizeof(void*));
  633. spin_unlock(&session->lock);
  634. }
  635. }
  636. break;
  637. case ISCSI_OP_SCSI_TMFUNC_RSP:
  638. rc = iscsi_check_assign_cmdsn(session,
  639. (struct iscsi_nopin*)hdr);
  640. if (rc)
  641. break;
  642. if (conn->in.datalen || conn->in.ahslen) {
  643. rc = ISCSI_ERR_PROTO;
  644. break;
  645. }
  646. conn->tmfrsp_pdus_cnt++;
  647. spin_lock(&session->lock);
  648. if (conn->tmabort_state == TMABORT_INITIAL) {
  649. __kfifo_put(session->mgmtpool.queue,
  650. (void*)&mtask, sizeof(void*));
  651. conn->tmabort_state =
  652. ((struct iscsi_tm_rsp *)hdr)->
  653. response == SCSI_TCP_TM_RESP_COMPLETE ?
  654. TMABORT_SUCCESS:TMABORT_FAILED;
  655. /* unblock eh_abort() */
  656. wake_up(&conn->ehwait);
  657. }
  658. spin_unlock(&session->lock);
  659. break;
  660. default:
  661. rc = ISCSI_ERR_BAD_OPCODE;
  662. break;
  663. }
  664. } else if (conn->in.itt == ISCSI_RESERVED_TAG) {
  665. if (conn->in.opcode == ISCSI_OP_NOOP_IN && !conn->in.datalen) {
  666. rc = iscsi_check_assign_cmdsn(session,
  667. (struct iscsi_nopin*)hdr);
  668. if (!rc)
  669. rc = iscsi_recv_pdu(iscsi_handle(conn),
  670. hdr, NULL, 0);
  671. }
  672. else
  673. rc = ISCSI_ERR_BAD_OPCODE;
  674. } else
  675. rc = ISCSI_ERR_BAD_ITT;
  676. return rc;
  677. }
  678. /**
  679. * iscsi_ctask_copy - copy skb bits to the destanation cmd task
  680. * @conn: iscsi connection
  681. * @ctask: scsi command task
  682. * @buf: buffer to copy to
  683. * @buf_size: size of buffer
  684. * @offset: offset within the buffer
  685. *
  686. * Notes:
  687. * The function calls skb_copy_bits() and updates per-connection and
  688. * per-cmd byte counters.
  689. *
  690. * Read counters (in bytes):
  691. *
  692. * conn->in.offset offset within in progress SKB
  693. * conn->in.copy left to copy from in progress SKB
  694. * including padding
  695. * conn->in.copied copied already from in progress SKB
  696. * conn->data_copied copied already from in progress buffer
  697. * ctask->sent total bytes sent up to the MidLayer
  698. * ctask->data_count left to copy from in progress Data-In
  699. * buf_left left to copy from in progress buffer
  700. **/
  701. static inline int
  702. iscsi_ctask_copy(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
  703. void *buf, int buf_size, int offset)
  704. {
  705. int buf_left = buf_size - (conn->data_copied + offset);
  706. int size = min(conn->in.copy, buf_left);
  707. int rc;
  708. size = min(size, ctask->data_count);
  709. debug_tcp("ctask_copy %d bytes at offset %d copied %d\n",
  710. size, conn->in.offset, conn->in.copied);
  711. BUG_ON(size <= 0);
  712. BUG_ON(ctask->sent + size > ctask->total_length);
  713. rc = skb_copy_bits(conn->in.skb, conn->in.offset,
  714. (char*)buf + (offset + conn->data_copied), size);
  715. /* must fit into skb->len */
  716. BUG_ON(rc);
  717. conn->in.offset += size;
  718. conn->in.copy -= size;
  719. conn->in.copied += size;
  720. conn->data_copied += size;
  721. ctask->sent += size;
  722. ctask->data_count -= size;
  723. BUG_ON(conn->in.copy < 0);
  724. BUG_ON(ctask->data_count < 0);
  725. if (buf_size != (conn->data_copied + offset)) {
  726. if (!ctask->data_count) {
  727. BUG_ON(buf_size - conn->data_copied < 0);
  728. /* done with this PDU */
  729. return buf_size - conn->data_copied;
  730. }
  731. return -EAGAIN;
  732. }
  733. /* done with this buffer or with both - PDU and buffer */
  734. conn->data_copied = 0;
  735. return 0;
  736. }
  737. /**
  738. * iscsi_tcp_copy - copy skb bits to the destanation buffer
  739. * @conn: iscsi connection
  740. * @buf: buffer to copy to
  741. * @buf_size: number of bytes to copy
  742. *
  743. * Notes:
  744. * The function calls skb_copy_bits() and updates per-connection
  745. * byte counters.
  746. **/
  747. static inline int
  748. iscsi_tcp_copy(struct iscsi_conn *conn, void *buf, int buf_size)
  749. {
  750. int buf_left = buf_size - conn->data_copied;
  751. int size = min(conn->in.copy, buf_left);
  752. int rc;
  753. debug_tcp("tcp_copy %d bytes at offset %d copied %d\n",
  754. size, conn->in.offset, conn->data_copied);
  755. BUG_ON(size <= 0);
  756. rc = skb_copy_bits(conn->in.skb, conn->in.offset,
  757. (char*)buf + conn->data_copied, size);
  758. BUG_ON(rc);
  759. conn->in.offset += size;
  760. conn->in.copy -= size;
  761. conn->in.copied += size;
  762. conn->data_copied += size;
  763. if (buf_size != conn->data_copied)
  764. return -EAGAIN;
  765. return 0;
  766. }
  767. static inline void
  768. partial_sg_digest_update(struct iscsi_conn *conn, struct scatterlist *sg,
  769. int offset, int length)
  770. {
  771. struct scatterlist temp;
  772. memcpy(&temp, sg, sizeof(struct scatterlist));
  773. temp.offset = offset;
  774. temp.length = length;
  775. crypto_digest_update(conn->data_rx_tfm, &temp, 1);
  776. }
  777. static int iscsi_scsi_data_in(struct iscsi_conn *conn)
  778. {
  779. struct iscsi_cmd_task *ctask = conn->in.ctask;
  780. struct scsi_cmnd *sc = ctask->sc;
  781. struct scatterlist tmp, *sg;
  782. int i, offset, rc = 0;
  783. BUG_ON((void*)ctask != sc->SCp.ptr);
  784. /*
  785. * copying Data-In into the Scsi_Cmnd
  786. */
  787. if (!sc->use_sg) {
  788. i = ctask->data_count;
  789. rc = iscsi_ctask_copy(conn, ctask, sc->request_buffer,
  790. sc->request_bufflen, ctask->data_offset);
  791. if (rc == -EAGAIN)
  792. return rc;
  793. if (conn->datadgst_en) {
  794. sg_init_one(&tmp, sc->request_buffer, i);
  795. crypto_digest_update(conn->data_rx_tfm, &tmp, 1);
  796. }
  797. rc = 0;
  798. goto done;
  799. }
  800. offset = ctask->data_offset;
  801. sg = sc->request_buffer;
  802. if (ctask->data_offset)
  803. for (i = 0; i < ctask->sg_count; i++)
  804. offset -= sg[i].length;
  805. /* we've passed through partial sg*/
  806. if (offset < 0)
  807. offset = 0;
  808. for (i = ctask->sg_count; i < sc->use_sg; i++) {
  809. char *dest;
  810. dest = kmap_atomic(sg[i].page, KM_SOFTIRQ0);
  811. rc = iscsi_ctask_copy(conn, ctask, dest + sg[i].offset,
  812. sg[i].length, offset);
  813. kunmap_atomic(dest, KM_SOFTIRQ0);
  814. if (rc == -EAGAIN)
  815. /* continue with the next SKB/PDU */
  816. return rc;
  817. if (!rc) {
  818. if (conn->datadgst_en) {
  819. if (!offset)
  820. crypto_digest_update(conn->data_rx_tfm,
  821. &sg[i], 1);
  822. else
  823. partial_sg_digest_update(conn, &sg[i],
  824. sg[i].offset + offset,
  825. sg[i].length - offset);
  826. }
  827. offset = 0;
  828. ctask->sg_count++;
  829. }
  830. if (!ctask->data_count) {
  831. if (rc && conn->datadgst_en)
  832. /*
  833. * data-in is complete, but buffer not...
  834. */
  835. partial_sg_digest_update(conn, &sg[i],
  836. sg[i].offset, sg[i].length-rc);
  837. rc = 0;
  838. break;
  839. }
  840. if (!conn->in.copy)
  841. return -EAGAIN;
  842. }
  843. BUG_ON(ctask->data_count);
  844. done:
  845. /* check for non-exceptional status */
  846. if (conn->in.flags & ISCSI_FLAG_DATA_STATUS) {
  847. debug_scsi("done [sc %lx res %d itt 0x%x]\n",
  848. (long)sc, sc->result, ctask->itt);
  849. conn->scsirsp_pdus_cnt++;
  850. iscsi_ctask_cleanup(conn, ctask);
  851. sc->scsi_done(sc);
  852. }
  853. return rc;
  854. }
  855. static int
  856. iscsi_data_recv(struct iscsi_conn *conn)
  857. {
  858. struct iscsi_session *session = conn->session;
  859. int rc = 0;
  860. switch(conn->in.opcode) {
  861. case ISCSI_OP_SCSI_DATA_IN:
  862. rc = iscsi_scsi_data_in(conn);
  863. break;
  864. case ISCSI_OP_SCSI_CMD_RSP: {
  865. /*
  866. * SCSI Sense Data:
  867. * copying the entire Data Segment.
  868. */
  869. if (iscsi_tcp_copy(conn, conn->data, conn->in.datalen)) {
  870. rc = -EAGAIN;
  871. goto exit;
  872. }
  873. /*
  874. * check for sense
  875. */
  876. conn->in.hdr = &conn->hdr;
  877. conn->senselen = (conn->data[0] << 8) | conn->data[1];
  878. rc = iscsi_cmd_rsp(conn, conn->in.ctask);
  879. }
  880. break;
  881. case ISCSI_OP_TEXT_RSP:
  882. case ISCSI_OP_LOGIN_RSP:
  883. case ISCSI_OP_NOOP_IN: {
  884. struct iscsi_mgmt_task *mtask = NULL;
  885. if (conn->in.itt != ISCSI_RESERVED_TAG)
  886. mtask = (struct iscsi_mgmt_task *)
  887. session->mgmt_cmds[conn->in.itt -
  888. ISCSI_MGMT_ITT_OFFSET];
  889. /*
  890. * Collect data segment to the connection's data
  891. * placeholder
  892. */
  893. if (iscsi_tcp_copy(conn, conn->data, conn->in.datalen)) {
  894. rc = -EAGAIN;
  895. goto exit;
  896. }
  897. rc = iscsi_recv_pdu(iscsi_handle(conn), conn->in.hdr,
  898. conn->data, conn->in.datalen);
  899. if (mtask && conn->login_mtask != mtask) {
  900. spin_lock(&session->lock);
  901. __kfifo_put(session->mgmtpool.queue, (void*)&mtask,
  902. sizeof(void*));
  903. spin_unlock(&session->lock);
  904. }
  905. }
  906. break;
  907. default:
  908. BUG_ON(1);
  909. }
  910. exit:
  911. return rc;
  912. }
  913. /**
  914. * iscsi_tcp_data_recv - TCP receive in sendfile fashion
  915. * @rd_desc: read descriptor
  916. * @skb: socket buffer
  917. * @offset: offset in skb
  918. * @len: skb->len - offset
  919. **/
  920. static int
  921. iscsi_tcp_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb,
  922. unsigned int offset, size_t len)
  923. {
  924. int rc;
  925. struct iscsi_conn *conn = rd_desc->arg.data;
  926. int start = skb_headlen(skb);
  927. int processed;
  928. char pad[ISCSI_PAD_LEN];
  929. struct scatterlist sg;
  930. /*
  931. * Save current SKB and its offset in the corresponding
  932. * connection context.
  933. */
  934. conn->in.copy = start - offset;
  935. conn->in.offset = offset;
  936. conn->in.skb = skb;
  937. conn->in.len = conn->in.copy;
  938. BUG_ON(conn->in.copy <= 0);
  939. debug_tcp("in %d bytes\n", conn->in.copy);
  940. more:
  941. conn->in.copied = 0;
  942. rc = 0;
  943. if (unlikely(conn->suspend_rx)) {
  944. debug_tcp("conn %d Rx suspended!\n", conn->id);
  945. return 0;
  946. }
  947. if (conn->in_progress == IN_PROGRESS_WAIT_HEADER ||
  948. conn->in_progress == IN_PROGRESS_HEADER_GATHER) {
  949. rc = iscsi_hdr_extract(conn);
  950. if (rc) {
  951. if (rc == -EAGAIN)
  952. goto nomore;
  953. else {
  954. iscsi_conn_failure(conn, rc);
  955. return 0;
  956. }
  957. }
  958. /*
  959. * Verify and process incoming PDU header.
  960. */
  961. rc = iscsi_hdr_recv(conn);
  962. if (!rc && conn->in.datalen) {
  963. if (conn->datadgst_en &&
  964. conn->in.opcode == ISCSI_OP_SCSI_DATA_IN) {
  965. BUG_ON(!conn->data_rx_tfm);
  966. crypto_digest_init(conn->data_rx_tfm);
  967. }
  968. conn->in_progress = IN_PROGRESS_DATA_RECV;
  969. } else if (rc) {
  970. iscsi_conn_failure(conn, rc);
  971. return 0;
  972. }
  973. }
  974. if (conn->in_progress == IN_PROGRESS_DDIGEST_RECV) {
  975. debug_tcp("extra data_recv offset %d copy %d\n",
  976. conn->in.offset, conn->in.copy);
  977. if (conn->in.opcode == ISCSI_OP_SCSI_DATA_IN) {
  978. uint32_t recv_digest;
  979. skb_copy_bits(conn->in.skb, conn->in.offset,
  980. &recv_digest, 4);
  981. conn->in.offset += 4;
  982. conn->in.copy -= 4;
  983. if (recv_digest != conn->in.datadgst) {
  984. debug_tcp("iscsi_tcp: data digest error!"
  985. "0x%x != 0x%x\n", recv_digest,
  986. conn->in.datadgst);
  987. iscsi_conn_failure(conn, ISCSI_ERR_DATA_DGST);
  988. return 0;
  989. } else {
  990. debug_tcp("iscsi_tcp: data digest match!"
  991. "0x%x == 0x%x\n", recv_digest,
  992. conn->in.datadgst);
  993. conn->in_progress = IN_PROGRESS_WAIT_HEADER;
  994. }
  995. }
  996. }
  997. if (conn->in_progress == IN_PROGRESS_DATA_RECV && conn->in.copy) {
  998. debug_tcp("data_recv offset %d copy %d\n",
  999. conn->in.offset, conn->in.copy);
  1000. rc = iscsi_data_recv(conn);
  1001. if (rc) {
  1002. if (rc == -EAGAIN) {
  1003. rd_desc->count = conn->in.datalen -
  1004. conn->in.ctask->data_count;
  1005. goto again;
  1006. }
  1007. iscsi_conn_failure(conn, rc);
  1008. return 0;
  1009. }
  1010. conn->in.copy -= conn->in.padding;
  1011. conn->in.offset += conn->in.padding;
  1012. if (conn->datadgst_en &&
  1013. conn->in.opcode == ISCSI_OP_SCSI_DATA_IN) {
  1014. if (conn->in.padding) {
  1015. debug_tcp("padding -> %d\n", conn->in.padding);
  1016. memset(pad, 0, conn->in.padding);
  1017. sg_init_one(&sg, pad, conn->in.padding);
  1018. crypto_digest_update(conn->data_rx_tfm, &sg, 1);
  1019. }
  1020. crypto_digest_final(conn->data_rx_tfm,
  1021. (u8 *) & conn->in.datadgst);
  1022. debug_tcp("rx digest 0x%x\n", conn->in.datadgst);
  1023. conn->in_progress = IN_PROGRESS_DDIGEST_RECV;
  1024. } else
  1025. conn->in_progress = IN_PROGRESS_WAIT_HEADER;
  1026. }
  1027. debug_tcp("f, processed %d from out of %d padding %d\n",
  1028. conn->in.offset - offset, (int)len, conn->in.padding);
  1029. BUG_ON(conn->in.offset - offset > len);
  1030. if (conn->in.offset - offset != len) {
  1031. debug_tcp("continue to process %d bytes\n",
  1032. (int)len - (conn->in.offset - offset));
  1033. goto more;
  1034. }
  1035. nomore:
  1036. processed = conn->in.offset - offset;
  1037. BUG_ON(processed == 0);
  1038. return processed;
  1039. again:
  1040. processed = conn->in.offset - offset;
  1041. debug_tcp("c, processed %d from out of %d rd_desc_cnt %d\n",
  1042. processed, (int)len, (int)rd_desc->count);
  1043. BUG_ON(processed == 0);
  1044. BUG_ON(processed > len);
  1045. conn->rxdata_octets += processed;
  1046. return processed;
  1047. }
  1048. static void
  1049. iscsi_tcp_data_ready(struct sock *sk, int flag)
  1050. {
  1051. struct iscsi_conn *conn = sk->sk_user_data;
  1052. read_descriptor_t rd_desc;
  1053. read_lock(&sk->sk_callback_lock);
  1054. /* use rd_desc to pass 'conn' to iscsi_tcp_data_recv */
  1055. rd_desc.arg.data = conn;
  1056. rd_desc.count = 0;
  1057. tcp_read_sock(sk, &rd_desc, iscsi_tcp_data_recv);
  1058. read_unlock(&sk->sk_callback_lock);
  1059. }
  1060. static void
  1061. iscsi_tcp_state_change(struct sock *sk)
  1062. {
  1063. struct iscsi_conn *conn;
  1064. struct iscsi_session *session;
  1065. void (*old_state_change)(struct sock *);
  1066. read_lock(&sk->sk_callback_lock);
  1067. conn = (struct iscsi_conn*)sk->sk_user_data;
  1068. session = conn->session;
  1069. if (sk->sk_state == TCP_CLOSE_WAIT ||
  1070. sk->sk_state == TCP_CLOSE) {
  1071. debug_tcp("iscsi_tcp_state_change: TCP_CLOSE|TCP_CLOSE_WAIT\n");
  1072. iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
  1073. }
  1074. old_state_change = conn->old_state_change;
  1075. read_unlock(&sk->sk_callback_lock);
  1076. old_state_change(sk);
  1077. }
  1078. /**
  1079. * iscsi_write_space - Called when more output buffer space is available
  1080. * @sk: socket space is available for
  1081. **/
  1082. static void
  1083. iscsi_write_space(struct sock *sk)
  1084. {
  1085. struct iscsi_conn *conn = (struct iscsi_conn*)sk->sk_user_data;
  1086. conn->old_write_space(sk);
  1087. debug_tcp("iscsi_write_space: cid %d\n", conn->id);
  1088. clear_bit(SUSPEND_BIT, &conn->suspend_tx);
  1089. schedule_work(&conn->xmitwork);
  1090. }
  1091. static void
  1092. iscsi_conn_set_callbacks(struct iscsi_conn *conn)
  1093. {
  1094. struct sock *sk = conn->sock->sk;
  1095. /* assign new callbacks */
  1096. write_lock_bh(&sk->sk_callback_lock);
  1097. sk->sk_user_data = conn;
  1098. conn->old_data_ready = sk->sk_data_ready;
  1099. conn->old_state_change = sk->sk_state_change;
  1100. conn->old_write_space = sk->sk_write_space;
  1101. sk->sk_data_ready = iscsi_tcp_data_ready;
  1102. sk->sk_state_change = iscsi_tcp_state_change;
  1103. sk->sk_write_space = iscsi_write_space;
  1104. write_unlock_bh(&sk->sk_callback_lock);
  1105. }
  1106. static void
  1107. iscsi_conn_restore_callbacks(struct iscsi_conn *conn)
  1108. {
  1109. struct sock *sk = conn->sock->sk;
  1110. /* restore socket callbacks, see also: iscsi_conn_set_callbacks() */
  1111. write_lock_bh(&sk->sk_callback_lock);
  1112. sk->sk_user_data = NULL;
  1113. sk->sk_data_ready = conn->old_data_ready;
  1114. sk->sk_state_change = conn->old_state_change;
  1115. sk->sk_write_space = conn->old_write_space;
  1116. sk->sk_no_check = 0;
  1117. write_unlock_bh(&sk->sk_callback_lock);
  1118. }
  1119. /**
  1120. * iscsi_send - generic send routine
  1121. * @sk: kernel's socket
  1122. * @buf: buffer to write from
  1123. * @size: actual size to write
  1124. * @flags: socket's flags
  1125. *
  1126. * Notes:
  1127. * depending on buffer will use tcp_sendpage() or tcp_sendmsg().
  1128. * buf->sg.offset == -1 tells us that buffer is non S/G and forces
  1129. * to use tcp_sendmsg().
  1130. */
  1131. static inline int
  1132. iscsi_send(struct socket *sk, struct iscsi_buf *buf, int size, int flags)
  1133. {
  1134. int res;
  1135. if ((int)buf->sg.offset >= 0) {
  1136. int offset = buf->sg.offset + buf->sent;
  1137. /* tcp_sendpage */
  1138. res = sk->ops->sendpage(sk, buf->sg.page, offset, size, flags);
  1139. } else {
  1140. struct msghdr msg;
  1141. buf->iov.iov_base = iscsi_buf_iov_base(buf);
  1142. buf->iov.iov_len = size;
  1143. memset(&msg, 0, sizeof(struct msghdr));
  1144. /* tcp_sendmsg */
  1145. res = kernel_sendmsg(sk, &msg, &buf->iov, 1, size);
  1146. }
  1147. return res;
  1148. }
  1149. /**
  1150. * iscsi_sendhdr - send PDU Header via tcp_sendpage()
  1151. * @conn: iscsi connection
  1152. * @buf: buffer to write from
  1153. * @datalen: lenght of data to be sent after the header
  1154. *
  1155. * Notes:
  1156. * (Tx, Fast Path)
  1157. **/
  1158. static inline int
  1159. iscsi_sendhdr(struct iscsi_conn *conn, struct iscsi_buf *buf, int datalen)
  1160. {
  1161. struct socket *sk = conn->sock;
  1162. int flags = 0; /* MSG_DONTWAIT; */
  1163. int res, size;
  1164. size = buf->sg.length - buf->sent;
  1165. BUG_ON(buf->sent + size > buf->sg.length);
  1166. if (buf->sent + size != buf->sg.length || datalen)
  1167. flags |= MSG_MORE;
  1168. res = iscsi_send(sk, buf, size, flags);
  1169. debug_tcp("sendhdr %d bytes, sent %d res %d\n", size, buf->sent, res);
  1170. if (res >= 0) {
  1171. conn->txdata_octets += res;
  1172. buf->sent += res;
  1173. if (size != res)
  1174. return -EAGAIN;
  1175. return 0;
  1176. } else if (res == -EAGAIN) {
  1177. conn->sendpage_failures_cnt++;
  1178. set_bit(SUSPEND_BIT, &conn->suspend_tx);
  1179. } else if (res == -EPIPE)
  1180. iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
  1181. return res;
  1182. }
  1183. /**
  1184. * iscsi_sendpage - send one page of iSCSI Data-Out.
  1185. * @conn: iscsi connection
  1186. * @buf: buffer to write from
  1187. * @count: remaining data
  1188. * @sent: number of bytes sent
  1189. *
  1190. * Notes:
  1191. * (Tx, Fast Path)
  1192. **/
  1193. static inline int
  1194. iscsi_sendpage(struct iscsi_conn *conn, struct iscsi_buf *buf,
  1195. int *count, int *sent)
  1196. {
  1197. struct socket *sk = conn->sock;
  1198. int flags = 0; /* MSG_DONTWAIT; */
  1199. int res, size;
  1200. size = buf->sg.length - buf->sent;
  1201. BUG_ON(buf->sent + size > buf->sg.length);
  1202. if (size > *count)
  1203. size = *count;
  1204. if (buf->sent + size != buf->sg.length)
  1205. flags |= MSG_MORE;
  1206. res = iscsi_send(sk, buf, size, flags);
  1207. debug_tcp("sendpage: %d bytes, sent %d left %d sent %d res %d\n",
  1208. size, buf->sent, *count, *sent, res);
  1209. if (res >= 0) {
  1210. conn->txdata_octets += res;
  1211. buf->sent += res;
  1212. *count -= res;
  1213. *sent += res;
  1214. if (size != res)
  1215. return -EAGAIN;
  1216. return 0;
  1217. } else if (res == -EAGAIN) {
  1218. conn->sendpage_failures_cnt++;
  1219. set_bit(SUSPEND_BIT, &conn->suspend_tx);
  1220. } else if (res == -EPIPE)
  1221. iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
  1222. return res;
  1223. }
  1224. static inline void
  1225. iscsi_data_digest_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
  1226. {
  1227. BUG_ON(!conn->data_tx_tfm);
  1228. crypto_digest_init(conn->data_tx_tfm);
  1229. ctask->digest_count = 4;
  1230. }
  1231. static inline void
  1232. iscsi_buf_data_digest_update(struct iscsi_conn *conn, struct iscsi_buf *buf)
  1233. {
  1234. struct scatterlist sg;
  1235. if (buf->sg.offset != -1)
  1236. crypto_digest_update(conn->data_tx_tfm, &buf->sg, 1);
  1237. else {
  1238. sg_init_one(&sg, (char *)buf->sg.page, buf->sg.length);
  1239. crypto_digest_update(conn->data_tx_tfm, &sg, 1);
  1240. }
  1241. }
  1242. static inline int
  1243. iscsi_digest_final_send(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
  1244. struct iscsi_buf *buf, uint32_t *digest, int final)
  1245. {
  1246. int rc = 0;
  1247. int sent = 0;
  1248. if (final)
  1249. crypto_digest_final(conn->data_tx_tfm, (u8*)digest);
  1250. iscsi_buf_init_virt(buf, (char*)digest, 4);
  1251. rc = iscsi_sendpage(conn, buf, &ctask->digest_count, &sent);
  1252. if (rc) {
  1253. ctask->datadigest = *digest;
  1254. ctask->xmstate |= XMSTATE_DATA_DIGEST;
  1255. } else
  1256. ctask->digest_count = 4;
  1257. return rc;
  1258. }
  1259. /**
  1260. * iscsi_solicit_data_cont - initialize next Data-Out
  1261. * @conn: iscsi connection
  1262. * @ctask: scsi command task
  1263. * @r2t: R2T info
  1264. * @left: bytes left to transfer
  1265. *
  1266. * Notes:
  1267. * Initialize next Data-Out within this R2T sequence and continue
  1268. * to process next Scatter-Gather element(if any) of this SCSI command.
  1269. *
  1270. * Called under connection lock.
  1271. **/
  1272. static void
  1273. iscsi_solicit_data_cont(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
  1274. struct iscsi_r2t_info *r2t, int left)
  1275. {
  1276. struct iscsi_data *hdr;
  1277. struct iscsi_data_task *dtask;
  1278. struct scsi_cmnd *sc = ctask->sc;
  1279. int new_offset;
  1280. dtask = mempool_alloc(ctask->datapool, GFP_ATOMIC);
  1281. BUG_ON(!dtask);
  1282. hdr = &dtask->hdr;
  1283. memset(hdr, 0, sizeof(struct iscsi_data));
  1284. hdr->ttt = r2t->ttt;
  1285. hdr->datasn = cpu_to_be32(r2t->solicit_datasn);
  1286. r2t->solicit_datasn++;
  1287. hdr->opcode = ISCSI_OP_SCSI_DATA_OUT;
  1288. memcpy(hdr->lun, ctask->hdr.lun, sizeof(hdr->lun));
  1289. hdr->itt = ctask->hdr.itt;
  1290. hdr->exp_statsn = r2t->exp_statsn;
  1291. new_offset = r2t->data_offset + r2t->sent;
  1292. hdr->offset = cpu_to_be32(new_offset);
  1293. if (left > conn->max_xmit_dlength) {
  1294. hton24(hdr->dlength, conn->max_xmit_dlength);
  1295. r2t->data_count = conn->max_xmit_dlength;
  1296. } else {
  1297. hton24(hdr->dlength, left);
  1298. r2t->data_count = left;
  1299. hdr->flags = ISCSI_FLAG_CMD_FINAL;
  1300. }
  1301. conn->dataout_pdus_cnt++;
  1302. iscsi_buf_init_hdr(conn, &r2t->headbuf, (char*)hdr,
  1303. (u8 *)dtask->hdrext);
  1304. r2t->dtask = dtask;
  1305. if (sc->use_sg && !iscsi_buf_left(&r2t->sendbuf)) {
  1306. BUG_ON(ctask->bad_sg == r2t->sg);
  1307. iscsi_buf_init_sg(&r2t->sendbuf, r2t->sg);
  1308. r2t->sg += 1;
  1309. } else
  1310. iscsi_buf_init_iov(&ctask->sendbuf,
  1311. (char*)sc->request_buffer + new_offset,
  1312. r2t->data_count);
  1313. list_add(&dtask->item, &ctask->dataqueue);
  1314. }
  1315. static void
  1316. iscsi_unsolicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
  1317. {
  1318. struct iscsi_data *hdr;
  1319. struct iscsi_data_task *dtask;
  1320. dtask = mempool_alloc(ctask->datapool, GFP_ATOMIC);
  1321. BUG_ON(!dtask);
  1322. hdr = &dtask->hdr;
  1323. memset(hdr, 0, sizeof(struct iscsi_data));
  1324. hdr->ttt = cpu_to_be32(ISCSI_RESERVED_TAG);
  1325. hdr->datasn = cpu_to_be32(ctask->unsol_datasn);
  1326. ctask->unsol_datasn++;
  1327. hdr->opcode = ISCSI_OP_SCSI_DATA_OUT;
  1328. memcpy(hdr->lun, ctask->hdr.lun, sizeof(hdr->lun));
  1329. hdr->itt = ctask->hdr.itt;
  1330. hdr->exp_statsn = cpu_to_be32(conn->exp_statsn);
  1331. hdr->offset = cpu_to_be32(ctask->total_length -
  1332. ctask->r2t_data_count -
  1333. ctask->unsol_count);
  1334. if (ctask->unsol_count > conn->max_xmit_dlength) {
  1335. hton24(hdr->dlength, conn->max_xmit_dlength);
  1336. ctask->data_count = conn->max_xmit_dlength;
  1337. hdr->flags = 0;
  1338. } else {
  1339. hton24(hdr->dlength, ctask->unsol_count);
  1340. ctask->data_count = ctask->unsol_count;
  1341. hdr->flags = ISCSI_FLAG_CMD_FINAL;
  1342. }
  1343. iscsi_buf_init_hdr(conn, &ctask->headbuf, (char*)hdr,
  1344. (u8 *)dtask->hdrext);
  1345. list_add(&dtask->item, &ctask->dataqueue);
  1346. ctask->dtask = dtask;
  1347. }
  1348. /**
  1349. * iscsi_cmd_init - Initialize iSCSI SCSI_READ or SCSI_WRITE commands
  1350. * @conn: iscsi connection
  1351. * @ctask: scsi command task
  1352. * @sc: scsi command
  1353. **/
  1354. static void
  1355. iscsi_cmd_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
  1356. struct scsi_cmnd *sc)
  1357. {
  1358. struct iscsi_session *session = conn->session;
  1359. BUG_ON(__kfifo_len(ctask->r2tqueue));
  1360. ctask->sc = sc;
  1361. ctask->conn = conn;
  1362. ctask->hdr.opcode = ISCSI_OP_SCSI_CMD;
  1363. ctask->hdr.flags = ISCSI_ATTR_SIMPLE;
  1364. int_to_scsilun(sc->device->lun, (struct scsi_lun *)ctask->hdr.lun);
  1365. ctask->hdr.itt = ctask->itt | (conn->id << CID_SHIFT) |
  1366. (session->age << AGE_SHIFT);
  1367. ctask->hdr.data_length = cpu_to_be32(sc->request_bufflen);
  1368. ctask->hdr.cmdsn = cpu_to_be32(session->cmdsn); session->cmdsn++;
  1369. ctask->hdr.exp_statsn = cpu_to_be32(conn->exp_statsn);
  1370. memcpy(ctask->hdr.cdb, sc->cmnd, sc->cmd_len);
  1371. memset(&ctask->hdr.cdb[sc->cmd_len], 0, MAX_COMMAND_SIZE - sc->cmd_len);
  1372. ctask->mtask = NULL;
  1373. ctask->sent = 0;
  1374. ctask->sg_count = 0;
  1375. ctask->total_length = sc->request_bufflen;
  1376. if (sc->sc_data_direction == DMA_TO_DEVICE) {
  1377. ctask->exp_r2tsn = 0;
  1378. ctask->hdr.flags |= ISCSI_FLAG_CMD_WRITE;
  1379. BUG_ON(ctask->total_length == 0);
  1380. if (sc->use_sg) {
  1381. struct scatterlist *sg = sc->request_buffer;
  1382. iscsi_buf_init_sg(&ctask->sendbuf,
  1383. &sg[ctask->sg_count++]);
  1384. ctask->sg = sg;
  1385. ctask->bad_sg = sg + sc->use_sg;
  1386. } else {
  1387. iscsi_buf_init_iov(&ctask->sendbuf, sc->request_buffer,
  1388. sc->request_bufflen);
  1389. }
  1390. /*
  1391. * Write counters:
  1392. *
  1393. * imm_count bytes to be sent right after
  1394. * SCSI PDU Header
  1395. *
  1396. * unsol_count bytes(as Data-Out) to be sent
  1397. * without R2T ack right after
  1398. * immediate data
  1399. *
  1400. * r2t_data_count bytes to be sent via R2T ack's
  1401. *
  1402. * pad_count bytes to be sent as zero-padding
  1403. */
  1404. ctask->imm_count = 0;
  1405. ctask->unsol_count = 0;
  1406. ctask->unsol_datasn = 0;
  1407. ctask->xmstate = XMSTATE_W_HDR;
  1408. /* calculate write padding */
  1409. ctask->pad_count = ctask->total_length & (ISCSI_PAD_LEN-1);
  1410. if (ctask->pad_count) {
  1411. ctask->pad_count = ISCSI_PAD_LEN - ctask->pad_count;
  1412. debug_scsi("write padding %d bytes\n",
  1413. ctask->pad_count);
  1414. ctask->xmstate |= XMSTATE_W_PAD;
  1415. }
  1416. if (session->imm_data_en) {
  1417. if (ctask->total_length >= session->first_burst)
  1418. ctask->imm_count = min(session->first_burst,
  1419. conn->max_xmit_dlength);
  1420. else
  1421. ctask->imm_count = min(ctask->total_length,
  1422. conn->max_xmit_dlength);
  1423. hton24(ctask->hdr.dlength, ctask->imm_count);
  1424. ctask->xmstate |= XMSTATE_IMM_DATA;
  1425. } else
  1426. zero_data(ctask->hdr.dlength);
  1427. if (!session->initial_r2t_en)
  1428. ctask->unsol_count = min(session->first_burst,
  1429. ctask->total_length) - ctask->imm_count;
  1430. if (!ctask->unsol_count)
  1431. /* No unsolicit Data-Out's */
  1432. ctask->hdr.flags |= ISCSI_FLAG_CMD_FINAL;
  1433. else
  1434. ctask->xmstate |= XMSTATE_UNS_HDR | XMSTATE_UNS_INIT;
  1435. ctask->r2t_data_count = ctask->total_length -
  1436. ctask->imm_count -
  1437. ctask->unsol_count;
  1438. debug_scsi("cmd [itt %x total %d imm %d imm_data %d "
  1439. "r2t_data %d]\n",
  1440. ctask->itt, ctask->total_length, ctask->imm_count,
  1441. ctask->unsol_count, ctask->r2t_data_count);
  1442. } else {
  1443. ctask->hdr.flags |= ISCSI_FLAG_CMD_FINAL;
  1444. if (sc->sc_data_direction == DMA_FROM_DEVICE)
  1445. ctask->hdr.flags |= ISCSI_FLAG_CMD_READ;
  1446. ctask->datasn = 0;
  1447. ctask->xmstate = XMSTATE_R_HDR;
  1448. zero_data(ctask->hdr.dlength);
  1449. }
  1450. iscsi_buf_init_hdr(conn, &ctask->headbuf, (char*)&ctask->hdr,
  1451. (u8 *)ctask->hdrext);
  1452. conn->scsicmd_pdus_cnt++;
  1453. }
  1454. /**
  1455. * iscsi_mtask_xmit - xmit management(immediate) task
  1456. * @conn: iscsi connection
  1457. * @mtask: task management task
  1458. *
  1459. * Notes:
  1460. * The function can return -EAGAIN in which case caller must
  1461. * call it again later, or recover. '0' return code means successful
  1462. * xmit.
  1463. *
  1464. * Management xmit state machine consists of two states:
  1465. * IN_PROGRESS_IMM_HEAD - PDU Header xmit in progress
  1466. * IN_PROGRESS_IMM_DATA - PDU Data xmit in progress
  1467. **/
  1468. static int
  1469. iscsi_mtask_xmit(struct iscsi_conn *conn, struct iscsi_mgmt_task *mtask)
  1470. {
  1471. debug_scsi("mtask deq [cid %d state %x itt 0x%x]\n",
  1472. conn->id, mtask->xmstate, mtask->itt);
  1473. if (mtask->xmstate & XMSTATE_IMM_HDR) {
  1474. mtask->xmstate &= ~XMSTATE_IMM_HDR;
  1475. if (mtask->data_count)
  1476. mtask->xmstate |= XMSTATE_IMM_DATA;
  1477. if (iscsi_sendhdr(conn, &mtask->headbuf, mtask->data_count)) {
  1478. mtask->xmstate |= XMSTATE_IMM_HDR;
  1479. if (mtask->data_count)
  1480. mtask->xmstate &= ~XMSTATE_IMM_DATA;
  1481. return -EAGAIN;
  1482. }
  1483. }
  1484. if (mtask->xmstate & XMSTATE_IMM_DATA) {
  1485. BUG_ON(!mtask->data_count);
  1486. mtask->xmstate &= ~XMSTATE_IMM_DATA;
  1487. /* FIXME: implement.
  1488. * Virtual buffer could be spreaded across multiple pages...
  1489. */
  1490. do {
  1491. if (iscsi_sendpage(conn, &mtask->sendbuf,
  1492. &mtask->data_count, &mtask->sent)) {
  1493. mtask->xmstate |= XMSTATE_IMM_DATA;
  1494. return -EAGAIN;
  1495. }
  1496. } while (mtask->data_count);
  1497. }
  1498. BUG_ON(mtask->xmstate != XMSTATE_IDLE);
  1499. return 0;
  1500. }
  1501. static inline int
  1502. handle_xmstate_r_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
  1503. {
  1504. ctask->xmstate &= ~XMSTATE_R_HDR;
  1505. if (!iscsi_sendhdr(conn, &ctask->headbuf, 0)) {
  1506. BUG_ON(ctask->xmstate != XMSTATE_IDLE);
  1507. return 0; /* wait for Data-In */
  1508. }
  1509. ctask->xmstate |= XMSTATE_R_HDR;
  1510. return -EAGAIN;
  1511. }
  1512. static inline int
  1513. handle_xmstate_w_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
  1514. {
  1515. ctask->xmstate &= ~XMSTATE_W_HDR;
  1516. if (iscsi_sendhdr(conn, &ctask->headbuf, ctask->imm_count)) {
  1517. ctask->xmstate |= XMSTATE_W_HDR;
  1518. return -EAGAIN;
  1519. }
  1520. return 0;
  1521. }
  1522. static inline int
  1523. handle_xmstate_data_digest(struct iscsi_conn *conn,
  1524. struct iscsi_cmd_task *ctask)
  1525. {
  1526. ctask->xmstate &= ~XMSTATE_DATA_DIGEST;
  1527. debug_tcp("resent data digest 0x%x\n", ctask->datadigest);
  1528. if (iscsi_digest_final_send(conn, ctask, &ctask->immbuf,
  1529. &ctask->datadigest, 0)) {
  1530. ctask->xmstate |= XMSTATE_DATA_DIGEST;
  1531. debug_tcp("resent data digest 0x%x fail!\n",
  1532. ctask->datadigest);
  1533. return -EAGAIN;
  1534. }
  1535. return 0;
  1536. }
  1537. static inline int
  1538. handle_xmstate_imm_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
  1539. {
  1540. BUG_ON(!ctask->imm_count);
  1541. ctask->xmstate &= ~XMSTATE_IMM_DATA;
  1542. if (conn->datadgst_en) {
  1543. iscsi_data_digest_init(conn, ctask);
  1544. ctask->immdigest = 0;
  1545. }
  1546. for (;;) {
  1547. if (iscsi_sendpage(conn, &ctask->sendbuf, &ctask->imm_count,
  1548. &ctask->sent)) {
  1549. ctask->xmstate |= XMSTATE_IMM_DATA;
  1550. if (conn->datadgst_en) {
  1551. crypto_digest_final(conn->data_tx_tfm,
  1552. (u8*)&ctask->immdigest);
  1553. debug_tcp("tx imm sendpage fail 0x%x\n",
  1554. ctask->datadigest);
  1555. }
  1556. return -EAGAIN;
  1557. }
  1558. if (conn->datadgst_en)
  1559. iscsi_buf_data_digest_update(conn, &ctask->sendbuf);
  1560. if (!ctask->imm_count)
  1561. break;
  1562. iscsi_buf_init_sg(&ctask->sendbuf,
  1563. &ctask->sg[ctask->sg_count++]);
  1564. }
  1565. if (conn->datadgst_en && !(ctask->xmstate & XMSTATE_W_PAD)) {
  1566. if (iscsi_digest_final_send(conn, ctask, &ctask->immbuf,
  1567. &ctask->immdigest, 1)) {
  1568. debug_tcp("sending imm digest 0x%x fail!\n",
  1569. ctask->immdigest);
  1570. return -EAGAIN;
  1571. }
  1572. debug_tcp("sending imm digest 0x%x\n", ctask->immdigest);
  1573. }
  1574. return 0;
  1575. }
  1576. static inline int
  1577. handle_xmstate_uns_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
  1578. {
  1579. struct iscsi_data_task *dtask;
  1580. ctask->xmstate |= XMSTATE_UNS_DATA;
  1581. if (ctask->xmstate & XMSTATE_UNS_INIT) {
  1582. iscsi_unsolicit_data_init(conn, ctask);
  1583. BUG_ON(!ctask->dtask);
  1584. dtask = ctask->dtask;
  1585. ctask->xmstate &= ~XMSTATE_UNS_INIT;
  1586. }
  1587. if (iscsi_sendhdr(conn, &ctask->headbuf, ctask->data_count)) {
  1588. ctask->xmstate &= ~XMSTATE_UNS_DATA;
  1589. ctask->xmstate |= XMSTATE_UNS_HDR;
  1590. return -EAGAIN;
  1591. }
  1592. debug_scsi("uns dout [itt 0x%x dlen %d sent %d]\n",
  1593. ctask->itt, ctask->unsol_count, ctask->sent);
  1594. return 0;
  1595. }
  1596. static inline int
  1597. handle_xmstate_uns_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
  1598. {
  1599. struct iscsi_data_task *dtask = ctask->dtask;
  1600. BUG_ON(!ctask->data_count);
  1601. ctask->xmstate &= ~XMSTATE_UNS_DATA;
  1602. if (conn->datadgst_en) {
  1603. iscsi_data_digest_init(conn, ctask);
  1604. dtask->digest = 0;
  1605. }
  1606. for (;;) {
  1607. int start = ctask->sent;
  1608. if (iscsi_sendpage(conn, &ctask->sendbuf, &ctask->data_count,
  1609. &ctask->sent)) {
  1610. ctask->unsol_count -= ctask->sent - start;
  1611. ctask->xmstate |= XMSTATE_UNS_DATA;
  1612. /* will continue with this ctask later.. */
  1613. if (conn->datadgst_en) {
  1614. crypto_digest_final(conn->data_tx_tfm,
  1615. (u8 *)&dtask->digest);
  1616. debug_tcp("tx uns data fail 0x%x\n",
  1617. dtask->digest);
  1618. }
  1619. return -EAGAIN;
  1620. }
  1621. BUG_ON(ctask->sent > ctask->total_length);
  1622. ctask->unsol_count -= ctask->sent - start;
  1623. /*
  1624. * XXX:we may run here with un-initial sendbuf.
  1625. * so pass it
  1626. */
  1627. if (conn->datadgst_en && ctask->sent - start > 0)
  1628. iscsi_buf_data_digest_update(conn, &ctask->sendbuf);
  1629. if (!ctask->data_count)
  1630. break;
  1631. iscsi_buf_init_sg(&ctask->sendbuf,
  1632. &ctask->sg[ctask->sg_count++]);
  1633. }
  1634. BUG_ON(ctask->unsol_count < 0);
  1635. /*
  1636. * Done with the Data-Out. Next, check if we need
  1637. * to send another unsolicited Data-Out.
  1638. */
  1639. if (ctask->unsol_count) {
  1640. if (conn->datadgst_en) {
  1641. if (iscsi_digest_final_send(conn, ctask,
  1642. &dtask->digestbuf,
  1643. &dtask->digest, 1)) {
  1644. debug_tcp("send uns digest 0x%x fail\n",
  1645. dtask->digest);
  1646. return -EAGAIN;
  1647. }
  1648. debug_tcp("sending uns digest 0x%x, more uns\n",
  1649. dtask->digest);
  1650. }
  1651. ctask->xmstate |= XMSTATE_UNS_INIT;
  1652. return 1;
  1653. }
  1654. if (conn->datadgst_en && !(ctask->xmstate & XMSTATE_W_PAD)) {
  1655. if (iscsi_digest_final_send(conn, ctask,
  1656. &dtask->digestbuf,
  1657. &dtask->digest, 1)) {
  1658. debug_tcp("send last uns digest 0x%x fail\n",
  1659. dtask->digest);
  1660. return -EAGAIN;
  1661. }
  1662. debug_tcp("sending uns digest 0x%x\n",dtask->digest);
  1663. }
  1664. return 0;
  1665. }
  1666. static inline int
  1667. handle_xmstate_sol_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
  1668. {
  1669. struct iscsi_session *session = conn->session;
  1670. struct iscsi_r2t_info *r2t = ctask->r2t;
  1671. struct iscsi_data_task *dtask = r2t->dtask;
  1672. int left;
  1673. ctask->xmstate &= ~XMSTATE_SOL_DATA;
  1674. ctask->dtask = dtask;
  1675. if (conn->datadgst_en) {
  1676. iscsi_data_digest_init(conn, ctask);
  1677. dtask->digest = 0;
  1678. }
  1679. solicit_again:
  1680. /*
  1681. * send Data-Out whitnin this R2T sequence.
  1682. */
  1683. if (!r2t->data_count)
  1684. goto data_out_done;
  1685. if (iscsi_sendpage(conn, &r2t->sendbuf, &r2t->data_count, &r2t->sent)) {
  1686. ctask->xmstate |= XMSTATE_SOL_DATA;
  1687. /* will continue with this ctask later.. */
  1688. if (conn->datadgst_en) {
  1689. crypto_digest_final(conn->data_tx_tfm,
  1690. (u8 *)&dtask->digest);
  1691. debug_tcp("r2t data send fail 0x%x\n", dtask->digest);
  1692. }
  1693. return -EAGAIN;
  1694. }
  1695. BUG_ON(r2t->data_count < 0);
  1696. if (conn->datadgst_en)
  1697. iscsi_buf_data_digest_update(conn, &r2t->sendbuf);
  1698. if (r2t->data_count) {
  1699. BUG_ON(ctask->sc->use_sg == 0);
  1700. if (!iscsi_buf_left(&r2t->sendbuf)) {
  1701. BUG_ON(ctask->bad_sg == r2t->sg);
  1702. iscsi_buf_init_sg(&r2t->sendbuf, r2t->sg);
  1703. r2t->sg += 1;
  1704. }
  1705. goto solicit_again;
  1706. }
  1707. data_out_done:
  1708. /*
  1709. * Done with this Data-Out. Next, check if we have
  1710. * to send another Data-Out for this R2T.
  1711. */
  1712. BUG_ON(r2t->data_length - r2t->sent < 0);
  1713. left = r2t->data_length - r2t->sent;
  1714. if (left) {
  1715. if (conn->datadgst_en) {
  1716. if (iscsi_digest_final_send(conn, ctask,
  1717. &dtask->digestbuf,
  1718. &dtask->digest, 1)) {
  1719. debug_tcp("send r2t data digest 0x%x"
  1720. "fail\n", dtask->digest);
  1721. return -EAGAIN;
  1722. }
  1723. debug_tcp("r2t data send digest 0x%x\n",
  1724. dtask->digest);
  1725. }
  1726. iscsi_solicit_data_cont(conn, ctask, r2t, left);
  1727. ctask->xmstate |= XMSTATE_SOL_DATA;
  1728. ctask->xmstate &= ~XMSTATE_SOL_HDR;
  1729. return 1;
  1730. }
  1731. /*
  1732. * Done with this R2T. Check if there are more
  1733. * outstanding R2Ts ready to be processed.
  1734. */
  1735. BUG_ON(ctask->r2t_data_count - r2t->data_length < 0);
  1736. if (conn->datadgst_en) {
  1737. if (iscsi_digest_final_send(conn, ctask, &dtask->digestbuf,
  1738. &dtask->digest, 1)) {
  1739. debug_tcp("send last r2t data digest 0x%x"
  1740. "fail\n", dtask->digest);
  1741. return -EAGAIN;
  1742. }
  1743. debug_tcp("r2t done dout digest 0x%x\n", dtask->digest);
  1744. }
  1745. ctask->r2t_data_count -= r2t->data_length;
  1746. ctask->r2t = NULL;
  1747. spin_lock_bh(&session->lock);
  1748. __kfifo_put(ctask->r2tpool.queue, (void*)&r2t, sizeof(void*));
  1749. spin_unlock_bh(&session->lock);
  1750. if (__kfifo_get(ctask->r2tqueue, (void*)&r2t, sizeof(void*))) {
  1751. ctask->r2t = r2t;
  1752. ctask->xmstate |= XMSTATE_SOL_DATA;
  1753. ctask->xmstate &= ~XMSTATE_SOL_HDR;
  1754. return 1;
  1755. }
  1756. return 0;
  1757. }
  1758. static inline int
  1759. handle_xmstate_w_pad(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
  1760. {
  1761. struct iscsi_data_task *dtask = ctask->dtask;
  1762. int sent;
  1763. ctask->xmstate &= ~XMSTATE_W_PAD;
  1764. iscsi_buf_init_virt(&ctask->sendbuf, (char*)&ctask->pad,
  1765. ctask->pad_count);
  1766. if (iscsi_sendpage(conn, &ctask->sendbuf, &ctask->pad_count, &sent)) {
  1767. ctask->xmstate |= XMSTATE_W_PAD;
  1768. return -EAGAIN;
  1769. }
  1770. if (conn->datadgst_en) {
  1771. iscsi_buf_data_digest_update(conn, &ctask->sendbuf);
  1772. /* imm data? */
  1773. if (!dtask) {
  1774. if (iscsi_digest_final_send(conn, ctask, &ctask->immbuf,
  1775. &ctask->immdigest, 1)) {
  1776. debug_tcp("send padding digest 0x%x"
  1777. "fail!\n", ctask->immdigest);
  1778. return -EAGAIN;
  1779. }
  1780. debug_tcp("done with padding, digest 0x%x\n",
  1781. ctask->datadigest);
  1782. } else {
  1783. if (iscsi_digest_final_send(conn, ctask,
  1784. &dtask->digestbuf,
  1785. &dtask->digest, 1)) {
  1786. debug_tcp("send padding digest 0x%x"
  1787. "fail\n", dtask->digest);
  1788. return -EAGAIN;
  1789. }
  1790. debug_tcp("done with padding, digest 0x%x\n",
  1791. dtask->digest);
  1792. }
  1793. }
  1794. return 0;
  1795. }
  1796. static int
  1797. iscsi_ctask_xmit(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
  1798. {
  1799. int rc = 0;
  1800. debug_scsi("ctask deq [cid %d xmstate %x itt 0x%x]\n",
  1801. conn->id, ctask->xmstate, ctask->itt);
  1802. /*
  1803. * serialize with TMF AbortTask
  1804. */
  1805. if (ctask->mtask)
  1806. return rc;
  1807. if (ctask->xmstate & XMSTATE_R_HDR) {
  1808. rc = handle_xmstate_r_hdr(conn, ctask);
  1809. return rc;
  1810. }
  1811. if (ctask->xmstate & XMSTATE_W_HDR) {
  1812. rc = handle_xmstate_w_hdr(conn, ctask);
  1813. if (rc)
  1814. return rc;
  1815. }
  1816. /* XXX: for data digest xmit recover */
  1817. if (ctask->xmstate & XMSTATE_DATA_DIGEST) {
  1818. rc = handle_xmstate_data_digest(conn, ctask);
  1819. if (rc)
  1820. return rc;
  1821. }
  1822. if (ctask->xmstate & XMSTATE_IMM_DATA) {
  1823. rc = handle_xmstate_imm_data(conn, ctask);
  1824. if (rc)
  1825. return rc;
  1826. }
  1827. if (ctask->xmstate & XMSTATE_UNS_HDR) {
  1828. BUG_ON(!ctask->unsol_count);
  1829. ctask->xmstate &= ~XMSTATE_UNS_HDR;
  1830. unsolicit_head_again:
  1831. rc = handle_xmstate_uns_hdr(conn, ctask);
  1832. if (rc)
  1833. return rc;
  1834. }
  1835. if (ctask->xmstate & XMSTATE_UNS_DATA) {
  1836. rc = handle_xmstate_uns_data(conn, ctask);
  1837. if (rc == 1)
  1838. goto unsolicit_head_again;
  1839. else if (rc)
  1840. return rc;
  1841. goto done;
  1842. }
  1843. if (ctask->xmstate & XMSTATE_SOL_HDR) {
  1844. struct iscsi_r2t_info *r2t;
  1845. ctask->xmstate &= ~XMSTATE_SOL_HDR;
  1846. ctask->xmstate |= XMSTATE_SOL_DATA;
  1847. if (!ctask->r2t)
  1848. __kfifo_get(ctask->r2tqueue, (void*)&ctask->r2t,
  1849. sizeof(void*));
  1850. solicit_head_again:
  1851. r2t = ctask->r2t;
  1852. if (iscsi_sendhdr(conn, &r2t->headbuf, r2t->data_count)) {
  1853. ctask->xmstate &= ~XMSTATE_SOL_DATA;
  1854. ctask->xmstate |= XMSTATE_SOL_HDR;
  1855. return -EAGAIN;
  1856. }
  1857. debug_scsi("sol dout [dsn %d itt 0x%x dlen %d sent %d]\n",
  1858. r2t->solicit_datasn - 1, ctask->itt, r2t->data_count,
  1859. r2t->sent);
  1860. }
  1861. if (ctask->xmstate & XMSTATE_SOL_DATA) {
  1862. rc = handle_xmstate_sol_data(conn, ctask);
  1863. if (rc == 1)
  1864. goto solicit_head_again;
  1865. if (rc)
  1866. return rc;
  1867. }
  1868. done:
  1869. /*
  1870. * Last thing to check is whether we need to send write
  1871. * padding. Note that we check for xmstate equality, not just the bit.
  1872. */
  1873. if (ctask->xmstate == XMSTATE_W_PAD)
  1874. rc = handle_xmstate_w_pad(conn, ctask);
  1875. return rc;
  1876. }
  1877. /**
  1878. * iscsi_data_xmit - xmit any command into the scheduled connection
  1879. * @conn: iscsi connection
  1880. *
  1881. * Notes:
  1882. * The function can return -EAGAIN in which case the caller must
  1883. * re-schedule it again later or recover. '0' return code means
  1884. * successful xmit.
  1885. **/
  1886. static int
  1887. iscsi_data_xmit(struct iscsi_conn *conn)
  1888. {
  1889. if (unlikely(conn->suspend_tx)) {
  1890. debug_tcp("conn %d Tx suspended!\n", conn->id);
  1891. return 0;
  1892. }
  1893. /*
  1894. * Transmit in the following order:
  1895. *
  1896. * 1) un-finished xmit (ctask or mtask)
  1897. * 2) immediate control PDUs
  1898. * 3) write data
  1899. * 4) SCSI commands
  1900. * 5) non-immediate control PDUs
  1901. *
  1902. * No need to lock around __kfifo_get as long as
  1903. * there's one producer and one consumer.
  1904. */
  1905. BUG_ON(conn->ctask && conn->mtask);
  1906. if (conn->ctask) {
  1907. if (iscsi_ctask_xmit(conn, conn->ctask))
  1908. goto again;
  1909. /* done with this in-progress ctask */
  1910. conn->ctask = NULL;
  1911. }
  1912. if (conn->mtask) {
  1913. if (iscsi_mtask_xmit(conn, conn->mtask))
  1914. goto again;
  1915. /* done with this in-progress mtask */
  1916. conn->mtask = NULL;
  1917. }
  1918. /* process immediate first */
  1919. if (unlikely(__kfifo_len(conn->immqueue))) {
  1920. struct iscsi_session *session = conn->session;
  1921. while (__kfifo_get(conn->immqueue, (void*)&conn->mtask,
  1922. sizeof(void*))) {
  1923. if (iscsi_mtask_xmit(conn, conn->mtask))
  1924. goto again;
  1925. if (conn->mtask->hdr.itt ==
  1926. cpu_to_be32(ISCSI_RESERVED_TAG)) {
  1927. spin_lock_bh(&session->lock);
  1928. __kfifo_put(session->mgmtpool.queue,
  1929. (void*)&conn->mtask, sizeof(void*));
  1930. spin_unlock_bh(&session->lock);
  1931. }
  1932. }
  1933. /* done with this mtask */
  1934. conn->mtask = NULL;
  1935. }
  1936. /* process write queue */
  1937. while (__kfifo_get(conn->writequeue, (void*)&conn->ctask,
  1938. sizeof(void*))) {
  1939. if (iscsi_ctask_xmit(conn, conn->ctask))
  1940. goto again;
  1941. }
  1942. /* process command queue */
  1943. while (__kfifo_get(conn->xmitqueue, (void*)&conn->ctask,
  1944. sizeof(void*))) {
  1945. if (iscsi_ctask_xmit(conn, conn->ctask))
  1946. goto again;
  1947. }
  1948. /* done with this ctask */
  1949. conn->ctask = NULL;
  1950. /* process the rest control plane PDUs, if any */
  1951. if (unlikely(__kfifo_len(conn->mgmtqueue))) {
  1952. struct iscsi_session *session = conn->session;
  1953. while (__kfifo_get(conn->mgmtqueue, (void*)&conn->mtask,
  1954. sizeof(void*))) {
  1955. if (iscsi_mtask_xmit(conn, conn->mtask))
  1956. goto again;
  1957. if (conn->mtask->hdr.itt ==
  1958. cpu_to_be32(ISCSI_RESERVED_TAG)) {
  1959. spin_lock_bh(&session->lock);
  1960. __kfifo_put(session->mgmtpool.queue,
  1961. (void*)&conn->mtask,
  1962. sizeof(void*));
  1963. spin_unlock_bh(&session->lock);
  1964. }
  1965. }
  1966. /* done with this mtask */
  1967. conn->mtask = NULL;
  1968. }
  1969. return 0;
  1970. again:
  1971. if (unlikely(conn->suspend_tx))
  1972. return 0;
  1973. return -EAGAIN;
  1974. }
  1975. static void
  1976. iscsi_xmitworker(void *data)
  1977. {
  1978. struct iscsi_conn *conn = data;
  1979. /*
  1980. * serialize Xmit worker on a per-connection basis.
  1981. */
  1982. down(&conn->xmitsema);
  1983. if (iscsi_data_xmit(conn))
  1984. schedule_work(&conn->xmitwork);
  1985. up(&conn->xmitsema);
  1986. }
  1987. #define FAILURE_BAD_HOST 1
  1988. #define FAILURE_SESSION_FAILED 2
  1989. #define FAILURE_SESSION_FREED 3
  1990. #define FAILURE_WINDOW_CLOSED 4
  1991. #define FAILURE_SESSION_TERMINATE 5
  1992. static int
  1993. iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
  1994. {
  1995. struct Scsi_Host *host;
  1996. int reason = 0;
  1997. struct iscsi_session *session;
  1998. struct iscsi_conn *conn = NULL;
  1999. struct iscsi_cmd_task *ctask = NULL;
  2000. sc->scsi_done = done;
  2001. sc->result = 0;
  2002. host = sc->device->host;
  2003. session = iscsi_hostdata(host->hostdata);
  2004. BUG_ON(host != session->host);
  2005. spin_lock(&session->lock);
  2006. if (session->state != ISCSI_STATE_LOGGED_IN) {
  2007. if (session->state == ISCSI_STATE_FAILED) {
  2008. reason = FAILURE_SESSION_FAILED;
  2009. goto reject;
  2010. } else if (session->state == ISCSI_STATE_TERMINATE) {
  2011. reason = FAILURE_SESSION_TERMINATE;
  2012. goto fault;
  2013. }
  2014. reason = FAILURE_SESSION_FREED;
  2015. goto fault;
  2016. }
  2017. /*
  2018. * Check for iSCSI window and take care of CmdSN wrap-around
  2019. */
  2020. if ((int)(session->max_cmdsn - session->cmdsn) < 0) {
  2021. reason = FAILURE_WINDOW_CLOSED;
  2022. goto reject;
  2023. }
  2024. conn = session->leadconn;
  2025. __kfifo_get(session->cmdpool.queue, (void*)&ctask, sizeof(void*));
  2026. BUG_ON(ctask->sc);
  2027. sc->SCp.phase = session->age;
  2028. sc->SCp.ptr = (char*)ctask;
  2029. iscsi_cmd_init(conn, ctask, sc);
  2030. __kfifo_put(conn->xmitqueue, (void*)&ctask, sizeof(void*));
  2031. debug_scsi(
  2032. "ctask enq [%s cid %d sc %lx itt 0x%x len %d cmdsn %d win %d]\n",
  2033. sc->sc_data_direction == DMA_TO_DEVICE ? "write" : "read",
  2034. conn->id, (long)sc, ctask->itt, sc->request_bufflen,
  2035. session->cmdsn, session->max_cmdsn - session->exp_cmdsn + 1);
  2036. spin_unlock(&session->lock);
  2037. if (!in_interrupt() && !down_trylock(&conn->xmitsema)) {
  2038. spin_unlock_irq(host->host_lock);
  2039. if (iscsi_data_xmit(conn))
  2040. schedule_work(&conn->xmitwork);
  2041. up(&conn->xmitsema);
  2042. spin_lock_irq(host->host_lock);
  2043. } else
  2044. schedule_work(&conn->xmitwork);
  2045. return 0;
  2046. reject:
  2047. spin_unlock(&session->lock);
  2048. debug_scsi("cmd 0x%x rejected (%d)\n", sc->cmnd[0], reason);
  2049. return SCSI_MLQUEUE_HOST_BUSY;
  2050. fault:
  2051. spin_unlock(&session->lock);
  2052. printk(KERN_ERR "iscsi_tcp: cmd 0x%x is not queued (%d)\n",
  2053. sc->cmnd[0], reason);
  2054. sc->sense_buffer[0] = 0x70;
  2055. sc->sense_buffer[2] = NOT_READY;
  2056. sc->sense_buffer[7] = 0x6;
  2057. sc->sense_buffer[12] = 0x08;
  2058. sc->sense_buffer[13] = 0x00;
  2059. sc->result = (DID_NO_CONNECT << 16);
  2060. sc->resid = sc->request_bufflen;
  2061. sc->scsi_done(sc);
  2062. return 0;
  2063. }
  2064. static int
  2065. iscsi_pool_init(struct iscsi_queue *q, int max, void ***items, int item_size)
  2066. {
  2067. int i;
  2068. *items = kmalloc(max * sizeof(void*), GFP_KERNEL);
  2069. if (*items == NULL)
  2070. return -ENOMEM;
  2071. q->max = max;
  2072. q->pool = kmalloc(max * sizeof(void*), GFP_KERNEL);
  2073. if (q->pool == NULL) {
  2074. kfree(*items);
  2075. return -ENOMEM;
  2076. }
  2077. q->queue = kfifo_init((void*)q->pool, max * sizeof(void*),
  2078. GFP_KERNEL, NULL);
  2079. if (q->queue == ERR_PTR(-ENOMEM)) {
  2080. kfree(q->pool);
  2081. kfree(*items);
  2082. return -ENOMEM;
  2083. }
  2084. for (i = 0; i < max; i++) {
  2085. q->pool[i] = kmalloc(item_size, GFP_KERNEL);
  2086. if (q->pool[i] == NULL) {
  2087. int j;
  2088. for (j = 0; j < i; j++)
  2089. kfree(q->pool[j]);
  2090. kfifo_free(q->queue);
  2091. kfree(q->pool);
  2092. kfree(*items);
  2093. return -ENOMEM;
  2094. }
  2095. memset(q->pool[i], 0, item_size);
  2096. (*items)[i] = q->pool[i];
  2097. __kfifo_put(q->queue, (void*)&q->pool[i], sizeof(void*));
  2098. }
  2099. return 0;
  2100. }
  2101. static void
  2102. iscsi_pool_free(struct iscsi_queue *q, void **items)
  2103. {
  2104. int i;
  2105. for (i = 0; i < q->max; i++)
  2106. kfree(items[i]);
  2107. kfree(q->pool);
  2108. kfree(items);
  2109. }
  2110. static iscsi_connh_t
  2111. iscsi_conn_create(iscsi_sessionh_t sessionh, uint32_t conn_idx)
  2112. {
  2113. struct iscsi_session *session = iscsi_ptr(sessionh);
  2114. struct iscsi_conn *conn = NULL;
  2115. conn = kmalloc(sizeof(struct iscsi_conn), GFP_KERNEL);
  2116. if (conn == NULL)
  2117. goto conn_alloc_fail;
  2118. memset(conn, 0, sizeof(struct iscsi_conn));
  2119. conn->c_stage = ISCSI_CONN_INITIAL_STAGE;
  2120. conn->in_progress = IN_PROGRESS_WAIT_HEADER;
  2121. conn->id = conn_idx;
  2122. conn->exp_statsn = 0;
  2123. conn->tmabort_state = TMABORT_INITIAL;
  2124. /* initial operational parameters */
  2125. conn->hdr_size = sizeof(struct iscsi_hdr);
  2126. conn->data_size = DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH;
  2127. conn->max_recv_dlength = DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH;
  2128. spin_lock_init(&conn->lock);
  2129. /* initialize general xmit PDU commands queue */
  2130. conn->xmitqueue = kfifo_alloc(session->cmds_max * sizeof(void*),
  2131. GFP_KERNEL, NULL);
  2132. if (conn->xmitqueue == ERR_PTR(-ENOMEM))
  2133. goto xmitqueue_alloc_fail;
  2134. /* initialize write response PDU commands queue */
  2135. conn->writequeue = kfifo_alloc(session->cmds_max * sizeof(void*),
  2136. GFP_KERNEL, NULL);
  2137. if (conn->writequeue == ERR_PTR(-ENOMEM))
  2138. goto writequeue_alloc_fail;
  2139. /* initialize general immediate & non-immediate PDU commands queue */
  2140. conn->immqueue = kfifo_alloc(session->mgmtpool_max * sizeof(void*),
  2141. GFP_KERNEL, NULL);
  2142. if (conn->immqueue == ERR_PTR(-ENOMEM))
  2143. goto immqueue_alloc_fail;
  2144. conn->mgmtqueue = kfifo_alloc(session->mgmtpool_max * sizeof(void*),
  2145. GFP_KERNEL, NULL);
  2146. if (conn->mgmtqueue == ERR_PTR(-ENOMEM))
  2147. goto mgmtqueue_alloc_fail;
  2148. INIT_WORK(&conn->xmitwork, iscsi_xmitworker, conn);
  2149. /* allocate login_mtask used for the login/text sequences */
  2150. spin_lock_bh(&session->lock);
  2151. if (!__kfifo_get(session->mgmtpool.queue,
  2152. (void*)&conn->login_mtask,
  2153. sizeof(void*))) {
  2154. spin_unlock_bh(&session->lock);
  2155. goto login_mtask_alloc_fail;
  2156. }
  2157. spin_unlock_bh(&session->lock);
  2158. /* allocate initial PDU receive place holder */
  2159. if (conn->data_size <= PAGE_SIZE)
  2160. conn->data = kmalloc(conn->data_size, GFP_KERNEL);
  2161. else
  2162. conn->data = (void*)__get_free_pages(GFP_KERNEL,
  2163. get_order(conn->data_size));
  2164. if (!conn->data)
  2165. goto max_recv_dlenght_alloc_fail;
  2166. init_timer(&conn->tmabort_timer);
  2167. init_MUTEX(&conn->xmitsema);
  2168. init_waitqueue_head(&conn->ehwait);
  2169. return iscsi_handle(conn);
  2170. max_recv_dlenght_alloc_fail:
  2171. spin_lock_bh(&session->lock);
  2172. __kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask,
  2173. sizeof(void*));
  2174. spin_unlock_bh(&session->lock);
  2175. login_mtask_alloc_fail:
  2176. kfifo_free(conn->mgmtqueue);
  2177. mgmtqueue_alloc_fail:
  2178. kfifo_free(conn->immqueue);
  2179. immqueue_alloc_fail:
  2180. kfifo_free(conn->writequeue);
  2181. writequeue_alloc_fail:
  2182. kfifo_free(conn->xmitqueue);
  2183. xmitqueue_alloc_fail:
  2184. kfree(conn);
  2185. conn_alloc_fail:
  2186. return iscsi_handle(NULL);
  2187. }
  2188. static void
  2189. iscsi_conn_destroy(iscsi_connh_t connh)
  2190. {
  2191. struct iscsi_conn *conn = iscsi_ptr(connh);
  2192. struct iscsi_session *session = conn->session;
  2193. down(&conn->xmitsema);
  2194. set_bit(SUSPEND_BIT, &conn->suspend_tx);
  2195. if (conn->c_stage == ISCSI_CONN_INITIAL_STAGE && conn->sock) {
  2196. struct sock *sk = conn->sock->sk;
  2197. /*
  2198. * conn_start() has never been called!
  2199. * need to cleanup the socket.
  2200. */
  2201. write_lock_bh(&sk->sk_callback_lock);
  2202. set_bit(SUSPEND_BIT, &conn->suspend_rx);
  2203. write_unlock_bh(&sk->sk_callback_lock);
  2204. sock_hold(conn->sock->sk);
  2205. iscsi_conn_restore_callbacks(conn);
  2206. sock_put(conn->sock->sk);
  2207. sock_release(conn->sock);
  2208. conn->sock = NULL;
  2209. }
  2210. spin_lock_bh(&session->lock);
  2211. conn->c_stage = ISCSI_CONN_CLEANUP_WAIT;
  2212. if (session->leadconn == conn) {
  2213. /*
  2214. * leading connection? then give up on recovery.
  2215. */
  2216. session->state = ISCSI_STATE_TERMINATE;
  2217. wake_up(&conn->ehwait);
  2218. }
  2219. spin_unlock_bh(&session->lock);
  2220. up(&conn->xmitsema);
  2221. /*
  2222. * Block until all in-progress commands for this connection
  2223. * time out or fail.
  2224. */
  2225. for (;;) {
  2226. spin_lock_bh(&conn->lock);
  2227. if (!session->host->host_busy) { /* OK for ERL == 0 */
  2228. spin_unlock_bh(&conn->lock);
  2229. break;
  2230. }
  2231. spin_unlock_bh(&conn->lock);
  2232. msleep_interruptible(500);
  2233. printk("conn_destroy(): host_busy %d host_failed %d\n",
  2234. session->host->host_busy, session->host->host_failed);
  2235. /*
  2236. * force eh_abort() to unblock
  2237. */
  2238. wake_up(&conn->ehwait);
  2239. }
  2240. /* now free crypto */
  2241. if (conn->hdrdgst_en || conn->datadgst_en) {
  2242. if (conn->tx_tfm)
  2243. crypto_free_tfm(conn->tx_tfm);
  2244. if (conn->rx_tfm)
  2245. crypto_free_tfm(conn->rx_tfm);
  2246. if (conn->data_tx_tfm)
  2247. crypto_free_tfm(conn->data_tx_tfm);
  2248. if (conn->data_rx_tfm)
  2249. crypto_free_tfm(conn->data_rx_tfm);
  2250. }
  2251. /* free conn->data, size = MaxRecvDataSegmentLength */
  2252. if (conn->data_size <= PAGE_SIZE)
  2253. kfree(conn->data);
  2254. else
  2255. free_pages((unsigned long)conn->data,
  2256. get_order(conn->data_size));
  2257. spin_lock_bh(&session->lock);
  2258. __kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask,
  2259. sizeof(void*));
  2260. list_del(&conn->item);
  2261. if (list_empty(&session->connections))
  2262. session->leadconn = NULL;
  2263. if (session->leadconn && session->leadconn == conn)
  2264. session->leadconn = container_of(session->connections.next,
  2265. struct iscsi_conn, item);
  2266. if (session->leadconn == NULL)
  2267. /* none connections exits.. reset sequencing */
  2268. session->cmdsn = session->max_cmdsn = session->exp_cmdsn = 1;
  2269. spin_unlock_bh(&session->lock);
  2270. kfifo_free(conn->xmitqueue);
  2271. kfifo_free(conn->writequeue);
  2272. kfifo_free(conn->immqueue);
  2273. kfifo_free(conn->mgmtqueue);
  2274. kfree(conn);
  2275. }
  2276. static int
  2277. iscsi_conn_bind(iscsi_sessionh_t sessionh, iscsi_connh_t connh,
  2278. uint32_t transport_fd, int is_leading)
  2279. {
  2280. struct iscsi_session *session = iscsi_ptr(sessionh);
  2281. struct iscsi_conn *tmp = ERR_PTR(-EEXIST), *conn = iscsi_ptr(connh);
  2282. struct sock *sk;
  2283. struct socket *sock;
  2284. int err;
  2285. /* lookup for existing socket */
  2286. sock = sockfd_lookup(transport_fd, &err);
  2287. if (!sock) {
  2288. printk(KERN_ERR "iscsi_tcp: sockfd_lookup failed %d\n", err);
  2289. return -EEXIST;
  2290. }
  2291. /* lookup for existing connection */
  2292. spin_lock_bh(&session->lock);
  2293. list_for_each_entry(tmp, &session->connections, item) {
  2294. if (tmp == conn) {
  2295. if (conn->c_stage != ISCSI_CONN_STOPPED ||
  2296. conn->stop_stage == STOP_CONN_TERM) {
  2297. printk(KERN_ERR "iscsi_tcp: can't bind "
  2298. "non-stopped connection (%d:%d)\n",
  2299. conn->c_stage, conn->stop_stage);
  2300. spin_unlock_bh(&session->lock);
  2301. return -EIO;
  2302. }
  2303. break;
  2304. }
  2305. }
  2306. if (tmp != conn) {
  2307. /* bind new iSCSI connection to session */
  2308. conn->session = session;
  2309. list_add(&conn->item, &session->connections);
  2310. }
  2311. spin_unlock_bh(&session->lock);
  2312. if (conn->stop_stage != STOP_CONN_SUSPEND) {
  2313. /* bind iSCSI connection and socket */
  2314. conn->sock = sock;
  2315. /* setup Socket parameters */
  2316. sk = sock->sk;
  2317. sk->sk_reuse = 1;
  2318. sk->sk_sndtimeo = 15 * HZ; /* FIXME: make it configurable */
  2319. sk->sk_allocation = GFP_ATOMIC;
  2320. /* FIXME: disable Nagle's algorithm */
  2321. /*
  2322. * Intercept TCP callbacks for sendfile like receive
  2323. * processing.
  2324. */
  2325. iscsi_conn_set_callbacks(conn);
  2326. /*
  2327. * set receive state machine into initial state
  2328. */
  2329. conn->in_progress = IN_PROGRESS_WAIT_HEADER;
  2330. }
  2331. if (is_leading)
  2332. session->leadconn = conn;
  2333. /*
  2334. * Unblock xmitworker(), Login Phase will pass through.
  2335. */
  2336. clear_bit(SUSPEND_BIT, &conn->suspend_rx);
  2337. clear_bit(SUSPEND_BIT, &conn->suspend_tx);
  2338. return 0;
  2339. }
  2340. static int
  2341. iscsi_conn_start(iscsi_connh_t connh)
  2342. {
  2343. struct iscsi_conn *conn = iscsi_ptr(connh);
  2344. struct iscsi_session *session = conn->session;
  2345. struct sock *sk;
  2346. /* FF phase warming up... */
  2347. if (session == NULL) {
  2348. printk(KERN_ERR "iscsi_tcp: can't start unbound connection\n");
  2349. return -EPERM;
  2350. }
  2351. sk = conn->sock->sk;
  2352. write_lock_bh(&sk->sk_callback_lock);
  2353. spin_lock_bh(&session->lock);
  2354. conn->c_stage = ISCSI_CONN_STARTED;
  2355. session->state = ISCSI_STATE_LOGGED_IN;
  2356. switch(conn->stop_stage) {
  2357. case STOP_CONN_RECOVER:
  2358. /*
  2359. * unblock eh_abort() if it is blocked. re-try all
  2360. * commands after successful recovery
  2361. */
  2362. session->conn_cnt++;
  2363. conn->stop_stage = 0;
  2364. conn->tmabort_state = TMABORT_INITIAL;
  2365. session->age++;
  2366. wake_up(&conn->ehwait);
  2367. break;
  2368. case STOP_CONN_TERM:
  2369. session->conn_cnt++;
  2370. conn->stop_stage = 0;
  2371. break;
  2372. case STOP_CONN_SUSPEND:
  2373. conn->stop_stage = 0;
  2374. clear_bit(SUSPEND_BIT, &conn->suspend_rx);
  2375. clear_bit(SUSPEND_BIT, &conn->suspend_tx);
  2376. break;
  2377. default:
  2378. break;
  2379. }
  2380. spin_unlock_bh(&session->lock);
  2381. write_unlock_bh(&sk->sk_callback_lock);
  2382. return 0;
  2383. }
  2384. static void
  2385. iscsi_conn_stop(iscsi_connh_t connh, int flag)
  2386. {
  2387. struct iscsi_conn *conn = iscsi_ptr(connh);
  2388. struct iscsi_session *session = conn->session;
  2389. struct sock *sk;
  2390. unsigned long flags;
  2391. BUG_ON(!conn->sock);
  2392. sk = conn->sock->sk;
  2393. write_lock_bh(&sk->sk_callback_lock);
  2394. set_bit(SUSPEND_BIT, &conn->suspend_rx);
  2395. write_unlock_bh(&sk->sk_callback_lock);
  2396. down(&conn->xmitsema);
  2397. spin_lock_irqsave(session->host->host_lock, flags);
  2398. spin_lock(&session->lock);
  2399. conn->stop_stage = flag;
  2400. conn->c_stage = ISCSI_CONN_STOPPED;
  2401. set_bit(SUSPEND_BIT, &conn->suspend_tx);
  2402. if (flag != STOP_CONN_SUSPEND)
  2403. session->conn_cnt--;
  2404. if (session->conn_cnt == 0 || session->leadconn == conn)
  2405. session->state = ISCSI_STATE_FAILED;
  2406. spin_unlock(&session->lock);
  2407. spin_unlock_irqrestore(session->host->host_lock, flags);
  2408. if (flag == STOP_CONN_TERM || flag == STOP_CONN_RECOVER) {
  2409. struct iscsi_cmd_task *ctask;
  2410. struct iscsi_mgmt_task *mtask;
  2411. /*
  2412. * Socket must go now.
  2413. */
  2414. sock_hold(conn->sock->sk);
  2415. iscsi_conn_restore_callbacks(conn);
  2416. sock_put(conn->sock->sk);
  2417. /*
  2418. * flush xmit queues.
  2419. */
  2420. spin_lock_bh(&session->lock);
  2421. while (__kfifo_get(conn->writequeue, (void*)&ctask,
  2422. sizeof(void*)) ||
  2423. __kfifo_get(conn->xmitqueue, (void*)&ctask,
  2424. sizeof(void*))) {
  2425. struct iscsi_r2t_info *r2t;
  2426. /*
  2427. * flush ctask's r2t queues
  2428. */
  2429. while (__kfifo_get(ctask->r2tqueue, (void*)&r2t,
  2430. sizeof(void*)))
  2431. __kfifo_put(ctask->r2tpool.queue, (void*)&r2t,
  2432. sizeof(void*));
  2433. spin_unlock_bh(&session->lock);
  2434. local_bh_disable();
  2435. iscsi_ctask_cleanup(conn, ctask);
  2436. local_bh_enable();
  2437. spin_lock_bh(&session->lock);
  2438. }
  2439. conn->ctask = NULL;
  2440. while (__kfifo_get(conn->immqueue, (void*)&mtask,
  2441. sizeof(void*)) ||
  2442. __kfifo_get(conn->mgmtqueue, (void*)&mtask,
  2443. sizeof(void*))) {
  2444. __kfifo_put(session->mgmtpool.queue,
  2445. (void*)&mtask, sizeof(void*));
  2446. }
  2447. conn->mtask = NULL;
  2448. spin_unlock_bh(&session->lock);
  2449. /*
  2450. * release socket only after we stopped data_xmit()
  2451. * activity and flushed all outstandings
  2452. */
  2453. sock_release(conn->sock);
  2454. conn->sock = NULL;
  2455. /*
  2456. * for connection level recovery we should not calculate
  2457. * header digest. conn->hdr_size used for optimization
  2458. * in hdr_extract() and will be re-negotiated at
  2459. * set_param() time.
  2460. */
  2461. if (flag == STOP_CONN_RECOVER)
  2462. conn->hdr_size = sizeof(struct iscsi_hdr);
  2463. }
  2464. up(&conn->xmitsema);
  2465. }
  2466. static int
  2467. iscsi_conn_send_generic(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
  2468. char *data, uint32_t data_size)
  2469. {
  2470. struct iscsi_session *session = conn->session;
  2471. struct iscsi_nopout *nop = (struct iscsi_nopout *)hdr;
  2472. struct iscsi_mgmt_task *mtask;
  2473. spin_lock_bh(&session->lock);
  2474. if (session->state == ISCSI_STATE_TERMINATE) {
  2475. spin_unlock_bh(&session->lock);
  2476. return -EPERM;
  2477. }
  2478. if (hdr->opcode == (ISCSI_OP_LOGIN | ISCSI_OP_IMMEDIATE) ||
  2479. hdr->opcode == (ISCSI_OP_TEXT | ISCSI_OP_IMMEDIATE))
  2480. /*
  2481. * Login and Text are sent serially, in
  2482. * request-followed-by-response sequence.
  2483. * Same mtask can be used. Same ITT must be used.
  2484. * Note that login_mtask is preallocated at conn_create().
  2485. */
  2486. mtask = conn->login_mtask;
  2487. else {
  2488. BUG_ON(conn->c_stage == ISCSI_CONN_INITIAL_STAGE);
  2489. BUG_ON(conn->c_stage == ISCSI_CONN_STOPPED);
  2490. if (!__kfifo_get(session->mgmtpool.queue,
  2491. (void*)&mtask, sizeof(void*))) {
  2492. spin_unlock_bh(&session->lock);
  2493. return -ENOSPC;
  2494. }
  2495. }
  2496. /*
  2497. * pre-format CmdSN and ExpStatSN for outgoing PDU.
  2498. */
  2499. if (hdr->itt != cpu_to_be32(ISCSI_RESERVED_TAG)) {
  2500. hdr->itt = mtask->itt | (conn->id << CID_SHIFT) |
  2501. (session->age << AGE_SHIFT);
  2502. nop->cmdsn = cpu_to_be32(session->cmdsn);
  2503. if (conn->c_stage == ISCSI_CONN_STARTED &&
  2504. !(hdr->opcode & ISCSI_OP_IMMEDIATE))
  2505. session->cmdsn++;
  2506. } else
  2507. /* do not advance CmdSN */
  2508. nop->cmdsn = cpu_to_be32(session->cmdsn);
  2509. nop->exp_statsn = cpu_to_be32(conn->exp_statsn);
  2510. memcpy(&mtask->hdr, hdr, sizeof(struct iscsi_hdr));
  2511. if (conn->c_stage == ISCSI_CONN_INITIAL_STAGE ||
  2512. conn->stop_stage == STOP_CONN_RECOVER)
  2513. iscsi_buf_init_virt(&mtask->headbuf, (char*)&mtask->hdr,
  2514. sizeof(struct iscsi_hdr));
  2515. else
  2516. /* this will update header digest */
  2517. iscsi_buf_init_hdr(conn, &mtask->headbuf, (char*)&mtask->hdr,
  2518. (u8 *)mtask->hdrext);
  2519. spin_unlock_bh(&session->lock);
  2520. if (data_size) {
  2521. memcpy(mtask->data, data, data_size);
  2522. mtask->data_count = data_size;
  2523. } else
  2524. mtask->data_count = 0;
  2525. mtask->xmstate = XMSTATE_IMM_HDR;
  2526. if (mtask->data_count) {
  2527. iscsi_buf_init_iov(&mtask->sendbuf, (char*)mtask->data,
  2528. mtask->data_count);
  2529. }
  2530. debug_scsi("mgmtpdu [op 0x%x hdr->itt 0x%x datalen %d]\n",
  2531. hdr->opcode, hdr->itt, data_size);
  2532. /*
  2533. * since send_pdu() could be called at least from two contexts,
  2534. * we need to serialize __kfifo_put, so we don't have to take
  2535. * additional lock on fast data-path
  2536. */
  2537. if (hdr->opcode & ISCSI_OP_IMMEDIATE)
  2538. __kfifo_put(conn->immqueue, (void*)&mtask, sizeof(void*));
  2539. else
  2540. __kfifo_put(conn->mgmtqueue, (void*)&mtask, sizeof(void*));
  2541. schedule_work(&conn->xmitwork);
  2542. return 0;
  2543. }
  2544. static int
  2545. iscsi_eh_host_reset(struct scsi_cmnd *sc)
  2546. {
  2547. struct iscsi_cmd_task *ctask = (struct iscsi_cmd_task *)sc->SCp.ptr;
  2548. struct iscsi_conn *conn = ctask->conn;
  2549. struct iscsi_session *session = conn->session;
  2550. spin_lock_bh(&session->lock);
  2551. if (session->state == ISCSI_STATE_TERMINATE) {
  2552. debug_scsi("failing host reset: session terminated "
  2553. "[CID %d age %d]", conn->id, session->age);
  2554. spin_unlock_bh(&session->lock);
  2555. return FAILED;
  2556. }
  2557. spin_unlock_bh(&session->lock);
  2558. debug_scsi("failing connection CID %d due to SCSI host reset "
  2559. "[itt 0x%x age %d]", conn->id, ctask->itt,
  2560. session->age);
  2561. iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
  2562. return SUCCESS;
  2563. }
  2564. static void
  2565. iscsi_tmabort_timedout(unsigned long data)
  2566. {
  2567. struct iscsi_cmd_task *ctask = (struct iscsi_cmd_task *)data;
  2568. struct iscsi_conn *conn = ctask->conn;
  2569. struct iscsi_session *session = conn->session;
  2570. spin_lock(&session->lock);
  2571. if (conn->tmabort_state == TMABORT_INITIAL) {
  2572. __kfifo_put(session->mgmtpool.queue,
  2573. (void*)&ctask->mtask, sizeof(void*));
  2574. conn->tmabort_state = TMABORT_TIMEDOUT;
  2575. debug_scsi("tmabort timedout [sc %lx itt 0x%x]\n",
  2576. (long)ctask->sc, ctask->itt);
  2577. /* unblock eh_abort() */
  2578. wake_up(&conn->ehwait);
  2579. }
  2580. spin_unlock(&session->lock);
  2581. }
  2582. static int
  2583. iscsi_eh_abort(struct scsi_cmnd *sc)
  2584. {
  2585. int rc;
  2586. struct iscsi_cmd_task *ctask = (struct iscsi_cmd_task *)sc->SCp.ptr;
  2587. struct iscsi_conn *conn = ctask->conn;
  2588. struct iscsi_session *session = conn->session;
  2589. conn->eh_abort_cnt++;
  2590. debug_scsi("aborting [sc %lx itt 0x%x]\n", (long)sc, ctask->itt);
  2591. /*
  2592. * two cases for ERL=0 here:
  2593. *
  2594. * 1) connection-level failure;
  2595. * 2) recovery due protocol error;
  2596. */
  2597. down(&conn->xmitsema);
  2598. spin_lock_bh(&session->lock);
  2599. if (session->state != ISCSI_STATE_LOGGED_IN) {
  2600. if (session->state == ISCSI_STATE_TERMINATE) {
  2601. spin_unlock_bh(&session->lock);
  2602. up(&conn->xmitsema);
  2603. goto failed;
  2604. }
  2605. spin_unlock_bh(&session->lock);
  2606. } else {
  2607. struct iscsi_tm *hdr = &conn->tmhdr;
  2608. /*
  2609. * Still LOGGED_IN...
  2610. */
  2611. if (!ctask->sc || sc->SCp.phase != session->age) {
  2612. /*
  2613. * 1) ctask completed before time out. But session
  2614. * is still ok => Happy Retry.
  2615. * 2) session was re-open during time out of ctask.
  2616. */
  2617. spin_unlock_bh(&session->lock);
  2618. up(&conn->xmitsema);
  2619. goto success;
  2620. }
  2621. conn->tmabort_state = TMABORT_INITIAL;
  2622. spin_unlock_bh(&session->lock);
  2623. /*
  2624. * ctask timed out but session is OK
  2625. * ERL=0 requires task mgmt abort to be issued on each
  2626. * failed command. requests must be serialized.
  2627. */
  2628. memset(hdr, 0, sizeof(struct iscsi_tm));
  2629. hdr->opcode = ISCSI_OP_SCSI_TMFUNC | ISCSI_OP_IMMEDIATE;
  2630. hdr->flags = ISCSI_TM_FUNC_ABORT_TASK;
  2631. hdr->flags |= ISCSI_FLAG_CMD_FINAL;
  2632. memcpy(hdr->lun, ctask->hdr.lun, sizeof(hdr->lun));
  2633. hdr->rtt = ctask->hdr.itt;
  2634. hdr->refcmdsn = ctask->hdr.cmdsn;
  2635. rc = iscsi_conn_send_generic(conn, (struct iscsi_hdr *)hdr,
  2636. NULL, 0);
  2637. if (rc) {
  2638. iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
  2639. debug_scsi("abort sent failure [itt 0x%x]", ctask->itt);
  2640. } else {
  2641. struct iscsi_r2t_info *r2t;
  2642. /*
  2643. * TMF abort vs. TMF response race logic
  2644. */
  2645. spin_lock_bh(&session->lock);
  2646. ctask->mtask = (struct iscsi_mgmt_task *)
  2647. session->mgmt_cmds[(hdr->itt & ITT_MASK) -
  2648. ISCSI_MGMT_ITT_OFFSET];
  2649. /*
  2650. * have to flush r2tqueue to avoid r2t leaks
  2651. */
  2652. while (__kfifo_get(ctask->r2tqueue, (void*)&r2t,
  2653. sizeof(void*))) {
  2654. __kfifo_put(ctask->r2tpool.queue, (void*)&r2t,
  2655. sizeof(void*));
  2656. }
  2657. if (conn->tmabort_state == TMABORT_INITIAL) {
  2658. conn->tmfcmd_pdus_cnt++;
  2659. conn->tmabort_timer.expires = 3*HZ + jiffies;
  2660. conn->tmabort_timer.function =
  2661. iscsi_tmabort_timedout;
  2662. conn->tmabort_timer.data = (unsigned long)ctask;
  2663. add_timer(&conn->tmabort_timer);
  2664. debug_scsi("abort sent [itt 0x%x]", ctask->itt);
  2665. } else {
  2666. if (!ctask->sc ||
  2667. conn->tmabort_state == TMABORT_SUCCESS) {
  2668. conn->tmabort_state = TMABORT_INITIAL;
  2669. spin_unlock_bh(&session->lock);
  2670. up(&conn->xmitsema);
  2671. goto success;
  2672. }
  2673. conn->tmabort_state = TMABORT_INITIAL;
  2674. iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
  2675. }
  2676. spin_unlock_bh(&session->lock);
  2677. }
  2678. }
  2679. up(&conn->xmitsema);
  2680. /*
  2681. * block eh thread until:
  2682. *
  2683. * 1) abort response;
  2684. * 2) abort timeout;
  2685. * 3) session re-opened;
  2686. * 4) session terminated;
  2687. */
  2688. for (;;) {
  2689. int p_state = session->state;
  2690. rc = wait_event_interruptible(conn->ehwait,
  2691. (p_state == ISCSI_STATE_LOGGED_IN ?
  2692. (session->state == ISCSI_STATE_TERMINATE ||
  2693. conn->tmabort_state != TMABORT_INITIAL) :
  2694. (session->state == ISCSI_STATE_TERMINATE ||
  2695. session->state == ISCSI_STATE_LOGGED_IN)));
  2696. if (rc) {
  2697. /* shutdown.. */
  2698. session->state = ISCSI_STATE_TERMINATE;
  2699. goto failed;
  2700. }
  2701. if (signal_pending(current))
  2702. flush_signals(current);
  2703. if (session->state == ISCSI_STATE_TERMINATE)
  2704. goto failed;
  2705. spin_lock_bh(&session->lock);
  2706. if (sc->SCp.phase == session->age &&
  2707. (conn->tmabort_state == TMABORT_TIMEDOUT ||
  2708. conn->tmabort_state == TMABORT_FAILED)) {
  2709. conn->tmabort_state = TMABORT_INITIAL;
  2710. if (!ctask->sc) {
  2711. /*
  2712. * ctask completed before tmf abort response or
  2713. * time out.
  2714. * But session is still ok => Happy Retry.
  2715. */
  2716. spin_unlock_bh(&session->lock);
  2717. break;
  2718. }
  2719. spin_unlock_bh(&session->lock);
  2720. iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
  2721. continue;
  2722. }
  2723. spin_unlock_bh(&session->lock);
  2724. break;
  2725. }
  2726. success:
  2727. debug_scsi("abort success [sc %lx itt 0x%x]\n", (long)sc, ctask->itt);
  2728. rc = SUCCESS;
  2729. goto exit;
  2730. failed:
  2731. debug_scsi("abort failed [sc %lx itt 0x%x]\n", (long)sc, ctask->itt);
  2732. rc = FAILED;
  2733. exit:
  2734. del_timer_sync(&conn->tmabort_timer);
  2735. down(&conn->xmitsema);
  2736. if (conn->sock) {
  2737. struct sock *sk = conn->sock->sk;
  2738. write_lock_bh(&sk->sk_callback_lock);
  2739. iscsi_ctask_cleanup(conn, ctask);
  2740. write_unlock_bh(&sk->sk_callback_lock);
  2741. }
  2742. up(&conn->xmitsema);
  2743. return rc;
  2744. }
  2745. static int
  2746. iscsi_r2tpool_alloc(struct iscsi_session *session)
  2747. {
  2748. int i;
  2749. int cmd_i;
  2750. /*
  2751. * initialize per-task: R2T pool and xmit queue
  2752. */
  2753. for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) {
  2754. struct iscsi_cmd_task *ctask = session->cmds[cmd_i];
  2755. /*
  2756. * pre-allocated x4 as much r2ts to handle race when
  2757. * target acks DataOut faster than we data_xmit() queues
  2758. * could replenish r2tqueue.
  2759. */
  2760. /* R2T pool */
  2761. if (iscsi_pool_init(&ctask->r2tpool, session->max_r2t * 4,
  2762. (void***)&ctask->r2ts, sizeof(struct iscsi_r2t_info))) {
  2763. goto r2t_alloc_fail;
  2764. }
  2765. /* R2T xmit queue */
  2766. ctask->r2tqueue = kfifo_alloc(
  2767. session->max_r2t * 4 * sizeof(void*), GFP_KERNEL, NULL);
  2768. if (ctask->r2tqueue == ERR_PTR(-ENOMEM)) {
  2769. iscsi_pool_free(&ctask->r2tpool, (void**)ctask->r2ts);
  2770. goto r2t_alloc_fail;
  2771. }
  2772. /*
  2773. * number of
  2774. * Data-Out PDU's within R2T-sequence can be quite big;
  2775. * using mempool
  2776. */
  2777. ctask->datapool = mempool_create(ISCSI_DTASK_DEFAULT_MAX,
  2778. mempool_alloc_slab, mempool_free_slab, taskcache);
  2779. if (ctask->datapool == NULL) {
  2780. kfifo_free(ctask->r2tqueue);
  2781. iscsi_pool_free(&ctask->r2tpool, (void**)ctask->r2ts);
  2782. goto r2t_alloc_fail;
  2783. }
  2784. INIT_LIST_HEAD(&ctask->dataqueue);
  2785. }
  2786. return 0;
  2787. r2t_alloc_fail:
  2788. for (i = 0; i < cmd_i; i++) {
  2789. mempool_destroy(session->cmds[i]->datapool);
  2790. kfifo_free(session->cmds[i]->r2tqueue);
  2791. iscsi_pool_free(&session->cmds[i]->r2tpool,
  2792. (void**)session->cmds[i]->r2ts);
  2793. }
  2794. return -ENOMEM;
  2795. }
  2796. static void
  2797. iscsi_r2tpool_free(struct iscsi_session *session)
  2798. {
  2799. int i;
  2800. for (i = 0; i < session->cmds_max; i++) {
  2801. mempool_destroy(session->cmds[i]->datapool);
  2802. kfifo_free(session->cmds[i]->r2tqueue);
  2803. iscsi_pool_free(&session->cmds[i]->r2tpool,
  2804. (void**)session->cmds[i]->r2ts);
  2805. }
  2806. }
  2807. static struct scsi_host_template iscsi_sht = {
  2808. .name = "iSCSI Initiator over TCP/IP, v."
  2809. ISCSI_VERSION_STR,
  2810. .queuecommand = iscsi_queuecommand,
  2811. .can_queue = ISCSI_XMIT_CMDS_MAX - 1,
  2812. .sg_tablesize = ISCSI_SG_TABLESIZE,
  2813. .cmd_per_lun = ISCSI_CMD_PER_LUN,
  2814. .eh_abort_handler = iscsi_eh_abort,
  2815. .eh_host_reset_handler = iscsi_eh_host_reset,
  2816. .use_clustering = DISABLE_CLUSTERING,
  2817. .proc_name = "iscsi_tcp",
  2818. .this_id = -1,
  2819. };
  2820. static iscsi_sessionh_t
  2821. iscsi_session_create(uint32_t initial_cmdsn, struct Scsi_Host *host)
  2822. {
  2823. int cmd_i;
  2824. struct iscsi_session *session;
  2825. session = iscsi_hostdata(host->hostdata);
  2826. memset(session, 0, sizeof(struct iscsi_session));
  2827. session->host = host;
  2828. session->id = host->host_no;
  2829. session->state = ISCSI_STATE_LOGGED_IN;
  2830. session->mgmtpool_max = ISCSI_MGMT_CMDS_MAX;
  2831. session->cmds_max = ISCSI_XMIT_CMDS_MAX;
  2832. session->cmdsn = initial_cmdsn;
  2833. session->exp_cmdsn = initial_cmdsn + 1;
  2834. session->max_cmdsn = initial_cmdsn + 1;
  2835. session->max_r2t = 1;
  2836. /* initialize SCSI PDU commands pool */
  2837. if (iscsi_pool_init(&session->cmdpool, session->cmds_max,
  2838. (void***)&session->cmds, sizeof(struct iscsi_cmd_task)))
  2839. goto cmdpool_alloc_fail;
  2840. /* pre-format cmds pool with ITT */
  2841. for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++)
  2842. session->cmds[cmd_i]->itt = cmd_i;
  2843. spin_lock_init(&session->lock);
  2844. INIT_LIST_HEAD(&session->connections);
  2845. /* initialize immediate command pool */
  2846. if (iscsi_pool_init(&session->mgmtpool, session->mgmtpool_max,
  2847. (void***)&session->mgmt_cmds, sizeof(struct iscsi_mgmt_task)))
  2848. goto mgmtpool_alloc_fail;
  2849. /* pre-format immediate cmds pool with ITT */
  2850. for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++) {
  2851. session->mgmt_cmds[cmd_i]->itt = ISCSI_MGMT_ITT_OFFSET + cmd_i;
  2852. session->mgmt_cmds[cmd_i]->data = kmalloc(
  2853. DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH, GFP_KERNEL);
  2854. if (!session->mgmt_cmds[cmd_i]->data) {
  2855. int j;
  2856. for (j = 0; j < cmd_i; j++)
  2857. kfree(session->mgmt_cmds[j]->data);
  2858. goto immdata_alloc_fail;
  2859. }
  2860. }
  2861. if (iscsi_r2tpool_alloc(session))
  2862. goto r2tpool_alloc_fail;
  2863. return iscsi_handle(session);
  2864. r2tpool_alloc_fail:
  2865. for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++)
  2866. kfree(session->mgmt_cmds[cmd_i]->data);
  2867. iscsi_pool_free(&session->mgmtpool, (void**)session->mgmt_cmds);
  2868. immdata_alloc_fail:
  2869. mgmtpool_alloc_fail:
  2870. iscsi_pool_free(&session->cmdpool, (void**)session->cmds);
  2871. cmdpool_alloc_fail:
  2872. return iscsi_handle(NULL);
  2873. }
  2874. static void
  2875. iscsi_session_destroy(iscsi_sessionh_t sessionh)
  2876. {
  2877. int cmd_i;
  2878. struct iscsi_data_task *dtask, *n;
  2879. struct iscsi_session *session = iscsi_ptr(sessionh);
  2880. for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) {
  2881. struct iscsi_cmd_task *ctask = session->cmds[cmd_i];
  2882. list_for_each_entry_safe(dtask, n, &ctask->dataqueue, item) {
  2883. list_del(&dtask->item);
  2884. mempool_free(dtask, ctask->datapool);
  2885. }
  2886. }
  2887. for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++)
  2888. kfree(session->mgmt_cmds[cmd_i]->data);
  2889. iscsi_r2tpool_free(session);
  2890. iscsi_pool_free(&session->mgmtpool, (void**)session->mgmt_cmds);
  2891. iscsi_pool_free(&session->cmdpool, (void**)session->cmds);
  2892. }
  2893. static int
  2894. iscsi_conn_set_param(iscsi_connh_t connh, enum iscsi_param param,
  2895. uint32_t value)
  2896. {
  2897. struct iscsi_conn *conn = iscsi_ptr(connh);
  2898. struct iscsi_session *session = conn->session;
  2899. spin_lock_bh(&session->lock);
  2900. if (conn->c_stage != ISCSI_CONN_INITIAL_STAGE &&
  2901. conn->stop_stage != STOP_CONN_RECOVER) {
  2902. printk(KERN_ERR "iscsi_tcp: can not change parameter [%d]\n",
  2903. param);
  2904. spin_unlock_bh(&session->lock);
  2905. return 0;
  2906. }
  2907. spin_unlock_bh(&session->lock);
  2908. switch(param) {
  2909. case ISCSI_PARAM_MAX_RECV_DLENGTH: {
  2910. char *saveptr = conn->data;
  2911. int flags = GFP_KERNEL;
  2912. if (conn->data_size >= value) {
  2913. conn->max_recv_dlength = value;
  2914. break;
  2915. }
  2916. spin_lock_bh(&session->lock);
  2917. if (conn->stop_stage == STOP_CONN_RECOVER)
  2918. flags = GFP_ATOMIC;
  2919. spin_unlock_bh(&session->lock);
  2920. if (value <= PAGE_SIZE)
  2921. conn->data = kmalloc(value, flags);
  2922. else
  2923. conn->data = (void*)__get_free_pages(flags,
  2924. get_order(value));
  2925. if (conn->data == NULL) {
  2926. conn->data = saveptr;
  2927. return -ENOMEM;
  2928. }
  2929. if (conn->data_size <= PAGE_SIZE)
  2930. kfree(saveptr);
  2931. else
  2932. free_pages((unsigned long)saveptr,
  2933. get_order(conn->data_size));
  2934. conn->max_recv_dlength = value;
  2935. conn->data_size = value;
  2936. }
  2937. break;
  2938. case ISCSI_PARAM_MAX_XMIT_DLENGTH:
  2939. conn->max_xmit_dlength = value;
  2940. break;
  2941. case ISCSI_PARAM_HDRDGST_EN:
  2942. conn->hdrdgst_en = value;
  2943. conn->hdr_size = sizeof(struct iscsi_hdr);
  2944. if (conn->hdrdgst_en) {
  2945. conn->hdr_size += sizeof(__u32);
  2946. if (!conn->tx_tfm)
  2947. conn->tx_tfm = crypto_alloc_tfm("crc32c", 0);
  2948. if (!conn->tx_tfm)
  2949. return -ENOMEM;
  2950. if (!conn->rx_tfm)
  2951. conn->rx_tfm = crypto_alloc_tfm("crc32c", 0);
  2952. if (!conn->rx_tfm) {
  2953. crypto_free_tfm(conn->tx_tfm);
  2954. return -ENOMEM;
  2955. }
  2956. } else {
  2957. if (conn->tx_tfm)
  2958. crypto_free_tfm(conn->tx_tfm);
  2959. if (conn->rx_tfm)
  2960. crypto_free_tfm(conn->rx_tfm);
  2961. }
  2962. break;
  2963. case ISCSI_PARAM_DATADGST_EN:
  2964. conn->datadgst_en = value;
  2965. if (conn->datadgst_en) {
  2966. if (!conn->data_tx_tfm)
  2967. conn->data_tx_tfm =
  2968. crypto_alloc_tfm("crc32c", 0);
  2969. if (!conn->data_tx_tfm)
  2970. return -ENOMEM;
  2971. if (!conn->data_rx_tfm)
  2972. conn->data_rx_tfm =
  2973. crypto_alloc_tfm("crc32c", 0);
  2974. if (!conn->data_rx_tfm) {
  2975. crypto_free_tfm(conn->data_tx_tfm);
  2976. return -ENOMEM;
  2977. }
  2978. } else {
  2979. if (conn->data_tx_tfm)
  2980. crypto_free_tfm(conn->data_tx_tfm);
  2981. if (conn->data_rx_tfm)
  2982. crypto_free_tfm(conn->data_rx_tfm);
  2983. }
  2984. break;
  2985. case ISCSI_PARAM_INITIAL_R2T_EN:
  2986. session->initial_r2t_en = value;
  2987. break;
  2988. case ISCSI_PARAM_MAX_R2T:
  2989. if (session->max_r2t == roundup_pow_of_two(value))
  2990. break;
  2991. iscsi_r2tpool_free(session);
  2992. session->max_r2t = value;
  2993. if (session->max_r2t & (session->max_r2t - 1))
  2994. session->max_r2t = roundup_pow_of_two(session->max_r2t);
  2995. if (iscsi_r2tpool_alloc(session))
  2996. return -ENOMEM;
  2997. break;
  2998. case ISCSI_PARAM_IMM_DATA_EN:
  2999. session->imm_data_en = value;
  3000. break;
  3001. case ISCSI_PARAM_FIRST_BURST:
  3002. session->first_burst = value;
  3003. break;
  3004. case ISCSI_PARAM_MAX_BURST:
  3005. session->max_burst = value;
  3006. break;
  3007. case ISCSI_PARAM_PDU_INORDER_EN:
  3008. session->pdu_inorder_en = value;
  3009. break;
  3010. case ISCSI_PARAM_DATASEQ_INORDER_EN:
  3011. session->dataseq_inorder_en = value;
  3012. break;
  3013. case ISCSI_PARAM_ERL:
  3014. session->erl = value;
  3015. break;
  3016. case ISCSI_PARAM_IFMARKER_EN:
  3017. BUG_ON(value);
  3018. session->ifmarker_en = value;
  3019. break;
  3020. case ISCSI_PARAM_OFMARKER_EN:
  3021. BUG_ON(value);
  3022. session->ofmarker_en = value;
  3023. break;
  3024. default:
  3025. break;
  3026. }
  3027. return 0;
  3028. }
  3029. static int
  3030. iscsi_conn_get_param(iscsi_connh_t connh, enum iscsi_param param,
  3031. uint32_t *value)
  3032. {
  3033. struct iscsi_conn *conn = iscsi_ptr(connh);
  3034. struct iscsi_session *session = conn->session;
  3035. switch(param) {
  3036. case ISCSI_PARAM_MAX_RECV_DLENGTH:
  3037. *value = conn->max_recv_dlength;
  3038. break;
  3039. case ISCSI_PARAM_MAX_XMIT_DLENGTH:
  3040. *value = conn->max_xmit_dlength;
  3041. break;
  3042. case ISCSI_PARAM_HDRDGST_EN:
  3043. *value = conn->hdrdgst_en;
  3044. break;
  3045. case ISCSI_PARAM_DATADGST_EN:
  3046. *value = conn->datadgst_en;
  3047. break;
  3048. case ISCSI_PARAM_INITIAL_R2T_EN:
  3049. *value = session->initial_r2t_en;
  3050. break;
  3051. case ISCSI_PARAM_MAX_R2T:
  3052. *value = session->max_r2t;
  3053. break;
  3054. case ISCSI_PARAM_IMM_DATA_EN:
  3055. *value = session->imm_data_en;
  3056. break;
  3057. case ISCSI_PARAM_FIRST_BURST:
  3058. *value = session->first_burst;
  3059. break;
  3060. case ISCSI_PARAM_MAX_BURST:
  3061. *value = session->max_burst;
  3062. break;
  3063. case ISCSI_PARAM_PDU_INORDER_EN:
  3064. *value = session->pdu_inorder_en;
  3065. break;
  3066. case ISCSI_PARAM_DATASEQ_INORDER_EN:
  3067. *value = session->dataseq_inorder_en;
  3068. break;
  3069. case ISCSI_PARAM_ERL:
  3070. *value = session->erl;
  3071. break;
  3072. case ISCSI_PARAM_IFMARKER_EN:
  3073. *value = session->ifmarker_en;
  3074. break;
  3075. case ISCSI_PARAM_OFMARKER_EN:
  3076. *value = session->ofmarker_en;
  3077. break;
  3078. default:
  3079. return ISCSI_ERR_PARAM_NOT_FOUND;
  3080. }
  3081. return 0;
  3082. }
  3083. static void
  3084. iscsi_conn_get_stats(iscsi_connh_t connh, struct iscsi_stats *stats)
  3085. {
  3086. struct iscsi_conn *conn = iscsi_ptr(connh);
  3087. stats->txdata_octets = conn->txdata_octets;
  3088. stats->rxdata_octets = conn->rxdata_octets;
  3089. stats->scsicmd_pdus = conn->scsicmd_pdus_cnt;
  3090. stats->dataout_pdus = conn->dataout_pdus_cnt;
  3091. stats->scsirsp_pdus = conn->scsirsp_pdus_cnt;
  3092. stats->datain_pdus = conn->datain_pdus_cnt;
  3093. stats->r2t_pdus = conn->r2t_pdus_cnt;
  3094. stats->tmfcmd_pdus = conn->tmfcmd_pdus_cnt;
  3095. stats->tmfrsp_pdus = conn->tmfrsp_pdus_cnt;
  3096. stats->custom_length = 3;
  3097. strcpy(stats->custom[0].desc, "tx_sendpage_failures");
  3098. stats->custom[0].value = conn->sendpage_failures_cnt;
  3099. strcpy(stats->custom[1].desc, "rx_discontiguous_hdr");
  3100. stats->custom[1].value = conn->discontiguous_hdr_cnt;
  3101. strcpy(stats->custom[2].desc, "eh_abort_cnt");
  3102. stats->custom[2].value = conn->eh_abort_cnt;
  3103. }
  3104. static int
  3105. iscsi_conn_send_pdu(iscsi_connh_t connh, struct iscsi_hdr *hdr, char *data,
  3106. uint32_t data_size)
  3107. {
  3108. struct iscsi_conn *conn = iscsi_ptr(connh);
  3109. int rc;
  3110. down(&conn->xmitsema);
  3111. rc = iscsi_conn_send_generic(conn, hdr, data, data_size);
  3112. up(&conn->xmitsema);
  3113. return rc;
  3114. }
  3115. static struct iscsi_transport iscsi_tcp_transport = {
  3116. .owner = THIS_MODULE,
  3117. .name = "tcp",
  3118. .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST
  3119. | CAP_DATADGST,
  3120. .host_template = &iscsi_sht,
  3121. .hostdata_size = sizeof(struct iscsi_session),
  3122. .max_conn = 1,
  3123. .max_cmd_len = ISCSI_TCP_MAX_CMD_LEN,
  3124. .create_session = iscsi_session_create,
  3125. .destroy_session = iscsi_session_destroy,
  3126. .create_conn = iscsi_conn_create,
  3127. .bind_conn = iscsi_conn_bind,
  3128. .destroy_conn = iscsi_conn_destroy,
  3129. .set_param = iscsi_conn_set_param,
  3130. .get_param = iscsi_conn_get_param,
  3131. .start_conn = iscsi_conn_start,
  3132. .stop_conn = iscsi_conn_stop,
  3133. .send_pdu = iscsi_conn_send_pdu,
  3134. .get_stats = iscsi_conn_get_stats,
  3135. };
  3136. static int __init
  3137. iscsi_tcp_init(void)
  3138. {
  3139. int error;
  3140. if (iscsi_max_lun < 1) {
  3141. printk(KERN_ERR "Invalid max_lun value of %u\n", iscsi_max_lun);
  3142. return -EINVAL;
  3143. }
  3144. iscsi_tcp_transport.max_lun = iscsi_max_lun;
  3145. taskcache = kmem_cache_create("iscsi_taskcache",
  3146. sizeof(struct iscsi_data_task), 0,
  3147. SLAB_HWCACHE_ALIGN | SLAB_NO_REAP, NULL, NULL);
  3148. if (!taskcache)
  3149. return -ENOMEM;
  3150. error = iscsi_register_transport(&iscsi_tcp_transport);
  3151. if (error)
  3152. kmem_cache_destroy(taskcache);
  3153. return error;
  3154. }
  3155. static void __exit
  3156. iscsi_tcp_exit(void)
  3157. {
  3158. iscsi_unregister_transport(&iscsi_tcp_transport);
  3159. kmem_cache_destroy(taskcache);
  3160. }
  3161. module_init(iscsi_tcp_init);
  3162. module_exit(iscsi_tcp_exit);