> +struct __scsi_request { > + void *data; > + void (*done)(void *data, char *sense, int result, int resid); > + char sense[SCSI_SENSE_BUFFERSIZE]; > +}; I don't think this is a good structure name. Just something like iocontext or similar? > +int scsi_execute_async_iov_req(struct scsi_device *sdev, > + const unsigned char *cmd, int data_direction, > + struct kvec *vec, int vec_count, int timeout, > + int retries, void *privdata, > + void (*done)(void *, char *, int, int)) If you passed an request_queue_t instead of th scsi_device this function would not have any knowledge about scsi internals and could be moved up to the block layer. not sure that's actually a good idea. If we stick to putting it into the scsi layer the done callback could normalize the sense data, though. > + struct request *req; > + struct __scsi_request *sreq; > + int write = (data_direction == DMA_TO_DEVICE); What about just passing in a write parameter directly? > + > + sreq = kzalloc(sizeof(*sreq), GFP_ATOMIC); > + if (!sreq) { > + return DRIVER_ERROR << 24; > + } > + > + req = blk_get_request(sdev->request_queue, write, GFP_ATOMIC); can you add a gfp_mask argument instead of hardcoding GFP_ATOMIC? - : 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