HomeFreeBSD

6676 Race between unique_insert() and unique_remove() causes ZFS fsid change

Description

6676 Race between unique_insert() and unique_remove() causes ZFS fsid change

illumos/illumos-gate@40510e8eba18690b9a9843b26393725eeb0f1dac
https://github.com/illumos/illumos-gate/commit/40510e8eba18690b9a9843b26393725eeb0f1dac

https://www.illumos.org/issues/6676

The fsid of zfs filesystems might change after reboot or remount. The problem seems to
be caused by a race between unique_insert() and unique_remove(). The unique_remove()
is called from dsl_dataset_evict() which is now an asynchronous thread. In a case the
dsl_dataset_evict() thread is very slow and calls unique_remove() too late we will end
up with changed fsid on zfs mount.

This problem is very likely caused by #5056.

Steps to Reproduce
Note: I'm able to reproduce this always on a single core (virtual) machine. On multicore
machines it is not so easy to reproduce.

uname -a

SunOS openindiana 5.11 illumos-633aa80 i86pc i386 i86pc Solaris

  1. zfs create rpool/TEST
  2. FS=$(echo ::fsinfo | mdb -k | grep TEST | awk '{print $1}')
  3. echo $FS::print vfs_t vfs_fsid | mdb -k

vfs_fsid = {

vfs_fsid.val = [ 0x54d7028a, 0x70311508 ]

}

  1. zfs umount rpool/TEST
  2. zfs mount rpool/TEST
  3. FS=$(echo ::fsinfo | mdb -k | grep TEST | awk '{print $1}')
  4. echo $FS::print vfs_t vfs_fsid | mdb -k

vfs_fsid = {

vfs_fsid.val = [ 0xd9454e49, 0x6b36d08 ]

}
#

Impact
The persistent fsid (filesystem id) is essential for proper NFS functionality.
If the fsid of a filesystem changes on remount (or after reboot) the NFS
clients might not be able to automatically recover from such event and the
manual remount of the NFS filesystems on every NFS client might be needed.

Author: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Dan Vatca <dan.vatca@gmail.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Sebastien Roy <sebastien.roy@delphix.com>
Approved by: Robert Mustacchi <rm@joyent.com>

Details

Provenance
jpaetzelAuthored on
Reviewer
matthew
Parents
rS314242: Remove MK_CRYPT stub
Branches
Unknown
Tags
Unknown