summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarco <marco@openbsd.org>2008-02-05 16:15:35 +0000
committermarco <marco@openbsd.org>2008-02-05 16:15:35 +0000
commit4ce7339fa966e8df59a5107a67d1274ec9d4816a (patch)
treed5c01ab14760daf56bbc702187814177e9caaba0
parentChange the method of identifying server connections to hide from (diff)
downloadwireguard-openbsd-4ce7339fa966e8df59a5107a67d1274ec9d4816a.tar.xz
wireguard-openbsd-4ce7339fa966e8df59a5107a67d1274ec9d4816a.zip
Create a generic function to validate IO instead of copying and pasting
same code in all disciplines. This shaves of a few bytes. crypto 3185 -> 2690 raid 0 2843 -> 2378 raid 1 3474 -> 2689
-rw-r--r--sys/dev/softraid.c59
-rw-r--r--sys/dev/softraid_crypto.c53
-rw-r--r--sys/dev/softraid_raid0.c47
-rw-r--r--sys/dev/softraid_raid1.c46
-rw-r--r--sys/dev/softraidvar.h4
5 files changed, 70 insertions, 139 deletions
diff --git a/sys/dev/softraid.c b/sys/dev/softraid.c
index ae42039372c..58f6ca8d485 100644
--- a/sys/dev/softraid.c
+++ b/sys/dev/softraid.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid.c,v 1.98 2008/02/03 00:25:21 marco Exp $ */
+/* $OpenBSD: softraid.c,v 1.99 2008/02/05 16:15:35 marco Exp $ */
/*
* Copyright (c) 2007 Marco Peereboom <marco@peereboom.us>
*
@@ -2171,6 +2171,63 @@ sr_shutdown(void *arg)
sr_shutdown_discipline(sd);
}
+int
+sr_validate_io(struct sr_workunit *wu, daddr64_t *blk, char *func)
+{
+ struct sr_discipline *sd = wu->swu_dis;
+ struct scsi_xfer *xs = wu->swu_xs;
+ int rv = 1;
+
+ DNPRINTF(SR_D_DIS, "%s: %s 0x%02x\n", DEVNAME(sd->sd_sc), func,
+ xs->cmd->opcode);
+
+ if (sd->sd_vol.sv_meta.svm_status == BIOC_SVOFFLINE) {
+ DNPRINTF(SR_D_DIS, "%s: %s device offline\n",
+ DEVNAME(sd->sd_sc));
+ goto bad;
+ }
+
+ if (xs->datalen == 0) {
+ printf("%s: %s: illegal block count\n",
+ DEVNAME(sd->sd_sc), func, sd->sd_vol.sv_meta.svm_devname);
+ goto bad;
+ }
+
+ if (xs->cmdlen == 10)
+ *blk = _4btol(((struct scsi_rw_big *)xs->cmd)->addr);
+ else if (xs->cmdlen == 16)
+ *blk = _8btol(((struct scsi_rw_16 *)xs->cmd)->addr);
+ else if (xs->cmdlen == 6)
+ *blk = _3btol(((struct scsi_rw *)xs->cmd)->addr);
+ else {
+ printf("%s: %s: illegal cmdlen\n", DEVNAME(sd->sd_sc), func,
+ sd->sd_vol.sv_meta.svm_devname);
+ goto bad;
+ }
+
+ wu->swu_blk_start = *blk;
+ wu->swu_blk_end = *blk + (xs->datalen >> DEV_BSHIFT) - 1;
+
+ if (wu->swu_blk_end > sd->sd_vol.sv_meta.svm_size) {
+ DNPRINTF(SR_D_DIS, "%s: %s out of bounds start: %lld "
+ "end: %lld length: %d\n",
+ DEVNAME(sd->sd_sc), func, wu->swu_blk_start,
+ wu->swu_blk_end, xs->datalen);
+
+ sd->sd_scsi_sense.error_code = SSD_ERRCODE_CURRENT |
+ SSD_ERRCODE_VALID;
+ sd->sd_scsi_sense.flags = SKEY_ILLEGAL_REQUEST;
+ sd->sd_scsi_sense.add_sense_code = 0x21;
+ sd->sd_scsi_sense.add_sense_code_qual = 0x00;
+ sd->sd_scsi_sense.extra_len = 4;
+ goto bad;
+ }
+
+ rv = 0;
+bad:
+ return (rv);
+}
+
#ifndef SMALL_KERNEL
int
sr_create_sensors(struct sr_discipline *sd)
diff --git a/sys/dev/softraid_crypto.c b/sys/dev/softraid_crypto.c
index 3a54a3604cf..44629f93879 100644
--- a/sys/dev/softraid_crypto.c
+++ b/sys/dev/softraid_crypto.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid_crypto.c,v 1.6 2008/01/31 20:55:43 marco Exp $ */
+/* $OpenBSD: softraid_crypto.c,v 1.7 2008/02/05 16:15:35 marco Exp $ */
/*
* Copyright (c) 2007 Ted Unangst <tedu@openbsd.org>
* Copyright (c) 2008 Marco Peereboom <marco@openbsd.org>
@@ -242,60 +242,13 @@ sr_crypto_rw2(struct sr_workunit *wu, struct cryptop *crp)
struct scsi_xfer *xs = wu->swu_xs;
struct sr_workunit *wup;
struct sr_ccb *ccb;
- struct sr_chunk *scp;
struct uio *uio;
int s;
daddr64_t blk;
- DNPRINTF(SR_D_DIS, "%s: sr_crypto_rw2 wu: %p\n",
- DEVNAME(sd->sd_sc), wu);
-
- if (sd->sd_vol.sv_meta.svm_status != BIOC_SVONLINE) {
- DNPRINTF(SR_D_DIS, "%s: sr_crypto_rw2 device offline\n",
- DEVNAME(sd->sd_sc));
- goto bad;
- }
- scp = sd->sd_vol.sv_chunks[0];
- if (scp->src_meta.scm_status != BIOC_SDONLINE) {
- DNPRINTF(SR_D_DIS, "%s: sr_crypto_rw2 disk offline\n",
- DEVNAME(sd->sd_sc));
- goto bad;
- }
-
- if (xs->datalen == 0) {
- printf("%s: %s: illegal block count\n",
- DEVNAME(sd->sd_sc), sd->sd_vol.sv_meta.svm_devname);
- goto bad;
- }
-
- if (xs->cmdlen == 10)
- blk = _4btol(((struct scsi_rw_big *)xs->cmd)->addr);
- else if (xs->cmdlen == 16)
- blk = _8btol(((struct scsi_rw_16 *)xs->cmd)->addr);
- else if (xs->cmdlen == 6)
- blk = _3btol(((struct scsi_rw *)xs->cmd)->addr);
- else {
- printf("%s: %s: illegal cmdlen\n", DEVNAME(sd->sd_sc),
- sd->sd_vol.sv_meta.svm_devname);
+ /* blk and scsi error will be handled by sr_validate_io */
+ if (sr_validate_io(wu, &blk, "sr_crypto_rw2"))
goto bad;
- }
-
- wu->swu_blk_start = blk;
- wu->swu_blk_end = blk + (xs->datalen >> 9) - 1;
-
- if (wu->swu_blk_end > sd->sd_vol.sv_meta.svm_size) {
- DNPRINTF(SR_D_DIS, "%s: sr_crypto_rw2 out of bounds "
- "start: %lld end: %lld length: %d\n", wu->swu_blk_start,
- wu->swu_blk_end, xs->datalen);
-
- sd->sd_scsi_sense.error_code = SSD_ERRCODE_CURRENT |
- SSD_ERRCODE_VALID;
- sd->sd_scsi_sense.flags = SKEY_ILLEGAL_REQUEST;
- sd->sd_scsi_sense.add_sense_code = 0x21;
- sd->sd_scsi_sense.add_sense_code_qual = 0x00;
- sd->sd_scsi_sense.extra_len = 4;
- goto bad;
- }
/* calculate physical block */
blk += SR_META_SIZE + SR_META_OFFSET;
diff --git a/sys/dev/softraid_raid0.c b/sys/dev/softraid_raid0.c
index 0afbaa5fbce..97833c47bdd 100644
--- a/sys/dev/softraid_raid0.c
+++ b/sys/dev/softraid_raid0.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid_raid0.c,v 1.6 2008/01/26 19:23:07 marco Exp $ */
+/* $OpenBSD: softraid_raid0.c,v 1.7 2008/02/05 16:15:35 marco Exp $ */
/*
* Copyright (c) 2008 Marco Peereboom <marco@peereboom.us>
*
@@ -212,50 +212,9 @@ sr_raid0_rw(struct sr_workunit *wu)
daddr64_t strip_bits, length, leftover;
u_int8_t *data;
- DNPRINTF(SR_D_DIS, "%s: sr_raid0_rw 0x%02x\n", DEVNAME(sd->sd_sc),
- xs->cmd->opcode);
-
- if (sd->sd_vol.sv_meta.svm_status == BIOC_SVOFFLINE) {
- DNPRINTF(SR_D_DIS, "%s: sr_raid0_rw device offline\n",
- DEVNAME(sd->sd_sc));
- goto bad;
- }
-
- if (xs->datalen == 0) {
- printf("%s: %s: illegal block count\n",
- DEVNAME(sd->sd_sc), sd->sd_vol.sv_meta.svm_devname);
+ /* blk and scsi error will be handled by sr_validate_io */
+ if (sr_validate_io(wu, &blk, "sr_raid0_rw"))
goto bad;
- }
-
- if (xs->cmdlen == 10)
- blk = _4btol(((struct scsi_rw_big *)xs->cmd)->addr);
- else if (xs->cmdlen == 16)
- blk = _8btol(((struct scsi_rw_16 *)xs->cmd)->addr);
- else if (xs->cmdlen == 6)
- blk = _3btol(((struct scsi_rw *)xs->cmd)->addr);
- else {
- printf("%s: %s: illegal cmdlen\n", DEVNAME(sd->sd_sc),
- sd->sd_vol.sv_meta.svm_devname);
- goto bad;
- }
-
- wu->swu_blk_start = blk;
- wu->swu_blk_end = blk + (xs->datalen >> DEV_BSHIFT) - 1;
-
- if (wu->swu_blk_end > sd->sd_vol.sv_meta.svm_size) {
- DNPRINTF(SR_D_DIS, "%s: sr_raid0_rw out of bounds start: %lld "
- "end: %lld length: %d\n",
- DEVNAME(sd->sd_sc), wu->swu_blk_start, wu->swu_blk_end,
- xs->datalen);
-
- sd->sd_scsi_sense.error_code = SSD_ERRCODE_CURRENT |
- SSD_ERRCODE_VALID;
- sd->sd_scsi_sense.flags = SKEY_ILLEGAL_REQUEST;
- sd->sd_scsi_sense.add_sense_code = 0x21;
- sd->sd_scsi_sense.add_sense_code_qual = 0x00;
- sd->sd_scsi_sense.extra_len = 4;
- goto bad;
- }
strip_size = sd->sd_vol.sv_meta.svm_strip_size;
strip_bits = sd->mds.mdd_raid0.sr0_strip_bits;
diff --git a/sys/dev/softraid_raid1.c b/sys/dev/softraid_raid1.c
index 933c5d57a54..430c9ed033c 100644
--- a/sys/dev/softraid_raid1.c
+++ b/sys/dev/softraid_raid1.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid_raid1.c,v 1.3 2008/01/24 19:58:08 marco Exp $ */
+/* $OpenBSD: softraid_raid1.c,v 1.4 2008/02/05 16:15:35 marco Exp $ */
/*
* Copyright (c) 2007 Marco Peereboom <marco@peereboom.us>
*
@@ -293,49 +293,9 @@ sr_raid1_rw(struct sr_workunit *wu)
int ios, x, i, s, rt;
daddr64_t blk;
- DNPRINTF(SR_D_DIS, "%s: sr_raid1_rw 0x%02x\n", DEVNAME(sd->sd_sc),
- xs->cmd->opcode);
-
- if (sd->sd_vol.sv_meta.svm_status == BIOC_SVOFFLINE) {
- DNPRINTF(SR_D_DIS, "%s: sr_raid1_rw device offline\n",
- DEVNAME(sd->sd_sc));
- goto bad;
- }
-
- if (xs->datalen == 0) {
- printf("%s: %s: illegal block count\n",
- DEVNAME(sd->sd_sc), sd->sd_vol.sv_meta.svm_devname);
- goto bad;
- }
-
- if (xs->cmdlen == 10)
- blk = _4btol(((struct scsi_rw_big *)xs->cmd)->addr);
- else if (xs->cmdlen == 16)
- blk = _8btol(((struct scsi_rw_16 *)xs->cmd)->addr);
- else if (xs->cmdlen == 6)
- blk = _3btol(((struct scsi_rw *)xs->cmd)->addr);
- else {
- printf("%s: %s: illegal cmdlen\n", DEVNAME(sd->sd_sc),
- sd->sd_vol.sv_meta.svm_devname);
+ /* blk and scsi error will be handled by sr_validate_io */
+ if (sr_validate_io(wu, &blk, "sr_raid1_rw"))
goto bad;
- }
-
- wu->swu_blk_start = blk;
- wu->swu_blk_end = blk + (xs->datalen >> 9) - 1;
-
- if (wu->swu_blk_end > sd->sd_vol.sv_meta.svm_size) {
- DNPRINTF(SR_D_DIS, "%s: sr_raid1_rw out of bounds start: %lld "
- "end: %lld length: %d\n", wu->swu_blk_start,
- wu->swu_blk_end, xs->datalen);
-
- sd->sd_scsi_sense.error_code = SSD_ERRCODE_CURRENT |
- SSD_ERRCODE_VALID;
- sd->sd_scsi_sense.flags = SKEY_ILLEGAL_REQUEST;
- sd->sd_scsi_sense.add_sense_code = 0x21;
- sd->sd_scsi_sense.add_sense_code_qual = 0x00;
- sd->sd_scsi_sense.extra_len = 4;
- goto bad;
- }
/* calculate physical block */
blk += SR_META_SIZE + SR_META_OFFSET;
diff --git a/sys/dev/softraidvar.h b/sys/dev/softraidvar.h
index 214ea8ba901..34b65d29253 100644
--- a/sys/dev/softraidvar.h
+++ b/sys/dev/softraidvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraidvar.h,v 1.41 2008/02/03 00:25:21 marco Exp $ */
+/* $OpenBSD: softraidvar.h,v 1.42 2008/02/05 16:15:35 marco Exp $ */
/*
* Copyright (c) 2006 Marco Peereboom <marco@peereboom.us>
*
@@ -365,6 +365,8 @@ void sr_put_wu(struct sr_workunit *);
/* misc functions */
int32_t sr_validate_stripsize(u_int32_t);
void sr_save_metadata_callback(void *, void *);
+int sr_validate_io(struct sr_workunit *, daddr64_t *,
+ char *);
/* discipline functions */
int sr_raid_inquiry(struct sr_workunit *);