diff --git a/sys/cam/scsi/scsi_all.c b/sys/cam/scsi/scsi_all.c index 7ededa1..dd60161 100644 --- a/sys/cam/scsi/scsi_all.c +++ b/sys/cam/scsi/scsi_all.c @@ -691,7 +691,7 @@ const struct sense_key_table_entry sense_key_table[] = { SSD_KEY_HARDWARE_ERROR, SS_RDEF, "HARDWARE FAILURE" }, { SSD_KEY_ILLEGAL_REQUEST, SS_FATAL|EINVAL, "ILLEGAL REQUEST" }, { SSD_KEY_UNIT_ATTENTION, SS_FATAL|ENXIO, "UNIT ATTENTION" }, - { SSD_KEY_DATA_PROTECT, SS_FATAL|EACCES, "DATA PROTECT" }, + { SSD_KEY_DATA_PROTECT, SS_FATAL|ENODEV, "DATA PROTECT" }, { SSD_KEY_BLANK_CHECK, SS_FATAL|ENOSPC, "BLANK CHECK" }, { SSD_KEY_Vendor_Specific, SS_FATAL|EIO, "Vendor Specific" }, { SSD_KEY_COPY_ABORTED, SS_FATAL|EIO, "COPY ABORTED" }, @@ -1410,22 +1410,22 @@ static struct asc_table_entry asc_table[] = { { SST(0x26, 0x12, SS_RDEF, /* XXX TBD */ "Vendor specific key reference not found") }, /* DT WRO BK */ - { SST(0x27, 0x00, SS_FATAL | EACCES, + { SST(0x27, 0x00, SS_FATAL | ENODEV, "Write protected") }, /* DT WRO BK */ - { SST(0x27, 0x01, SS_FATAL | EACCES, + { SST(0x27, 0x01, SS_FATAL | ENODEV, "Hardware write protected") }, /* DT WRO BK */ - { SST(0x27, 0x02, SS_FATAL | EACCES, + { SST(0x27, 0x02, SS_FATAL | ENODEV, "Logical unit software write protected") }, /* T R */ - { SST(0x27, 0x03, SS_FATAL | EACCES, + { SST(0x27, 0x03, SS_FATAL | ENODEV, "Associated write protect") }, /* T R */ - { SST(0x27, 0x04, SS_FATAL | EACCES, + { SST(0x27, 0x04, SS_FATAL | ENODEV, "Persistent write protect") }, /* T R */ - { SST(0x27, 0x05, SS_FATAL | EACCES, + { SST(0x27, 0x05, SS_FATAL | ENODEV, "Permanent write protect") }, /* R F */ { SST(0x27, 0x06, SS_RDEF, /* XXX TBD */ diff --git a/sys/cam/scsi/scsi_low.c b/sys/cam/scsi/scsi_low.c index 1b2f4f6..cfcf0da 100644 --- a/sys/cam/scsi/scsi_low.c +++ b/sys/cam/scsi/scsi_low.c @@ -1317,12 +1317,12 @@ scsi_low_attach_cam(slp) if (slp->sl_si.sim == NULL) { cam_simq_free(devq); - return ENODEV; + return ENXIO; } if (xpt_bus_register(slp->sl_si.sim, NULL, 0) != CAM_SUCCESS) { free(slp->sl_si.sim, M_SCSILOW); - return ENODEV; + return ENXIO; } if (xpt_create_path(&slp->sl_si.path, /*periph*/NULL, @@ -1330,7 +1330,7 @@ scsi_low_attach_cam(slp) CAM_LUN_WILDCARD) != CAM_REQ_CMP) { xpt_bus_deregister(cam_sim_path(slp->sl_si.sim)); cam_sim_free(slp->sl_si.sim, /*free_simq*/TRUE); - return ENODEV; + return ENXIO; } slp->sl_show_result = SHOW_CALCF_RES; /* OK ? */ diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index 554521a..ca43bd3 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -691,6 +691,13 @@ vfs_donmount(struct thread *td, int fsflags, struct uio *fsoptions) } error = vfs_domount(td, fstype, fspath, fsflags, &optlist); + if (error == ENODEV && (fsflags & MNT_RDONLY) == 0 && + (fsflags & MNT_UPDATE) == 0 && !has_rw && !has_noro) { + printf("vfs_donmount: R/W mount failed, possibly R/O media," + " falling back to R/O mount\n"); + fsflags |= MNT_RDONLY; + error = vfs_domount(td, fstype, fspath, fsflags, &optlist); + } bail: /* copyout the errmsg */ if (errmsg_pos != -1 && ((2 * errmsg_pos + 1) < fsoptions->uio_iovcnt)