Date: Tue, 7 Jul 2015 18:30:41 +0000 From: Raviprakash Darbha <rdarbha@juniper.net> To: "freebsd-scsi@freebsd.org" <freebsd-scsi@freebsd.org>, "freebsd-geom@freebsd.org" <freebsd-geom@freebsd.org> Cc: Raviprakash Darbha <rdarbha@juniper.net> Subject: questions about camcontrol eject Message-ID: <FE8D9CAE-003A-43AA-A7CD-84B4372243C7@juniper.net>
next in thread | raw e-mail | index | archive | help
Hello All I am trying to get cam control eject working on my router with 2 drives for= sometime and have some observations from the code. While allocating memory for ccb we either have a malloc option or a memory = pool. In the eject case we choose the memory pool as its low priority. After getting the ccb and setting the relevant fields it is submitted to th= e ata_action routine but then it fails there returning an error code . //Code snippets from sys/cam/scsi/scsi-pass.c /* * Non-immediate CCBs need a CCB from the per-device pool * of CCBs, which is scheduled by the transport layer. * Immediate CCBs and user-supplied CCBs should just be * malloced. */ if ((inccb->ccb_h.func_code & XPT_FC_QUEUED) && ((inccb->ccb_h.func_code & XPT_FC_USER_CCB) =3D=3D 0)) = { ccb =3D cam_periph_getccb(periph, priority); ccb_malloced =3D 0; } else { ccb =3D xpt_alloc_ccb_nowait(); if (ccb !=3D NULL) xpt_setup_ccb(&ccb->ccb_h, periph->path, priority); ccb_malloced =3D 1; } if (ccb =3D=3D NULL) { xpt_print(periph->path, "unable to allocate CCB\n")= ; error =3D ENOMEM; break; } error =3D passsendccb(periph, ccb, inccb); from sys/cam/ata/ata/xpt.c { struct cam_ed *device; u_int maxlen =3D 0; device =3D start_ccb->ccb_h.path->device; if (device->protocol =3D=3D PROTO_SCSI && (device->flags & CAM_DEV_IDENTIFY_DATA_VALID)) { uint16_t p =3D device->ident_data.config & ATA_PROTO_MASK; maxlen =3D (device->ident_data.config =3D=3D ATA_PROTO_CFA= ) ? 0 : (p =3D=3D ATA_PROTO_ATAPI_16) ? 16 : (p =3D=3D ATA_PROTO_ATAPI_12) ? 12 : 0; ///// maxlen is still set to 0. } if (start_ccb->csio.cdb_len > maxlen) { start_ccb->ccb_h.status =3D CAM_REQ_INVALID; xpt_done(start_ccb); break; ///// hence returning from here. } xpt_action_default(start_ccb); break; } My question is if this is a code path thats expected to run this way in whi= ch case I am missing something or is this a bug ? In the later case I am as= suming the ccb_hdr is not set correctly in case we get the ccb from the poo= l so i m considering to set it by calling xpt_ccb_setup in that case too t= o get the right values in the device structure. Any help is greatly appreciated here. Please let me know if more informatio= n is needed. Thanks Ravi
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?FE8D9CAE-003A-43AA-A7CD-84B4372243C7>