]> git.proxmox.com Git - mirror_qemu.git/blob - hw/scsi/scsi-generic.c
virtio-scsi: Configure all host notifiers in a single MR transaction
[mirror_qemu.git] / hw / scsi / scsi-generic.c
1 /*
2 * Generic SCSI Device support
3 *
4 * Copyright (c) 2007 Bull S.A.S.
5 * Based on code by Paul Brook
6 * Based on code by Fabrice Bellard
7 *
8 * Written by Laurent Vivier <Laurent.Vivier@bull.net>
9 *
10 * This code is licensed under the LGPL.
11 *
12 */
13
14 #include "qemu/osdep.h"
15 #include "qapi/error.h"
16 #include "qemu/ctype.h"
17 #include "qemu/error-report.h"
18 #include "qemu/module.h"
19 #include "hw/scsi/scsi.h"
20 #include "migration/qemu-file-types.h"
21 #include "hw/qdev-properties.h"
22 #include "hw/qdev-properties-system.h"
23 #include "hw/scsi/emulation.h"
24 #include "sysemu/block-backend.h"
25 #include "trace.h"
26
27 #ifdef __linux__
28
29 #include <scsi/sg.h>
30 #include "scsi/constants.h"
31
32 #ifndef MAX_UINT
33 #define MAX_UINT ((unsigned int)-1)
34 #endif
35
36 typedef struct SCSIGenericReq {
37 SCSIRequest req;
38 uint8_t *buf;
39 int buflen;
40 int len;
41 sg_io_hdr_t io_header;
42 } SCSIGenericReq;
43
44 static void scsi_generic_save_request(QEMUFile *f, SCSIRequest *req)
45 {
46 SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
47
48 qemu_put_sbe32s(f, &r->buflen);
49 if (r->buflen && r->req.cmd.mode == SCSI_XFER_TO_DEV) {
50 assert(!r->req.sg);
51 qemu_put_buffer(f, r->buf, r->req.cmd.xfer);
52 }
53 }
54
55 static void scsi_generic_load_request(QEMUFile *f, SCSIRequest *req)
56 {
57 SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
58
59 qemu_get_sbe32s(f, &r->buflen);
60 if (r->buflen && r->req.cmd.mode == SCSI_XFER_TO_DEV) {
61 assert(!r->req.sg);
62 qemu_get_buffer(f, r->buf, r->req.cmd.xfer);
63 }
64 }
65
66 static void scsi_free_request(SCSIRequest *req)
67 {
68 SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
69
70 g_free(r->buf);
71 }
72
73 /* Helper function for command completion. */
74 static void scsi_command_complete_noio(SCSIGenericReq *r, int ret)
75 {
76 int status;
77 SCSISense sense;
78 sg_io_hdr_t *io_hdr = &r->io_header;
79
80 assert(r->req.aiocb == NULL);
81
82 if (r->req.io_canceled) {
83 scsi_req_cancel_complete(&r->req);
84 goto done;
85 }
86 if (ret < 0) {
87 status = scsi_sense_from_errno(-ret, &sense);
88 if (status == CHECK_CONDITION) {
89 scsi_req_build_sense(&r->req, sense);
90 }
91 } else if (io_hdr->host_status != SCSI_HOST_OK) {
92 scsi_req_complete_failed(&r->req, io_hdr->host_status);
93 goto done;
94 } else if (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT) {
95 status = BUSY;
96 } else {
97 status = io_hdr->status;
98 if (io_hdr->driver_status & SG_ERR_DRIVER_SENSE) {
99 r->req.sense_len = io_hdr->sb_len_wr;
100 }
101 }
102 trace_scsi_generic_command_complete_noio(r, r->req.tag, status);
103
104 scsi_req_complete(&r->req, status);
105 done:
106 scsi_req_unref(&r->req);
107 }
108
109 static void scsi_command_complete(void *opaque, int ret)
110 {
111 SCSIGenericReq *r = (SCSIGenericReq *)opaque;
112 SCSIDevice *s = r->req.dev;
113
114 assert(r->req.aiocb != NULL);
115 r->req.aiocb = NULL;
116
117 aio_context_acquire(blk_get_aio_context(s->conf.blk));
118 scsi_command_complete_noio(r, ret);
119 aio_context_release(blk_get_aio_context(s->conf.blk));
120 }
121
122 static int execute_command(BlockBackend *blk,
123 SCSIGenericReq *r, int direction,
124 BlockCompletionFunc *complete)
125 {
126 SCSIDevice *s = r->req.dev;
127
128 r->io_header.interface_id = 'S';
129 r->io_header.dxfer_direction = direction;
130 r->io_header.dxferp = r->buf;
131 r->io_header.dxfer_len = r->buflen;
132 r->io_header.cmdp = r->req.cmd.buf;
133 r->io_header.cmd_len = r->req.cmd.len;
134 r->io_header.mx_sb_len = sizeof(r->req.sense);
135 r->io_header.sbp = r->req.sense;
136 r->io_header.timeout = s->io_timeout * 1000;
137 r->io_header.usr_ptr = r;
138 r->io_header.flags |= SG_FLAG_DIRECT_IO;
139
140 trace_scsi_generic_aio_sgio_command(r->req.tag, r->req.cmd.buf[0],
141 r->io_header.timeout);
142 r->req.aiocb = blk_aio_ioctl(blk, SG_IO, &r->io_header, complete, r);
143 if (r->req.aiocb == NULL) {
144 return -EIO;
145 }
146
147 return 0;
148 }
149
150 static void scsi_handle_inquiry_reply(SCSIGenericReq *r, SCSIDevice *s)
151 {
152 uint8_t page, page_idx;
153
154 /*
155 * EVPD set to zero returns the standard INQUIRY data.
156 *
157 * Check if scsi_version is unset (-1) to avoid re-defining it
158 * each time an INQUIRY with standard data is received.
159 * scsi_version is initialized with -1 in scsi_generic_reset
160 * and scsi_disk_reset, making sure that we'll set the
161 * scsi_version after a reset. If the version field of the
162 * INQUIRY response somehow changes after a guest reboot,
163 * we'll be able to keep track of it.
164 *
165 * On SCSI-2 and older, first 3 bits of byte 2 is the
166 * ANSI-approved version, while on later versions the
167 * whole byte 2 contains the version. Check if we're dealing
168 * with a newer version and, in that case, assign the
169 * whole byte.
170 */
171 if (s->scsi_version == -1 && !(r->req.cmd.buf[1] & 0x01)) {
172 s->scsi_version = r->buf[2] & 0x07;
173 if (s->scsi_version > 2) {
174 s->scsi_version = r->buf[2];
175 }
176 }
177
178 if ((s->type == TYPE_DISK || s->type == TYPE_ZBC) &&
179 (r->req.cmd.buf[1] & 0x01)) {
180 page = r->req.cmd.buf[2];
181 if (page == 0xb0) {
182 uint32_t max_transfer =
183 blk_get_max_transfer(s->conf.blk) / s->blocksize;
184
185 assert(max_transfer);
186 stl_be_p(&r->buf[8], max_transfer);
187 /* Also take care of the opt xfer len. */
188 stl_be_p(&r->buf[12],
189 MIN_NON_ZERO(max_transfer, ldl_be_p(&r->buf[12])));
190 } else if (s->needs_vpd_bl_emulation && page == 0x00 && r->buflen >= 4) {
191 /*
192 * Now we're capable of supplying the VPD Block Limits
193 * response if the hardware can't. Add it in the INQUIRY
194 * Supported VPD pages response in case we are using the
195 * emulation for this device.
196 *
197 * This way, the guest kernel will be aware of the support
198 * and will use it to proper setup the SCSI device.
199 *
200 * VPD page numbers must be sorted, so insert 0xb0 at the
201 * right place with an in-place insert. When the while loop
202 * begins the device response is at r[0] to r[page_idx - 1].
203 */
204 page_idx = lduw_be_p(r->buf + 2) + 4;
205 page_idx = MIN(page_idx, r->buflen);
206 while (page_idx > 4 && r->buf[page_idx - 1] >= 0xb0) {
207 if (page_idx < r->buflen) {
208 r->buf[page_idx] = r->buf[page_idx - 1];
209 }
210 page_idx--;
211 }
212 if (page_idx < r->buflen) {
213 r->buf[page_idx] = 0xb0;
214 }
215 stw_be_p(r->buf + 2, lduw_be_p(r->buf + 2) + 1);
216 }
217 }
218 }
219
220 static int scsi_generic_emulate_block_limits(SCSIGenericReq *r, SCSIDevice *s)
221 {
222 int len;
223 uint8_t buf[64];
224
225 SCSIBlockLimits bl = {
226 .max_io_sectors = blk_get_max_transfer(s->conf.blk) / s->blocksize
227 };
228
229 memset(r->buf, 0, r->buflen);
230 stb_p(buf, s->type);
231 stb_p(buf + 1, 0xb0);
232 len = scsi_emulate_block_limits(buf + 4, &bl);
233 assert(len <= sizeof(buf) - 4);
234 stw_be_p(buf + 2, len);
235
236 memcpy(r->buf, buf, MIN(r->buflen, len + 4));
237
238 r->io_header.sb_len_wr = 0;
239
240 /*
241 * We have valid contents in the reply buffer but the
242 * io_header can report a sense error coming from
243 * the hardware in scsi_command_complete_noio. Clean
244 * up the io_header to avoid reporting it.
245 */
246 r->io_header.driver_status = 0;
247 r->io_header.status = 0;
248
249 return r->buflen;
250 }
251
252 static void scsi_read_complete(void * opaque, int ret)
253 {
254 SCSIGenericReq *r = (SCSIGenericReq *)opaque;
255 SCSIDevice *s = r->req.dev;
256 int len;
257
258 assert(r->req.aiocb != NULL);
259 r->req.aiocb = NULL;
260
261 aio_context_acquire(blk_get_aio_context(s->conf.blk));
262
263 if (ret || r->req.io_canceled) {
264 scsi_command_complete_noio(r, ret);
265 goto done;
266 }
267
268 len = r->io_header.dxfer_len - r->io_header.resid;
269 trace_scsi_generic_read_complete(r->req.tag, len);
270
271 r->len = -1;
272
273 if (r->io_header.driver_status & SG_ERR_DRIVER_SENSE) {
274 SCSISense sense =
275 scsi_parse_sense_buf(r->req.sense, r->io_header.sb_len_wr);
276
277 /*
278 * Check if this is a VPD Block Limits request that
279 * resulted in sense error but would need emulation.
280 * In this case, emulate a valid VPD response.
281 */
282 if (sense.key == ILLEGAL_REQUEST &&
283 s->needs_vpd_bl_emulation &&
284 r->req.cmd.buf[0] == INQUIRY &&
285 (r->req.cmd.buf[1] & 0x01) &&
286 r->req.cmd.buf[2] == 0xb0) {
287 len = scsi_generic_emulate_block_limits(r, s);
288 /*
289 * It's okay to jup to req_complete: no need to
290 * let scsi_handle_inquiry_reply handle an
291 * INQUIRY VPD BL request we created manually.
292 */
293 }
294 if (sense.key) {
295 goto req_complete;
296 }
297 }
298
299 if (r->io_header.host_status != SCSI_HOST_OK ||
300 (r->io_header.driver_status & SG_ERR_DRIVER_TIMEOUT) ||
301 r->io_header.status != GOOD ||
302 len == 0) {
303 scsi_command_complete_noio(r, 0);
304 goto done;
305 }
306
307 /* Snoop READ CAPACITY output to set the blocksize. */
308 if (r->req.cmd.buf[0] == READ_CAPACITY_10 &&
309 (ldl_be_p(&r->buf[0]) != 0xffffffffU || s->max_lba == 0)) {
310 s->blocksize = ldl_be_p(&r->buf[4]);
311 s->max_lba = ldl_be_p(&r->buf[0]) & 0xffffffffULL;
312 } else if (r->req.cmd.buf[0] == SERVICE_ACTION_IN_16 &&
313 (r->req.cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) {
314 s->blocksize = ldl_be_p(&r->buf[8]);
315 s->max_lba = ldq_be_p(&r->buf[0]);
316 }
317 blk_set_guest_block_size(s->conf.blk, s->blocksize);
318
319 /*
320 * Patch MODE SENSE device specific parameters if the BDS is opened
321 * readonly.
322 */
323 if ((s->type == TYPE_DISK || s->type == TYPE_TAPE || s->type == TYPE_ZBC) &&
324 !blk_is_writable(s->conf.blk) &&
325 (r->req.cmd.buf[0] == MODE_SENSE ||
326 r->req.cmd.buf[0] == MODE_SENSE_10) &&
327 (r->req.cmd.buf[1] & 0x8) == 0) {
328 if (r->req.cmd.buf[0] == MODE_SENSE) {
329 r->buf[2] |= 0x80;
330 } else {
331 r->buf[3] |= 0x80;
332 }
333 }
334 if (r->req.cmd.buf[0] == INQUIRY) {
335 scsi_handle_inquiry_reply(r, s);
336 }
337
338 req_complete:
339 scsi_req_data(&r->req, len);
340 scsi_req_unref(&r->req);
341
342 done:
343 aio_context_release(blk_get_aio_context(s->conf.blk));
344 }
345
346 /* Read more data from scsi device into buffer. */
347 static void scsi_read_data(SCSIRequest *req)
348 {
349 SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
350 SCSIDevice *s = r->req.dev;
351 int ret;
352
353 trace_scsi_generic_read_data(req->tag);
354
355 /* The request is used as the AIO opaque value, so add a ref. */
356 scsi_req_ref(&r->req);
357 if (r->len == -1) {
358 scsi_command_complete_noio(r, 0);
359 return;
360 }
361
362 ret = execute_command(s->conf.blk, r, SG_DXFER_FROM_DEV,
363 scsi_read_complete);
364 if (ret < 0) {
365 scsi_command_complete_noio(r, ret);
366 }
367 }
368
369 static void scsi_write_complete(void * opaque, int ret)
370 {
371 SCSIGenericReq *r = (SCSIGenericReq *)opaque;
372 SCSIDevice *s = r->req.dev;
373
374 trace_scsi_generic_write_complete(ret);
375
376 assert(r->req.aiocb != NULL);
377 r->req.aiocb = NULL;
378
379 aio_context_acquire(blk_get_aio_context(s->conf.blk));
380
381 if (ret || r->req.io_canceled) {
382 scsi_command_complete_noio(r, ret);
383 goto done;
384 }
385
386 if (r->req.cmd.buf[0] == MODE_SELECT && r->req.cmd.buf[4] == 12 &&
387 s->type == TYPE_TAPE) {
388 s->blocksize = (r->buf[9] << 16) | (r->buf[10] << 8) | r->buf[11];
389 trace_scsi_generic_write_complete_blocksize(s->blocksize);
390 }
391
392 scsi_command_complete_noio(r, ret);
393
394 done:
395 aio_context_release(blk_get_aio_context(s->conf.blk));
396 }
397
398 /* Write data to a scsi device. Returns nonzero on failure.
399 The transfer may complete asynchronously. */
400 static void scsi_write_data(SCSIRequest *req)
401 {
402 SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
403 SCSIDevice *s = r->req.dev;
404 int ret;
405
406 trace_scsi_generic_write_data(req->tag);
407 if (r->len == 0) {
408 r->len = r->buflen;
409 scsi_req_data(&r->req, r->len);
410 return;
411 }
412
413 /* The request is used as the AIO opaque value, so add a ref. */
414 scsi_req_ref(&r->req);
415 ret = execute_command(s->conf.blk, r, SG_DXFER_TO_DEV, scsi_write_complete);
416 if (ret < 0) {
417 scsi_command_complete_noio(r, ret);
418 }
419 }
420
421 /* Return a pointer to the data buffer. */
422 static uint8_t *scsi_get_buf(SCSIRequest *req)
423 {
424 SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
425
426 return r->buf;
427 }
428
429 static void scsi_generic_command_dump(uint8_t *cmd, int len)
430 {
431 int i;
432 char *line_buffer, *p;
433
434 line_buffer = g_malloc(len * 5 + 1);
435
436 for (i = 0, p = line_buffer; i < len; i++) {
437 p += sprintf(p, " 0x%02x", cmd[i]);
438 }
439 trace_scsi_generic_send_command(line_buffer);
440
441 g_free(line_buffer);
442 }
443
444 /* Execute a scsi command. Returns the length of the data expected by the
445 command. This will be Positive for data transfers from the device
446 (eg. disk reads), negative for transfers to the device (eg. disk writes),
447 and zero if the command does not transfer any data. */
448
449 static int32_t scsi_send_command(SCSIRequest *req, uint8_t *cmd)
450 {
451 SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
452 SCSIDevice *s = r->req.dev;
453 int ret;
454
455 if (trace_event_get_state_backends(TRACE_SCSI_GENERIC_SEND_COMMAND)) {
456 scsi_generic_command_dump(cmd, r->req.cmd.len);
457 }
458
459 if (r->req.cmd.xfer == 0) {
460 g_free(r->buf);
461 r->buflen = 0;
462 r->buf = NULL;
463 /* The request is used as the AIO opaque value, so add a ref. */
464 scsi_req_ref(&r->req);
465 ret = execute_command(s->conf.blk, r, SG_DXFER_NONE,
466 scsi_command_complete);
467 if (ret < 0) {
468 scsi_command_complete_noio(r, ret);
469 return 0;
470 }
471 return 0;
472 }
473
474 if (r->buflen != r->req.cmd.xfer) {
475 g_free(r->buf);
476 r->buf = g_malloc(r->req.cmd.xfer);
477 r->buflen = r->req.cmd.xfer;
478 }
479
480 memset(r->buf, 0, r->buflen);
481 r->len = r->req.cmd.xfer;
482 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
483 r->len = 0;
484 return -r->req.cmd.xfer;
485 } else {
486 return r->req.cmd.xfer;
487 }
488 }
489
490 static int read_naa_id(const uint8_t *p, uint64_t *p_wwn)
491 {
492 int i;
493
494 if ((p[1] & 0xF) == 3) {
495 /* NAA designator type */
496 if (p[3] != 8) {
497 return -EINVAL;
498 }
499 *p_wwn = ldq_be_p(p + 4);
500 return 0;
501 }
502
503 if ((p[1] & 0xF) == 8) {
504 /* SCSI name string designator type */
505 if (p[3] < 20 || memcmp(&p[4], "naa.", 4)) {
506 return -EINVAL;
507 }
508 if (p[3] > 20 && p[24] != ',') {
509 return -EINVAL;
510 }
511 *p_wwn = 0;
512 for (i = 8; i < 24; i++) {
513 char c = qemu_toupper(p[i]);
514 c -= (c >= '0' && c <= '9' ? '0' : 'A' - 10);
515 *p_wwn = (*p_wwn << 4) | c;
516 }
517 return 0;
518 }
519
520 return -EINVAL;
521 }
522
523 int scsi_SG_IO_FROM_DEV(BlockBackend *blk, uint8_t *cmd, uint8_t cmd_size,
524 uint8_t *buf, uint8_t buf_size, uint32_t timeout)
525 {
526 sg_io_hdr_t io_header;
527 uint8_t sensebuf[8];
528 int ret;
529
530 memset(&io_header, 0, sizeof(io_header));
531 io_header.interface_id = 'S';
532 io_header.dxfer_direction = SG_DXFER_FROM_DEV;
533 io_header.dxfer_len = buf_size;
534 io_header.dxferp = buf;
535 io_header.cmdp = cmd;
536 io_header.cmd_len = cmd_size;
537 io_header.mx_sb_len = sizeof(sensebuf);
538 io_header.sbp = sensebuf;
539 io_header.timeout = timeout * 1000;
540
541 trace_scsi_generic_ioctl_sgio_command(cmd[0], io_header.timeout);
542 ret = blk_ioctl(blk, SG_IO, &io_header);
543 if (ret < 0 || io_header.status ||
544 io_header.driver_status || io_header.host_status) {
545 trace_scsi_generic_ioctl_sgio_done(cmd[0], ret, io_header.status,
546 io_header.host_status);
547 return -1;
548 }
549 return 0;
550 }
551
552 /*
553 * Executes an INQUIRY request with EVPD set to retrieve the
554 * available VPD pages of the device. If the device does
555 * not support the Block Limits page (page 0xb0), set
556 * the needs_vpd_bl_emulation flag for future use.
557 */
558 static void scsi_generic_set_vpd_bl_emulation(SCSIDevice *s)
559 {
560 uint8_t cmd[6];
561 uint8_t buf[250];
562 uint8_t page_len;
563 int ret, i;
564
565 memset(cmd, 0, sizeof(cmd));
566 memset(buf, 0, sizeof(buf));
567 cmd[0] = INQUIRY;
568 cmd[1] = 1;
569 cmd[2] = 0x00;
570 cmd[4] = sizeof(buf);
571
572 ret = scsi_SG_IO_FROM_DEV(s->conf.blk, cmd, sizeof(cmd),
573 buf, sizeof(buf), s->io_timeout);
574 if (ret < 0) {
575 /*
576 * Do not assume anything if we can't retrieve the
577 * INQUIRY response to assert the VPD Block Limits
578 * support.
579 */
580 s->needs_vpd_bl_emulation = false;
581 return;
582 }
583
584 page_len = buf[3];
585 for (i = 4; i < MIN(sizeof(buf), page_len + 4); i++) {
586 if (buf[i] == 0xb0) {
587 s->needs_vpd_bl_emulation = false;
588 return;
589 }
590 }
591 s->needs_vpd_bl_emulation = true;
592 }
593
594 static void scsi_generic_read_device_identification(SCSIDevice *s)
595 {
596 uint8_t cmd[6];
597 uint8_t buf[250];
598 int ret;
599 int i, len;
600
601 memset(cmd, 0, sizeof(cmd));
602 memset(buf, 0, sizeof(buf));
603 cmd[0] = INQUIRY;
604 cmd[1] = 1;
605 cmd[2] = 0x83;
606 cmd[4] = sizeof(buf);
607
608 ret = scsi_SG_IO_FROM_DEV(s->conf.blk, cmd, sizeof(cmd),
609 buf, sizeof(buf), s->io_timeout);
610 if (ret < 0) {
611 return;
612 }
613
614 len = MIN((buf[2] << 8) | buf[3], sizeof(buf) - 4);
615 for (i = 0; i + 3 <= len; ) {
616 const uint8_t *p = &buf[i + 4];
617 uint64_t wwn;
618
619 if (i + (p[3] + 4) > len) {
620 break;
621 }
622
623 if ((p[1] & 0x10) == 0) {
624 /* Associated with the logical unit */
625 if (read_naa_id(p, &wwn) == 0) {
626 s->wwn = wwn;
627 }
628 } else if ((p[1] & 0x10) == 0x10) {
629 /* Associated with the target port */
630 if (read_naa_id(p, &wwn) == 0) {
631 s->port_wwn = wwn;
632 }
633 }
634
635 i += p[3] + 4;
636 }
637 }
638
639 void scsi_generic_read_device_inquiry(SCSIDevice *s)
640 {
641 scsi_generic_read_device_identification(s);
642 if (s->type == TYPE_DISK || s->type == TYPE_ZBC) {
643 scsi_generic_set_vpd_bl_emulation(s);
644 } else {
645 s->needs_vpd_bl_emulation = false;
646 }
647 }
648
649 static int get_stream_blocksize(BlockBackend *blk)
650 {
651 uint8_t cmd[6];
652 uint8_t buf[12];
653 int ret;
654
655 memset(cmd, 0, sizeof(cmd));
656 memset(buf, 0, sizeof(buf));
657 cmd[0] = MODE_SENSE;
658 cmd[4] = sizeof(buf);
659
660 ret = scsi_SG_IO_FROM_DEV(blk, cmd, sizeof(cmd), buf, sizeof(buf), 6);
661 if (ret < 0) {
662 return -1;
663 }
664
665 return (buf[9] << 16) | (buf[10] << 8) | buf[11];
666 }
667
668 static void scsi_generic_reset(DeviceState *dev)
669 {
670 SCSIDevice *s = SCSI_DEVICE(dev);
671
672 s->scsi_version = s->default_scsi_version;
673 scsi_device_purge_requests(s, SENSE_CODE(RESET));
674 }
675
676 static void scsi_generic_realize(SCSIDevice *s, Error **errp)
677 {
678 int rc;
679 int sg_version;
680 struct sg_scsi_id scsiid;
681
682 if (!s->conf.blk) {
683 error_setg(errp, "drive property not set");
684 return;
685 }
686
687 if (blk_get_on_error(s->conf.blk, 0) != BLOCKDEV_ON_ERROR_ENOSPC &&
688 blk_get_on_error(s->conf.blk, 0) != BLOCKDEV_ON_ERROR_REPORT) {
689 error_setg(errp, "Device doesn't support drive option werror");
690 return;
691 }
692 if (blk_get_on_error(s->conf.blk, 1) != BLOCKDEV_ON_ERROR_REPORT) {
693 error_setg(errp, "Device doesn't support drive option rerror");
694 return;
695 }
696
697 /* check we are using a driver managing SG_IO (version 3 and after */
698 rc = blk_ioctl(s->conf.blk, SG_GET_VERSION_NUM, &sg_version);
699 if (rc < 0) {
700 error_setg_errno(errp, -rc, "cannot get SG_IO version number");
701 if (rc != -EPERM) {
702 error_append_hint(errp, "Is this a SCSI device?\n");
703 }
704 return;
705 }
706 if (sg_version < 30000) {
707 error_setg(errp, "scsi generic interface too old");
708 return;
709 }
710
711 /* get LUN of the /dev/sg? */
712 if (blk_ioctl(s->conf.blk, SG_GET_SCSI_ID, &scsiid)) {
713 error_setg(errp, "SG_GET_SCSI_ID ioctl failed");
714 return;
715 }
716 if (!blkconf_apply_backend_options(&s->conf,
717 !blk_supports_write_perm(s->conf.blk),
718 true, errp)) {
719 return;
720 }
721
722 /* define device state */
723 s->type = scsiid.scsi_type;
724 trace_scsi_generic_realize_type(s->type);
725
726 switch (s->type) {
727 case TYPE_TAPE:
728 s->blocksize = get_stream_blocksize(s->conf.blk);
729 if (s->blocksize == -1) {
730 s->blocksize = 0;
731 }
732 break;
733
734 /* Make a guess for block devices, we'll fix it when the guest sends.
735 * READ CAPACITY. If they don't, they likely would assume these sizes
736 * anyway. (TODO: they could also send MODE SENSE).
737 */
738 case TYPE_ROM:
739 case TYPE_WORM:
740 s->blocksize = 2048;
741 break;
742 default:
743 s->blocksize = 512;
744 break;
745 }
746
747 trace_scsi_generic_realize_blocksize(s->blocksize);
748
749 /* Only used by scsi-block, but initialize it nevertheless to be clean. */
750 s->default_scsi_version = -1;
751 s->io_timeout = DEFAULT_IO_TIMEOUT;
752 scsi_generic_read_device_inquiry(s);
753 }
754
755 const SCSIReqOps scsi_generic_req_ops = {
756 .size = sizeof(SCSIGenericReq),
757 .free_req = scsi_free_request,
758 .send_command = scsi_send_command,
759 .read_data = scsi_read_data,
760 .write_data = scsi_write_data,
761 .get_buf = scsi_get_buf,
762 .load_request = scsi_generic_load_request,
763 .save_request = scsi_generic_save_request,
764 };
765
766 static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
767 uint8_t *buf, void *hba_private)
768 {
769 return scsi_req_alloc(&scsi_generic_req_ops, d, tag, lun, hba_private);
770 }
771
772 static Property scsi_generic_properties[] = {
773 DEFINE_PROP_DRIVE("drive", SCSIDevice, conf.blk),
774 DEFINE_PROP_BOOL("share-rw", SCSIDevice, conf.share_rw, false),
775 DEFINE_PROP_UINT32("io_timeout", SCSIDevice, io_timeout,
776 DEFAULT_IO_TIMEOUT),
777 DEFINE_PROP_END_OF_LIST(),
778 };
779
780 static int scsi_generic_parse_cdb(SCSIDevice *dev, SCSICommand *cmd,
781 uint8_t *buf, void *hba_private)
782 {
783 return scsi_bus_parse_cdb(dev, cmd, buf, hba_private);
784 }
785
786 static void scsi_generic_class_initfn(ObjectClass *klass, void *data)
787 {
788 DeviceClass *dc = DEVICE_CLASS(klass);
789 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
790
791 sc->realize = scsi_generic_realize;
792 sc->alloc_req = scsi_new_request;
793 sc->parse_cdb = scsi_generic_parse_cdb;
794 dc->fw_name = "disk";
795 dc->desc = "pass through generic scsi device (/dev/sg*)";
796 dc->reset = scsi_generic_reset;
797 device_class_set_props(dc, scsi_generic_properties);
798 dc->vmsd = &vmstate_scsi_device;
799 }
800
801 static const TypeInfo scsi_generic_info = {
802 .name = "scsi-generic",
803 .parent = TYPE_SCSI_DEVICE,
804 .instance_size = sizeof(SCSIDevice),
805 .class_init = scsi_generic_class_initfn,
806 };
807
808 static void scsi_generic_register_types(void)
809 {
810 type_register_static(&scsi_generic_info);
811 }
812
813 type_init(scsi_generic_register_types)
814
815 #endif /* __linux__ */