Re: zfs and device name changes

Stephen Borrill <[email protected]> Fri, 27 Mar 2026 12:38:30 +0000 (GMT)
Newsgroups gmane.os.netbsd.devel.kernel
Message-ID <Pine.NEB.4.64.2603271223340.2896@ugly>
On Fri, 27 Mar 2026, Stephen Borrill wrote:
> On Fri, 27 Mar 2026, Takashi YAMAMOTO wrote:
>> hi,
>> 
>> On Thu, Mar 26, 2026 at 12:41 PM Taylor R Campbell <[email protected]> 
>> wrote:
>>> 
>>>> Date: Tue, 24 Mar 2026 09:14:37 +0900
>>>> From: Takashi YAMAMOTO <[email protected]>
>>>> 
>>>> the attached patch is my attempt to make zfs a bit more robust against
>>>> device name changes.
>>>> the identical patch is available at github too:
>>>> https://github.com/yamt/netbsd-src/commit/32283c2e362034301c3da218a05849c04ee20c2a
>>>> 
>>>> while it seems working as far as i tested, i'd be happy if someone can 
>>>> review it
>>>> as my knowledge of zfs (well, and recent netbsd in general) is weak.
>>> 
>>> I don't understand why all this new code is needed.  Doesn't zfs
>>> already have logic to scan all disks/partitions/wedges and find the
>>> vdevs by guid?
>> 
>> which code are you talking about?
>> it's entirely possible i'm missing something as i'm new to the code base.
>> 
>>> 
>>> I am under the impression that /etc/zfs/zpool.cache may bypass the
>>> scan so this doesn't work in some circumstances, but in my years of
>>> using zfs on various machines with frequent device renumbering of cgd
>>> volumes and dkN wedges, I have never encountered this type of trouble
>>> myself, and I'm not sure what I'm doing differently.
>> 
>> do you mean zfs finds vdevs after renumbering without zpool import?
>> it doesn't match my experience.
>> without this patch, i had to use zpool export/import after:
>> - modify gpt in a way affecting dk numbering
>> - swapping qemu disk images
>
> Naively:
>
> # zpool create tank mirror xbd2 xbd3 mirror xbd4 xbd5
> # zpool status
>  pool: tank
> state: ONLINE
>  scan: none requested
> config:
>
>        NAME        STATE     READ WRITE CKSUM
>        tank        ONLINE       0     0     0
>          mirror-0  ONLINE       0     0     0
>            xbd2    ONLINE       0     0     0
>            xbd3    ONLINE       0     0     0
>          mirror-1  ONLINE       0     0     0
>            xbd4    ONLINE       0     0     0
>            xbd5    ONLINE       0     0     0
>
> errors: No known data errors
> # halt -p
>
> ** Remove xbd1 to simulate failed/disconnected disk
> ** means xbd2 -> xbd1, xbd3 -> xbd2, etc.
>
> After boot:
>
> # zpool status
>  pool: tank
> state: UNAVAIL
> status: One or more devices could not be opened.  There are insufficient
>        replicas for the pool to continue functioning.
> action: Attach the missing device and online it using 'zpool online'.
>   see: http://illumos.org/msg/ZFS-8000-3C
>  scan: none requested
> config:
>
>        NAME                     STATE     READ WRITE CKSUM
>        tank                     UNAVAIL      0     0     0
>          mirror-0               UNAVAIL      0     0     0
>            6289893268167966748  FAULTED      0     0     0  was /dev/xbd2
>            4017376292647041077  FAULTED      0     0     0  was /dev/xbd3
>          mirror-1               UNAVAIL      0     0     0
>            4378765686596708079  FAULTED      0     0     0  was /dev/xbd4
>            6863498524284650610  UNAVAIL      0     0     0  was /dev/xbd5
>
> After yamt's patch:
>
> dmesg shows:
> ZFS WARNING: vdev guid mismatch for /dev/xbd2, actual 37c09674044d7835 
> expected 574a309a2445c01c
> ZFS: trying to find a vdev (/dev/xbd2) by guid 574a309a2445c01c
> ZFS WARNING: vdev guid mismatch for /dev/xbd3, actual 3cc48031384426ef 
> expected 37c09674044d7835
> ZFS: trying to find a vdev (/dev/xbd3) by guid 37c09674044d7835
> ZFS WARNING: vdev guid mismatch for /dev/xbd4, actual 5f400b8b20678472 
> expected 3cc48031384426ef
> ZFS: trying to find a vdev (/dev/xbd4) by guid 3cc48031384426ef
> ZFS: trying to find a vdev (/dev/xbd5) by guid 5f400b8b20678472
>
> # zpool status
>  pool: tank
> state: UNAVAIL
> status: One or more devices could not be opened.  There are insufficient
>        replicas for the pool to continue functioning.
> action: Attach the missing device and online it using 'zpool online'.
>   see: http://illumos.org/msg/ZFS-8000-3C
>  scan: none requested
> config:
>
>        NAME                     STATE     READ WRITE CKSUM
>        tank                     UNAVAIL      0     0     0
>          mirror-0               UNAVAIL      0     0     0
>            6289893268167966748  UNAVAIL      0     0     0  was /dev/xbd2
>            4017376292647041077  UNAVAIL      0     0     0  was /dev/xbd3
>          mirror-1               UNAVAIL      0     0     0
>            4378765686596708079  UNAVAIL      0     0     0  was /dev/xbd4
>            6863498524284650610  UNAVAIL      0     0     0  was /dev/xbd5

But after using export (to store in zpool.cache, I guess), import does 
work after a disk failure:

# zpool export tank
# zpool import tank
# halt -p

** Remove xbd1 to simulate failed/disconnected disk
** means xbd2 -> xbd1, xbd3 -> xbd2, etc.

# zpool status
   pool: tank
  state: UNAVAIL
status: One or more devices could not be opened.  There are insufficient
         replicas for the pool to continue functioning.
action: Attach the missing device and online it using 'zpool online'.
    see: http://illumos.org/msg/ZFS-8000-3C
   scan: none requested
config:

         NAME                     STATE     READ WRITE CKSUM
         tank                     UNAVAIL      0     0     0
           mirror-0               UNAVAIL      0     0     0
             6289893268167966748  UNAVAIL      0     0     0  was /dev/xbd2
             4017376292647041077  UNAVAIL      0     0     0  was /dev/xbd3
           mirror-1               UNAVAIL      0     0     0
             4378765686596708079  UNAVAIL      0     0     0  was /dev/xbd4
             6863498524284650610  UNAVAIL      0     0     0  was /dev/xbd5

# zpool import tank
cannot import 'tank': a pool with that name is already created/imported,
and no additional pools with that name were found
# zpool export tank
# zpool import tank
cannot import 'tank': pool may be in use from other system
use '-f' to import anyway
# zpool import -f tank
# zpool status
   pool: tank
  state: ONLINE
   scan: none requested
config:

         NAME        STATE     READ WRITE CKSUM
         tank        ONLINE       0     0     0
           mirror-0  ONLINE       0     0     0
             xbd1    ONLINE       0     0     0
             xbd2    ONLINE       0     0     0
           mirror-1  ONLINE       0     0     0
             xbd3    ONLINE       0     0     0
             xbd4    ONLINE       0     0     0

errors: No known data errors

-- 
Stephen