On Sun, 30 Nov 2008, FUJITA Tomonori wrote: > This patchset removes the majority of scsi_execute_async in st > driver. IOW, this converts st driver to use the block layer functions. > > We are in the process of removing scsi_execute_async and > scsi_req_map_sg. scsi_execute_async in sg driver were removed in > 2.6.27. Now only st and osst drivers use scsi_execute_async(). > > st driver uses scsi_execute_async for two purposes, performing sort > management SCSI commands internally and data transfer between user and > kernel space (st_read and st_write). This patchset converts the > former. > > The former performs SCSI commands synchronously. It uses a liner > in-kernel buffer (not scatter gather) for data transfer. To perform > such commands, other upper layer drivers (e.g. sd) use > scsi_execute_req (internally uses blk_rq_map_kern and and > blk_execute_rq). scsi_execute_req is not fully fit for st so I adds a > helper function similar to scsi_execute_req and replace > scsi_execute_async in st driver (I might modify scsi_execute_req for > st and remove the helper function later). > > I'm still working on converting scsi_execute_async for data transfer > between user and kernel space but I want to get this first half be > merged. > I have looked at the patches but it is a little difficult to say much without seeing the other half. I think there should be only one function in st to handle scsi. If you extend st_scsi_kern_execute to handle also read and write (as you later indicate you may do) I think that is a good direction. I tested the patches in 2.6.28-rc7 and noticed a couple of problems. The patches do not convert st_int_ioctl. I added simple conversion (at the end of this message) but after this, the driver did not pass my simple tests. Looking at st_scsi_kern_execute(), it seems that it does not copy the sense data to struct st_request. Thanks, Kai --- linux-t1/drivers/scsi/st.c.org 2008-12-02 20:14:11.000000000 +0200 +++ linux-t1/drivers/scsi/st.c 2008-12-02 20:34:49.000000000 +0200 @@ -2872,12 +2872,14 @@ static int st_int_ioctl(struct scsi_tape return (-ENOSYS); } - SRpnt = st_do_scsi(NULL, STp, cmd, datalen, direction, - timeout, MAX_RETRIES, 1); + + SRpnt = st_allocate_request(STp); if (!SRpnt) - return (STp->buffer)->syscall_result; + return STp->buffer->syscall_result; - ioctl_result = (STp->buffer)->syscall_result; + ioctl_result = st_scsi_kern_execute(SRpnt, cmd, direction, + STp->buffer->b_data, datalen, + timeout, MAX_RETRIES); if (!ioctl_result) { /* SCSI command successful */ st_release_request(SRpnt); -- To unsubscribe from this list: 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