Description
System information
Type | Version/Name |
---|---|
Distribution Name | Debian |
Distribution Version | testing |
Linux Kernel | 4.20.5 and 4.20.10 |
Architecture | x64 |
ZFS/SPL Version | master / 0.8.0-rc3-g0a1086319 |
Describe the problem you're observing
Expected behaviour of zfs mount -a
is that it detects dependencies and waits for these dependencies to be available before doing any mounts below. For example dpool/data/test depends on dpool/data, when dpool/data is mounted on /var/data and dpool/data/test gets mounted on /var/data/test AFTER /var/data is available to the system.
This is what happens with zfs mount -a
:
root@debian:[~]# zfs mount
rpool/ROOT /
root@debian:[~]# ls /var/data/
root@debian:[~]# zfs mount -a
root@debian:[~]# zfs mount
rpool/ROOT /
dpool/data /var/data
dpool/data/test /var/data/test
# ZFS says mount was ok; but it is not!
root@debian:[~]# ls /var/data/
testfile_dpool_data
# test is missing!
# Unmount everything again
root@debian:[~]# zfs umount dpool/data
umount: /var/data/test: not mounted.
cannot unmount '/var/data/test': umount failed
root@debian:[~]# zfs umount dpool/data/test
umount: /var/data/test: not mounted.
cannot unmount '/var/data/test': umount failed
# Uhm. What!? Check linux mount
root@debian:[~]# mount | grep 'var/data'
dpool/data on /var/data type zfs (rw,relatime,xattr,noacl)
dpool/data/test on /var/data/test type zfs (rw,relatime,xattr,noacl)
# Ok, do a manual unmount
root@debian:[~]# umount /var/data/test
umount: /var/data/test: no mount point specified.
# Hmm, ok, that's caused by the (unwanted) overlayed mount. Unmount it first.
root@debian:[~]# umount /var/data
root@debian:[~]# ls /var/data
test
root@debian:[~]# zfs mount
rpool/ROOT /
dpool/data/test /var/data/test
# Ok, this is correct. Then let's unmount dpool/data/test
root@debian:[~]# zfs umount dpool/data/test
root@debian:[~]# zfs mount
rpool/ROOT /
root@debian:[~]# ls /var/data/
test
root@debian:[~]# ls /var/data/test/
root@debian:[~]#
Doing it manually:
root@debian:[~]# zfs mount
rpool/ROOT /
root@debian:[~]# ls /var/data/
root@debian:[~]# zfs mount dpool/data
root@debian:[~]# ls /var/data/
testfile_dpool_data test
root@debian:[~]# ls /var/data/test
root@debian:[~]# zfs mount dpool/data/test
root@debian:[~]# ls /var/data/test
testfile_dpool_data_test
root@debian:[~]# zfs unmount /var/data/test; zfs unmount /var/data
root@debian:[~]# ls /var/data/
root@debian:[~]#
The problem here IMHO is that zfs does not wait for the dependency mount (dpool/data) to be really available and mistakenly does a overlayed mount when the sub-zfs (dpool/data/test) becomes available first.
Update:
When setting ZFS_SERIAL_MOUNT=1, everything works fine. So the problem is not a missing wait/sleep/whatever but it's the parallization of dependent mounts (zfs_foreach_mountpoint).
Update 2: See #8450 (comment)