Index | Thread | Search

From:
ASOU Masato <takeasou.masato@gmail.com>
Subject:
Close the existing keydisk.img.
To:
tech@openbsd.org
Cc:
YASUOKA Masahiko <yasuoka@openbsd.org>, Masato ASOU <takeasou.masato@gmail.com>
Date:
Mon, 9 Feb 2026 16:07:29 +0900

Download raw body.

Thread
  • ASOU Masato:

    Close the existing keydisk.img.

Hi,

When I run the make command in regress/usr.sbin/install for the
second time, vnd2 fails to be unconfigured.  The problem does not
occur if the make clean command is run (to delete keydisk.img) before
the second time.

If keydisk.img was generatad with the dd command during the first
run, softraid_crypto.c: sr_crypto_create_key_disk() execute
VOP_CLOSE("vnd2").  However, if keydisk.img from the previous run
still exists, softraid_crypto.c: sr_crypto_read_key_disk() does not
execute VOP_CLOSE("vnd2").

The patch is included at the end of this email.


The below is first time and vnd2 success to be unconfigured.

    $ cd /usr/src/regress/usr.sbin/installboot
    $ doas make
    doas (asou@obsd78-vnconfig.example.co.jp) password:
    ==== create-root ====
    dd if=/dev/zero  of=disk1.img bs=1m count=0 seek=768 status=none
    vnconfig -- disk1.img 1>diskdev1.txt
    fdisk -gy -b 532480 -- "$(<diskdev1.txt)" 1>/dev/null
    echo 'RAID *' |  disklabel -wAT- -- "$(<diskdev1.txt)" 1>/dev/null
    dd if=/dev/zero  of=disk2.img bs=1m count=0 seek=768 status=none
    vnconfig -- disk2.img 1>diskdev2.txt
    fdisk -gy -b 532480 -- "$(<diskdev2.txt)" 1>/dev/null
    echo 'RAID *' |  disklabel -wAT- -- "$(<diskdev2.txt)" 1>/dev/null
    dd if=/dev/zero  of=keydisk.img bs=1m count=0 seek=768 status=none
    vnconfig -- keydisk.img 1>keydev.txt
    fdisk -gy -b 532480 -- "$(<keydev.txt)" 1>/dev/null
    echo 'RAID *' |  disklabel -wAT- -- "$(<keydev.txt)" 1>/dev/null
    bioctl -l"$(sed -- s/$/a/ diskdev1.txt diskdev2.txt | paste -sd,
-- -)"  -c1C -k"$(<keydev.txt)"a -- softraid0 |  grep -o --
'sd[0-9]*$' 1>rootdev.txt
    fdisk -gy -b 532480 -- "$(<rootdev.txt)" 1>/dev/null
    disklabel -Aw -- "$(<rootdev.txt)"
    newfs -q -- "$(<rootdev.txt)"a 1>/dev/null
    newfs: reduced number of fragments per cylinder group from 31696
to 31432 to enlarge last cylinder group
    mkdir -p -- mnt
    mount -- /dev/"$(<rootdev.txt)"a mnt
    mkdir -- mnt/usr
    cp -r -- /usr/mdec mnt/usr/

    ==== prepare ====
    /usr/sbin/installboot -p -- "$(<rootdev.txt)"

    ==== dry-prepare ====
    /usr/sbin/installboot -n -p -- "$(<rootdev.txt)"

    ==== dry-default ====
    /usr/sbin/installboot -n -- "$(<rootdev.txt)"

    ==== dry-root ====
    /usr/sbin/installboot -n -r/ -- "$(<rootdev.txt)"

    ==== root ====
    /usr/sbin/installboot -r mnt -- "$(<rootdev.txt)"

    ==== root-stages ====
    /usr/sbin/installboot -- "$(<rootdev.txt)" /usr/mdec/biosboot /usr/mdec/boot

    ==== dry-prepare-root ====
    /usr/sbin/installboot -n -p -r/ -- "$(<rootdev.txt)" 2>/dev/null
    *** Error 1 in . (Makefile:142 'dry-prepare-root')
    EXPECTED_FAIL

    ==== dry-prepare-stages ====
    /usr/sbin/installboot -n -p -- "$(<rootdev.txt)"
/usr/mdec/biosboot /usr/mdec/boot 2>/dev/null
    *** Error 1 in . (Makefile:144 'dry-prepare-stages')
    EXPECTED_FAIL

    ==== dry-nodisk-stages ====
    /usr/sbin/installboot -n -- /usr/mdec/biosboot /usr/mdec/boot 2>/dev/null
    *** Error 1 in . (Makefile:147 'dry-nodisk-stages')
    EXPECTED_FAIL

    ==== dry-toofew ====
    /usr/sbin/installboot -n -- 2>/dev/null
    *** Error 1 in . (Makefile:150 'dry-toofew')
    EXPECTED_FAIL

    ==== dry-toomany ====
    /usr/sbin/installboot -n -- disk stage1 stage2 too many 2>/dev/null
    *** Error 1 in . (Makefile:152 'dry-toomany')
    EXPECTED_FAIL

    ==== cleanup ====
    umount -- mnt 2>/dev/null
    rmdir -- mnt 2>/dev/null
    bioctl -d -- "$(<rootdev.txt)" 2>/dev/null
    vnconfig -u -- "$(<diskdev1.txt)" 2>/dev/null
    vnconfig -u -- "$(<diskdev2.txt)" 2>/dev/null
    vnconfig -u -- "$(<keydev.txt)" 2>/dev/null

    $ doas vnconfig -l
    vnd0: not in use
    vnd1: not in use
    vnd2: not in use
    vnd3: not in use
    $

The above seems fine.

However, when I run the make command again, vnd2 fails to be
unconfigured.

    $ doas make
    ==== create-root ====
    dd if=/dev/zero  of=disk1.img bs=1m count=0 seek=768 status=none
    vnconfig -- disk1.img 1>diskdev1.txt
    fdisk -gy -b 532480 -- "$(<diskdev1.txt)" 1>/dev/null
    echo 'RAID *' |  disklabel -wAT- -- "$(<diskdev1.txt)" 1>/dev/null
    dd if=/dev/zero  of=disk2.img bs=1m count=0 seek=768 status=none
    vnconfig -- disk2.img 1>diskdev2.txt
    fdisk -gy -b 532480 -- "$(<diskdev2.txt)" 1>/dev/null
    echo 'RAID *' |  disklabel -wAT- -- "$(<diskdev2.txt)" 1>/dev/null
    dd if=/dev/zero  of=keydisk.img bs=1m count=0 seek=768 status=none
    vnconfig -- keydisk.img 1>keydev.txt
    fdisk -gy -b 532480 -- "$(<keydev.txt)" 1>/dev/null
    echo 'RAID *' |  disklabel -wAT- -- "$(<keydev.txt)" 1>/dev/null
    bioctl -l"$(sed -- s/$/a/ diskdev1.txt diskdev2.txt | paste -sd,
-- -)"  -c1C -k"$(<keydev.txt)"a -- softraid0 |  grep -o --
'sd[0-9]*$' 1>rootdev.txt
    fdisk -gy -b 532480 -- "$(<rootdev.txt)" 1>/dev/null
    disklabel -Aw -- "$(<rootdev.txt)"
    newfs -q -- "$(<rootdev.txt)"a 1>/dev/null
    newfs: reduced number of fragments per cylinder group from 31696
to 31432 to enlarge last cylinder group
    mkdir -p -- mnt
    mount -- /dev/"$(<rootdev.txt)"a mnt
    mkdir -- mnt/usr
    cp -r -- /usr/mdec mnt/usr/

    ==== prepare ====
    /usr/sbin/installboot -p -- "$(<rootdev.txt)"

    ==== dry-prepare ====
    /usr/sbin/installboot -n -p -- "$(<rootdev.txt)"

    ==== dry-default ====
    /usr/sbin/installboot -n -- "$(<rootdev.txt)"

    ==== dry-root ====
    /usr/sbin/installboot -n -r/ -- "$(<rootdev.txt)"

    ==== root ====
    /usr/sbin/installboot -r mnt -- "$(<rootdev.txt)"

    ==== root-stages ====
    /usr/sbin/installboot -- "$(<rootdev.txt)" /usr/mdec/biosboot /usr/mdec/boot

    ==== dry-prepare-root ====
    /usr/sbin/installboot -n -p -r/ -- "$(<rootdev.txt)" 2>/dev/null
    *** Error 1 in . (Makefile:142 'dry-prepare-root')
    EXPECTED_FAIL

    ==== dry-prepare-stages ====
    /usr/sbin/installboot -n -p -- "$(<rootdev.txt)"
/usr/mdec/biosboot /usr/mdec/boot 2>/dev/null
    *** Error 1 in . (Makefile:144 'dry-prepare-stages')
    EXPECTED_FAIL

    ==== dry-nodisk-stages ====
    /usr/sbin/installboot -n -- /usr/mdec/biosboot /usr/mdec/boot 2>/dev/null
    *** Error 1 in . (Makefile:147 'dry-nodisk-stages')
    EXPECTED_FAIL

    ==== dry-toofew ====
    /usr/sbin/installboot -n -- 2>/dev/null
    *** Error 1 in . (Makefile:150 'dry-toofew')
    EXPECTED_FAIL

    ==== dry-toomany ====
    /usr/sbin/installboot -n -- disk stage1 stage2 too many 2>/dev/null
    *** Error 1 in . (Makefile:152 'dry-toomany')
    EXPECTED_FAIL

    ==== cleanup ====
    umount -- mnt 2>/dev/null
    rmdir -- mnt 2>/dev/null
    bioctl -d -- "$(<rootdev.txt)" 2>/dev/null
    vnconfig -u -- "$(<diskdev1.txt)" 2>/dev/null
    vnconfig -u -- "$(<diskdev2.txt)" 2>/dev/null
    vnconfig -u -- "$(<keydev.txt)" 2>/dev/null
    *** Error 1 in target 'cleanup' (ignored)

    $ doas vnconfig -l
    vnd0: not in use
    vnd1: not in use
    vnd2: covering keydisk.img on sd0f, inode 77924
    vnd3: not in use
    $

comment? ok?
--
ASOU Masato

diff --git a/sys/dev/softraid_crypto.c b/sys/dev/softraid_crypto.c
index 6e24f2ff4f5..8e52701e5f9 100644
--- a/sys/dev/softraid_crypto.c
+++ b/sys/dev/softraid_crypto.c
@@ -837,7 +837,7 @@ sr_crypto_read_key_disk(struct sr_discipline *sd,
struct sr_crypto *mdd_crypto,
                vput(vn);
                goto done;
        }
-       open = 1; /* close dev on error */
+       open = 1;

        /* Get partition details. */
        label = malloc(sizeof(*label), M_DEVBUF, M_WAITOK);
@@ -900,8 +900,6 @@ sr_crypto_read_key_disk(struct sr_discipline *sd,
struct sr_crypto *mdd_crypto,
                }
        }

-       open = 0;
-
 done:
        for (omi = SLIST_FIRST(&som); omi != NULL; omi = omi_next) {
                omi_next = SLIST_NEXT(omi, omi_link);