diff options
author | 2008-02-05 16:15:35 +0000 | |
---|---|---|
committer | 2008-02-05 16:15:35 +0000 | |
commit | 4ce7339fa966e8df59a5107a67d1274ec9d4816a (patch) | |
tree | d5c01ab14760daf56bbc702187814177e9caaba0 | |
parent | Change the method of identifying server connections to hide from (diff) | |
download | wireguard-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.c | 59 | ||||
-rw-r--r-- | sys/dev/softraid_crypto.c | 53 | ||||
-rw-r--r-- | sys/dev/softraid_raid0.c | 47 | ||||
-rw-r--r-- | sys/dev/softraid_raid1.c | 46 | ||||
-rw-r--r-- | sys/dev/softraidvar.h | 4 |
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 *); |