On Tue, 22 Mar 2011, Roger Quadros wrote:
I have a question here.
The host can request us to send less or more than the actual TOC size, since it
has no clue how big it is.
e.g. Linux host requests us to send only 12 bytes even though our formatted TOC
length is 20. In this case should we return fsg->data_size_from_cmnd instead of
actual TOC length?
No. Always return the actual TOC length.
e.g. Mac requests us to send 65534 bytes but our RAW TOC length is 37.
The file storage driver seems to be zero padding our data response. So we
respond with 65534 bytes, 37 of TOC and remaining zero padded.
Can we do something like this to avoid unnecessary zero padded transfers?
ret = fsg_get_toc(curlun, msf, format, buf);
if (ret< 0) {
curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
return -EINVAL;
} else if (ret> fsg->data_size_from_cmnd) {
ret = fsg->data_size_from_cmnd;
} else {
fsg->residue = ret;
}
return ret;
Not needed (and not correct). The code at the end of do_scsi_command()
already does this:
reply = min((u32) reply, fsg->data_size_from_cmnd);
...
fsg->residue -= reply;