On Fri, 2 Jul 2010 09:08:56 -0400
Mike Snitzer <snitzer@redhat.com> wrote:
I think that as long as we free an allocated page for discard,
scsi_setup_discard_cmnd or the block layer don't need to detect the
case of a partially constructed command.
As I wrote earlier, I think that we need to clean up (and fix) the
error handling of the prep path. Currently, it's just messy. Some
errors are handled in the prep functions while some are in
scsi_prep_return().
- we call scsi_put_command in two places (scsi_init_io and scsi_prep_return).
- scsi_init_io calls scsi_put_command directly for BLKPREP_KILL but
calls it indirectly via scsi_unprep_request for BLKPREP_DEFER.
- If scsi_init_io() hits BLKPREP_KILL internally, we hit kernel oops
in scsi_prep_return since we call scsi_put_command twice. (luckily,
scsi_init_sgtable and scsi_alloc_sgtable in scsi_init_io return only
DEFER).
you could add more if you like.
I think that handling all the errors in scsi_prep_return() is
cleaner. I'll send a patch.
If we prefer to make sure that a request is completely reset (as
blk_clear_request_payload does), then we can add it on the top of the
patch.
--