On Mon, 31 Jan 2005 16:38:05 -0800, Greg KH <[EMAIL PROTECTED]> wrote:
> On Thu, Jan 27, 2005 at 12:43:25AM -0800, Pete Zaitcev wrote: > > This patch adds support for ioctls to ub, with the help of scsi_ioctl_cmd(). > > Now ub can eject CDs. But do not try to burn CDs yet, it's not tested. > > > > Original patch from Peter Jones (aka deviant-). > > > > Signed-off-by: Pete Zaitcev > > Applied, thanks. > > greg k-h I am awfully sorry, but that patch contained a bug. The code dereferenced cmd->back as if it were a pointer to a request even when it wasn't. It worked by accident, because rq->flags overlapped with a zeroed memory in other case. Here is a corrective patch. Signed-off-by: Pete Zaitcev --- linux-2.6.11-rc2-lem-gregkh/drivers/block/ub.c 2005-02-02 22:25:04.000000000 -0800 +++ linux-2.6.11-rc2-lem/drivers/block/ub.c 2005-02-02 22:22:19.000000000 -0800 @@ -775,6 +775,12 @@ request_queue_t *q = disk->queue; int uptodate; + if (blk_pc_request(rq)) { + /* UB_SENSE_SIZE is smaller than SCSI_SENSE_BUFFERSIZE */ + memcpy(rq->sense, sc->top_sense, UB_SENSE_SIZE); + rq->sense_len = UB_SENSE_SIZE; + } + if (cmd->error == 0) uptodate = 1; else @@ -833,6 +839,17 @@ bcb = &sc->work_bcb; + /* + * ``If the allocation length is eighteen or greater, and a device + * server returns less than eithteen bytes of data, the application + * client should assume that the bytes not transferred would have been + * zeroes had the device server returned those bytes.'' + * + * We zero sense for all commands so that when a packet request + * fails it does not return a stale sense. + */ + memset(&sc->top_sense, 0, UB_SENSE_SIZE); + /* set up the command wrapper */ bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); bcb->Tag = cmd->tag; /* Endianness is not important */ @@ -938,7 +955,6 @@ { struct urb *urb = &sc->work_urb; struct bulk_cs_wrap *bcs; - struct request *rq = cmd->back; int pipe; int rc; @@ -1192,13 +1208,6 @@ (*cmd->done)(sc, cmd); } else if (cmd->state == UB_CMDST_SENSE) { - if (blk_pc_request(rq)) { - /* - * UB_SENSE_SIZE is smaller than SCSI_SENSE_BUFFERSIZE - */ - memcpy(rq->sense, sc->top_sense, UB_SENSE_SIZE); - rq->sense_len = UB_SENSE_SIZE; - } ub_state_done(sc, cmd, -EIO); } else { @@ -1284,14 +1293,6 @@ goto error; } - /* - * ``If the allocation length is eighteen or greater, and a device - * server returns less than eithteen bytes of data, the application - * client should assume that the bytes not transferred would have been - * zeroes had the device server returned those bytes.'' - */ - memset(&sc->top_sense, 0, UB_SENSE_SIZE); - scmd = &sc->top_rqs_cmd; scmd->cdb[0] = REQUEST_SENSE; scmd->cdb[4] = UB_SENSE_SIZE; ------------------------------------------------------- This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting Tool for open source databases. Create drag-&-drop reports. Save time by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc. Download a FREE copy at http://www.intelliview.com/go/osdn_nl _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel