Signed-off-by: Ronnie Sahlberg <ronniesahlberg@xxxxxxxxx> --- usr/bs_rdwr.c | 10 +++++++++- usr/sbc.c | 7 +++++-- usr/scsi.c | 4 ++++ usr/scsi.h | 3 ++- usr/scsi_cmnd.h | 1 + 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/usr/bs_rdwr.c b/usr/bs_rdwr.c index 03b869d..acee73c 100644 --- a/usr/bs_rdwr.c +++ b/usr/bs_rdwr.c @@ -19,7 +19,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA */ -#define _XOPEN_SOURCE 500 +#define _XOPEN_SOURCE 600 #include <errno.h> #include <fcntl.h> @@ -113,6 +113,14 @@ static void bs_rdwr_request(struct scsi_cmd *cmd) if (ret != length) set_medium_error(&result, &key, &asc); break; + case PRE_FETCH_10: + case PRE_FETCH_16: + ret = posix_fadvise(fd, cmd->offset, cmd->tl, + POSIX_FADV_WILLNEED); + + if (ret != 0) + set_medium_error(&result, &key, &asc); + break; default: break; } diff --git a/usr/sbc.c b/usr/sbc.c index 9666801..b5843af 100644 --- a/usr/sbc.c +++ b/usr/sbc.c @@ -130,6 +130,8 @@ static int sbc_rw(int host_no, struct scsi_cmd *cmd) case WRITE_10: case WRITE_12: case WRITE_16: + case PRE_FETCH_10: + case PRE_FETCH_16: key = DATA_PROTECT; asc = ASC_WRITE_PROTECT; goto sense; @@ -149,6 +151,7 @@ static int sbc_rw(int host_no, struct scsi_cmd *cmd) } cmd->offset = lba; + cmd->tl = tl; ret = cmd->dev->bst->bs_cmd_submit(cmd); if (ret) { @@ -407,7 +410,7 @@ static struct device_type_template sbc_template = { {spc_illegal_op,}, {spc_illegal_op,}, {spc_illegal_op,}, - {spc_illegal_op,}, + {sbc_rw, NULL, PR_EA_FA|PR_EA_FN}, /*PRE_FETCH_10 */ {sbc_sync_cache, NULL, PR_WE_FA|PR_EA_FA|PR_WE_FN|PR_EA_FN}, {spc_illegal_op,}, {spc_illegal_op,}, @@ -464,7 +467,7 @@ static struct device_type_template sbc_template = { {spc_illegal_op,}, /* 0x90 */ - {spc_illegal_op,}, + {sbc_rw, NULL, PR_EA_FA|PR_EA_FN}, /*PRE_FETCH_16 */ {sbc_sync_cache, NULL, PR_WE_FA|PR_EA_FA|PR_WE_FN|PR_EA_FN}, {spc_illegal_op,}, {spc_illegal_op,}, diff --git a/usr/scsi.c b/usr/scsi.c index 8db2b88..5f78bfd 100644 --- a/usr/scsi.c +++ b/usr/scsi.c @@ -115,6 +115,7 @@ uint64_t scsi_rw_offset(uint8_t *scb) off = ((scb[1] & 0x1f) << 16) + (scb[2] << 8) + scb[3]; break; case READ_10: + case PRE_FETCH_10: case WRITE_10: case VERIFY: case WRITE_VERIFY: @@ -127,6 +128,7 @@ uint64_t scsi_rw_offset(uint8_t *scb) (uint32_t)scb[4] << 8 | (uint32_t)scb[5]; break; case READ_16: + case PRE_FETCH_16: case WRITE_16: case VERIFY_16: case WRITE_VERIFY_16: @@ -156,6 +158,7 @@ uint32_t scsi_rw_count(uint8_t *scb) cnt = 256; break; case READ_10: + case PRE_FETCH_10: case WRITE_10: case VERIFY: case WRITE_VERIFY: @@ -170,6 +173,7 @@ uint32_t scsi_rw_count(uint8_t *scb) (uint32_t)scb[8] << 8 | (uint32_t)scb[9]; break; case READ_16: + case PRE_FETCH_16: case WRITE_16: case VERIFY_16: case WRITE_VERIFY_16: diff --git a/usr/scsi.h b/usr/scsi.h index f4d8c11..0d33e32 100644 --- a/usr/scsi.h +++ b/usr/scsi.h @@ -45,7 +45,7 @@ #define SEARCH_EQUAL 0x31 #define SEARCH_LOW 0x32 #define SET_LIMITS 0x33 -#define PRE_FETCH 0x34 +#define PRE_FETCH_10 0x34 #define READ_POSITION 0x34 #define SYNCHRONIZE_CACHE 0x35 #define LOCK_UNLOCK_CACHE 0x36 @@ -74,6 +74,7 @@ #define WRITE_16 0x8a #define WRITE_VERIFY_16 0x8e #define VERIFY_16 0x8f +#define PRE_FETCH_16 0x90 #define SYNCHRONIZE_CACHE_16 0x91 #define SERVICE_ACTION_IN 0x9e #define SAI_READ_CAPACITY_16 0x10 diff --git a/usr/scsi_cmnd.h b/usr/scsi_cmnd.h index 6e3c6e2..83d733c 100644 --- a/usr/scsi_cmnd.h +++ b/usr/scsi_cmnd.h @@ -34,6 +34,7 @@ struct scsi_cmd { uint64_t cmd_itn_id; uint64_t offset; + uint32_t tl; uint8_t *scb; int scb_len; uint8_t lun[8]; -- 1.7.3.1 -- To unsubscribe from this list: send the line "unsubscribe stgt" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html