Messages in this thread | | | Date | Tue, 20 Dec 2005 19:38:58 +0100 | From | Jens Axboe <> | Subject | Re: [PATCH rc6] block: Fix CDROMEJECT to work in more cases |
| |
On Tue, Dec 20 2005, Linus Torvalds wrote: > > > On Tue, 20 Dec 2005, Jens Axboe wrote: > > > > WRITEs cannot have length 0, and READs cannot as well. Since it's just > > one bit for direction, those are the rules. > > Jens, your logic doesn't make sense.
It does
> There clearly _are_ commands with a 0 data-length.
Of course, that's not what I'm saying. What I am saying is interpreted from the driver or further down in the io stack.
> And commands _have_ to be either READ or WRITE. We don't have a choice. > ll_rw_block: blk_get_request() even has a BIG_ON() that enforces that.
Yes, it has to choose one of the two pools.
> So claiming that reads and writes cannot have zere data-length is INSANE.
There are two sides to this - looking at the request allocations pools, yes if you want a request you have to tell from which pool you want it from. But a request that originates from that particular pool (in this case the write pool), does _not_ have to imply any transfer of data from a device!
> So reads and writes HAVE to accept a zero data length. End of story. If
That's not up for debate, of course that is the case. Otherwise we could not issue any request unless it needed to transfer data from a device. Just because an empty request happens to have the data direction bit set, does not mean it wants to transfer data to the device. By definition, that is an impossibility since there's nothing to transfer.
> there is some path in the SCSI layer that refuses it, that part must be > fixed, or you have to add a new "NONE" (and perhaps "BOTH") direction.
There _was_ a bug in the SCSI layer, because it had logic like this:
if (rq_data_dir(req) == WRITE) DMA_TO_DEVICE else if (req->data_len) DMA_FROM_DEVICE else DMA_NONE
which was buggy, because for it to transfer data to the device, both the direction bit _and_ a data length must be set.
-- Jens Axboe
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |