1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-27 11:55:06 +00:00
Mirror of the FreeBSD src repository https://git.FreeBSD.org/src.git .
Go to file
Baptiste Daroussin f34d9e5d6b Fix a bug introduced with parallel mounting of zfs
Incorporate a fix from zol:
ab5036df1c

commit log from upstream:
 Fix race in parallel mount's thread dispatching algorithm

Strategy of parallel mount is as follows.

1) Initial thread dispatching is to select sets of mount points that
 don't have dependencies on other sets, hence threads can/should run
 lock-less and shouldn't race with other threads for other sets. Each
 thread dispatched corresponds to top level directory which may or may
 not have datasets to be mounted on sub directories.

2) Subsequent recursive thread dispatching for each thread from 1)
 is to mount datasets for each set of mount points. The mount points
 within each set have dependencies (i.e. child directories), so child
 directories are processed only after parent directory completes.

The problem is that the initial thread dispatching in
zfs_foreach_mountpoint() can be multi-threaded when it needs to be
single-threaded, and this puts threads under race condition. This race
appeared as mount/unmount issues on ZoL for ZoL having different
timing regarding mount(2) execution due to fork(2)/exec(2) of mount(8).
`zfs unmount -a` which expects proper mount order can't unmount if the
mounts were reordered by the race condition.

There are currently two known patterns of input list `handles` in
`zfs_foreach_mountpoint(..,handles,..)` which cause the race condition.

1) #8833 case where input is `/a /a /a/b` after sorting.
 The problem is that libzfs_path_contains() can't correctly handle an
 input list with two same top level directories.
 There is a race between two POSIX threads A and B,
  * ThreadA for "/a" for test1 and "/a/b"
  * ThreadB for "/a" for test0/a
 and in case of #8833, ThreadA won the race. Two threads were created
 because "/a" wasn't considered as `"/a" contains "/a"`.

2) #8450 case where input is `/ /var/data /var/data/test` after sorting.
 The problem is that libzfs_path_contains() can't correctly handle an
 input list containing "/".
 There is a race between two POSIX threads A and B,
  * ThreadA for "/" and "/var/data/test"
  * ThreadB for "/var/data"
 and in case of #8450, ThreadA won the race. Two threads were created
 because "/var/data" wasn't considered as `"/" contains "/var/data"`.
 In other words, if there is (at least one) "/" in the input list,
 the initial thread dispatching must be single-threaded since every
 directory is a child of "/", meaning they all directly or indirectly
 depend on "/".

In both cases, the first non_descendant_idx() call fails to correctly
determine "path1-contains-path2", and as a result the initial thread
dispatching creates another thread when it needs to be single-threaded.
Fix a conditional in libzfs_path_contains() to consider above two.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed by: Sebastien Roy <sebastien.roy@delphix.com>
Signed-off-by: Tomohiro Kusumi <kusumi.tomohiro@gmail.com>

PR:		237517, 237397, 239243
Submitted by:	Matthew D. Fuller <fullermd@over-yonder.net> (by email)
MFC after:	3 days
2019-07-26 13:12:33 +00:00
bin Now that we have MK_LS_COLORS, we don't need RELEASE_CRUNCH check here. 2019-07-15 07:35:46 +00:00
cddl Fix a bug introduced with parallel mounting of zfs 2019-07-26 13:12:33 +00:00
contrib Update mandoc to cvs snapshot 2019-07-23 2019-07-26 10:00:33 +00:00
crypto Complete LOCAL_PEERCRED support. Cache pid of the remote process in the 2019-05-30 14:24:26 +00:00
etc Remove NAND and NANDFS support 2019-06-25 04:50:09 +00:00
gnu powerpc: Transition to Secure-PLT, like most other OSs (Toolchain part) 2019-06-25 02:35:22 +00:00
include Add an entry for copy_file_range(2) to unistd.h. 2019-07-25 06:10:44 +00:00
kerberos5 Fix generation of krb5-config with LC_CTYPE=*.UTF-8 2019-07-01 11:47:45 +00:00
lib libsysdecode: use the proper include directory 2019-07-25 17:10:17 +00:00
libexec motd: Generate from template to /var/run 2019-07-20 20:56:31 +00:00
release motd: Generate from template to /var/run 2019-07-20 20:56:31 +00:00
rescue Remove unused defines since r147075 2019-07-12 04:44:50 +00:00
sbin Make camcontrol sanitize support also ATA devices. 2019-07-25 18:48:31 +00:00
secure Merge OpenSSL 1.1.1c. 2019-05-28 21:54:12 +00:00
share Fix grammar nit in copy_file_range docs 2019-07-25 15:43:15 +00:00
stand loader: ignore some variable settings if input unverified 2019-07-17 23:33:14 +00:00
sys Implement pmap_advise(). (Without a working pmap_advise() implementation 2019-07-26 05:07:09 +00:00
targets Remove cap_random(3). 2019-07-24 22:50:43 +00:00
tests Temporarily skip flakey test case 2019-07-24 17:41:40 +00:00
tools Save the last callout function executed on each CPU 2019-07-03 19:22:44 +00:00
usr.bin motd: Generate from template to /var/run 2019-07-20 20:56:31 +00:00
usr.sbin Add device temperature reporting into CTL. 2019-07-26 03:49:16 +00:00
.arcconfig
.arclint
.cirrus.yml cirrus.yml: use OVMF.fd from uefi-edk2-qemu-x86_64 package 2019-07-24 21:08:30 +00:00
.clang-format Add a basic clang-format configuration file 2019-06-07 15:23:52 +00:00
.gitattributes Add a basic clang-format configuration file 2019-06-07 15:23:52 +00:00
.gitignore Ignore _.universe-toolchain file. 2018-07-01 13:50:37 +00:00
COPYRIGHT Happy New Year 2019! 2019-01-01 00:25:25 +00:00
LOCKS
MAINTAINERS Update/reformat maintainer entries that I am a part of 2019-04-29 18:48:43 +00:00
Makefile pkgbase: Add the sub stage-packages targets to TGTS 2019-07-24 08:00:00 +00:00
Makefile.inc1 Add head(1) to native-xtools so that it can be used in qemu-user jails 2019-06-20 13:24:58 +00:00
Makefile.libcompat libsysdecode: use the proper include directory 2019-07-25 17:10:17 +00:00
Makefile.sys.inc
ObsoleteFiles.inc Remove cap_random(3). 2019-07-24 22:50:43 +00:00
README
README.md
RELNOTES Document r350307. 2019-07-24 22:57:17 +00:00
UPDATING Fix indentation (spaces->tab). 2019-07-25 15:31:15 +00:00

FreeBSD Source:

This is the top level of the FreeBSD source directory. This file was last revised on: FreeBSD

FreeBSD is an operating system used to power modern servers, desktops, and embedded platforms. A large community has continually developed it for more than thirty years. Its advanced networking, security, and storage features have made FreeBSD the platform of choice for many of the busiest web sites and most pervasive embedded networking and storage devices.

For copyright information, please see the file COPYRIGHT in this directory. Additional copyright information also exists for some sources in this tree - please see the specific source directories for more information.

The Makefile in this directory supports a number of targets for building components (or all) of the FreeBSD source tree. See build(7), config(8), https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/makeworld.html, and https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig.html for more information, including setting make(1) variables.

Source Roadmap:

bin		System/user commands.

cddl		Various commands and libraries under the Common Development
		and Distribution License.

contrib		Packages contributed by 3rd parties.

crypto		Cryptography stuff (see crypto/README).

etc		Template files for /etc.

gnu		Various commands and libraries under the GNU Public License.
		Please see gnu/COPYING* for more information.

include		System include files.

kerberos5	Kerberos5 (Heimdal) package.

lib		System libraries.

libexec		System daemons.

release		Release building Makefile & associated tools.

rescue		Build system for statically linked /rescue utilities.

sbin		System commands.

secure		Cryptographic libraries and commands.

share		Shared resources.

stand		Boot loader sources.

sys		Kernel sources.

sys/<arch>/conf Kernel configuration files. GENERIC is the configuration
		used in release builds. NOTES contains documentation of
		all possible entries.

tests		Regression tests which can be run by Kyua.  See tests/README
		for additional information.

tools		Utilities for regression testing and miscellaneous tasks.

usr.bin		User commands.

usr.sbin	System administration commands.

For information on synchronizing your source tree with one or more of the FreeBSD Project's development branches, please see:

https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/current-stable.html