iscsi_tcp.c 94 KB

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