Jamie Landeg-Jones
2017-11-20 16:39:10 UTC
There appears to be a bug in the system call related to getmntinfo(3) / getfsstat(2)
, when if the "automount" flag is set on "nullfs" mounts, it is not returned on
a getfsstat "WAIT" call. The non-refreshed, non-blocking "MNT_NOWAIT" produces the
correct result.
I first noticed this when debugging why my nullfs autofs partitions weren't being
automatically unmounted. (FreeBSD current and release)
The somewhat hacked snippet from automount.c in the example below demonstrates this -
When called with no parameters, it performs a MNT_WAIT request, otherwise a MNT_NOWAIT
request is performed:
Cheers, Jamie
| #include <stdio.h>
| #include <string.h>
| #include <sys/mount.h>
|
| int main(int argc, char **argv)
| {
| struct statfs *mntbuf;
| int i, nitems;
|
| nitems = getmntinfo(&mntbuf, (argc == 1) ? MNT_WAIT : MNT_NOWAIT);
| if (nitems <= 0)
| printf ("getmntinfo fail\n");
|
| for (i = 0; i < nitems; i++) {
| if (strcmp(mntbuf[i].f_fstypename, "autofs") == 0) {
| printf("skipping %s, filesystem type is autofs\n",
| mntbuf[i].f_mntonname);
| continue;
| }
|
| if ((mntbuf[i].f_flags & MNT_AUTOMOUNTED) == 0) {
| printf("skipping %s, not automounted\n",
| mntbuf[i].f_mntonname);
| continue;
| }
|
| printf("%s IS automounted!!!!!!!!!\n",
| mntbuf[i].f_mntonname);
| }
| }
| 14:24 [2] (1) "autofs" ***@thompson# df
| Filesystem 1K-blocks Used Avail Capacity Mounted on
| /dev/ada1p2 5061628 707264 3949436 15% /
| devfs 1 1 0 100% /dev
| /dev/ada1p4 5061628 535004 4121696 11% /var
| /dev/ada1p5 978973296 21689416 878966020 2% /usr
|
| 14:24 [2] (2) "autofs" ***@thompson# mount
| /dev/ada1p2 on / (ufs, local)
| devfs on /dev (devfs, local, multilabel)
| /dev/ada1p4 on /var (ufs, local, soft-updates)
| /dev/ada1p5 on /usr (ufs, local, soft-updates)
|
| 14:25 [2] (3) "autofs" ***@thompson# mkdir /tmp/automounted /tmp/manual
|
| 14:25 [2] (4) "autofs" ***@thompson# mount -t nullfs -o ro /usr/src /tmp/manual
|
| 14:25 [2] (5) "autofs" ***@thompson# mount -t nullfs -o ro,automounted /usr/src /tmp/automounted/
|
| 14:26 [2] (6) "autofs" ***@thompson# df
| Filesystem 1K-blocks Used Avail Capacity Mounted on
| /dev/ada1p2 5061628 707264 3949436 15% /
| devfs 1 1 0 100% /dev
| /dev/ada1p4 5061628 535004 4121696 11% /var
| /dev/ada1p5 978973296 21689420 878966016 2% /usr
| /usr/src 978973296 21689420 878966016 2% /tmp/manual
| /usr/src 978973296 21689420 878966016 2% /tmp/automounted
|
| 14:26 [2] (7) "autofs" ***@thompson# mount
| /dev/ada1p2 on / (ufs, local)
| devfs on /dev (devfs, local, multilabel)
| /dev/ada1p4 on /var (ufs, local, soft-updates)
| /dev/ada1p5 on /usr (ufs, local, soft-updates)
| /usr/src on /tmp/manual (nullfs, local, read-only)
| /usr/src on /tmp/automounted (nullfs, local, read-only, automounted)
|
| 14:26 [2] (8) "autofs" ***@thompson# ./a.out
| skipping /, not automounted
| skipping /dev, not automounted
| skipping /var, not automounted
| skipping /usr, not automounted
| skipping /tmp/manual, not automounted
| skipping /tmp/automounted, not automounted
|
| 14:26 [2] (9) "autofs" ***@thompson# ./a.out x
| skipping /, not automounted
| skipping /dev, not automounted
| skipping /var, not automounted
| skipping /usr, not automounted
| skipping /tmp/manual, not automounted
| /tmp/automounted IS automounted!!!!!!!!!
, when if the "automount" flag is set on "nullfs" mounts, it is not returned on
a getfsstat "WAIT" call. The non-refreshed, non-blocking "MNT_NOWAIT" produces the
correct result.
I first noticed this when debugging why my nullfs autofs partitions weren't being
automatically unmounted. (FreeBSD current and release)
The somewhat hacked snippet from automount.c in the example below demonstrates this -
When called with no parameters, it performs a MNT_WAIT request, otherwise a MNT_NOWAIT
request is performed:
Cheers, Jamie
| #include <stdio.h>
| #include <string.h>
| #include <sys/mount.h>
|
| int main(int argc, char **argv)
| {
| struct statfs *mntbuf;
| int i, nitems;
|
| nitems = getmntinfo(&mntbuf, (argc == 1) ? MNT_WAIT : MNT_NOWAIT);
| if (nitems <= 0)
| printf ("getmntinfo fail\n");
|
| for (i = 0; i < nitems; i++) {
| if (strcmp(mntbuf[i].f_fstypename, "autofs") == 0) {
| printf("skipping %s, filesystem type is autofs\n",
| mntbuf[i].f_mntonname);
| continue;
| }
|
| if ((mntbuf[i].f_flags & MNT_AUTOMOUNTED) == 0) {
| printf("skipping %s, not automounted\n",
| mntbuf[i].f_mntonname);
| continue;
| }
|
| printf("%s IS automounted!!!!!!!!!\n",
| mntbuf[i].f_mntonname);
| }
| }
| 14:24 [2] (1) "autofs" ***@thompson# df
| Filesystem 1K-blocks Used Avail Capacity Mounted on
| /dev/ada1p2 5061628 707264 3949436 15% /
| devfs 1 1 0 100% /dev
| /dev/ada1p4 5061628 535004 4121696 11% /var
| /dev/ada1p5 978973296 21689416 878966020 2% /usr
|
| 14:24 [2] (2) "autofs" ***@thompson# mount
| /dev/ada1p2 on / (ufs, local)
| devfs on /dev (devfs, local, multilabel)
| /dev/ada1p4 on /var (ufs, local, soft-updates)
| /dev/ada1p5 on /usr (ufs, local, soft-updates)
|
| 14:25 [2] (3) "autofs" ***@thompson# mkdir /tmp/automounted /tmp/manual
|
| 14:25 [2] (4) "autofs" ***@thompson# mount -t nullfs -o ro /usr/src /tmp/manual
|
| 14:25 [2] (5) "autofs" ***@thompson# mount -t nullfs -o ro,automounted /usr/src /tmp/automounted/
|
| 14:26 [2] (6) "autofs" ***@thompson# df
| Filesystem 1K-blocks Used Avail Capacity Mounted on
| /dev/ada1p2 5061628 707264 3949436 15% /
| devfs 1 1 0 100% /dev
| /dev/ada1p4 5061628 535004 4121696 11% /var
| /dev/ada1p5 978973296 21689420 878966016 2% /usr
| /usr/src 978973296 21689420 878966016 2% /tmp/manual
| /usr/src 978973296 21689420 878966016 2% /tmp/automounted
|
| 14:26 [2] (7) "autofs" ***@thompson# mount
| /dev/ada1p2 on / (ufs, local)
| devfs on /dev (devfs, local, multilabel)
| /dev/ada1p4 on /var (ufs, local, soft-updates)
| /dev/ada1p5 on /usr (ufs, local, soft-updates)
| /usr/src on /tmp/manual (nullfs, local, read-only)
| /usr/src on /tmp/automounted (nullfs, local, read-only, automounted)
|
| 14:26 [2] (8) "autofs" ***@thompson# ./a.out
| skipping /, not automounted
| skipping /dev, not automounted
| skipping /var, not automounted
| skipping /usr, not automounted
| skipping /tmp/manual, not automounted
| skipping /tmp/automounted, not automounted
|
| 14:26 [2] (9) "autofs" ***@thompson# ./a.out x
| skipping /, not automounted
| skipping /dev, not automounted
| skipping /var, not automounted
| skipping /usr, not automounted
| skipping /tmp/manual, not automounted
| /tmp/automounted IS automounted!!!!!!!!!