summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorJoel Sing <jsing@cvs.openbsd.org>2012-01-22 11:13:33 +0000
committerJoel Sing <jsing@cvs.openbsd.org>2012-01-22 11:13:33 +0000
commit971ad6bd36c44b88da9d8fb41ff3b26a59fd79de (patch)
tree1660473a81df08db46e52604a16ce1e1dcc4773c /sys
parentdc525b2b303cabb8371d35abcc681c9b9a2f42f5 (diff)
Convert softraid(4) to new bio(4) status interface. This allows bioctl(8)
to provide useful feedback, rather than reporting an ioctl failure and leaving the user to consult dmesg. For now we continue to print most things to the console, even if the message is a result of an ioctl.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/softraid.c249
-rw-r--r--sys/dev/softraid_concat.c6
-rw-r--r--sys/dev/softraid_crypto.c47
-rw-r--r--sys/dev/softraid_raid0.c7
-rw-r--r--sys/dev/softraid_raid1.c6
5 files changed, 158 insertions, 157 deletions
diff --git a/sys/dev/softraid.c b/sys/dev/softraid.c
index ffacbe3250b..d32a90b2791 100644
--- a/sys/dev/softraid.c
+++ b/sys/dev/softraid.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid.c,v 1.271 2012/01/22 10:46:12 jsing Exp $ */
+/* $OpenBSD: softraid.c,v 1.272 2012/01/22 11:13:31 jsing Exp $ */
/*
* Copyright (c) 2007, 2008, 2009 Marco Peereboom <marco@peereboom.us>
* Copyright (c) 2008 Chris Kuethe <ckuethe@openbsd.org>
@@ -228,8 +228,7 @@ sr_meta_attach(struct sr_discipline *sd, int chunk_no, int force)
/* in memory copy of metadata */
sd->sd_meta = malloc(SR_META_SIZE * 512, M_DEVBUF, M_ZERO | M_NOWAIT);
if (!sd->sd_meta) {
- printf("%s: could not allocate memory for metadata\n",
- DEVNAME(sc));
+ sr_error(sc, "could not allocate memory for metadata");
goto bad;
}
@@ -239,8 +238,8 @@ sr_meta_attach(struct sr_discipline *sd, int chunk_no, int force)
M_DEVBUF, M_ZERO | M_NOWAIT);
if (!sd->sd_meta_foreign) {
/* unwind frees sd_meta */
- printf("%s: could not allocate memory for foreign "
- "metadata\n", DEVNAME(sc));
+ sr_error(sc, "could not allocate memory for foreign "
+ "metadata");
goto bad;
}
}
@@ -321,8 +320,8 @@ sr_meta_probe(struct sr_discipline *sd, dev_t *dt, int no_chunk)
} else {
sr_meta_getdevname(sc, dev, devname, sizeof(devname));
if (bdevvp(dev, &vn)) {
- printf("%s: sr_meta_probe: can't allocate "
- "vnode\n", DEVNAME(sc));
+ sr_error(sc, "sr_meta_probe: cannot allocate "
+ "vnode");
goto unwind;
}
@@ -500,8 +499,7 @@ sr_meta_clear(struct sr_discipline *sd)
DNPRINTF(SR_D_META, "%s: sr_meta_clear\n", DEVNAME(sc));
if (sd->sd_meta_type != SR_META_F_NATIVE) {
- printf("%s: sr_meta_clear can not clear foreign metadata\n",
- DEVNAME(sc));
+ sr_error(sc, "cannot clear foreign metadata");
goto done;
}
@@ -616,8 +614,7 @@ sr_meta_save_callback(void *arg1, void *arg2)
s = splbio();
if (sr_meta_save(arg1, SR_META_DIRTY))
- printf("%s: save metadata failed\n",
- DEVNAME(sd->sd_sc));
+ printf("%s: save metadata failed\n", DEVNAME(sd->sd_sc));
sd->sd_must_flush = 0;
splx(s);
@@ -910,7 +907,7 @@ sr_meta_validate(struct sr_discipline *sd, dev_t dev, struct sr_metadata *sm,
s = &smd[sd->sd_meta_type];
if (sd->sd_meta_type != SR_META_F_NATIVE)
if (s->smd_validate(sd, sm, fm)) {
- printf("%s: invalid foreign metadata\n", DEVNAME(sc));
+ sr_error(sc, "invalid foreign metadata");
goto done;
}
@@ -920,14 +917,14 @@ sr_meta_validate(struct sr_discipline *sd, dev_t dev, struct sr_metadata *sm,
*/
if (sm->ssdi.ssd_magic != SR_MAGIC) {
- printf("%s: not valid softraid metadata\n", DEVNAME(sc));
+ sr_error(sc, "not valid softraid metadata");
goto done;
}
/* Verify metadata checksum. */
sr_checksum(sc, sm, &checksum, sizeof(struct sr_meta_invariant));
if (bcmp(&checksum, &sm->ssd_checksum, sizeof(checksum))) {
- printf("%s: invalid metadata checksum\n", DEVNAME(sc));
+ sr_error(sc, "invalid metadata checksum");
goto done;
}
@@ -960,9 +957,9 @@ sr_meta_validate(struct sr_discipline *sd, dev_t dev, struct sr_metadata *sm,
} else {
- printf("%s: %s can not read metadata version %u, expected %u\n",
- DEVNAME(sc), devname, sm->ssdi.ssd_version,
- SR_META_VERSION);
+ sr_error(sc, "cannot read metadata version %u on %s, "
+ "expected version %u or earlier",
+ sm->ssdi.ssd_version, devname, SR_META_VERSION);
goto done;
}
@@ -1014,8 +1011,7 @@ sr_meta_native_bootprobe(struct sr_softc *sc, dev_t devno,
chrdev = blktochr(devno);
rawdev = MAKEDISKDEV(major(chrdev), DISKUNIT(devno), RAW_PART);
if (cdevvp(rawdev, &vn)) {
- printf("%s: sr_meta_native_bootprobe: can't allocate vnode\n",
- DEVNAME(sc));
+ sr_error(sc, "sr_meta_native_bootprobe: cannot allocate vnode");
goto done;
}
@@ -1051,8 +1047,7 @@ sr_meta_native_bootprobe(struct sr_softc *sc, dev_t devno,
md = malloc(SR_META_SIZE * 512, M_DEVBUF, M_ZERO | M_NOWAIT);
if (md == NULL) {
- printf("%s: not enough memory for metadata buffer\n",
- DEVNAME(sc));
+ sr_error(sc, "not enough memory for metadata buffer");
goto done;
}
@@ -1060,8 +1055,7 @@ sr_meta_native_bootprobe(struct sr_softc *sc, dev_t devno,
fake_sd = malloc(sizeof(struct sr_discipline), M_DEVBUF,
M_ZERO | M_NOWAIT);
if (fake_sd == NULL) {
- printf("%s: not enough memory for fake discipline\n",
- DEVNAME(sc));
+ sr_error(sc, "not enough memory for fake discipline");
goto done;
}
fake_sd->sd_sc = sc;
@@ -1074,8 +1068,8 @@ sr_meta_native_bootprobe(struct sr_softc *sc, dev_t devno,
/* open partition */
rawdev = MAKEDISKDEV(major(devno), DISKUNIT(devno), i);
if (bdevvp(rawdev, &vn)) {
- printf("%s: sr_meta_native_bootprobe: can't allocate "
- "vnode for partition\n", DEVNAME(sc));
+ sr_error(sc, "sr_meta_native_bootprobe: cannot "
+ "allocate vnode for partition");
goto done;
}
error = VOP_OPEN(vn, FREAD, NOCRED, curproc);
@@ -1088,8 +1082,8 @@ sr_meta_native_bootprobe(struct sr_softc *sc, dev_t devno,
}
if (sr_meta_native_read(fake_sd, rawdev, md, NULL)) {
- printf("%s: native bootprobe could not read native "
- "metadata\n", DEVNAME(sc));
+ sr_error(sc, "native bootprobe could not read native "
+ "metadata");
VOP_CLOSE(vn, FREAD, NOCRED, curproc);
vput(vn);
continue;
@@ -1225,8 +1219,7 @@ sr_boot_assembly(struct sr_softc *sc)
bv = malloc(sizeof(struct sr_boot_volume),
M_DEVBUF, M_NOWAIT | M_CANFAIL | M_ZERO);
if (bv == NULL) {
- printf("%s: failed to allocate boot volume!\n",
- DEVNAME(sc));
+ sr_error(sc, "failed to allocate boot volume");
goto unwind;
}
@@ -1432,6 +1425,7 @@ sr_boot_assembly(struct sr_softc *sc)
bcr.bc_flags = BIOC_SCDEVT;
rw_enter_write(&sc->sc_lock);
+ bio_status_init(&sc->sc_status, &sc->sc_dev);
sr_ioctl_createraid(sc, &bcr, 0);
rw_exit_write(&sc->sc_lock);
@@ -1593,8 +1587,7 @@ sr_meta_native_attach(struct sr_discipline *sd, int force)
md = malloc(SR_META_SIZE * 512, M_DEVBUF, M_ZERO | M_NOWAIT);
if (md == NULL) {
- printf("%s: not enough memory for metadata buffer\n",
- DEVNAME(sc));
+ sr_error(sc, "not enough memory for metadata buffer");
goto bad;
}
@@ -1606,8 +1599,7 @@ sr_meta_native_attach(struct sr_discipline *sd, int force)
continue;
if (sr_meta_native_read(sd, ch_entry->src_dev_mm, md, NULL)) {
- printf("%s: could not read native metadata\n",
- DEVNAME(sc));
+ sr_error(sc, "could not read native metadata");
goto bad;
}
@@ -1623,8 +1615,7 @@ sr_meta_native_attach(struct sr_discipline *sd, int force)
continue;
} else if (bcmp(&md->ssdi.ssd_uuid, &uuid,
sizeof uuid)) {
- printf("%s: not part of the same volume\n",
- DEVNAME(sc));
+ sr_error(sc, "not part of the same volume");
goto bad;
}
if (md->ssd_ondisk != version) {
@@ -1636,8 +1627,8 @@ sr_meta_native_attach(struct sr_discipline *sd, int force)
}
if (sr && not_sr) {
- printf("%s: not all chunks are of the native metadata format\n",
- DEVNAME(sc));
+ sr_error(sc, "not all chunks are of the native metadata "
+ "format");
goto bad;
}
@@ -1653,8 +1644,7 @@ sr_meta_native_attach(struct sr_discipline *sd, int force)
panic("src_dev_mm == NODEV");
if (sr_meta_native_read(sd, ch_entry->src_dev_mm, md,
NULL))
- printf("%s: could not read native metadata\n",
- DEVNAME(sc));
+ sr_warn(sc, "could not read native metadata");
if (md->ssd_ondisk != version)
sd->sd_vol.sv_chunks[d]->src_meta.scm_status =
BIOC_SDOFFLINE;
@@ -2257,12 +2247,15 @@ int
sr_ioctl(struct device *dev, u_long cmd, caddr_t addr)
{
struct sr_softc *sc = (struct sr_softc *)dev;
+ struct bio *bio = (struct bio *)addr;
int rv = 0;
DNPRINTF(SR_D_IOCTL, "%s: sr_ioctl ", DEVNAME(sc));
rw_enter_write(&sc->sc_lock);
+ bio_status_init(&sc->sc_status, &sc->sc_dev);
+
switch (cmd) {
case BIOCINQ:
DNPRINTF(SR_D_IOCTL, "inq\n");
@@ -2319,9 +2312,13 @@ sr_ioctl(struct device *dev, u_long cmd, caddr_t addr)
rv = ENOTTY;
}
+ sc->sc_status.bs_status = (rv ? BIO_STATUS_ERROR : BIO_STATUS_SUCCESS);
+
+ bcopy(&sc->sc_status, &bio->bio_status, sizeof(struct bio_status));
+
rw_exit_write(&sc->sc_lock);
- return (rv);
+ return (0);
}
int
@@ -2516,7 +2513,7 @@ sr_ioctl_setstate(struct sr_softc *sc, struct bioc_setstate *bs)
c++;
}
if (found == 0) {
- printf("%s: chunk not part of array\n", DEVNAME(sc));
+ sr_error(sc, "chunk not part of array");
goto done;
}
@@ -2524,8 +2521,8 @@ sr_ioctl_setstate(struct sr_softc *sc, struct bioc_setstate *bs)
sd->sd_set_chunk_state(sd, c, BIOC_SDOFFLINE);
if (sr_meta_save(sd, SR_META_DIRTY)) {
- printf("%s: could not save metadata to %s\n",
- DEVNAME(sc), sd->sd_meta->ssd_devname);
+ sr_error(sc, "could not save metadata for %s",
+ sd->sd_meta->ssd_devname);
goto done;
}
rv = 0;
@@ -2539,8 +2536,7 @@ sr_ioctl_setstate(struct sr_softc *sc, struct bioc_setstate *bs)
break;
default:
- printf("%s: unsupported state request %d\n",
- DEVNAME(sc), bs->bs_status);
+ sr_error(sc, "unsupported state request %d", bs->bs_status);
}
done:
@@ -2605,11 +2601,9 @@ sr_hotspare(struct sr_softc *sc, dev_t dev)
c = sr_chunk_in_use(sc, dev);
if (c != BIOC_SDINVALID && c != BIOC_SDOFFLINE) {
if (c == BIOC_SDHOTSPARE)
- printf("%s: %s is already a hotspare\n",
- DEVNAME(sc), devname);
+ sr_error(sc, "%s is already a hotspare", devname);
else
- printf("%s: %s is already in use\n",
- DEVNAME(sc), devname);
+ sr_error(sc, "%s is already in use", devname);
goto done;
}
@@ -2617,7 +2611,7 @@ sr_hotspare(struct sr_softc *sc, dev_t dev)
/* Open device. */
if (bdevvp(dev, &vn)) {
- printf("%s: sr_hotspare: can't allocate vnode\n", DEVNAME(sc));
+ sr_error(sc, "sr_hotspare: cannot allocate vnode");
goto done;
}
if (VOP_OPEN(vn, FREAD | FWRITE, NOCRED, curproc)) {
@@ -2639,9 +2633,8 @@ sr_hotspare(struct sr_softc *sc, dev_t dev)
goto fail;
}
if (label.d_partitions[part].p_fstype != FS_RAID) {
- printf("%s: %s partition not of type RAID (%d)\n",
- DEVNAME(sc), devname,
- label.d_partitions[part].p_fstype);
+ sr_error(sc, "%s partition not of type RAID (%d)",
+ devname, label.d_partitions[part].p_fstype);
goto fail;
}
@@ -2710,8 +2703,7 @@ sr_hotspare(struct sr_softc *sc, dev_t dev)
/* Save metadata. */
if (sr_meta_save(sd, SR_META_DIRTY)) {
- printf("%s: could not save metadata to %s\n",
- DEVNAME(sc), devname);
+ sr_error(sc, "could not save metadata to %s", devname);
goto fail;
}
@@ -2761,6 +2753,7 @@ sr_hotspare_rebuild_callback(void *arg1, void *arg2)
void
sr_hotspare_rebuild(struct sr_discipline *sd)
{
+ struct sr_softc *sc = sd->sd_sc;
struct sr_chunk_head *cl;
struct sr_chunk *hotspare, *chunk = NULL;
struct sr_workunit *wu;
@@ -2782,13 +2775,13 @@ sr_hotspare_rebuild(struct sr_discipline *sd)
if (chunk == NULL) {
printf("%s: no offline chunk found on %s!\n",
- DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname);
+ DEVNAME(sc), sd->sd_meta->ssd_devname);
return;
}
/* See if we have a suitable hotspare... */
- rw_enter_write(&sd->sd_sc->sc_hs_lock);
- cl = &sd->sd_sc->sc_hotspare_list;
+ rw_enter_write(&sc->sc_hs_lock);
+ cl = &sc->sc_hotspare_list;
SLIST_FOREACH(hotspare, cl, src_link)
if (hotspare->src_size >= chunk->src_size)
break;
@@ -2796,7 +2789,7 @@ sr_hotspare_rebuild(struct sr_discipline *sd)
if (hotspare != NULL) {
printf("%s: %s volume degraded, will attempt to "
- "rebuild on hotspare %s\n", DEVNAME(sd->sd_sc),
+ "rebuild on hotspare %s\n", DEVNAME(sc),
sd->sd_meta->ssd_devname, hotspare->src_devname);
/*
@@ -2830,31 +2823,32 @@ sr_hotspare_rebuild(struct sr_discipline *sd)
} while (busy && i < 120);
DNPRINTF(SR_D_META, "%s: waited %i seconds for I/O to "
- "complete on failed chunk %s\n", DEVNAME(sd->sd_sc),
+ "complete on failed chunk %s\n", DEVNAME(sc),
i, chunk->src_devname);
if (busy) {
printf("%s: pending I/O failed to complete on "
"failed chunk %s, hotspare rebuild aborted...\n",
- DEVNAME(sd->sd_sc), chunk->src_devname);
+ DEVNAME(sc), chunk->src_devname);
goto done;
}
s = splbio();
- rw_enter_write(&sd->sd_sc->sc_lock);
+ rw_enter_write(&sc->sc_lock);
+ bio_status_init(&sc->sc_status, &sc->sc_dev);
if (sr_rebuild_init(sd, hotspare->src_dev_mm, 1) == 0) {
/* Remove hotspare from available list. */
- sd->sd_sc->sc_hotspare_no--;
+ sc->sc_hotspare_no--;
SLIST_REMOVE(cl, hotspare, sr_chunk, src_link);
free(hotspare, M_DEVBUF);
}
- rw_exit_write(&sd->sd_sc->sc_lock);
+ rw_exit_write(&sc->sc_lock);
splx(s);
}
done:
- rw_exit_write(&sd->sd_sc->sc_hs_lock);
+ rw_exit_write(&sc->sc_hs_lock);
}
int
@@ -2875,19 +2869,17 @@ sr_rebuild_init(struct sr_discipline *sd, dev_t dev, int hotspare)
*/
if (!(sd->sd_capabilities & SR_CAP_REBUILD)) {
- printf("%s: discipline does not support rebuild\n",
- DEVNAME(sc));
+ sr_error(sc, "discipline does not support rebuild");
goto done;
}
/* make sure volume is in the right state */
if (sd->sd_vol_status == BIOC_SVREBUILD) {
- printf("%s: rebuild already in progress\n", DEVNAME(sc));
+ sr_error(sc, "rebuild already in progress");
goto done;
}
if (sd->sd_vol_status != BIOC_SVDEGRADED) {
- printf("%s: %s not degraded\n", DEVNAME(sc),
- sd->sd_meta->ssd_devname);
+ sr_error(sc, "volume not degraded");
goto done;
}
@@ -2900,8 +2892,7 @@ sr_rebuild_init(struct sr_discipline *sd, dev_t dev, int hotspare)
}
}
if (chunk == NULL) {
- printf("%s: no offline chunks available for rebuild\n",
- DEVNAME(sc));
+ sr_error(sc, "no offline chunks available to rebuild");
goto done;
}
@@ -2938,27 +2929,26 @@ sr_rebuild_init(struct sr_discipline *sd, dev_t dev, int hotspare)
goto done;
}
if (label.d_partitions[part].p_fstype != FS_RAID) {
- printf("%s: %s partition not of type RAID (%d)\n",
- DEVNAME(sc), devname,
- label.d_partitions[part].p_fstype);
+ sr_error(sc, "%s partition not of type RAID (%d)",
+ devname, label.d_partitions[part].p_fstype);
goto done;
}
/* Is the partition large enough? */
size = DL_GETPSIZE(&label.d_partitions[part]) - SR_DATA_OFFSET;
if (size < csize) {
- printf("%s: partition too small, at least %llu B required\n",
- DEVNAME(sc), csize << DEV_BSHIFT);
+ sr_error(sc, "%s partition too small, at least %llu bytes "
+ "required", devname, csize << DEV_BSHIFT);
goto done;
} else if (size > csize)
- printf("%s: partition too large, wasting %llu B\n",
- DEVNAME(sc), (size - csize) << DEV_BSHIFT);
+ sr_warn(sc, "%s partition too large, wasting %llu bytes",
+ devname, (size - csize) << DEV_BSHIFT);
/* Ensure that this chunk is not already in use. */
status = sr_chunk_in_use(sc, dev);
if (status != BIOC_SDINVALID && status != BIOC_SDOFFLINE &&
!(hotspare && status == BIOC_SDHOTSPARE)) {
- printf("%s: %s is already in use\n", DEVNAME(sc), devname);
+ sr_error(sc, "%s is already in use", devname);
goto done;
}
@@ -2988,13 +2978,12 @@ sr_rebuild_init(struct sr_discipline *sd, dev_t dev, int hotspare)
sd->sd_set_chunk_state(sd, cid, BIOC_SDREBUILD);
if (sr_meta_save(sd, SR_META_DIRTY)) {
- printf("%s: could not save metadata to %s\n",
- DEVNAME(sc), devname);
+ sr_error(sc, "could not save metadata to %s", devname);
open = 1;
goto done;
}
- printf("%s: rebuild of %s started on %s\n", DEVNAME(sc),
+ sr_warn(sc, "rebuild of %s started on %s",
sd->sd_meta->ssd_devname, devname);
sd->sd_reb_abort = 0;
@@ -3047,7 +3036,7 @@ sr_ioctl_createraid(struct sr_softc *sc, struct bioc_createraid *bc, int user)
struct sr_chunk *ch_entry;
struct scsi_link *link;
struct device *dev;
- char devname[32];
+ char *uuid, devname[32];
dev_t *dt;
int i, no_chunk, rv = EINVAL, target, vol;
int no_meta;
@@ -3072,11 +3061,11 @@ sr_ioctl_createraid(struct sr_softc *sc, struct bioc_createraid *bc, int user)
SLIST_INIT(&sd->sd_meta_opt);
sd->sd_workq = workq_create("srdis", 1, IPL_BIO);
if (sd->sd_workq == NULL) {
- printf("%s: could not create workq\n", DEVNAME(sc));
+ sr_error(sc, "could not create discipline workq");
goto unwind;
}
if (sr_discipline_init(sd, bc->bc_level)) {
- printf("%s: could not initialize discipline\n", DEVNAME(sc));
+ sr_error(sc, "could not initialize discipline");
goto unwind;
}
@@ -3088,38 +3077,35 @@ sr_ioctl_createraid(struct sr_softc *sc, struct bioc_createraid *bc, int user)
for (i = 0; i < no_chunk; i++) {
if (sr_chunk_in_use(sc, dt[i]) != BIOC_SDINVALID) {
sr_meta_getdevname(sc, dt[i], devname, sizeof(devname));
- printf("%s: chunk %s already in use\n",
- DEVNAME(sc), devname);
+ sr_error(sc, "chunk %s already in use", devname);
goto unwind;
}
}
sd->sd_meta_type = sr_meta_probe(sd, dt, no_chunk);
if (sd->sd_meta_type == SR_META_F_INVALID) {
- printf("%s: invalid metadata format\n", DEVNAME(sc));
+ sr_error(sc, "invalid metadata format");
goto unwind;
}
- if (sr_meta_attach(sd, no_chunk, bc->bc_flags & BIOC_SCFORCE)) {
- printf("%s: can't attach metadata type %d\n", DEVNAME(sc),
- sd->sd_meta_type);
+ if (sr_meta_attach(sd, no_chunk, bc->bc_flags & BIOC_SCFORCE))
goto unwind;
- }
/* force the raid volume by clearing metadata region */
if (bc->bc_flags & BIOC_SCFORCE) {
/* make sure disk isn't up and running */
if (sr_meta_read(sd))
if (sr_already_assembled(sd)) {
- printf("%s: disk ", DEVNAME(sc));
- sr_uuid_print(&sd->sd_meta->ssdi.ssd_uuid, 0);
- printf(" is currently in use; can't force "
- "create\n");
+ uuid = sr_uuid_format(
+ &sd->sd_meta->ssdi.ssd_uuid);
+ sr_error(sc, "disk %s is currently in use; "
+ "cannot force create", uuid);
+ free(uuid, M_DEVBUF);
goto unwind;
}
if (sr_meta_clear(sd)) {
- printf("%s: failed to clear metadata\n", DEVNAME(sc));
+ sr_error(sc, "failed to clear metadata");
goto unwind;
}
}
@@ -3128,8 +3114,8 @@ sr_ioctl_createraid(struct sr_softc *sc, struct bioc_createraid *bc, int user)
if (no_meta == -1) {
/* Corrupt metadata on one or more chunks. */
- printf("%s: one of the chunks has corrupt metadata; aborting "
- "assembly\n", DEVNAME(sc));
+ sr_error(sc, "one of the chunks has corrupt metadata; "
+ "aborting assembly");
goto unwind;
} else if (no_meta == 0) {
@@ -3154,8 +3140,8 @@ sr_ioctl_createraid(struct sr_softc *sc, struct bioc_createraid *bc, int user)
/* Warn if we've wasted chunk space due to coercing. */
if ((sd->sd_capabilities & SR_CAP_NON_COERCED) == 0 &&
sd->sd_vol.sv_chunk_minsz != sd->sd_vol.sv_chunk_maxsz)
- printf("%s: chunk sizes are not equal; up to %llu "
- "blocks wasted per chunk\n", DEVNAME(sc),
+ sr_warn(sc, "chunk sizes are not equal; up to %llu "
+ "blocks wasted per chunk",
sd->sd_vol.sv_chunk_maxsz -
sd->sd_vol.sv_chunk_minsz);
@@ -3163,15 +3149,15 @@ sr_ioctl_createraid(struct sr_softc *sc, struct bioc_createraid *bc, int user)
/* Ensure metadata level matches requested assembly level. */
if (sd->sd_meta->ssdi.ssd_level != bc->bc_level) {
- printf("%s: volume level does not match metadata "
- "level!\n", DEVNAME(sc));
+ sr_error(sc, "volume level does not match metadata "
+ "level");
goto unwind;
}
if (sr_already_assembled(sd)) {
- printf("%s: disk ", DEVNAME(sc));
- sr_uuid_print(&sd->sd_meta->ssdi.ssd_uuid, 0);
- printf(" already assembled\n");
+ uuid = sr_uuid_format(&sd->sd_meta->ssdi.ssd_uuid);
+ sr_error(sc, "disk %s already assembled", uuid);
+ free(uuid, M_DEVBUF);
goto unwind;
}
@@ -3182,12 +3168,12 @@ sr_ioctl_createraid(struct sr_softc *sc, struct bioc_createraid *bc, int user)
}
if (no_meta != no_chunk)
- printf("%s: trying to bring up %s degraded\n",
- DEVNAME(sc), sd->sd_meta->ssd_devname);
+ sr_warn(sc, "trying to bring up %s degraded",
+ sd->sd_meta->ssd_devname);
if (sd->sd_meta->ssd_meta_flags & SR_META_DIRTY)
- printf("%s: %s was not shutdown properly\n",
- DEVNAME(sc), sd->sd_meta->ssd_devname);
+ sr_warn(sc, "%s was not shutdown properly",
+ sd->sd_meta->ssd_devname);
SLIST_FOREACH(omi, &sd->sd_meta_opt, omi_link)
if (sd->sd_meta_opt_handler == NULL ||
@@ -3226,8 +3212,8 @@ sr_ioctl_createraid(struct sr_softc *sc, struct bioc_createraid *bc, int user)
/* Initialise volume state. */
sd->sd_set_vol_state(sd);
if (sd->sd_vol_status == BIOC_SVOFFLINE) {
- printf("%s: %s offline, will not be brought online\n",
- DEVNAME(sc), sd->sd_meta->ssd_devname);
+ sr_error(sc, "%s is offline, will not be brought "
+ "online", sd->sd_meta->ssd_devname);
goto unwind;
}
@@ -3251,7 +3237,7 @@ sr_ioctl_createraid(struct sr_softc *sc, struct bioc_createraid *bc, int user)
if (sc->sc_dis[target] == NULL)
break;
if (target == SR_MAX_LD) {
- printf("%s: no free target for %s\n", DEVNAME(sc),
+ sr_error(sc, "no free target for %s",
sd->sd_meta->ssd_devname);
goto unwind;
}
@@ -3263,7 +3249,7 @@ sr_ioctl_createraid(struct sr_softc *sc, struct bioc_createraid *bc, int user)
sd->sd_target = target;
sc->sc_dis[target] = sd;
if (scsi_probe_lun(sc->sc_scsibus, target, 0) != 0) {
- printf("%s: scsi_probe_lun failed\n", DEVNAME(sc));
+ sr_error(sc, "scsi_probe_lun failed");
sc->sc_dis[target] = NULL;
sd->sd_target = 0;
goto unwind;
@@ -3283,8 +3269,8 @@ sr_ioctl_createraid(struct sr_softc *sc, struct bioc_createraid *bc, int user)
if (sd->sd_meta->ssd_devname[0] != '\0' &&
strncmp(sd->sd_meta->ssd_devname, dev->dv_xname,
sizeof(dev->dv_xname)))
- printf("%s: volume %s is roaming, it used to be %s, "
- "updating metadata\n", DEVNAME(sc), dev->dv_xname,
+ sr_warn(sc, "volume %s is roaming, it used to be %s, "
+ "updating metadata", dev->dv_xname,
sd->sd_meta->ssd_devname);
/* Populate remaining volume metadata. */
@@ -3292,13 +3278,16 @@ sr_ioctl_createraid(struct sr_softc *sc, struct bioc_createraid *bc, int user)
strlcpy(sd->sd_meta->ssd_devname, dev->dv_xname,
sizeof(sd->sd_meta->ssd_devname));
+ sr_info(sc, "%s volume attached as %s",
+ sd->sd_meta->ssdi.ssd_product, sd->sd_meta->ssd_devname);
+
/* Update device name on any roaming chunks. */
sr_roam_chunks(sd);
#ifndef SMALL_KERNEL
if (sr_sensors_create(sd))
- printf("%s: unable to create sensor for %s\n",
- DEVNAME(sc), dev->dv_xname);
+ sr_warn(sc, "unable to create sensor for %s",
+ dev->dv_xname);
#endif /* SMALL_KERNEL */
} else {
/* This volume does not attach as a system disk. */
@@ -3319,10 +3308,10 @@ sr_ioctl_createraid(struct sr_softc *sc, struct bioc_createraid *bc, int user)
sd->sd_ready = 1;
return (rv);
+
unwind:
sr_discipline_shutdown(sd, 0);
- /* XXX - use internal status values! */
if (rv == EAGAIN)
rv = 0;
@@ -3349,8 +3338,10 @@ sr_ioctl_deleteraid(struct sr_softc *sc, struct bioc_deleteraid *dr)
}
}
- if (sd == NULL)
+ if (sd == NULL) {
+ sr_error(sc, "volume %s not found", dr->bd_dev);
goto bad;
+ }
sd->sd_deleted = 1;
sd->sd_meta->ssdi.ssd_vol_flags = BIOC_SCNOAUTOASSEMBLE;
@@ -3425,15 +3416,14 @@ sr_ioctl_installboot(struct sr_softc *sc, struct bioc_installboot *bb)
if (dk == NULL || dk->dk_label == NULL ||
(dk->dk_flags & DKF_LABELVALID) == 0 ||
bcmp(dk->dk_label->d_uid, &duid, sizeof(duid)) == 0) {
- printf("%s: failed to get DUID for softraid volume!\n",
- DEVNAME(sd->sd_sc));
+ sr_error(sc, "failed to get DUID for softraid volume");
goto done;
}
bcopy(dk->dk_label->d_uid, duid, sizeof(duid));
/* Ensure that boot storage area is large enough. */
if (sd->sd_meta->ssd_data_offset < (SR_BOOT_OFFSET + SR_BOOT_SIZE)) {
- printf("%s: insufficient boot storage!\n", DEVNAME(sd->sd_sc));
+ sr_error(sc, "insufficient boot storage");
goto done;
}
@@ -3502,7 +3492,7 @@ sr_ioctl_installboot(struct sr_softc *sc, struct bioc_installboot *bb)
if (sr_rw(sc, chunk->src_dev_mm, bootblk, bbs,
SR_BOOT_BLOCKS_OFFSET, B_WRITE)) {
- printf("%s: failed to write boot block\n", DEVNAME(sc));
+ sr_error(sc, "failed to write boot block", DEVNAME(sc));
goto done;
}
@@ -3513,8 +3503,7 @@ sr_ioctl_installboot(struct sr_softc *sc, struct bioc_installboot *bb)
if (sr_rw(sc, chunk->src_dev_mm, bootldr, bls,
SR_BOOT_LOADER_OFFSET, B_WRITE)) {
- printf("%s: failed to write boot loader\n",
- DEVNAME(sc));
+ sr_error(sc, "failed to write boot loader");
goto done;
}
@@ -3525,8 +3514,8 @@ sr_ioctl_installboot(struct sr_softc *sc, struct bioc_installboot *bb)
/* Mark volume as bootable and save metadata. */
sd->sd_meta->ssdi.ssd_vol_flags |= BIOC_SCBOOTABLE;
if (sr_meta_save(sd, SR_META_DIRTY)) {
- printf("%s: could not save metadata to %s\n",
- DEVNAME(sc), chunk->src_devname);
+ sr_error(sc, "could not save metadata to %s",
+ chunk->src_devname);
goto done;
}
@@ -4264,7 +4253,7 @@ sr_rebuild(void *arg)
if (kthread_create(sr_rebuild_thread, sd, &sd->sd_background_proc,
DEVNAME(sc)) != 0)
- printf("%s: unable to start backgound operation\n",
+ printf("%s: unable to start background operation\n",
DEVNAME(sc));
}
diff --git a/sys/dev/softraid_concat.c b/sys/dev/softraid_concat.c
index 9b7712e1ad1..ffa206c63b8 100644
--- a/sys/dev/softraid_concat.c
+++ b/sys/dev/softraid_concat.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid_concat.c,v 1.1 2011/12/31 17:06:10 jsing Exp $ */
+/* $OpenBSD: softraid_concat.c,v 1.2 2012/01/22 11:13:32 jsing Exp $ */
/*
* Copyright (c) 2008 Marco Peereboom <marco@peereboom.us>
* Copyright (c) 2011 Joel Sing <jsing@openbsd.org>
@@ -66,8 +66,10 @@ sr_concat_create(struct sr_discipline *sd, struct bioc_createraid *bc,
{
int i;
- if (no_chunk < 2)
+ if (no_chunk < 2) {
+ sr_error(sd->sd_sc, "CONCAT requires two or more chunks");
return EINVAL;
+ }
strlcpy(sd->sd_name, "CONCAT", sizeof(sd->sd_name));
diff --git a/sys/dev/softraid_crypto.c b/sys/dev/softraid_crypto.c
index 4ba1328c340..fe8c9930ba9 100644
--- a/sys/dev/softraid_crypto.c
+++ b/sys/dev/softraid_crypto.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid_crypto.c,v 1.78 2012/01/22 10:50:39 jsing Exp $ */
+/* $OpenBSD: softraid_crypto.c,v 1.79 2012/01/22 11:13:32 jsing Exp $ */
/*
* Copyright (c) 2007 Marco Peereboom <marco@peereboom.us>
* Copyright (c) 2008 Hans-Joerg Hoexer <hshoexer@openbsd.org>
@@ -137,8 +137,10 @@ sr_crypto_create(struct sr_discipline *sd, struct bioc_createraid *bc,
struct sr_meta_opt_item *omi;
int rv = EINVAL;
- if (no_chunk != 1)
+ if (no_chunk != 1) {
+ sr_error(sd->sd_sc, "CRYPTO requires exactly one chunk");
goto done;
+ }
/* Create crypto optional metadata. */
omi = malloc(sizeof(struct sr_meta_opt_item), M_DEVBUF,
@@ -604,6 +606,7 @@ sr_crypto_change_maskkey(struct sr_discipline *sd,
sizeof(kdfinfo1->maskkey), p, ksz, check_digest);
if (memcmp(sd->mds.mdd_crypto.scr_meta->chk_hmac_sha1.sch_mac,
check_digest, sizeof(check_digest)) != 0) {
+ sr_error(sd->sd_sc, "incorrect key or passphrase");
rv = EPERM;
goto out;
}
@@ -664,13 +667,13 @@ sr_crypto_create_key_disk(struct sr_discipline *sd, dev_t dev)
/* Make sure chunk is not already in use. */
c = sr_chunk_in_use(sc, dev);
if (c != BIOC_SDINVALID && c != BIOC_SDOFFLINE) {
- printf("%s: %s is already in use\n", DEVNAME(sc), devname);
+ sr_error(sc, "%s is already in use", devname);
goto done;
}
/* Open device. */
if (bdevvp(dev, &vn)) {
- printf("%s: cannot open key disk %s\n", DEVNAME(sc), devname);
+ sr_error(sc, "cannot open key disk %s", devname);
goto done;
}
if (VOP_OPEN(vn, FREAD | FWRITE, NOCRED, curproc)) {
@@ -692,9 +695,8 @@ sr_crypto_create_key_disk(struct sr_discipline *sd, dev_t dev)
goto fail;
}
if (label.d_partitions[part].p_fstype != FS_RAID) {
- printf("%s: %s partition not of type RAID (%d)\n",
- DEVNAME(sc), devname,
- label.d_partitions[part].p_fstype);
+ sr_error(sc, "%s partition not of type RAID (%d)\n",
+ devname, label.d_partitions[part].p_fstype);
goto fail;
}
@@ -779,8 +781,7 @@ sr_crypto_create_key_disk(struct sr_discipline *sd, dev_t dev)
/* Save metadata. */
if (sr_meta_save(fakesd, SR_META_DIRTY)) {
- printf("%s: could not save metadata to %s\n",
- DEVNAME(sc), devname);
+ sr_error(sc, "could not save metadata to %s", devname);
goto fail;
}
@@ -834,13 +835,13 @@ sr_crypto_read_key_disk(struct sr_discipline *sd, dev_t dev)
/* Make sure chunk is not already in use. */
c = sr_chunk_in_use(sc, dev);
if (c != BIOC_SDINVALID && c != BIOC_SDOFFLINE) {
- printf("%s: %s is already in use\n", DEVNAME(sc), devname);
+ sr_error(sc, "%s is already in use", devname);
goto done;
}
/* Open device. */
if (bdevvp(dev, &vn)) {
- printf("%s: cannot open key disk %s\n", DEVNAME(sc), devname);
+ sr_error(sc, "cannot open key disk %s", devname);
goto done;
}
if (VOP_OPEN(vn, FREAD | FWRITE, NOCRED, curproc)) {
@@ -862,9 +863,8 @@ sr_crypto_read_key_disk(struct sr_discipline *sd, dev_t dev)
goto done;
}
if (label.d_partitions[part].p_fstype != FS_RAID) {
- printf("%s: %s partition not of type RAID (%d)\n",
- DEVNAME(sc), devname,
- label.d_partitions[part].p_fstype);
+ sr_error(sc, "%s partition not of type RAID (%d)\n",
+ devname, label.d_partitions[part].p_fstype);
goto done;
}
@@ -873,8 +873,7 @@ sr_crypto_read_key_disk(struct sr_discipline *sd, dev_t dev)
*/
sm = malloc(SR_META_SIZE * 512, M_DEVBUF, M_WAITOK | M_ZERO);
if (sr_meta_native_read(sd, dev, sm, NULL)) {
- printf("%s: native bootprobe could not read native "
- "metadata\n", DEVNAME(sc));
+ sr_error(sc, "native bootprobe could not read native metadata");
goto done;
}
@@ -886,7 +885,7 @@ sr_crypto_read_key_disk(struct sr_discipline *sd, dev_t dev)
/* Make sure this is a key disk. */
if (sm->ssdi.ssd_level != SR_KEYDISK_LEVEL) {
- printf("%s: %s is not a key disk\n", DEVNAME(sc), devname);
+ sr_error(sc, "%s is not a key disk", devname);
goto done;
}
@@ -953,12 +952,19 @@ sr_crypto_alloc_resources(struct sr_discipline *sd)
for (i = 0; i < SR_CRYPTO_MAXKEYS; i++)
sd->mds.mdd_crypto.scr_sid[i] = (u_int64_t)-1;
- if (sr_wu_alloc(sd))
+ if (sr_wu_alloc(sd)) {
+ sr_error(sd->sd_sc, "unable to allocate work units");
return (ENOMEM);
- if (sr_ccb_alloc(sd))
+ }
+ if (sr_ccb_alloc(sd)) {
+ sr_error(sd->sd_sc, "unable to allocate CCBs");
return (ENOMEM);
- if (sr_crypto_decrypt_key(sd))
+ }
+ if (sr_crypto_decrypt_key(sd)) {
+ sr_error(sd->sd_sc, "incorrect key or passphrase");
return (EPERM);
+ }
+
/*
* For each wu allocate the uio, iovec and crypto structures.
* these have to be allocated now because during runtime we can't
@@ -1132,6 +1138,7 @@ bad:
explicit_bzero(&kdfpair, sizeof(kdfpair));
explicit_bzero(&kdfinfo1, sizeof(kdfinfo1));
explicit_bzero(&kdfinfo2, sizeof(kdfinfo2));
+
return (rv);
}
diff --git a/sys/dev/softraid_raid0.c b/sys/dev/softraid_raid0.c
index a9c7e5a7d60..a686fef700e 100644
--- a/sys/dev/softraid_raid0.c
+++ b/sys/dev/softraid_raid0.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid_raid0.c,v 1.25 2011/12/26 14:54:52 jsing Exp $ */
+/* $OpenBSD: softraid_raid0.c,v 1.26 2012/01/22 11:13:32 jsing Exp $ */
/*
* Copyright (c) 2008 Marco Peereboom <marco@peereboom.us>
*
@@ -75,9 +75,10 @@ int
sr_raid0_create(struct sr_discipline *sd, struct bioc_createraid *bc,
int no_chunk, int64_t coerced_size)
{
-
- if (no_chunk < 2)
+ if (no_chunk < 2) {
+ sr_error(sd->sd_sc, "RAID 0 requires two or more chunks");
return EINVAL;
+ }
/*
* XXX add variable strip size later even though MAXPHYS is really
diff --git a/sys/dev/softraid_raid1.c b/sys/dev/softraid_raid1.c
index 34f7804a4b1..bc61f87d2d5 100644
--- a/sys/dev/softraid_raid1.c
+++ b/sys/dev/softraid_raid1.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid_raid1.c,v 1.30 2011/12/26 14:54:52 jsing Exp $ */
+/* $OpenBSD: softraid_raid1.c,v 1.31 2012/01/22 11:13:32 jsing Exp $ */
/*
* Copyright (c) 2007 Marco Peereboom <marco@peereboom.us>
*
@@ -82,8 +82,10 @@ sr_raid1_create(struct sr_discipline *sd, struct bioc_createraid *bc,
int no_chunk, int64_t coerced_size)
{
- if (no_chunk < 2)
+ if (no_chunk < 2) {
+ sr_error(sd->sd_sc, "RAID 1 requires two or more chunks");
return EINVAL;
+ }
strlcpy(sd->sd_name, "RAID 1", sizeof(sd->sd_name));
sd->sd_meta->ssdi.ssd_size = coerced_size;