提交 8dbd4574 编写于 作者: P Paolo Bonzini 提交者: Anthony Liguori

scsi: introduce SCSIReqOps

This will let allow requests to be dispatched through different callbacks,
either common or per-device.

This patch adjusts the API, the next one will move members to SCSIReqOps.
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 b45ef674
...@@ -133,12 +133,12 @@ int scsi_bus_legacy_handle_cmdline(SCSIBus *bus) ...@@ -133,12 +133,12 @@ int scsi_bus_legacy_handle_cmdline(SCSIBus *bus)
return res; return res;
} }
SCSIRequest *scsi_req_alloc(size_t size, SCSIDevice *d, uint32_t tag, SCSIRequest *scsi_req_alloc(SCSIReqOps *reqops, SCSIDevice *d, uint32_t tag,
uint32_t lun, void *hba_private) uint32_t lun, void *hba_private)
{ {
SCSIRequest *req; SCSIRequest *req;
req = qemu_mallocz(size); req = qemu_mallocz(reqops->size);
req->refcount = 1; req->refcount = 1;
req->bus = scsi_bus_from_device(d); req->bus = scsi_bus_from_device(d);
req->dev = d; req->dev = d;
...@@ -147,6 +147,7 @@ SCSIRequest *scsi_req_alloc(size_t size, SCSIDevice *d, uint32_t tag, ...@@ -147,6 +147,7 @@ SCSIRequest *scsi_req_alloc(size_t size, SCSIDevice *d, uint32_t tag,
req->hba_private = hba_private; req->hba_private = hba_private;
req->status = -1; req->status = -1;
req->sense_len = 0; req->sense_len = 0;
req->ops = reqops;
trace_scsi_req_alloc(req->dev->id, req->lun, req->tag); trace_scsi_req_alloc(req->dev->id, req->lun, req->tag);
return req; return req;
} }
......
...@@ -76,19 +76,6 @@ struct SCSIDiskState ...@@ -76,19 +76,6 @@ struct SCSIDiskState
static int scsi_handle_rw_error(SCSIDiskReq *r, int error, int type); static int scsi_handle_rw_error(SCSIDiskReq *r, int error, int type);
static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf); static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf);
static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag,
uint32_t lun, void *hba_private)
{
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
SCSIRequest *req;
SCSIDiskReq *r;
req = scsi_req_alloc(sizeof(SCSIDiskReq), &s->qdev, tag, lun, hba_private);
r = DO_UPCAST(SCSIDiskReq, req, req);
r->iov.iov_base = qemu_blockalign(s->bs, SCSI_DMA_BUF_SIZE);
return req;
}
static void scsi_free_request(SCSIRequest *req) static void scsi_free_request(SCSIRequest *req)
{ {
SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req); SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
...@@ -1225,6 +1212,23 @@ static int scsi_disk_initfn(SCSIDevice *dev) ...@@ -1225,6 +1212,23 @@ static int scsi_disk_initfn(SCSIDevice *dev)
return scsi_initfn(dev, scsi_type); return scsi_initfn(dev, scsi_type);
} }
static SCSIReqOps scsi_disk_reqops = {
.size = sizeof(SCSIDiskReq),
};
static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag,
uint32_t lun, void *hba_private)
{
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
SCSIRequest *req;
SCSIDiskReq *r;
req = scsi_req_alloc(&scsi_disk_reqops, &s->qdev, tag, lun, hba_private);
r = DO_UPCAST(SCSIDiskReq, req, req);
r->iov.iov_base = qemu_blockalign(s->bs, SCSI_DMA_BUF_SIZE);
return req;
}
#define DEFINE_SCSI_DISK_PROPERTIES() \ #define DEFINE_SCSI_DISK_PROPERTIES() \
DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), \ DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), \
DEFINE_PROP_STRING("ver", SCSIDiskState, version), \ DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
......
...@@ -63,15 +63,6 @@ struct SCSIGenericState ...@@ -63,15 +63,6 @@ struct SCSIGenericState
int lun; int lun;
}; };
static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
void *hba_private)
{
SCSIRequest *req;
req = scsi_req_alloc(sizeof(SCSIGenericReq), d, tag, lun, hba_private);
return req;
}
static void scsi_free_request(SCSIRequest *req) static void scsi_free_request(SCSIRequest *req)
{ {
SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req); SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
...@@ -498,6 +489,19 @@ static int scsi_generic_initfn(SCSIDevice *dev) ...@@ -498,6 +489,19 @@ static int scsi_generic_initfn(SCSIDevice *dev)
return 0; return 0;
} }
static SCSIReqOps scsi_generic_req_ops = {
.size = sizeof(SCSIGenericReq),
};
static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
void *hba_private)
{
SCSIRequest *req;
req = scsi_req_alloc(&scsi_generic_req_ops, d, tag, lun, hba_private);
return req;
}
static SCSIDeviceInfo scsi_generic_info = { static SCSIDeviceInfo scsi_generic_info = {
.qdev.name = "scsi-generic", .qdev.name = "scsi-generic",
.qdev.desc = "pass through generic scsi device (/dev/sg*)", .qdev.desc = "pass through generic scsi device (/dev/sg*)",
......
...@@ -14,6 +14,7 @@ typedef struct SCSIBusOps SCSIBusOps; ...@@ -14,6 +14,7 @@ typedef struct SCSIBusOps SCSIBusOps;
typedef struct SCSIDevice SCSIDevice; typedef struct SCSIDevice SCSIDevice;
typedef struct SCSIDeviceInfo SCSIDeviceInfo; typedef struct SCSIDeviceInfo SCSIDeviceInfo;
typedef struct SCSIRequest SCSIRequest; typedef struct SCSIRequest SCSIRequest;
typedef struct SCSIReqOps SCSIReqOps;
enum SCSIXferMode { enum SCSIXferMode {
SCSI_XFER_NONE, /* TEST_UNIT_READY, ... */ SCSI_XFER_NONE, /* TEST_UNIT_READY, ... */
...@@ -32,6 +33,7 @@ typedef struct SCSISense { ...@@ -32,6 +33,7 @@ typedef struct SCSISense {
struct SCSIRequest { struct SCSIRequest {
SCSIBus *bus; SCSIBus *bus;
SCSIDevice *dev; SCSIDevice *dev;
SCSIReqOps *ops;
uint32_t refcount; uint32_t refcount;
uint32_t tag; uint32_t tag;
uint32_t lun; uint32_t lun;
...@@ -69,6 +71,10 @@ int cdrom_read_toc(int nb_sectors, uint8_t *buf, int msf, int start_track); ...@@ -69,6 +71,10 @@ int cdrom_read_toc(int nb_sectors, uint8_t *buf, int msf, int start_track);
int cdrom_read_toc_raw(int nb_sectors, uint8_t *buf, int msf, int session_num); int cdrom_read_toc_raw(int nb_sectors, uint8_t *buf, int msf, int session_num);
/* scsi-bus.c */ /* scsi-bus.c */
struct SCSIReqOps {
size_t size;
};
typedef int (*scsi_qdev_initfn)(SCSIDevice *dev); typedef int (*scsi_qdev_initfn)(SCSIDevice *dev);
struct SCSIDeviceInfo { struct SCSIDeviceInfo {
DeviceInfo qdev; DeviceInfo qdev;
...@@ -144,7 +150,7 @@ extern const struct SCSISense sense_code_LUN_FAILURE; ...@@ -144,7 +150,7 @@ extern const struct SCSISense sense_code_LUN_FAILURE;
int scsi_sense_valid(SCSISense sense); int scsi_sense_valid(SCSISense sense);
SCSIRequest *scsi_req_alloc(size_t size, SCSIDevice *d, uint32_t tag, SCSIRequest *scsi_req_alloc(SCSIReqOps *reqops, SCSIDevice *d, uint32_t tag,
uint32_t lun, void *hba_private); uint32_t lun, void *hba_private);
SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun, SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun,
void *hba_private); void *hba_private);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册