# HG changeset patch # User t.horikoshi@jp.fujitsu.com # Date 1215043545 -32400 # Node ID 3132ef07eecf3f7d57bd6659d8f9ecf6f13421f5 # Parent b5ca56b48581e3e8ffc659d78f4aa725082c974c pvscsi: Fix whitelist emulation. Signed-off-by: Tomonari Horikoshi Signed-off-by: Jun Kamada diff -r b5ca56b48581 -r 3132ef07eecf drivers/xen/scsiback/emulate.c --- a/drivers/xen/scsiback/emulate.c Tue Jun 17 10:32:02 2008 +0100 +++ b/drivers/xen/scsiback/emulate.c Thu Jul 03 09:05:45 2008 +0900 @@ -93,7 +93,7 @@ static void scsiback_mk_sense_buffer(uin data[13] = asq; } -static void resp_not_supported_cmd(pending_req_t *pending_req) +static void resp_not_supported_cmd(pending_req_t *pending_req, void *data) { scsiback_mk_sense_buffer(pending_req->sense_buffer, ILLEGAL_REQUEST, INVALID_OPCODE, 0); @@ -270,7 +270,7 @@ int __pre_do_emulation(pending_req_t *pe 1: non emulation or should call native driver after modifing the request buffer. */ - return (bitmap[op_code] & VSCSIIF_NEED_CMD_EXEC); + return !!(bitmap[op_code] & VSCSIIF_NEED_CMD_EXEC); } void scsiback_rsp_emulation(pending_req_t *pending_req) @@ -308,16 +308,14 @@ void scsiback_emulation_init(void) /* Initialize to default state */ for (i = 0; i < VSCSI_MAX_SCSI_OP_CODE; i++) { - bitmap[i] = VSCSIIF_NEED_CMD_EXEC; - pre_function[i] = NULL; + bitmap[i] = (VSCSIIF_NEED_EMULATE_REQBUF | + VSCSIIF_NEED_EMULATE_RSPBUF); + pre_function[i] = resp_not_supported_cmd; post_function[i] = NULL; /* means, - no need for pre-emulation - no need for post-emulation - call native driver - - (Current setting is black-list bases, white-list - bases may be appropriate for security.) */ } @@ -325,6 +323,77 @@ void scsiback_emulation_init(void) Register appropriate functions below as you need. (See scsi/scsi.h for definition of SCSI op_code.) */ + + /* + This command is Non emulation. + */ + bitmap[TEST_UNIT_READY] = VSCSIIF_NEED_CMD_EXEC; + pre_function[TEST_UNIT_READY] = NULL; + post_function[TEST_UNIT_READY] = NULL; + + bitmap[REZERO_UNIT] = VSCSIIF_NEED_CMD_EXEC; + pre_function[REZERO_UNIT] = NULL; + post_function[REZERO_UNIT] = NULL; + + bitmap[REQUEST_SENSE] = VSCSIIF_NEED_CMD_EXEC; + pre_function[REQUEST_SENSE] = NULL; + post_function[REQUEST_SENSE] = NULL; + + bitmap[FORMAT_UNIT] = VSCSIIF_NEED_CMD_EXEC; + pre_function[FORMAT_UNIT] = NULL; + post_function[FORMAT_UNIT] = NULL; + + bitmap[READ_BLOCK_LIMITS] = VSCSIIF_NEED_CMD_EXEC; + pre_function[READ_BLOCK_LIMITS] = NULL; + post_function[READ_BLOCK_LIMITS] = NULL; + + bitmap[READ_6] = VSCSIIF_NEED_CMD_EXEC; + pre_function[READ_6] = NULL; + post_function[READ_6] = NULL; + + bitmap[WRITE_6] = VSCSIIF_NEED_CMD_EXEC; + pre_function[WRITE_6] = NULL; + post_function[WRITE_6] = NULL; + + bitmap[WRITE_FILEMARKS] = VSCSIIF_NEED_CMD_EXEC; + pre_function[WRITE_FILEMARKS] = NULL; + post_function[WRITE_FILEMARKS] = NULL; + + bitmap[SPACE] = VSCSIIF_NEED_CMD_EXEC; + pre_function[SPACE] = NULL; + post_function[SPACE] = NULL; + + bitmap[INQUIRY] = VSCSIIF_NEED_CMD_EXEC; + pre_function[INQUIRY] = NULL; + post_function[INQUIRY] = NULL; + + bitmap[ERASE] = VSCSIIF_NEED_CMD_EXEC; + pre_function[ERASE] = NULL; + post_function[ERASE] = NULL; + + bitmap[MODE_SENSE] = VSCSIIF_NEED_CMD_EXEC; + pre_function[MODE_SENSE] = NULL; + post_function[MODE_SENSE] = NULL; + + bitmap[SEND_DIAGNOSTIC] = VSCSIIF_NEED_CMD_EXEC; + pre_function[SEND_DIAGNOSTIC] = NULL; + post_function[SEND_DIAGNOSTIC] = NULL; + + bitmap[READ_CAPACITY] = VSCSIIF_NEED_CMD_EXEC; + pre_function[READ_CAPACITY] = NULL; + post_function[READ_CAPACITY] = NULL; + + bitmap[READ_10] = VSCSIIF_NEED_CMD_EXEC; + pre_function[READ_10] = NULL; + post_function[READ_10] = NULL; + + bitmap[WRITE_10] = VSCSIIF_NEED_CMD_EXEC; + pre_function[WRITE_10] = NULL; + post_function[WRITE_10] = NULL; + + /* + This command is Full emulation. + */ pre_function[REPORT_LUNS] = __report_luns; bitmap[REPORT_LUNS] = (VSCSIIF_NEED_EMULATE_REQBUF | VSCSIIF_NEED_EMULATE_RSPBUF);