summaryrefslogtreecommitdiffstats
path: root/sys/cam/ctl/ctl_backend_ramdisk.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2015-10-05 11:31:24 +0000
committermav <mav@FreeBSD.org>2015-10-05 11:31:24 +0000
commit85b5a86dbdd825182ee25aabfb085017635d26a5 (patch)
tree49d54efdf87b86f89da67d47a7e3a16fa0ca13cb /sys/cam/ctl/ctl_backend_ramdisk.c
parent3e85febb126fcf3fc33ad9460816254312716ff6 (diff)
downloadFreeBSD-src-85b5a86dbdd825182ee25aabfb085017635d26a5.zip
FreeBSD-src-85b5a86dbdd825182ee25aabfb085017635d26a5.tar.gz
MFC r288348: Umplement media load/eject support for removable devices.
In case of block backend eject really closes the backing store, while load tries to open it back. Failed store open is reported as no media.
Diffstat (limited to 'sys/cam/ctl/ctl_backend_ramdisk.c')
-rw-r--r--sys/cam/ctl/ctl_backend_ramdisk.c33
1 files changed, 12 insertions, 21 deletions
diff --git a/sys/cam/ctl/ctl_backend_ramdisk.c b/sys/cam/ctl/ctl_backend_ramdisk.c
index efa41e6..e210122 100644
--- a/sys/cam/ctl/ctl_backend_ramdisk.c
+++ b/sys/cam/ctl/ctl_backend_ramdisk.c
@@ -1,6 +1,7 @@
/*-
* Copyright (c) 2003, 2008 Silicon Graphics International Corp.
* Copyright (c) 2012 The FreeBSD Foundation
+ * Copyright (c) 2014-2015 Alexander Motin <mav@FreeBSD.org>
* All rights reserved.
*
* Portions of this software were developed by Edward Tomasz Napierala
@@ -848,8 +849,11 @@ ctl_backend_ramdisk_lun_config_status(void *be_lun,
static int
ctl_backend_ramdisk_config_write(union ctl_io *io)
{
+ struct ctl_be_lun *cbe_lun;
int retval;
+ cbe_lun = (struct ctl_be_lun *)io->io_hdr.ctl_private[
+ CTL_PRIV_BACKEND_LUN].ptr;
retval = 0;
switch (io->scsiio.cdb[0]) {
case SYNCHRONIZE_CACHE:
@@ -874,31 +878,18 @@ ctl_backend_ramdisk_config_write(union ctl_io *io)
break;
case START_STOP_UNIT: {
struct scsi_start_stop_unit *cdb;
- struct ctl_be_lun *cbe_lun;
cdb = (struct scsi_start_stop_unit *)io->scsiio.cdb;
-
- cbe_lun = (struct ctl_be_lun *)io->io_hdr.ctl_private[
- CTL_PRIV_BACKEND_LUN].ptr;
-
- if (cdb->how & SSS_START)
- retval = ctl_start_lun(cbe_lun);
- else
- retval = ctl_stop_lun(cbe_lun);
-
- /*
- * In general, the above routines should not fail. They
- * just set state for the LUN. So we've got something
- * pretty wrong here if we can't start or stop the LUN.
- */
- if (retval != 0) {
- ctl_set_internal_failure(&io->scsiio,
- /*sks_valid*/ 1,
- /*retry_count*/ 0xf051);
- retval = CTL_RETVAL_COMPLETE;
+ if (cdb->how & SSS_START) {
+ if (cdb->how & SSS_LOEJ)
+ ctl_lun_has_media(cbe_lun);
+ ctl_start_lun(cbe_lun);
} else {
- ctl_set_success(&io->scsiio);
+ ctl_stop_lun(cbe_lun);
+ if (cdb->how & SSS_LOEJ)
+ ctl_lun_ejected(cbe_lun);
}
+ ctl_set_success(&io->scsiio);
ctl_config_write_done(io);
break;
}
OpenPOWER on IntegriCloud