summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjsing <jsing@openbsd.org>2013-03-31 10:41:16 +0000
committerjsing <jsing@openbsd.org>2013-03-31 10:41:16 +0000
commit2cb1dc0a8a76a545bb5b8105cb4484c766960f72 (patch)
tree9e7a7099046b0d5c13dad67aab3c72360c03bf1f /sys
parenttypo fix from rodent@netbsd; (diff)
downloadwireguard-openbsd-2cb1dc0a8a76a545bb5b8105cb4484c766960f72.tar.xz
wireguard-openbsd-2cb1dc0a8a76a545bb5b8105cb4484c766960f72.zip
Pull the initialisation of runtime values out into a separate init
function, rather than having it spread across create/assemble/alloc. Also handle strip size errors appropriately, rather than failing silently. ok krw@
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/softraid_raid0.c27
-rw-r--r--sys/dev/softraid_raid6.c35
-rw-r--r--sys/dev/softraid_raidp.c24
3 files changed, 51 insertions, 35 deletions
diff --git a/sys/dev/softraid_raid0.c b/sys/dev/softraid_raid0.c
index 4e87e3cfa00..700e401b08c 100644
--- a/sys/dev/softraid_raid0.c
+++ b/sys/dev/softraid_raid0.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid_raid0.c,v 1.36 2013/03/30 02:02:14 jsing Exp $ */
+/* $OpenBSD: softraid_raid0.c,v 1.37 2013/03/31 10:41:16 jsing Exp $ */
/*
* Copyright (c) 2008 Marco Peereboom <marco@peereboom.us>
*
@@ -48,6 +48,7 @@ int sr_raid0_create(struct sr_discipline *, struct bioc_createraid *,
int, int64_t);
int sr_raid0_assemble(struct sr_discipline *, struct bioc_createraid *,
int, void *);
+int sr_raid0_init(struct sr_discipline *);
int sr_raid0_alloc_resources(struct sr_discipline *);
int sr_raid0_free_resources(struct sr_discipline *);
int sr_raid0_rw(struct sr_workunit *);
@@ -88,18 +89,26 @@ sr_raid0_create(struct sr_discipline *sd, struct bioc_createraid *bc,
sd->sd_meta->ssdi.ssd_size = (coerced_size &
~((sd->sd_meta->ssdi.ssd_strip_size >> DEV_BSHIFT) - 1)) * no_chunk;
- sd->sd_max_ccb_per_wu =
- (MAXPHYS / sd->sd_meta->ssdi.ssd_strip_size + 1) *
- SR_RAID0_NOWU * no_chunk;
-
- return 0;
+ return sr_raid0_init(sd);
}
int
sr_raid0_assemble(struct sr_discipline *sd, struct bioc_createraid *bc,
int no_chunks, void *data)
{
+ return sr_raid0_init(sd);
+}
+int
+sr_raid0_init(struct sr_discipline *sd)
+{
+ /* Initialise runtime values. */
+ sd->mds.mdd_raid0.sr0_strip_bits =
+ sr_validate_stripsize(sd->sd_meta->ssdi.ssd_strip_size);
+ if (sd->mds.mdd_raid0.sr0_strip_bits == -1) {
+ sr_error(sd->sd_sc, "invalid strip size", sd->sd_name);
+ return EINVAL;
+ }
sd->sd_max_ccb_per_wu =
(MAXPHYS / sd->sd_meta->ssdi.ssd_strip_size + 1) *
SR_RAID0_NOWU * sd->sd_meta->ssdi.ssd_chunk_no;
@@ -120,12 +129,6 @@ sr_raid0_alloc_resources(struct sr_discipline *sd)
if (sr_ccb_alloc(sd))
goto bad;
- /* setup runtime values */
- sd->mds.mdd_raid0.sr0_strip_bits =
- sr_validate_stripsize(sd->sd_meta->ssdi.ssd_strip_size);
- if (sd->mds.mdd_raid0.sr0_strip_bits == -1)
- goto bad;
-
rv = 0;
bad:
return (rv);
diff --git a/sys/dev/softraid_raid6.c b/sys/dev/softraid_raid6.c
index a94ceab5df9..d2b052f10f4 100644
--- a/sys/dev/softraid_raid6.c
+++ b/sys/dev/softraid_raid6.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid_raid6.c,v 1.41 2013/03/30 14:41:37 jsing Exp $ */
+/* $OpenBSD: softraid_raid6.c,v 1.42 2013/03/31 10:41:16 jsing Exp $ */
/*
* Copyright (c) 2009 Marco Peereboom <marco@peereboom.us>
* Copyright (c) 2009 Jordan Hargrave <jordan@openbsd.org>
@@ -53,6 +53,7 @@ int sr_raid6_create(struct sr_discipline *, struct bioc_createraid *,
int, int64_t);
int sr_raid6_assemble(struct sr_discipline *, struct bioc_createraid *,
int, void *);
+int sr_raid6_init(struct sr_discipline *);
int sr_raid6_alloc_resources(struct sr_discipline *);
int sr_raid6_free_resources(struct sr_discipline *);
int sr_raid6_rw(struct sr_workunit *);
@@ -127,21 +128,31 @@ sr_raid6_create(struct sr_discipline *sd, struct bioc_createraid *bc,
* XXX add variable strip size later even though MAXPHYS is really
* the clever value, users like * to tinker with that type of stuff.
*/
- sd->sd_meta->ssdi.ssd_strip_size = MAXPHYS;
- sd->sd_meta->ssdi.ssd_size = (coerced_size &
+ sd->sd_meta->ssdi.ssd_strip_size = MAXPHYS;
+ sd->sd_meta->ssdi.ssd_size = (coerced_size &
~((sd->sd_meta->ssdi.ssd_strip_size >> DEV_BSHIFT) - 1)) *
(no_chunk - 2);
- /* only if stripsize <= MAXPHYS */
- sd->sd_max_ccb_per_wu = max(6, 2 * no_chunk);
-
- return 0;
+ return sr_raid6_init(sd);
}
int
sr_raid6_assemble(struct sr_discipline *sd, struct bioc_createraid *bc,
int no_chunk, void *data)
{
+ return sr_raid6_init(sd);
+}
+
+int
+sr_raid6_init(struct sr_discipline *sd)
+{
+ /* Initialise runtime values. */
+ sd->mds.mdd_raid6.sr6_strip_bits =
+ sr_validate_stripsize(sd->sd_meta->ssdi.ssd_strip_size);
+ if (sd->mds.mdd_raid6.sr6_strip_bits == -1) {
+ sr_error(sd->sd_sc, "invalid strip size");
+ return EINVAL;
+ }
/* only if stripsize <= MAXPHYS */
sd->sd_max_ccb_per_wu = max(6, 2 * sd->sd_meta->ssdi.ssd_chunk_no);
@@ -168,12 +179,6 @@ sr_raid6_alloc_resources(struct sr_discipline *sd)
if (sr_ccb_alloc(sd))
goto bad;
- /* setup runtime values */
- sd->mds.mdd_raid6.sr6_strip_bits =
- sr_validate_stripsize(sd->sd_meta->ssdi.ssd_strip_size);
- if (sd->mds.mdd_raid6.sr6_strip_bits == -1)
- goto bad;
-
rv = 0;
bad:
return (rv);
@@ -395,7 +400,7 @@ die:
/* modes:
* readq: sr_raid6_addio(i, lba, length, NULL, SCSI_DATA_IN,
- * SR_CCBF_FREEBUF, qbuf, NULL, 0);
+ * SR_CCBF_FREEBUF, qbuf, NULL, 0);
* readp: sr_raid6_addio(i, lba, length, NULL, SCSI_DATA_IN,
* SR_CCBF_FREEBUF, pbuf, NULL, 0);
* readx: sr_raid6_addio(i, lba, length, NULL, SCSI_DATA_IN,
@@ -413,7 +418,7 @@ sr_raid6_rw(struct sr_workunit *wu)
daddr64_t blk, lbaoffs, strip_no, chunk, qchunk, pchunk, fchunk;
daddr64_t strip_size, no_chunk, lba, chunk_offs, phys_offs;
daddr64_t strip_bits, length, strip_offs, datalen, row_size;
- void *pbuf, *data, *qbuf;
+ void *pbuf, *data, *qbuf;
/* blk and scsi error will be handled by sr_validate_io */
if (sr_validate_io(wu, &blk, "sr_raid6_rw"))
diff --git a/sys/dev/softraid_raidp.c b/sys/dev/softraid_raidp.c
index 28e9a10e6ea..86179ec02b0 100644
--- a/sys/dev/softraid_raidp.c
+++ b/sys/dev/softraid_raidp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid_raidp.c,v 1.38 2013/03/30 14:41:37 jsing Exp $ */
+/* $OpenBSD: softraid_raidp.c,v 1.39 2013/03/31 10:41:16 jsing Exp $ */
/*
* Copyright (c) 2009 Marco Peereboom <marco@peereboom.us>
* Copyright (c) 2009 Jordan Hargrave <jordan@openbsd.org>
@@ -49,6 +49,7 @@ int sr_raidp_create(struct sr_discipline *, struct bioc_createraid *,
int, int64_t);
int sr_raidp_assemble(struct sr_discipline *, struct bioc_createraid *,
int, void *);
+int sr_raidp_init(struct sr_discipline *);
int sr_raidp_alloc_resources(struct sr_discipline *);
int sr_raidp_free_resources(struct sr_discipline *);
int sr_raidp_rw(struct sr_workunit *);
@@ -110,13 +111,26 @@ sr_raidp_create(struct sr_discipline *sd, struct bioc_createraid *bc,
~((sd->sd_meta->ssdi.ssd_strip_size >> DEV_BSHIFT) - 1)) *
(no_chunk - 1);
- return 0;
+ return sr_raidp_init(sd);
}
int
sr_raidp_assemble(struct sr_discipline *sd, struct bioc_createraid *bc,
int no_chunk, void *data)
{
+ return sr_raidp_init(sd);
+}
+
+int
+sr_raidp_init(struct sr_discipline *sd)
+{
+ /* Initialise runtime values. */
+ sd->mds.mdd_raidp.srp_strip_bits =
+ sr_validate_stripsize(sd->sd_meta->ssdi.ssd_strip_size);
+ if (sd->mds.mdd_raidp.srp_strip_bits == -1) {
+ sr_error(sd->sd_sc, "invalid strip size");
+ return EINVAL;
+ }
return 0;
}
@@ -140,12 +154,6 @@ sr_raidp_alloc_resources(struct sr_discipline *sd)
if (sr_ccb_alloc(sd))
goto bad;
- /* setup runtime values */
- sd->mds.mdd_raidp.srp_strip_bits =
- sr_validate_stripsize(sd->sd_meta->ssdi.ssd_strip_size);
- if (sd->mds.mdd_raidp.srp_strip_bits == -1)
- goto bad;
-
rv = 0;
bad:
return (rv);