James Bottomley wrote:
On Wed, 2006-03-01 at 14:42 -0600, Mike Christie wrote:
The current sg driver should use alloc_pages() with an order that should
get 32 KB. If the order being passed to alloc_pages() in sg.c is only
getting one page by default that is bug.
The generic routines now being used can turn that 32KB segment into
multiple 4KB ones if the LLD does not support clustering.
To be honest, the original behaviour was a bug. A device that doesn't
enable clustering is telling us it can't take anything other than
PAGE_SIZE chunks ... trying to give it more is likely to end in tears.
Yeah, we hit this with iscsi_tcp. iscsi_tcp does not suport clustering,
not due to a HW limit, but becuase that is just how it was implemented.
When we get clustered segments we end up with data corruption or an oops
depending on the operation. I think the workaround was to set the
default segment for sg and st to a page or just use the block layer sg_io.
However ... I'm not sure we actually have any devices that anyone can
identify which truly can't enable clustering (a lot which have it
disabled, I suspect, are that way historically because their writers
didn't trust the clustering algorithm).
ok, I can implement clustering for iscsi_tcp. For now it does not much
matter since we never supported large sg or st commands.
-
: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html