Skip to content

zfs mount -a race #8450

Closed
Closed
@c0d3z3r0

Description

@c0d3z3r0

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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions