Lines Matching +full:lock +full:- +full:pr

9  *  2009-Dec-12 Artyom Tarasenko : implemented stamdard inquiry for the case
12 * 2009-Oct-13 Artyom Tarasenko : implemented the block descriptor in the
25 #include "qemu/error-report.h"
26 #include "qemu/main-loop.h"
28 #include "qemu/hw-version.h"
31 #include "migration/qemu-file-types.h"
36 #include "system/block-backend.h"
39 #include "hw/qdev-properties.h"
40 #include "hw/qdev-properties-system.h"
58 #define DEFAULT_MAX_IO_SIZE INT_MAX /* 2 GB - 1 block */
60 #define TYPE_SCSI_DISK_BASE "scsi-disk-base"
72 * errors, the function passes ret == -ENODEV and sets the host_status field
117 * 0x0000 - rotation rate not reported
118 * 0x0001 - non-rotating medium (SSD)
119 * 0x0002-0x0400 - reserved
120 * 0x0401-0xffe - rotations per minute
121 * 0xffff - reserved
131 qemu_vfree(r->iov.iov_base); in scsi_free_request()
137 trace_scsi_disk_check_condition(r->req.tag, sense.key, sense.asc, in scsi_check_condition()
139 scsi_req_build_sense(&r->req, sense); in scsi_check_condition()
140 scsi_req_complete(&r->req, CHECK_CONDITION); in scsi_check_condition()
145 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_init_iovec()
147 if (!r->iov.iov_base) { in scsi_init_iovec()
148 r->buflen = size; in scsi_init_iovec()
149 r->iov.iov_base = blk_blockalign(s->qdev.conf.blk, r->buflen); in scsi_init_iovec()
151 r->iov.iov_len = MIN(r->sector_count * BDRV_SECTOR_SIZE, r->buflen); in scsi_init_iovec()
152 qemu_iovec_init_external(&r->qiov, &r->iov, 1); in scsi_init_iovec()
159 qemu_put_be64s(f, &r->sector); in scsi_disk_save_request()
160 qemu_put_be32s(f, &r->sector_count); in scsi_disk_save_request()
161 qemu_put_be32s(f, &r->buflen); in scsi_disk_save_request()
162 if (r->buflen) { in scsi_disk_save_request()
163 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) { in scsi_disk_save_request()
164 qemu_put_buffer(f, r->iov.iov_base, r->iov.iov_len); in scsi_disk_save_request()
165 } else if (!req->retry) { in scsi_disk_save_request()
166 uint32_t len = r->iov.iov_len; in scsi_disk_save_request()
168 qemu_put_buffer(f, r->iov.iov_base, r->iov.iov_len); in scsi_disk_save_request()
175 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_save_request()
177 if (s->migrate_emulated_scsi_request) { in scsi_disk_emulate_save_request()
186 qemu_get_be64s(f, &r->sector); in scsi_disk_load_request()
187 qemu_get_be32s(f, &r->sector_count); in scsi_disk_load_request()
188 qemu_get_be32s(f, &r->buflen); in scsi_disk_load_request()
189 if (r->buflen) { in scsi_disk_load_request()
190 scsi_init_iovec(r, r->buflen); in scsi_disk_load_request()
191 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) { in scsi_disk_load_request()
192 qemu_get_buffer(f, r->iov.iov_base, r->iov.iov_len); in scsi_disk_load_request()
193 } else if (!r->req.retry) { in scsi_disk_load_request()
196 r->iov.iov_len = len; in scsi_disk_load_request()
197 assert(r->iov.iov_len <= r->buflen); in scsi_disk_load_request()
198 qemu_get_buffer(f, r->iov.iov_base, r->iov.iov_len); in scsi_disk_load_request()
202 qemu_iovec_init_external(&r->qiov, &r->iov, 1); in scsi_disk_load_request()
207 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_load_request()
209 if (s->migrate_emulated_scsi_request) { in scsi_disk_emulate_load_request()
223 bool is_read = (r->req.cmd.mode == SCSI_XFER_FROM_DEV); in scsi_handle_rw_error()
224 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_handle_rw_error()
236 * -ENODEV as the return value. in scsi_handle_rw_error()
241 host_status = r->req.host_status; in scsi_handle_rw_error()
242 if (host_status != -1) { in scsi_handle_rw_error()
243 assert(ret == -ENODEV); in scsi_handle_rw_error()
244 r->req.host_status = -1; in scsi_handle_rw_error()
248 status = scsi_sense_from_errno(-ret, &sense); in scsi_handle_rw_error()
249 error = -ret; in scsi_handle_rw_error()
256 error = scsi_sense_buf_to_errno(r->req.sense, sizeof(r->req.sense)); in scsi_handle_rw_error()
269 * Treating a reservation conflict as a guest-side error is obvious in scsi_handle_rw_error()
270 * when a pr-manager is in use. Without one, the situation is less in scsi_handle_rw_error()
287 * rather follow the rerror=/werror= settings. Guest-handled errors in scsi_handle_rw_error()
292 scsi_sense_buf_is_guest_recoverable(r->req.sense, in scsi_handle_rw_error()
293 sizeof(r->req.sense)))) { in scsi_handle_rw_error()
297 action = blk_get_error_action(s->qdev.conf.blk, is_read, error); in scsi_handle_rw_error()
298 blk_error_action(s->qdev.conf.blk, action, is_read, error); in scsi_handle_rw_error()
304 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct); in scsi_handle_rw_error()
306 if (host_status != -1) { in scsi_handle_rw_error()
307 scsi_req_complete_failed(&r->req, host_status); in scsi_handle_rw_error()
311 sdc->update_sense(&r->req); in scsi_handle_rw_error()
313 scsi_req_build_sense(&r->req, sense); in scsi_handle_rw_error()
315 scsi_req_complete(&r->req, status); in scsi_handle_rw_error()
322 scsi_req_retry(&r->req); in scsi_handle_rw_error()
332 if (r->req.io_canceled) { in scsi_disk_req_check_error()
333 scsi_req_cancel_complete(&r->req); in scsi_disk_req_check_error()
347 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_aio_complete()
350 assert(r->req.ctx == qemu_get_current_aio_context()); in scsi_aio_complete()
352 assert(r->req.aiocb != NULL); in scsi_aio_complete()
353 r->req.aiocb = NULL; in scsi_aio_complete()
359 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct); in scsi_aio_complete()
360 scsi_req_complete(&r->req, GOOD); in scsi_aio_complete()
363 scsi_req_unref(&r->req); in scsi_aio_complete()
368 switch (cmd->buf[0]) { in scsi_is_cmd_fua()
375 return (cmd->buf[1] & 8) != 0; in scsi_is_cmd_fua()
394 assert(r->req.aiocb == NULL); in scsi_dma_complete_noio()
399 r->sector += r->sector_count; in scsi_dma_complete_noio()
400 r->sector_count = 0; in scsi_dma_complete_noio()
401 scsi_req_complete(&r->req, GOOD); in scsi_dma_complete_noio()
404 scsi_req_unref(&r->req); in scsi_dma_complete_noio()
410 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_dma_complete()
412 assert(r->req.aiocb != NULL); in scsi_dma_complete()
413 r->req.aiocb = NULL; in scsi_dma_complete()
417 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct); in scsi_dma_complete()
419 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct); in scsi_dma_complete()
429 assert(r->req.ctx == qemu_get_current_aio_context()); in scsi_read_complete_noio()
431 assert(r->req.aiocb == NULL); in scsi_read_complete_noio()
436 n = r->qiov.size / BDRV_SECTOR_SIZE; in scsi_read_complete_noio()
437 r->sector += n; in scsi_read_complete_noio()
438 r->sector_count -= n; in scsi_read_complete_noio()
439 scsi_req_data(&r->req, r->qiov.size); in scsi_read_complete_noio()
442 scsi_req_unref(&r->req); in scsi_read_complete_noio()
448 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_read_complete()
450 assert(r->req.aiocb != NULL); in scsi_read_complete()
451 r->req.aiocb = NULL; in scsi_read_complete()
455 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct); in scsi_read_complete()
457 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct); in scsi_read_complete()
458 trace_scsi_disk_read_complete(r->req.tag, r->qiov.size); in scsi_read_complete()
466 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_do_read()
469 assert (r->req.aiocb == NULL); in scsi_do_read()
475 scsi_req_ref(&r->req); in scsi_do_read()
477 if (r->req.sg) { in scsi_do_read()
478 dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_READ); in scsi_do_read()
479 r->req.residual -= r->req.sg->size; in scsi_do_read()
480 r->req.aiocb = dma_blk_io(r->req.sg, r->sector << BDRV_SECTOR_BITS, in scsi_do_read()
482 sdc->dma_readv, r, scsi_dma_complete, r, in scsi_do_read()
486 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, in scsi_do_read()
487 r->qiov.size, BLOCK_ACCT_READ); in scsi_do_read()
488 r->req.aiocb = sdc->dma_readv(r->sector << BDRV_SECTOR_BITS, &r->qiov, in scsi_do_read()
493 scsi_req_unref(&r->req); in scsi_do_read()
499 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_do_read_cb()
501 assert (r->req.aiocb != NULL); in scsi_do_read_cb()
502 r->req.aiocb = NULL; in scsi_do_read_cb()
505 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct); in scsi_do_read_cb()
507 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct); in scsi_do_read_cb()
516 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_read_data()
519 trace_scsi_disk_read_data_count(r->sector_count); in scsi_read_data()
520 if (r->sector_count == 0) { in scsi_read_data()
522 scsi_req_complete(&r->req, GOOD); in scsi_read_data()
527 assert(r->req.aiocb == NULL); in scsi_read_data()
530 scsi_req_ref(&r->req); in scsi_read_data()
531 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) { in scsi_read_data()
533 scsi_read_complete_noio(r, -EINVAL); in scsi_read_data()
537 if (!blk_is_available(req->dev->conf.blk)) { in scsi_read_data()
538 scsi_read_complete_noio(r, -ENOMEDIUM); in scsi_read_data()
542 first = !r->started; in scsi_read_data()
543 r->started = true; in scsi_read_data()
544 if (first && r->need_fua) { in scsi_read_data()
545 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0, in scsi_read_data()
547 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_do_read_cb, r); in scsi_read_data()
558 assert(r->req.ctx == qemu_get_current_aio_context()); in scsi_write_complete_noio()
560 assert (r->req.aiocb == NULL); in scsi_write_complete_noio()
565 n = r->qiov.size / BDRV_SECTOR_SIZE; in scsi_write_complete_noio()
566 r->sector += n; in scsi_write_complete_noio()
567 r->sector_count -= n; in scsi_write_complete_noio()
568 if (r->sector_count == 0) { in scsi_write_complete_noio()
569 scsi_req_complete(&r->req, GOOD); in scsi_write_complete_noio()
572 trace_scsi_disk_write_complete_noio(r->req.tag, r->qiov.size); in scsi_write_complete_noio()
573 scsi_req_data(&r->req, r->qiov.size); in scsi_write_complete_noio()
577 scsi_req_unref(&r->req); in scsi_write_complete_noio()
583 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_write_complete()
585 assert (r->req.aiocb != NULL); in scsi_write_complete()
586 r->req.aiocb = NULL; in scsi_write_complete()
590 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct); in scsi_write_complete()
592 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct); in scsi_write_complete()
600 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_write_data()
605 assert(r->req.aiocb == NULL); in scsi_write_data()
608 scsi_req_ref(&r->req); in scsi_write_data()
609 if (r->req.cmd.mode != SCSI_XFER_TO_DEV) { in scsi_write_data()
611 scsi_write_complete_noio(r, -EINVAL); in scsi_write_data()
615 if (!r->req.sg && !r->qiov.size) { in scsi_write_data()
617 r->started = true; in scsi_write_data()
621 if (!blk_is_available(req->dev->conf.blk)) { in scsi_write_data()
622 scsi_write_complete_noio(r, -ENOMEDIUM); in scsi_write_data()
626 if (r->req.cmd.buf[0] == VERIFY_10 || r->req.cmd.buf[0] == VERIFY_12 || in scsi_write_data()
627 r->req.cmd.buf[0] == VERIFY_16) { in scsi_write_data()
628 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0, in scsi_write_data()
630 cb = r->req.sg ? scsi_dma_complete : scsi_write_complete; in scsi_write_data()
631 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, cb, r); in scsi_write_data()
635 if (r->req.sg) { in scsi_write_data()
636 dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_WRITE); in scsi_write_data()
637 r->req.residual -= r->req.sg->size; in scsi_write_data()
638 r->req.aiocb = dma_blk_io(r->req.sg, r->sector << BDRV_SECTOR_BITS, in scsi_write_data()
640 sdc->dma_writev, r, scsi_dma_complete, r, in scsi_write_data()
643 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, in scsi_write_data()
644 r->qiov.size, BLOCK_ACCT_WRITE); in scsi_write_data()
645 r->req.aiocb = sdc->dma_writev(r->sector << BDRV_SECTOR_BITS, &r->qiov, in scsi_write_data()
655 return (uint8_t *)r->iov.iov_base; in scsi_get_buf()
660 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_vpd_page()
661 uint8_t page_code = req->cmd.buf[2]; in scsi_disk_emulate_vpd_page()
664 outbuf[buflen++] = s->qdev.type & 0x1f; in scsi_disk_emulate_vpd_page()
673 trace_scsi_disk_emulate_vpd_page_00(req->cmd.xfer); in scsi_disk_emulate_vpd_page()
675 if (s->serial) { in scsi_disk_emulate_vpd_page()
679 if (s->qdev.type == TYPE_DISK) { in scsi_disk_emulate_vpd_page()
690 if (!s->serial) { in scsi_disk_emulate_vpd_page()
692 return -1; in scsi_disk_emulate_vpd_page()
695 l = strlen(s->serial); in scsi_disk_emulate_vpd_page()
700 trace_scsi_disk_emulate_vpd_page_80(req->cmd.xfer); in scsi_disk_emulate_vpd_page()
701 memcpy(outbuf + buflen, s->serial, l); in scsi_disk_emulate_vpd_page()
708 int id_len = s->device_id ? MIN(strlen(s->device_id), 255 - 8) : 0; in scsi_disk_emulate_vpd_page()
710 trace_scsi_disk_emulate_vpd_page_83(req->cmd.xfer); in scsi_disk_emulate_vpd_page()
717 memcpy(outbuf + buflen, s->device_id, id_len); in scsi_disk_emulate_vpd_page()
721 if (s->qdev.wwn) { in scsi_disk_emulate_vpd_page()
726 stq_be_p(&outbuf[buflen], s->qdev.wwn); in scsi_disk_emulate_vpd_page()
730 if (s->qdev.port_wwn) { in scsi_disk_emulate_vpd_page()
735 stq_be_p(&outbuf[buflen], s->qdev.port_wwn); in scsi_disk_emulate_vpd_page()
739 if (s->port_index) { in scsi_disk_emulate_vpd_page()
747 stw_be_p(&outbuf[buflen + 2], s->port_index); in scsi_disk_emulate_vpd_page()
756 if (s->qdev.type == TYPE_ROM) { in scsi_disk_emulate_vpd_page()
758 return -1; in scsi_disk_emulate_vpd_page()
762 s->qdev.conf.discard_granularity / s->qdev.blocksize; in scsi_disk_emulate_vpd_page()
764 s->qdev.conf.min_io_size / s->qdev.blocksize; in scsi_disk_emulate_vpd_page()
766 s->qdev.conf.opt_io_size / s->qdev.blocksize; in scsi_disk_emulate_vpd_page()
768 s->max_unmap_size / s->qdev.blocksize; in scsi_disk_emulate_vpd_page()
770 s->max_io_size / s->qdev.blocksize; in scsi_disk_emulate_vpd_page()
771 /* 255 descriptors fit in 4 KiB with an 8-byte header */ in scsi_disk_emulate_vpd_page()
774 if (s->qdev.type == TYPE_DISK) { in scsi_disk_emulate_vpd_page()
775 int max_transfer_blk = blk_get_max_transfer(s->qdev.conf.blk); in scsi_disk_emulate_vpd_page()
777 max_transfer_blk / s->qdev.blocksize; in scsi_disk_emulate_vpd_page()
788 outbuf[4] = (s->rotation_rate >> 8) & 0xff; in scsi_disk_emulate_vpd_page()
789 outbuf[5] = s->rotation_rate & 0xff; in scsi_disk_emulate_vpd_page()
800 outbuf[6] = s->qdev.conf.discard_granularity ? 2 : 1; in scsi_disk_emulate_vpd_page()
805 return -1; in scsi_disk_emulate_vpd_page()
808 assert(buflen - start <= 255); in scsi_disk_emulate_vpd_page()
809 outbuf[start - 1] = buflen - start; in scsi_disk_emulate_vpd_page()
815 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_inquiry()
818 if (req->cmd.buf[1] & 0x1) { in scsi_disk_emulate_inquiry()
824 if (req->cmd.buf[2] != 0) { in scsi_disk_emulate_inquiry()
825 return -1; in scsi_disk_emulate_inquiry()
829 buflen = req->cmd.xfer; in scsi_disk_emulate_inquiry()
834 outbuf[0] = s->qdev.type & 0x1f; in scsi_disk_emulate_inquiry()
835 outbuf[1] = (s->features & (1 << SCSI_DISK_F_REMOVABLE)) ? 0x80 : 0; in scsi_disk_emulate_inquiry()
837 strpadcpy((char *) &outbuf[16], 16, s->product, ' '); in scsi_disk_emulate_inquiry()
838 strpadcpy((char *) &outbuf[8], 8, s->vendor, ' '); in scsi_disk_emulate_inquiry()
841 memcpy(&outbuf[32], s->version, MIN(4, strlen(s->version))); in scsi_disk_emulate_inquiry()
843 * We claim conformance to SPC-3, which is required for guests in scsi_disk_emulate_inquiry()
845 * block characteristics VPD page by default. Not all of SPC-3 in scsi_disk_emulate_inquiry()
848 outbuf[2] = s->qdev.default_scsi_version; in scsi_disk_emulate_inquiry()
852 outbuf[4] = buflen - 5; /* Additional Length = (Len - 1) - 4 */ in scsi_disk_emulate_inquiry()
856 outbuf[4] = 36 - 5; in scsi_disk_emulate_inquiry()
860 outbuf[7] = 0x10 | (req->bus->info->tcq ? 0x02 : 0); in scsi_disk_emulate_inquiry()
867 if (s->qdev.type != TYPE_ROM) { in media_is_dvd()
870 if (!blk_is_available(s->qdev.conf.blk)) { in media_is_dvd()
873 blk_get_geometry(s->qdev.conf.blk, &nb_sectors); in media_is_dvd()
880 if (s->qdev.type != TYPE_ROM) { in media_is_cd()
883 if (!blk_is_available(s->qdev.conf.blk)) { in media_is_cd()
886 blk_get_geometry(s->qdev.conf.blk, &nb_sectors); in media_is_cd()
893 uint8_t type = r->req.cmd.buf[1] & 7; in scsi_read_disc_information()
895 if (s->qdev.type != TYPE_ROM) { in scsi_read_disc_information()
896 return -1; in scsi_read_disc_information()
899 /* Types 1/2 are only defined for Blu-Ray. */ in scsi_read_disc_information()
902 return -1; in scsi_read_disc_information()
913 outbuf[8] = 0x00; /* CD-ROM or DVD-ROM */ in scsi_read_disc_information()
914 /* 9-10-11: most significant byte corresponding bytes 4-5-6 */ in scsi_read_disc_information()
915 /* 12-23: not meaningful for CD-ROM or DVD-ROM */ in scsi_read_disc_information()
916 /* 24-31: disc bar code */ in scsi_read_disc_information()
933 uint8_t media = r->req.cmd.buf[1]; in scsi_read_dvd_structure()
934 uint8_t layer = r->req.cmd.buf[6]; in scsi_read_dvd_structure()
935 uint8_t format = r->req.cmd.buf[7]; in scsi_read_dvd_structure()
936 int size = -1; in scsi_read_dvd_structure()
938 if (s->qdev.type != TYPE_ROM) { in scsi_read_dvd_structure()
939 return -1; in scsi_read_dvd_structure()
943 return -1; in scsi_read_dvd_structure()
947 if (!blk_is_available(s->qdev.conf.blk)) { in scsi_read_dvd_structure()
949 return -1; in scsi_read_dvd_structure()
953 return -1; in scsi_read_dvd_structure()
956 return -1; in scsi_read_dvd_structure()
969 blk_get_geometry(s->qdev.conf.blk, &nb_sectors); in scsi_read_dvd_structure()
971 outbuf[4] = 1; /* DVD-ROM, part version 1 */ in scsi_read_dvd_structure()
973 outbuf[6] = 1; /* one layer, read-only (per MMC-2 spec) */ in scsi_read_dvd_structure()
976 stl_be_p(&outbuf[12], (nb_sectors >> 2) - 1); /* end sector */ in scsi_read_dvd_structure()
977 stl_be_p(&outbuf[16], (nb_sectors >> 2) - 1); /* l0 end sector */ in scsi_read_dvd_structure()
984 case 0x03: /* BCA information - invalid field for no BCA info */ in scsi_read_dvd_structure()
985 return -1; in scsi_read_dvd_structure()
1006 return -1; in scsi_read_dvd_structure()
1010 stw_be_p(outbuf, size - 2); in scsi_read_dvd_structure()
1014 return -1; in scsi_read_dvd_structure()
1022 if (s->tray_open) { in scsi_event_status_media()
1024 } else if (blk_is_inserted(s->qdev.conf.blk)) { in scsi_event_status_media()
1031 if (s->media_event) { in scsi_event_status_media()
1033 s->media_event = false; in scsi_event_status_media()
1034 } else if (s->eject_request) { in scsi_event_status_media()
1036 s->eject_request = false; in scsi_event_status_media()
1053 uint8_t *buf = r->req.cmd.buf; in scsi_get_event_status_notification()
1055 if (s->qdev.type != TYPE_ROM) { in scsi_get_event_status_notification()
1056 return -1; in scsi_get_event_status_notification()
1060 return -1; in scsi_get_event_status_notification()
1072 stw_be_p(outbuf, size - 4); in scsi_get_event_status_notification()
1080 if (s->qdev.type != TYPE_ROM) { in scsi_get_configuration()
1081 return -1; in scsi_get_configuration()
1095 /* outbuf[8] - outbuf[19]: Feature 0 - Profile list */ in scsi_get_configuration()
1102 /* outbuf[20] - outbuf[31]: Feature 1 - Core feature */ in scsi_get_configuration()
1108 /* outbuf[32] - outbuf[39]: Feature 3 - Removable media feature */ in scsi_get_configuration()
1112 outbuf[36] = 0x39; /* tray, load=1, eject=1, unlocked at powerup, lock=1 */ in scsi_get_configuration()
1120 if (s->qdev.type != TYPE_ROM) { in scsi_emulate_mechanism_status()
1121 return -1; in scsi_emulate_mechanism_status()
1124 outbuf[5] = 1; /* CD-ROM */ in scsi_emulate_mechanism_status()
1146 if ((mode_sense_valid[page] & (1 << s->qdev.type)) == 0) { in mode_sense_page()
1147 return -1; in mode_sense_page()
1157 * SCSI specs, because those include a 2-byte header. This is unfortunate, in mode_sense_page()
1160 * 2-byte and 4-byte headers. in mode_sense_page()
1169 p[0] = (s->qdev.conf.cyls >> 16) & 0xff; in mode_sense_page()
1170 p[1] = (s->qdev.conf.cyls >> 8) & 0xff; in mode_sense_page()
1171 p[2] = s->qdev.conf.cyls & 0xff; in mode_sense_page()
1172 p[3] = s->qdev.conf.heads & 0xff; in mode_sense_page()
1174 p[4] = (s->qdev.conf.cyls >> 16) & 0xff; in mode_sense_page()
1175 p[5] = (s->qdev.conf.cyls >> 8) & 0xff; in mode_sense_page()
1176 p[6] = s->qdev.conf.cyls & 0xff; in mode_sense_page()
1178 p[7] = (s->qdev.conf.cyls >> 16) & 0xff; in mode_sense_page()
1179 p[8] = (s->qdev.conf.cyls >> 8) & 0xff; in mode_sense_page()
1180 p[9] = s->qdev.conf.cyls & 0xff; in mode_sense_page()
1202 p[2] = s->qdev.conf.heads & 0xff; in mode_sense_page()
1203 p[3] = s->qdev.conf.secs & 0xff; in mode_sense_page()
1204 p[4] = s->qdev.blocksize >> 8; in mode_sense_page()
1205 p[6] = (s->qdev.conf.cyls >> 8) & 0xff; in mode_sense_page()
1206 p[7] = s->qdev.conf.cyls & 0xff; in mode_sense_page()
1208 p[8] = (s->qdev.conf.cyls >> 8) & 0xff; in mode_sense_page()
1209 p[9] = s->qdev.conf.cyls & 0xff; in mode_sense_page()
1211 p[10] = (s->qdev.conf.cyls >> 8) & 0xff; in mode_sense_page()
1212 p[11] = s->qdev.conf.cyls & 0xff; in mode_sense_page()
1233 blk_enable_write_cache(s->qdev.conf.blk)) { in mode_sense_page()
1241 if (s->qdev.type == TYPE_ROM) { in mode_sense_page()
1248 if (s->qdev.type == TYPE_ROM) { in mode_sense_page()
1263 p[0] = 0x3b; /* CD-R & CD-RW read */ in mode_sense_page()
1270 p[4] = 0x2d | (s->tray_locked ? 2 : 0); in mode_sense_page()
1289 if (s->quirks & (1 << SCSI_DISK_QUIRK_MODE_PAGE_APPLE_VENDOR)) { in mode_sense_page()
1299 return -1; in mode_sense_page()
1303 if (s->qdev.type == TYPE_DISK && (s->quirks & in mode_sense_page()
1315 return -1; in mode_sense_page()
1319 return -1; in mode_sense_page()
1331 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_disk_emulate_mode_sense()
1338 dbd = (r->req.cmd.buf[1] & 0x8) != 0; in scsi_disk_emulate_mode_sense()
1339 page = r->req.cmd.buf[2] & 0x3f; in scsi_disk_emulate_mode_sense()
1340 page_control = (r->req.cmd.buf[2] & 0xc0) >> 6; in scsi_disk_emulate_mode_sense()
1342 trace_scsi_disk_emulate_mode_sense((r->req.cmd.buf[0] == MODE_SENSE) ? 6 : in scsi_disk_emulate_mode_sense()
1343 10, page, r->req.cmd.xfer, page_control); in scsi_disk_emulate_mode_sense()
1344 memset(outbuf, 0, r->req.cmd.xfer); in scsi_disk_emulate_mode_sense()
1347 if (s->qdev.type == TYPE_DISK) { in scsi_disk_emulate_mode_sense()
1348 dev_specific_param = s->features & (1 << SCSI_DISK_F_DPOFUA) ? 0x10 : 0; in scsi_disk_emulate_mode_sense()
1349 if (!blk_is_writable(s->qdev.conf.blk)) { in scsi_disk_emulate_mode_sense()
1353 if (s->quirks & (1 << SCSI_DISK_QUIRK_MODE_SENSE_ROM_USE_DBD)) { in scsi_disk_emulate_mode_sense()
1362 if (s->quirks & (1 << SCSI_DISK_QUIRK_MODE_PAGE_APPLE_VENDOR) && in scsi_disk_emulate_mode_sense()
1369 * and defines no device-specific parameter. in scsi_disk_emulate_mode_sense()
1376 if (r->req.cmd.buf[0] == MODE_SENSE) { in scsi_disk_emulate_mode_sense()
1388 blk_get_geometry(s->qdev.conf.blk, &nb_sectors); in scsi_disk_emulate_mode_sense()
1390 if (r->req.cmd.buf[0] == MODE_SENSE) { in scsi_disk_emulate_mode_sense()
1395 nb_sectors /= (s->qdev.blocksize / BDRV_SECTOR_SIZE); in scsi_disk_emulate_mode_sense()
1404 p[5] = 0; /* bytes 5-7 are the sector size in bytes */ in scsi_disk_emulate_mode_sense()
1405 p[6] = s->qdev.blocksize >> 8; in scsi_disk_emulate_mode_sense()
1413 return -1; in scsi_disk_emulate_mode_sense()
1422 if (ret == -1) { in scsi_disk_emulate_mode_sense()
1423 return -1; in scsi_disk_emulate_mode_sense()
1427 buflen = p - outbuf; in scsi_disk_emulate_mode_sense()
1433 if (r->req.cmd.buf[0] == MODE_SENSE) { in scsi_disk_emulate_mode_sense()
1434 outbuf[0] = buflen - 1; in scsi_disk_emulate_mode_sense()
1436 outbuf[0] = ((buflen - 2) >> 8) & 0xff; in scsi_disk_emulate_mode_sense()
1437 outbuf[1] = (buflen - 2) & 0xff; in scsi_disk_emulate_mode_sense()
1444 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_read_toc()
1448 msf = req->cmd.buf[1] & 2; in scsi_disk_emulate_read_toc()
1449 format = req->cmd.buf[2] & 0xf; in scsi_disk_emulate_read_toc()
1450 start_track = req->cmd.buf[6]; in scsi_disk_emulate_read_toc()
1451 blk_get_geometry(s->qdev.conf.blk, &nb_sectors); in scsi_disk_emulate_read_toc()
1453 nb_sectors /= s->qdev.blocksize / BDRV_SECTOR_SIZE; in scsi_disk_emulate_read_toc()
1470 return -1; in scsi_disk_emulate_read_toc()
1477 SCSIRequest *req = &r->req; in scsi_disk_emulate_start_stop()
1478 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_start_stop()
1479 bool start = req->cmd.buf[4] & 1; in scsi_disk_emulate_start_stop()
1480 bool loej = req->cmd.buf[4] & 2; /* load on start, eject on !start */ in scsi_disk_emulate_start_stop()
1481 int pwrcnd = req->cmd.buf[4] & 0xf0; in scsi_disk_emulate_start_stop()
1488 if ((s->features & (1 << SCSI_DISK_F_REMOVABLE)) && loej) { in scsi_disk_emulate_start_stop()
1489 if (!start && !s->tray_open && s->tray_locked) { in scsi_disk_emulate_start_stop()
1491 blk_is_inserted(s->qdev.conf.blk) in scsi_disk_emulate_start_stop()
1494 return -1; in scsi_disk_emulate_start_stop()
1497 if (s->tray_open != !start) { in scsi_disk_emulate_start_stop()
1498 blk_eject(s->qdev.conf.blk, !start); in scsi_disk_emulate_start_stop()
1499 s->tray_open = !start; in scsi_disk_emulate_start_stop()
1508 int buflen = r->iov.iov_len; in scsi_disk_emulate_read_data()
1512 r->iov.iov_len = 0; in scsi_disk_emulate_read_data()
1513 r->started = true; in scsi_disk_emulate_read_data()
1514 scsi_req_data(&r->req, buflen); in scsi_disk_emulate_read_data()
1519 scsi_req_complete(&r->req, GOOD); in scsi_disk_emulate_read_data()
1535 return -1; in scsi_disk_check_mode_select()
1540 return -1; in scsi_disk_check_mode_select()
1547 return -1; in scsi_disk_check_mode_select()
1559 if (((mode_current[i] ^ inbuf[i - 2]) & ~mode_changeable[i]) != 0) { in scsi_disk_check_mode_select()
1560 return -1; in scsi_disk_check_mode_select()
1570 blk_set_enable_write_cache(s->qdev.conf.blk, (p[0] & 4) != 0); in scsi_disk_apply_mode_select()
1580 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in mode_select_pages()
1594 len -= 4; in mode_select_pages()
1602 len -= 2; in mode_select_pages()
1609 if (!(s->quirks & SCSI_DISK_QUIRK_MODE_PAGE_TRUNCATED)) { in mode_select_pages()
1624 len -= page_len; in mode_select_pages()
1630 return -1; in mode_select_pages()
1634 return -1; in mode_select_pages()
1639 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_disk_emulate_mode_select()
1641 int cmd = r->req.cmd.buf[0]; in scsi_disk_emulate_mode_select()
1642 int len = r->req.cmd.xfer; in scsi_disk_emulate_mode_select()
1647 if ((r->req.cmd.buf[1] & 0x11) != 0x10) { in scsi_disk_emulate_mode_select()
1648 if (!(s->quirks & in scsi_disk_emulate_mode_select()
1660 len -= hdr_len; in scsi_disk_emulate_mode_select()
1674 * Since the existing code only checks/updates bits 8-15 of the block in scsi_disk_emulate_mode_select()
1680 if (bs && !(bs & ~0xfe00) && bs != s->qdev.blocksize) { in scsi_disk_emulate_mode_select()
1681 s->qdev.blocksize = bs; in scsi_disk_emulate_mode_select()
1682 trace_scsi_disk_mode_select_set_blocksize(s->qdev.blocksize); in scsi_disk_emulate_mode_select()
1686 len -= bd_len; in scsi_disk_emulate_mode_select()
1696 if (!blk_enable_write_cache(s->qdev.conf.blk)) { in scsi_disk_emulate_mode_select()
1698 scsi_req_ref(&r->req); in scsi_disk_emulate_mode_select()
1699 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0, in scsi_disk_emulate_mode_select()
1701 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r); in scsi_disk_emulate_mode_select()
1705 scsi_req_complete(&r->req, GOOD); in scsi_disk_emulate_mode_select()
1730 * and a 0-block read to the first LBA beyond the end of device is in check_lba_range()
1734 sector_num + nb_sectors <= s->qdev.max_lba + 1); in check_lba_range()
1747 SCSIDiskReq *r = data->r; in scsi_unmap_complete_noio()
1748 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_unmap_complete_noio()
1750 assert(r->req.aiocb == NULL); in scsi_unmap_complete_noio()
1752 if (data->count > 0) { in scsi_unmap_complete_noio()
1753 uint64_t sector_num = ldq_be_p(&data->inbuf[0]); in scsi_unmap_complete_noio()
1754 uint32_t nb_sectors = ldl_be_p(&data->inbuf[8]) & 0xffffffffULL; in scsi_unmap_complete_noio()
1755 r->sector = sector_num * (s->qdev.blocksize / BDRV_SECTOR_SIZE); in scsi_unmap_complete_noio()
1756 r->sector_count = nb_sectors * (s->qdev.blocksize / BDRV_SECTOR_SIZE); in scsi_unmap_complete_noio()
1759 block_acct_invalid(blk_get_stats(s->qdev.conf.blk), in scsi_unmap_complete_noio()
1765 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, in scsi_unmap_complete_noio()
1766 r->sector_count * BDRV_SECTOR_SIZE, in scsi_unmap_complete_noio()
1769 r->req.aiocb = blk_aio_pdiscard(s->qdev.conf.blk, in scsi_unmap_complete_noio()
1770 r->sector * BDRV_SECTOR_SIZE, in scsi_unmap_complete_noio()
1771 r->sector_count * BDRV_SECTOR_SIZE, in scsi_unmap_complete_noio()
1773 data->count--; in scsi_unmap_complete_noio()
1774 data->inbuf += 16; in scsi_unmap_complete_noio()
1778 scsi_req_complete(&r->req, GOOD); in scsi_unmap_complete_noio()
1781 scsi_req_unref(&r->req); in scsi_unmap_complete_noio()
1788 SCSIDiskReq *r = data->r; in scsi_unmap_complete()
1789 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_unmap_complete()
1791 assert(r->req.aiocb != NULL); in scsi_unmap_complete()
1792 r->req.aiocb = NULL; in scsi_unmap_complete()
1795 scsi_req_unref(&r->req); in scsi_unmap_complete()
1798 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct); in scsi_unmap_complete()
1805 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_disk_emulate_unmap()
1807 int len = r->req.cmd.xfer; in scsi_disk_emulate_unmap()
1811 if (r->req.cmd.buf[1] & 0x1) { in scsi_disk_emulate_unmap()
1828 if (!blk_is_writable(s->qdev.conf.blk)) { in scsi_disk_emulate_unmap()
1829 block_acct_invalid(blk_get_stats(s->qdev.conf.blk), BLOCK_ACCT_UNMAP); in scsi_disk_emulate_unmap()
1835 data->r = r; in scsi_disk_emulate_unmap()
1836 data->inbuf = &p[8]; in scsi_disk_emulate_unmap()
1837 data->count = lduw_be_p(&p[2]) >> 4; in scsi_disk_emulate_unmap()
1840 scsi_req_ref(&r->req); in scsi_disk_emulate_unmap()
1845 block_acct_invalid(blk_get_stats(s->qdev.conf.blk), BLOCK_ACCT_UNMAP); in scsi_disk_emulate_unmap()
1850 block_acct_invalid(blk_get_stats(s->qdev.conf.blk), BLOCK_ACCT_UNMAP); in scsi_disk_emulate_unmap()
1865 SCSIDiskReq *r = data->r; in scsi_write_same_complete()
1866 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_write_same_complete()
1868 assert(r->req.aiocb != NULL); in scsi_write_same_complete()
1869 r->req.aiocb = NULL; in scsi_write_same_complete()
1875 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct); in scsi_write_same_complete()
1877 data->nb_sectors -= data->iov.iov_len / BDRV_SECTOR_SIZE; in scsi_write_same_complete()
1878 data->sector += data->iov.iov_len / BDRV_SECTOR_SIZE; in scsi_write_same_complete()
1879 data->iov.iov_len = MIN(data->nb_sectors * BDRV_SECTOR_SIZE, in scsi_write_same_complete()
1880 data->iov.iov_len); in scsi_write_same_complete()
1881 if (data->iov.iov_len) { in scsi_write_same_complete()
1882 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, in scsi_write_same_complete()
1883 data->iov.iov_len, BLOCK_ACCT_WRITE); in scsi_write_same_complete()
1886 qemu_iovec_init_external(&data->qiov, &data->iov, 1); in scsi_write_same_complete()
1887 r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk, in scsi_write_same_complete()
1888 data->sector << BDRV_SECTOR_BITS, in scsi_write_same_complete()
1889 &data->qiov, 0, in scsi_write_same_complete()
1894 scsi_req_complete(&r->req, GOOD); in scsi_write_same_complete()
1897 scsi_req_unref(&r->req); in scsi_write_same_complete()
1898 qemu_vfree(data->iov.iov_base); in scsi_write_same_complete()
1904 SCSIRequest *req = &r->req; in scsi_disk_emulate_write_same()
1905 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_write_same()
1906 uint32_t nb_sectors = scsi_data_cdb_xfer(r->req.cmd.buf); in scsi_disk_emulate_write_same()
1912 if (nb_sectors == 0 || (req->cmd.buf[1] & 0x16)) { in scsi_disk_emulate_write_same()
1917 if (!blk_is_writable(s->qdev.conf.blk)) { in scsi_disk_emulate_write_same()
1921 if (!check_lba_range(s, r->req.cmd.lba, nb_sectors)) { in scsi_disk_emulate_write_same()
1926 if ((req->cmd.buf[1] & 0x1) || buffer_is_zero(inbuf, s->qdev.blocksize)) { in scsi_disk_emulate_write_same()
1927 int flags = (req->cmd.buf[1] & 0x8) ? BDRV_REQ_MAY_UNMAP : 0; in scsi_disk_emulate_write_same()
1930 scsi_req_ref(&r->req); in scsi_disk_emulate_write_same()
1931 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, in scsi_disk_emulate_write_same()
1932 nb_sectors * s->qdev.blocksize, in scsi_disk_emulate_write_same()
1934 r->req.aiocb = blk_aio_pwrite_zeroes(s->qdev.conf.blk, in scsi_disk_emulate_write_same()
1935 r->req.cmd.lba * s->qdev.blocksize, in scsi_disk_emulate_write_same()
1936 nb_sectors * s->qdev.blocksize, in scsi_disk_emulate_write_same()
1942 data->r = r; in scsi_disk_emulate_write_same()
1943 data->sector = r->req.cmd.lba * (s->qdev.blocksize / BDRV_SECTOR_SIZE); in scsi_disk_emulate_write_same()
1944 data->nb_sectors = nb_sectors * (s->qdev.blocksize / BDRV_SECTOR_SIZE); in scsi_disk_emulate_write_same()
1945 data->iov.iov_len = MIN(data->nb_sectors * BDRV_SECTOR_SIZE, in scsi_disk_emulate_write_same()
1947 data->iov.iov_base = buf = blk_blockalign(s->qdev.conf.blk, in scsi_disk_emulate_write_same()
1948 data->iov.iov_len); in scsi_disk_emulate_write_same()
1949 qemu_iovec_init_external(&data->qiov, &data->iov, 1); in scsi_disk_emulate_write_same()
1951 for (i = 0; i < data->iov.iov_len; i += l) { in scsi_disk_emulate_write_same()
1952 l = MIN(s->qdev.blocksize, data->iov.iov_len - i); in scsi_disk_emulate_write_same()
1956 scsi_req_ref(&r->req); in scsi_disk_emulate_write_same()
1957 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, in scsi_disk_emulate_write_same()
1958 data->iov.iov_len, BLOCK_ACCT_WRITE); in scsi_disk_emulate_write_same()
1959 r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk, in scsi_disk_emulate_write_same()
1960 data->sector << BDRV_SECTOR_BITS, in scsi_disk_emulate_write_same()
1961 &data->qiov, 0, in scsi_disk_emulate_write_same()
1969 if (r->iov.iov_len) { in scsi_disk_emulate_write_data()
1970 int buflen = r->iov.iov_len; in scsi_disk_emulate_write_data()
1972 r->iov.iov_len = 0; in scsi_disk_emulate_write_data()
1973 scsi_req_data(&r->req, buflen); in scsi_disk_emulate_write_data()
1977 switch (req->cmd.buf[0]) { in scsi_disk_emulate_write_data()
1981 scsi_disk_emulate_mode_select(r, r->iov.iov_base); in scsi_disk_emulate_write_data()
1985 scsi_disk_emulate_unmap(r, r->iov.iov_base); in scsi_disk_emulate_write_data()
1991 if (r->req.status == -1) { in scsi_disk_emulate_write_data()
1998 scsi_disk_emulate_write_same(r, r->iov.iov_base); in scsi_disk_emulate_write_data()
2002 scsi_req_complete(&r->req, GOOD); in scsi_disk_emulate_write_data()
2013 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_emulate_command()
2018 switch (req->cmd.buf[0]) { in scsi_disk_emulate_command()
2035 if (!blk_is_available(s->qdev.conf.blk)) { in scsi_disk_emulate_command()
2044 * requires the buffer to be as big as req->cmd.xfer in several in scsi_disk_emulate_command()
2050 if (req->cmd.xfer > 65536) { in scsi_disk_emulate_command()
2053 r->buflen = MAX(4096, req->cmd.xfer); in scsi_disk_emulate_command()
2055 if (!r->iov.iov_base) { in scsi_disk_emulate_command()
2056 r->iov.iov_base = blk_blockalign(s->qdev.conf.blk, r->buflen); in scsi_disk_emulate_command()
2059 outbuf = r->iov.iov_base; in scsi_disk_emulate_command()
2060 memset(outbuf, 0, r->buflen); in scsi_disk_emulate_command()
2061 switch (req->cmd.buf[0]) { in scsi_disk_emulate_command()
2063 assert(blk_is_available(s->qdev.conf.blk)); in scsi_disk_emulate_command()
2085 if (req->cmd.buf[1] & 1) { in scsi_disk_emulate_command()
2090 if (req->cmd.buf[1] & 3) { in scsi_disk_emulate_command()
2095 if (req->cmd.buf[1] & 1) { in scsi_disk_emulate_command()
2100 if (req->cmd.buf[1] & 3) { in scsi_disk_emulate_command()
2110 s->tray_locked = req->cmd.buf[4] & 1; in scsi_disk_emulate_command()
2111 blk_lock_medium(s->qdev.conf.blk, req->cmd.buf[4] & 1); in scsi_disk_emulate_command()
2116 blk_get_geometry(s->qdev.conf.blk, &nb_sectors); in scsi_disk_emulate_command()
2121 if ((req->cmd.buf[8] & 1) == 0 && req->cmd.lba) { in scsi_disk_emulate_command()
2124 nb_sectors /= s->qdev.blocksize / BDRV_SECTOR_SIZE; in scsi_disk_emulate_command()
2126 nb_sectors--; in scsi_disk_emulate_command()
2128 s->qdev.max_lba = nb_sectors; in scsi_disk_emulate_command()
2139 outbuf[6] = s->qdev.blocksize >> 8; in scsi_disk_emulate_command()
2144 buflen = scsi_convert_sense(NULL, 0, outbuf, r->buflen, in scsi_disk_emulate_command()
2145 (req->cmd.buf[1] & 1) == 0); in scsi_disk_emulate_command()
2182 if ((req->cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) { in scsi_disk_emulate_command()
2184 memset(outbuf, 0, req->cmd.xfer); in scsi_disk_emulate_command()
2185 blk_get_geometry(s->qdev.conf.blk, &nb_sectors); in scsi_disk_emulate_command()
2190 if ((req->cmd.buf[14] & 1) == 0 && req->cmd.lba) { in scsi_disk_emulate_command()
2193 nb_sectors /= s->qdev.blocksize / BDRV_SECTOR_SIZE; in scsi_disk_emulate_command()
2195 nb_sectors--; in scsi_disk_emulate_command()
2197 s->qdev.max_lba = nb_sectors; in scsi_disk_emulate_command()
2208 outbuf[10] = s->qdev.blocksize >> 8; in scsi_disk_emulate_command()
2211 outbuf[13] = get_physical_block_exp(&s->qdev.conf); in scsi_disk_emulate_command()
2214 if (s->qdev.conf.discard_granularity) { in scsi_disk_emulate_command()
2225 scsi_req_ref(&r->req); in scsi_disk_emulate_command()
2226 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0, in scsi_disk_emulate_command()
2228 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r); in scsi_disk_emulate_command()
2231 trace_scsi_disk_emulate_command_SEEK_10(r->req.cmd.lba); in scsi_disk_emulate_command()
2232 if (r->req.cmd.lba > s->qdev.max_lba) { in scsi_disk_emulate_command()
2237 trace_scsi_disk_emulate_command_MODE_SELECT(r->req.cmd.xfer); in scsi_disk_emulate_command()
2240 trace_scsi_disk_emulate_command_MODE_SELECT_10(r->req.cmd.xfer); in scsi_disk_emulate_command()
2243 trace_scsi_disk_emulate_command_UNMAP(r->req.cmd.xfer); in scsi_disk_emulate_command()
2248 trace_scsi_disk_emulate_command_VERIFY((req->cmd.buf[1] >> 1) & 3); in scsi_disk_emulate_command()
2249 if (req->cmd.buf[1] & 6) { in scsi_disk_emulate_command()
2256 req->cmd.buf[0] == WRITE_SAME_10 ? 10 : 16, r->req.cmd.xfer); in scsi_disk_emulate_command()
2259 trace_scsi_disk_emulate_command_FORMAT_UNIT(r->req.cmd.xfer); in scsi_disk_emulate_command()
2267 assert(!r->req.aiocb); in scsi_disk_emulate_command()
2268 r->iov.iov_len = MIN(r->buflen, req->cmd.xfer); in scsi_disk_emulate_command()
2269 if (r->iov.iov_len == 0) { in scsi_disk_emulate_command()
2270 scsi_req_complete(&r->req, GOOD); in scsi_disk_emulate_command()
2272 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) { in scsi_disk_emulate_command()
2273 assert(r->iov.iov_len == req->cmd.xfer); in scsi_disk_emulate_command()
2274 return -r->iov.iov_len; in scsi_disk_emulate_command()
2276 return r->iov.iov_len; in scsi_disk_emulate_command()
2280 if (r->req.status == -1) { in scsi_disk_emulate_command()
2298 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_disk_dma_command()
2305 if (!blk_is_available(s->qdev.conf.blk)) { in scsi_disk_dma_command()
2310 len = scsi_data_cdb_xfer(r->req.cmd.buf); in scsi_disk_dma_command()
2316 trace_scsi_disk_dma_command_READ(r->req.cmd.lba, len); in scsi_disk_dma_command()
2321 if (s->qdev.scsi_version > 2 && (r->req.cmd.buf[1] & 0xe0)) { in scsi_disk_dma_command()
2324 if (!check_lba_range(s, r->req.cmd.lba, len)) { in scsi_disk_dma_command()
2327 r->sector = r->req.cmd.lba * (s->qdev.blocksize / BDRV_SECTOR_SIZE); in scsi_disk_dma_command()
2328 r->sector_count = len * (s->qdev.blocksize / BDRV_SECTOR_SIZE); in scsi_disk_dma_command()
2337 if (!blk_is_writable(s->qdev.conf.blk)) { in scsi_disk_dma_command()
2343 r->req.cmd.lba, len); in scsi_disk_dma_command()
2348 /* We get here only for BYTCHK == 0x01 and only for scsi-block. in scsi_disk_dma_command()
2352 if (s->qdev.scsi_version > 2 && (r->req.cmd.buf[1] & 0xe0)) { in scsi_disk_dma_command()
2355 if (!check_lba_range(s, r->req.cmd.lba, len)) { in scsi_disk_dma_command()
2358 r->sector = r->req.cmd.lba * (s->qdev.blocksize / BDRV_SECTOR_SIZE); in scsi_disk_dma_command()
2359 r->sector_count = len * (s->qdev.blocksize / BDRV_SECTOR_SIZE); in scsi_disk_dma_command()
2370 r->need_fua = sdc->need_fua(&r->req.cmd); in scsi_disk_dma_command()
2371 if (r->sector_count == 0) { in scsi_disk_dma_command()
2372 scsi_req_complete(&r->req, GOOD); in scsi_disk_dma_command()
2374 assert(r->iov.iov_len == 0); in scsi_disk_dma_command()
2375 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) { in scsi_disk_dma_command()
2376 return -r->sector_count * BDRV_SECTOR_SIZE; in scsi_disk_dma_command()
2378 return r->sector_count * BDRV_SECTOR_SIZE; in scsi_disk_dma_command()
2387 scsi_device_purge_requests(&s->qdev, SENSE_CODE(RESET)); in scsi_disk_reset()
2389 blk_get_geometry(s->qdev.conf.blk, &nb_sectors); in scsi_disk_reset()
2391 nb_sectors /= s->qdev.blocksize / BDRV_SECTOR_SIZE; in scsi_disk_reset()
2393 nb_sectors--; in scsi_disk_reset()
2395 s->qdev.max_lba = nb_sectors; in scsi_disk_reset()
2397 s->tray_locked = 0; in scsi_disk_reset()
2398 s->tray_open = 0; in scsi_disk_reset()
2400 s->qdev.scsi_version = s->qdev.default_scsi_version; in scsi_disk_reset()
2407 scsi_device_drained_begin(&s->qdev); in scsi_disk_drained_begin()
2414 scsi_device_drained_end(&s->qdev); in scsi_disk_drained_end()
2422 * direct-access devices. in scsi_disk_resize_cb()
2424 if (s->qdev.type == TYPE_DISK) { in scsi_disk_resize_cb()
2425 scsi_device_report_change(&s->qdev, SENSE_CODE(CAPACITY_CHANGED)); in scsi_disk_resize_cb()
2443 s->media_changed = load; in scsi_cd_change_media_cb()
2444 s->tray_open = !load; in scsi_cd_change_media_cb()
2445 scsi_device_set_ua(&s->qdev, SENSE_CODE(UNIT_ATTENTION_NO_MEDIUM)); in scsi_cd_change_media_cb()
2446 s->media_event = true; in scsi_cd_change_media_cb()
2447 s->eject_request = false; in scsi_cd_change_media_cb()
2454 s->eject_request = true; in scsi_cd_eject_request_cb()
2456 s->tray_locked = false; in scsi_cd_eject_request_cb()
2462 return ((SCSIDiskState *)opaque)->tray_open; in scsi_cd_is_tray_open()
2467 return ((SCSIDiskState *)opaque)->tray_locked; in scsi_cd_is_medium_locked()
2489 if (s->media_changed) { in scsi_disk_unit_attention_reported()
2490 s->media_changed = false; in scsi_disk_unit_attention_reported()
2491 scsi_device_set_ua(&s->qdev, SENSE_CODE(MEDIUM_CHANGED)); in scsi_disk_unit_attention_reported()
2500 if (!s->qdev.conf.blk) { in scsi_realize()
2505 if (!(s->features & (1 << SCSI_DISK_F_REMOVABLE)) && in scsi_realize()
2506 !blk_is_inserted(s->qdev.conf.blk)) { in scsi_realize()
2511 if (!blkconf_blocksizes(&s->qdev.conf, errp)) { in scsi_realize()
2515 if (blk_get_aio_context(s->qdev.conf.blk) != qemu_get_aio_context() && in scsi_realize()
2516 !s->qdev.hba_supports_iothread) in scsi_realize()
2522 if (dev->type == TYPE_DISK) { in scsi_realize()
2523 if (!blkconf_geometry(&dev->conf, NULL, 65535, 255, 255, errp)) { in scsi_realize()
2528 read_only = !blk_supports_write_perm(s->qdev.conf.blk); in scsi_realize()
2529 if (dev->type == TYPE_ROM) { in scsi_realize()
2533 if (!blkconf_apply_backend_options(&dev->conf, read_only, in scsi_realize()
2534 dev->type == TYPE_DISK, errp)) { in scsi_realize()
2538 if (s->qdev.conf.discard_granularity == -1) { in scsi_realize()
2539 s->qdev.conf.discard_granularity = in scsi_realize()
2540 MAX(s->qdev.conf.logical_block_size, DEFAULT_DISCARD_GRANULARITY); in scsi_realize()
2543 if (!s->version) { in scsi_realize()
2544 s->version = g_strdup(qemu_hw_version()); in scsi_realize()
2546 if (!s->vendor) { in scsi_realize()
2547 s->vendor = g_strdup("QEMU"); in scsi_realize()
2549 if (s->serial && strlen(s->serial) > MAX_SERIAL_LEN) { in scsi_realize()
2554 if (!s->device_id) { in scsi_realize()
2555 if (s->serial) { in scsi_realize()
2556 if (strlen(s->serial) > MAX_SERIAL_LEN_FOR_DEVID) { in scsi_realize()
2562 s->device_id = g_strdup(s->serial); in scsi_realize()
2564 const char *str = blk_name(s->qdev.conf.blk); in scsi_realize()
2566 s->device_id = g_strdup(str); in scsi_realize()
2571 if (blk_is_sg(s->qdev.conf.blk)) { in scsi_realize()
2576 if ((s->features & (1 << SCSI_DISK_F_REMOVABLE)) && in scsi_realize()
2577 !(s->features & (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS))) { in scsi_realize()
2578 blk_set_dev_ops(s->qdev.conf.blk, &scsi_disk_removable_block_ops, s); in scsi_realize()
2580 blk_set_dev_ops(s->qdev.conf.blk, &scsi_disk_block_ops, s); in scsi_realize()
2583 blk_iostatus_enable(s->qdev.conf.blk); in scsi_realize()
2585 add_boot_device_lchs(&dev->qdev, NULL, in scsi_realize()
2586 dev->conf.lcyls, in scsi_realize()
2587 dev->conf.lheads, in scsi_realize()
2588 dev->conf.lsecs); in scsi_realize()
2593 del_boot_device_lchs(&dev->qdev, NULL); in scsi_unrealize()
2603 if (s->qdev.conf.blk) { in scsi_hd_realize()
2604 if (!blkconf_blocksizes(&s->qdev.conf, errp)) { in scsi_hd_realize()
2608 s->qdev.blocksize = s->qdev.conf.logical_block_size; in scsi_hd_realize()
2609 s->qdev.type = TYPE_DISK; in scsi_hd_realize()
2610 if (!s->product) { in scsi_hd_realize()
2611 s->product = g_strdup("QEMU HARDDISK"); in scsi_hd_realize()
2613 scsi_realize(&s->qdev, errp); in scsi_hd_realize()
2622 if (!dev->conf.blk) { in scsi_cd_realize()
2624 * dev->conf, qdev takes care of detaching on unplug. */ in scsi_cd_realize()
2625 dev->conf.blk = blk_new(qemu_get_aio_context(), 0, BLK_PERM_ALL); in scsi_cd_realize()
2626 ret = blk_attach_dev(dev->conf.blk, &dev->qdev); in scsi_cd_realize()
2630 if (dev->conf.physical_block_size != 0) { in scsi_cd_realize()
2631 blocksize = dev->conf.physical_block_size; in scsi_cd_realize()
2634 s->qdev.blocksize = blocksize; in scsi_cd_realize()
2635 s->qdev.type = TYPE_ROM; in scsi_cd_realize()
2636 s->features |= 1 << SCSI_DISK_F_REMOVABLE; in scsi_cd_realize()
2637 if (!s->product) { in scsi_cd_realize()
2638 s->product = g_strdup("QEMU CD-ROM"); in scsi_cd_realize()
2640 scsi_realize(&s->qdev, errp); in scsi_cd_realize()
2714 trace_scsi_disk_new_request(lun, tag, str->str); in scsi_disk_new_request_dump()
2730 req = scsi_req_alloc(ops, &s->qdev, tag, lun, hba_private); in scsi_new_request()
2751 ret = scsi_SG_IO_FROM_DEV(s->qdev.conf.blk, cmd, sizeof(cmd), in get_device_type()
2752 buf, sizeof(buf), s->qdev.io_timeout); in get_device_type()
2754 return -1; in get_device_type()
2756 s->qdev.type = buf[0]; in get_device_type()
2758 s->features |= 1 << SCSI_DISK_F_REMOVABLE; in get_device_type()
2769 if (!s->qdev.conf.blk) { in scsi_block_realize()
2774 if (s->rotation_rate) { in scsi_block_realize()
2775 error_report_once("rotation_rate is specified for scsi-block but is " in scsi_block_realize()
2781 rc = blk_ioctl(s->qdev.conf.blk, SG_GET_VERSION_NUM, &sg_version); in scsi_block_realize()
2783 error_setg_errno(errp, -rc, "cannot get SG_IO version number"); in scsi_block_realize()
2784 if (rc != -EPERM) { in scsi_block_realize()
2805 if (s->qdev.type == TYPE_ROM || s->qdev.type == TYPE_WORM) { in scsi_block_realize()
2806 s->qdev.blocksize = 2048; in scsi_block_realize()
2808 s->qdev.blocksize = 512; in scsi_block_realize()
2811 /* Makes the scsi-block device not removable by using HMP and QMP eject in scsi_block_realize()
2814 s->features |= (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS); in scsi_block_realize()
2816 scsi_realize(&s->qdev, errp); in scsi_block_realize()
2817 scsi_generic_read_device_inquiry(&s->qdev); in scsi_block_realize()
2836 SCSIDiskReq *r = &req->req; in scsi_block_sgio_complete()
2837 sg_io_hdr_t *io_hdr = &req->io_header; in scsi_block_sgio_complete()
2840 if (io_hdr->host_status != SCSI_HOST_OK) { in scsi_block_sgio_complete()
2841 r->req.host_status = io_hdr->host_status; in scsi_block_sgio_complete()
2842 ret = -ENODEV; in scsi_block_sgio_complete()
2843 } else if (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT) { in scsi_block_sgio_complete()
2846 ret = io_hdr->status; in scsi_block_sgio_complete()
2850 req->cb(req->cb_opaque, ret); in scsi_block_sgio_complete()
2858 sg_io_hdr_t *io_header = &req->io_header; in scsi_block_do_sgio()
2859 SCSIDiskReq *r = &req->req; in scsi_block_do_sgio()
2860 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_block_do_sgio()
2869 assert(offset % s->qdev.blocksize == 0); in scsi_block_do_sgio()
2870 assert(iov->size % s->qdev.blocksize == 0); in scsi_block_do_sgio()
2872 io_header->interface_id = 'S'; in scsi_block_do_sgio()
2875 io_header->dxfer_direction = direction; in scsi_block_do_sgio()
2876 io_header->dxfer_len = iov->size; in scsi_block_do_sgio()
2877 io_header->dxferp = (void *)iov->iov; in scsi_block_do_sgio()
2878 io_header->iovec_count = iov->niov; in scsi_block_do_sgio()
2879 assert(io_header->iovec_count == iov->niov); /* no overflow! */ in scsi_block_do_sgio()
2886 io_header->cmdp = req->cdb; in scsi_block_do_sgio()
2887 lba = offset / s->qdev.blocksize; in scsi_block_do_sgio()
2888 nb_logical_blocks = io_header->dxfer_len / s->qdev.blocksize; in scsi_block_do_sgio()
2890 if ((req->cmd >> 5) == 0 && lba <= 0x1ffff) { in scsi_block_do_sgio()
2891 /* 6-byte CDB */ in scsi_block_do_sgio()
2892 stl_be_p(&req->cdb[0], lba | (req->cmd << 24)); in scsi_block_do_sgio()
2893 req->cdb[4] = nb_logical_blocks; in scsi_block_do_sgio()
2894 req->cdb[5] = 0; in scsi_block_do_sgio()
2895 io_header->cmd_len = 6; in scsi_block_do_sgio()
2896 } else if ((req->cmd >> 5) <= 1 && lba <= 0xffffffffULL) { in scsi_block_do_sgio()
2897 /* 10-byte CDB */ in scsi_block_do_sgio()
2898 req->cdb[0] = (req->cmd & 0x1f) | 0x20; in scsi_block_do_sgio()
2899 req->cdb[1] = req->cdb1; in scsi_block_do_sgio()
2900 stl_be_p(&req->cdb[2], lba); in scsi_block_do_sgio()
2901 req->cdb[6] = req->group_number; in scsi_block_do_sgio()
2902 stw_be_p(&req->cdb[7], nb_logical_blocks); in scsi_block_do_sgio()
2903 req->cdb[9] = 0; in scsi_block_do_sgio()
2904 io_header->cmd_len = 10; in scsi_block_do_sgio()
2905 } else if ((req->cmd >> 5) != 4 && lba <= 0xffffffffULL) { in scsi_block_do_sgio()
2906 /* 12-byte CDB */ in scsi_block_do_sgio()
2907 req->cdb[0] = (req->cmd & 0x1f) | 0xA0; in scsi_block_do_sgio()
2908 req->cdb[1] = req->cdb1; in scsi_block_do_sgio()
2909 stl_be_p(&req->cdb[2], lba); in scsi_block_do_sgio()
2910 stl_be_p(&req->cdb[6], nb_logical_blocks); in scsi_block_do_sgio()
2911 req->cdb[10] = req->group_number; in scsi_block_do_sgio()
2912 req->cdb[11] = 0; in scsi_block_do_sgio()
2913 io_header->cmd_len = 12; in scsi_block_do_sgio()
2915 /* 16-byte CDB */ in scsi_block_do_sgio()
2916 req->cdb[0] = (req->cmd & 0x1f) | 0x80; in scsi_block_do_sgio()
2917 req->cdb[1] = req->cdb1; in scsi_block_do_sgio()
2918 stq_be_p(&req->cdb[2], lba); in scsi_block_do_sgio()
2919 stl_be_p(&req->cdb[10], nb_logical_blocks); in scsi_block_do_sgio()
2920 req->cdb[14] = req->group_number; in scsi_block_do_sgio()
2921 req->cdb[15] = 0; in scsi_block_do_sgio()
2922 io_header->cmd_len = 16; in scsi_block_do_sgio()
2925 /* The rest is as in scsi-generic.c. */ in scsi_block_do_sgio()
2926 io_header->mx_sb_len = sizeof(r->req.sense); in scsi_block_do_sgio()
2927 io_header->sbp = r->req.sense; in scsi_block_do_sgio()
2928 io_header->timeout = s->qdev.io_timeout * 1000; in scsi_block_do_sgio()
2929 io_header->usr_ptr = r; in scsi_block_do_sgio()
2930 io_header->flags |= SG_FLAG_DIRECT_IO; in scsi_block_do_sgio()
2931 req->cb = cb; in scsi_block_do_sgio()
2932 req->cb_opaque = opaque; in scsi_block_do_sgio()
2933 trace_scsi_disk_aio_sgio_command(r->req.tag, req->cdb[0], lba, in scsi_block_do_sgio()
2934 nb_logical_blocks, io_header->timeout); in scsi_block_do_sgio()
2935 aiocb = blk_aio_ioctl(s->qdev.conf.blk, SG_IO, io_header, scsi_block_sgio_complete, req); in scsi_block_do_sgio()
2971 /* Check if BYTCHK == 0x01 (data-out buffer contains data in scsi_block_is_passthrough()
2992 * involves writing beyond the maximum LBA or to negative LBA (lead-in). in scsi_block_is_passthrough()
2995 * just make scsi-block operate the same as scsi-generic for them. in scsi_block_is_passthrough()
2997 if (s->qdev.type != TYPE_ROM) { in scsi_block_is_passthrough()
3013 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev); in scsi_block_dma_command()
3015 r->cmd = req->cmd.buf[0]; in scsi_block_dma_command()
3016 switch (r->cmd >> 5) { in scsi_block_dma_command()
3018 /* 6-byte CDB. */ in scsi_block_dma_command()
3019 r->cdb1 = r->group_number = 0; in scsi_block_dma_command()
3022 /* 10-byte CDB. */ in scsi_block_dma_command()
3023 r->cdb1 = req->cmd.buf[1]; in scsi_block_dma_command()
3024 r->group_number = req->cmd.buf[6]; in scsi_block_dma_command()
3027 /* 12-byte CDB. */ in scsi_block_dma_command()
3028 r->cdb1 = req->cmd.buf[1]; in scsi_block_dma_command()
3029 r->group_number = req->cmd.buf[10]; in scsi_block_dma_command()
3032 /* 16-byte CDB. */ in scsi_block_dma_command()
3033 r->cdb1 = req->cmd.buf[1]; in scsi_block_dma_command()
3034 r->group_number = req->cmd.buf[14]; in scsi_block_dma_command()
3044 if (s->qdev.scsi_version > 2 && (req->cmd.buf[1] & 0xe0)) { in scsi_block_dma_command()
3045 scsi_check_condition(&r->req, SENSE_CODE(INVALID_FIELD)); in scsi_block_dma_command()
3070 return scsi_req_alloc(&scsi_generic_req_ops, &s->qdev, tag, lun, in scsi_block_new_request()
3073 return scsi_req_alloc(&scsi_block_dma_reqops, &s->qdev, tag, lun, in scsi_block_new_request()
3085 return scsi_bus_parse_cdb(&s->qdev, cmd, buf, buf_len, hba_private); in scsi_block_parse_cdb()
3087 return scsi_req_parse_cdb(&s->qdev, cmd, buf, buf_len); in scsi_block_parse_cdb()
3095 r->req.sense_len = MIN(br->io_header.sb_len_wr, sizeof(r->req.sense)); in scsi_block_update_sense()
3105 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_dma_readv()
3106 return blk_aio_preadv(s->qdev.conf.blk, offset, iov, 0, cb, cb_opaque); in scsi_dma_readv()
3115 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); in scsi_dma_writev()
3116 int flags = r->need_fua ? BDRV_REQ_FUA : 0; in scsi_dma_writev()
3117 return blk_aio_pwritev(s->qdev.conf.blk, offset, iov, flags, cb, cb_opaque); in scsi_dma_writev()
3122 return g_strdup(SCSI_DISK_BASE(obj)->loadparm); in scsi_property_get_loadparm()
3140 SCSI_DISK_BASE(obj)->loadparm = lp_str; in scsi_property_set_loadparm()
3162 dc->fw_name = "disk"; in scsi_disk_base_class_initfn()
3164 sdc->dma_readv = scsi_dma_readv; in scsi_disk_base_class_initfn()
3165 sdc->dma_writev = scsi_dma_writev; in scsi_disk_base_class_initfn()
3166 sdc->need_fua = scsi_is_cmd_fua; in scsi_disk_base_class_initfn()
3187 …DEFINE_PROP_BOOL("migrate-emulated-scsi-request", SCSIDiskState, migrate_emulated_scsi_request, tr…
3213 .name = "scsi-disk",
3232 sc->realize = scsi_hd_realize; in scsi_hd_class_initfn()
3233 sc->unrealize = scsi_unrealize; in scsi_hd_class_initfn()
3234 sc->alloc_req = scsi_new_request; in scsi_hd_class_initfn()
3235 sc->unit_attention_reported = scsi_disk_unit_attention_reported; in scsi_hd_class_initfn()
3236 dc->desc = "virtual SCSI disk"; in scsi_hd_class_initfn()
3238 dc->vmsd = &vmstate_scsi_disk_state; in scsi_hd_class_initfn()
3244 .name = "scsi-hd",
3274 sc->realize = scsi_cd_realize; in scsi_cd_class_initfn()
3275 sc->alloc_req = scsi_new_request; in scsi_cd_class_initfn()
3276 sc->unit_attention_reported = scsi_disk_unit_attention_reported; in scsi_cd_class_initfn()
3277 dc->desc = "virtual SCSI CD-ROM"; in scsi_cd_class_initfn()
3279 dc->vmsd = &vmstate_scsi_disk_state; in scsi_cd_class_initfn()
3285 .name = "scsi-cd",
3294 DEFINE_PROP_BOOL("share-rw", SCSIDiskState, qdev.conf.share_rw, false),
3301 -1),
3312 sc->realize = scsi_block_realize; in scsi_block_class_initfn()
3313 sc->alloc_req = scsi_block_new_request; in scsi_block_class_initfn()
3314 sc->parse_cdb = scsi_block_parse_cdb; in scsi_block_class_initfn()
3315 sdc->dma_readv = scsi_block_dma_readv; in scsi_block_class_initfn()
3316 sdc->dma_writev = scsi_block_dma_writev; in scsi_block_class_initfn()
3317 sdc->update_sense = scsi_block_update_sense; in scsi_block_class_initfn()
3318 sdc->need_fua = scsi_block_no_fua; in scsi_block_class_initfn()
3319 dc->desc = "SCSI block device passthrough"; in scsi_block_class_initfn()
3321 dc->vmsd = &vmstate_scsi_disk_state; in scsi_block_class_initfn()
3325 .name = "scsi-block",