Re: zfs and device name changes
Stephen Borrill <[email protected]> Mon, 30 Mar 2026 12:13:08 +0100 (BST)
| Newsgroups | gmane.os.netbsd.devel.kernel |
|---|---|
| Message-ID | <Pine.NEB.4.64.2603301209580.2896@ugly> |
On Fri, 27 Mar 2026, Takashi YAMAMOTO wrote: > On Fri, Mar 27, 2026 at 9:17 PM Stephen Borrill <[email protected]> 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 > > my patch doesn't scan xbd disks as it wasn't included in the list. > (see device_is_eligible_for_vdev) > if you add it, it should be found. Indeed. I should have look at the patch more closely! After adding xbd to the list then, if I remove xbd1, 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: vdev 574a309a2445c01c found: xbd1 (bdev 142:1) ZFS WARNING: vdev guid mismatch for /dev/xbd3, actual 3cc48031384426ef expected 37c09674044d7835 ZFS: trying to find a vdev (/dev/xbd3) by guid 37c09674044d7835 ZFS: vdev 37c09674044d7835 found: xbd2 (bdev 142:2) ZFS WARNING: vdev guid mismatch for /dev/xbd4, actual 5f400b8b20678472 expected 3cc48031384426ef ZFS: trying to find a vdev (/dev/xbd4) by guid 3cc48031384426ef ZFS: vdev 3cc48031384426ef found: xbd3 (bdev 142:3) ZFS: trying to find a vdev (/dev/xbd5) by guid 5f400b8b20678472 ZFS: vdev 5f400b8b20678472 found: xbd4 (bdev 142:4) ZFS WARNING: vdev guid mismatch for /dev/xbd2, actual 37c09674044d7835 expected 574a309a2445c01c ZFS: trying to find a vdev (/dev/xbd2) by guid 574a309a2445c01c ZFS: vdev 574a309a2445c01c found: xbd1 (bdev 142:1) ZFS WARNING: vdev guid mismatch for /dev/xbd3, actual 3cc48031384426ef expected 37c09674044d7835 ZFS: trying to find a vdev (/dev/xbd3) by guid 37c09674044d7835 ZFS: vdev 37c09674044d7835 found: xbd2 (bdev 142:2) ZFS WARNING: vdev guid mismatch for /dev/xbd4, actual 5f400b8b20678472 expected 3cc48031384426ef ZFS: trying to find a vdev (/dev/xbd4) by guid 3cc48031384426ef ZFS: vdev 3cc48031384426ef found: xbd3 (bdev 142:3) ZFS: trying to find a vdev (/dev/xbd5) by guid 5f400b8b20678472 ZFS: vdev 5f400b8b20678472 found: xbd4 (bdev 142:4) And the pool configures. It is slightly odd from a UI point of view that the old device name are still used (they are actually xbd1-xbd4 now). # 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 Thanks! -- Stephen