[Bug 237397] 'zfs mount -a' mounts filesystems in incorrect order

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Sun May 5 19:18:55 UTC 2019


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=237397

--- Comment #3 from Jim Long <freebsd-bugzilla at umpquanet.com> ---
Created attachment 204229
  --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=204229&action=edit
truss output of 'zfs mount -a' showing incorrect mounting behaviour

Another view of the behaviour:

System running on ZFS:

FreeBSD electron 12.0-STABLE FreeBSD 12.0-STABLE r346293 GENERIC  amd64

# zfs mount
electron/system/ROOT/default    /
electron/system/var             /var
electron/system/home            /home
electron/system/usr             /usr
electron/system/tmp             /tmp
electron/system/usr/local       /usr/local

Of the entire set of mountable filesystems (canmount != off and mountpoint !=
none), there are three filesystems not yet mounted.  Those three mountpoints
are /data, /data/backup, and /data/backup/jimsdesk:

# zfs list -o canmount,mounted,mountpoint,name | egrep -vw '^[[:blank:]]*off'
CANMOUNT  MOUNTED  MOUNTPOINT               NAME
      on       no  none                     electron
      on       no  /data                    electron/data
      on       no  /data/backup             electron/data/backup
      on       no  /data/backup/jimsdesk    electron/data/backup/jimsdesk
      on       no  none                     electron/system
      on       no  none                     electron/system/ROOT
      on      yes  /                        electron/system/ROOT/default
      on      yes  /home                    electron/system/home
      on      yes  /tmp                     electron/system/tmp
      on      yes  /usr                     electron/system/usr
      on      yes  /usr/local               electron/system/usr/local
      on      yes  /var                     electron/system/var

Mountpoint /data does not exist in /:

# find /data -ls | wc -l
find: /data: No such file or directory
       0

After manually mounting electron/data, /data is created, filesystem content
appears, including an empty mountpoint directory for the next filesystem,
electron/data/backup:

# zfs mount electron/data
# find /data | wc -l
       8
# find /data/backup -ls
     8        1 drwxr-xr-x    2 root         wheel     2 May  3 12:55
/data/backup

After mounting electron/data/backup, filesystem content is present under the
mountpoint /data/backup, including an empty mountpoint directory for the next
filesystem, electron/data/backup/jimsdesk:

# find /data/backup | head -3000000 | wc -l
 3000000
# find /data/backup/jimsdesk -ls 
7904435        1 drwxr-xr-x    2 root         wheel     2 Mar  5 16:48
/data/backup/jimsdesk

After mounting electron/data/backup/jimsdesk, that filesystem content also
appears under /data/backup/jimsdesk:

# zfs mount electron/data/backup/jimsdesk
# find /data/backup/jimsdesk | head -3000000 | wc -l
 1481437

That's all excellent.  Manual mounting works.  Let's clean up:

# zfs umount /data/backup/jimsdesk
# find /data/backup/jimsdesk -ls
7904435        1 drwxr-xr-x    2 root         wheel     2 Mar  5 16:48
/data/backup/jimsdesk
# zfs umount /data/backup
# find /data/backup -ls
     8        1 drwxr-xr-x    2 root         wheel     2 May  3 12:55
/data/backup
# zfs umount /data 
# find /data -ls
  1488        1 drwxr-xr-x    2 root         wheel     2 May  3 13:21 /data
# rmdir /data
# find /data -ls
find: /data: No such file or directory

Now we're back to our original mount state: everything mounted except /data
/data/backup and /data/backup/jimsdesk:

# zfs list -o canmount,mounted,mountpoint,name | egrep -vw '^[[:blank:]]*off'
CANMOUNT  MOUNTED  MOUNTPOINT               NAME
      on       no  none                     electron
      on       no  /data                    electron/data
      on       no  /data/backup             electron/data/backup
      on       no  /data/backup/jimsdesk    electron/data/backup/jimsdesk
      on       no  none                     electron/system
      on       no  none                     electron/system/ROOT
      on      yes  /                        electron/system/ROOT/default
      on      yes  /home                    electron/system/home
      on      yes  /tmp                     electron/system/tmp
      on      yes  /usr                     electron/system/usr
      on      yes  /usr/local               electron/system/usr/local
      on      yes  /var                     electron/system/var

Now let's 'truss zfs mount -a'.  Instead of inlining all the output, it's
attached.

# truss zfs mount -a > truss-zfs-mount-a.out 2>&1
# egrep 'mount|mkdir' truss-zfs-mount-a.out 
mkdir("/data/backup",0755)                       ERR#2 'No such file or
directory'
mkdir("/data",0755)                              = 0 (0x0)
mkdir("/data/backup",0755)                       = 0 (0x0)
nmount(0x801653000,8,0x0)                        = 0 (0x0)
mkdir("/data",0755)                              ERR#17 'File exists'
cannot mount '/data': failed to create mountpoint
write(2,"cannot mount '/data': failed to "...,50) = 50 (0x32)
nmount(0x801672000,8,0x0)                        = 0 (0x0)

After 'zfs mount -a' only two of the expected three filesystems are mounted:

electron : 13:35:05 /root# zfs list -o canmount,mounted,mountpoint,name | egrep
-vw '^[[:blank:]]*off'
CANMOUNT  MOUNTED  MOUNTPOINT               NAME
      on       no  none                     electron
      on       no  /data                    electron/data
      on      yes  /data/backup             electron/data/backup
      on      yes  /data/backup/jimsdesk    electron/data/backup/jimsdesk
      on       no  none                     electron/system
      on       no  none                     electron/system/ROOT
      on      yes  /                        electron/system/ROOT/default
      on      yes  /home                    electron/system/home
      on      yes  /tmp                     electron/system/tmp
      on      yes  /usr                     electron/system/usr
      on      yes  /usr/local               electron/system/usr/local
      on      yes  /var                     electron/system/var

electron/data is still not mounted, as per the 'cannot mount ...' error from
'zfs mount -a'.  The truss output also shows that zfs was confused about the
order in which to create mountpoints, and attempted to create the second-tier
mountpoint (/data/backup) before creating the first-tier mountpoint (/data).

The truss output file is attached to this PR.

So, although the mode of failure varies a little, I hope that this truss file
will be sufficient for someone to look at and diagnose that 'zfs mount -a' is
not doing things correctly.  Let me know if I can provide additional info.

Thank you!

Jim

-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the freebsd-fs mailing list