summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_disk.c
diff options
context:
space:
mode:
authorkrw <krw@openbsd.org>2015-08-31 15:47:51 +0000
committerkrw <krw@openbsd.org>2015-08-31 15:47:51 +0000
commitc28aa738316220f4ed05a3a3b50305e30f98c537 (patch)
tree1b2a5e1b8dcc696969fc9bbeb9328affaa0f80fc /sys/kern/subr_disk.c
parenttweak previous; (diff)
downloadwireguard-openbsd-c28aa738316220f4ed05a3a3b50305e30f98c537.tar.xz
wireguard-openbsd-c28aa738316220f4ed05a3a3b50305e30f98c537.zip
Abstract 5 identical code blocks into a readdisksector() function.
Cleaner, clearer and less error prone. Tested by bmercer@ as part of a larger diff, of which this is the last part. reads ok to jsing@ kettenis@. ok deraadt@.
Diffstat (limited to 'sys/kern/subr_disk.c')
-rw-r--r--sys/kern/subr_disk.c73
1 files changed, 31 insertions, 42 deletions
diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c
index b0ba7504eba..847fd1f7898 100644
--- a/sys/kern/subr_disk.c
+++ b/sys/kern/subr_disk.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: subr_disk.c,v 1.196 2015/08/31 14:02:36 krw Exp $ */
+/* $OpenBSD: subr_disk.c,v 1.197 2015/08/31 15:47:51 krw Exp $ */
/* $NetBSD: subr_disk.c,v 1.17 1996/03/16 23:17:08 christos Exp $ */
/*
@@ -103,6 +103,9 @@ struct disk_attach_task {
void disk_attach_callback(void *);
+int readdisksector(struct buf *, void (*)(struct buf *), struct disklabel *,
+ u_int64_t);
+
/*
* Compute checksum for disk label.
*/
@@ -291,6 +294,24 @@ checkdisklabel(void *rlp, struct disklabel *lp, u_int64_t boundstart,
}
/*
+ * Read a disk sector.
+ */
+int
+readdisksector(struct buf *bp, void (*strat)(struct buf *),
+ struct disklabel *lp, u_int64_t sector)
+{
+ bp->b_blkno = DL_SECTOBLK(lp, sector);
+ bp->b_bcount = lp->d_secsize;
+ bp->b_error = 0;
+ CLR(bp->b_flags, B_READ | B_WRITE | B_DONE | B_ERROR);
+ SET(bp->b_flags, B_BUSY | B_READ | B_RAW);
+
+ (*strat)(bp);
+
+ return (biowait(bp));
+}
+
+/*
* If dos partition table requested, attempt to load it and
* find disklabel inside a DOS partition. Return buffer
* for use in signalling errors if requested.
@@ -328,13 +349,7 @@ readdoslabel(struct buf *bp, void (*strat)(struct buf *),
sector = extoff;
/* read MBR/EBR */
- bp->b_blkno = DL_SECTOBLK(lp, sector);
- bp->b_bcount = lp->d_secsize;
- bp->b_error = 0; /* B_ERROR and b_error may have stale data. */
- CLR(bp->b_flags, B_READ | B_WRITE | B_DONE | B_ERROR);
- SET(bp->b_flags, B_BUSY | B_READ | B_RAW);
- (*strat)(bp);
- error = biowait(bp);
+ error = readdisksector(bp, strat, lp, sector);
if (error) {
/*wrong*/ if (partoffp)
/*wrong*/ *partoffp = -1;
@@ -526,14 +541,9 @@ notfat:
if (spoofonly)
return (0);
- bp->b_blkno = DL_SECTOBLK(lp, dospartoff + DL_BLKTOSEC(lp,
- DOS_LABELSECTOR));
- bp->b_bcount = lp->d_secsize;
- bp->b_error = 0; /* B_ERROR and b_error may have stale data. */
- CLR(bp->b_flags, B_READ | B_WRITE | B_DONE | B_ERROR);
- SET(bp->b_flags, B_BUSY | B_READ | B_RAW);
- (*strat)(bp);
- if (biowait(bp))
+ error = readdisksector(bp, strat, lp, dospartoff +
+ DL_BLKTOSEC(lp, DOS_LABELSECTOR));
+ if (error)
return (bp->b_error);
offset = DL_BLKOFFSET(lp, DOS_LABELSECTOR);
@@ -652,15 +662,7 @@ readgptlabel(struct buf *bp, void (*strat)(struct buf *),
uint32_t ghpartnum;
uint32_t ghpartspersec;
- /* read header record */
- bp->b_blkno = DL_SECTOBLK(lp, sector);
- bp->b_bcount = lp->d_secsize;
- bp->b_error = 0; /* B_ERROR and b_error may have stale data. */
- CLR(bp->b_flags, B_READ | B_WRITE | B_DONE | B_ERROR);
- SET(bp->b_flags, B_BUSY | B_READ | B_RAW);
- (*strat)(bp);
- error = biowait(bp);
-
+ error = readdisksector(bp, strat, lp, sector);
if (error) {
DPRINTF("error reading from disk\n");
/*wrong*/ if (partoffp)
@@ -739,15 +741,7 @@ readgptlabel(struct buf *bp, void (*strat)(struct buf *),
*/
sector = letoh64(gh.gh_part_lba);
for (i = 0; i < ghpartnum / ghpartspersec; i++, sector++) {
- /* read partition record */
- bp->b_blkno = DL_SECTOBLK(lp, sector);
- bp->b_bcount = lp->d_secsize;
- /* B_ERROR and b_error may have stale data. */
- bp->b_error = 0;
- CLR(bp->b_flags, B_READ | B_WRITE | B_DONE | B_ERROR);
- SET(bp->b_flags, B_BUSY | B_READ | B_RAW);
- (*strat)(bp);
- error = biowait(bp);
+ error = readdisksector(bp, strat, lp, sector);
if (error) {
/*wrong*/ if (partoffp)
/*wrong*/ *partoffp = -1;
@@ -840,14 +834,9 @@ readgptlabel(struct buf *bp, void (*strat)(struct buf *),
if (spoofonly)
return (0);
- bp->b_blkno = DL_SECTOBLK(lp, gptpartoff + DL_BLKTOSEC(lp,
- DOS_LABELSECTOR));
- bp->b_bcount = lp->d_secsize;
- bp->b_error = 0; /* B_ERROR and b_error may have stale data. */
- CLR(bp->b_flags, B_READ | B_WRITE | B_DONE | B_ERROR);
- SET(bp->b_flags, B_BUSY | B_READ | B_RAW);
- (*strat)(bp);
- if (biowait(bp))
+ error = readdisksector(bp, strat, lp, gptpartoff +
+ DL_BLKTOSEC(lp, DOS_LABELSECTOR));
+ if (error)
return (bp->b_error);
offset = DL_BLKOFFSET(lp, DOS_LABELSECTOR);