=================================================================
Test Suite for Bind Mount and Shared Subtree Features in the VFS:
=================================================================
Author: Avantika Mathur
Date: September 16, 2005
Last update: March 18th, 2008 (by Matt Helsley)

About:
------
These tests exercise the Linux Kernel's bind mount and shared subtree
capabilities. With it administrators may use clear semantics to manage
complex mount trees on a system.

Bind mount simply allows administrators to make a directory appear in
two places at once -- somewhat like hard links for files:

# mkdir mnt mnt2
# mount --bind mnt mnt2
# touch mnt/a
# ls mnt2
a

Note that bind mounts are not recursive. To get a recursive bind mount
use --rbind.

Another limitation of simple bind mounts is they cannot propagate future binds:

# mkdir mnt mnt2
# mount --bind mnt mnt2
# touch mnt/a
# mkdir mnt/foo
# ls mnt2
a foo
# mkdir sub
# touch sub/b
# mount --bind sub /mnt/foo
# ls mnt/foo
b
# ls mnt2/foo

mnt2/foo appears to be empty because the second bind mount did not propagate
to mnt2. Shared subtrees allow propagation whereas bind mounts do not.
To enable full administrator control of propagation there are several kinds of
subtrees:
	private		[default -- this is a "normal" mount]
	shared		[propagation goes both ways]
	slave		[propagation goes one way]
	unbindable	[cannot --bind and hence cannot share]

For further details on these types of subtrees please see your kernel source's
Documentation/filesystems/sharedsubtree.txt file.
 
Building:
---------
Uses GNU Make. In the root directory type:
make

Installing:
-----------
Type:
make install

Cleaning:
---------
Type:
make clean

Running:
--------
run LTPROOT/testscripts/test_fs_bind.sh


Testcases:
----------
There are multiple testcases testing in each of the following categories,
testing functionality of different types of mounts, different combinations,
etc:
-- bind
-- rbind
-- move
-- regression tests
-- clone namespace (currently not run)


Directory Structure:
--------------------
In the root directory of the suite there are scripts to execute the whole test suite. Logged results are stored in LTPROOT/results/fs_bind. PASS/FAIL
indications are passed to the LTP API and logged in the results directory too.

Basic tests of bind and move mounts are part of the test_fs_bind.sh test
script itself. These are prerequisites for the more the complicated tests.
The bind, rbind, and move directories contain tests for bind, rbind, move in
combination with the various kinds of subtrees. The regression and cloneNS
directories perform basic regression tests and combine some of the tests with
mount namespaces respectively.

The bin directory contains scripts used by each of the testcases for
common setup, creating, and comparing mounts. 

Running the Test Suite:
-----------------------
To run the entire testsuite run:
test_fs_bind.sh

Log directories where the results are stored in LTPROOT/results/fs_bind

Reading the Test Suite Results:
-------------------------------
Test suite results are logged, by default, in the LTPROOT/results/fs_bind
directory. Its structure is:
fs_bind-\
	|-> errors		 (stderr of main test suite script itself)
	|-> summary		 (stdout of main test suite script itself)
	|-move--\
	|	|->test01-\	(logs of test01)
	|	|	  |-> log		(stdout)
	|	|	  |-> err		(stderr)
	|	|	  |-> mtab.before
	|	|	  |-> mtab.after
	|	|	  |-> proc_mounts.before
	|	|	  |-> proc_mounts.after
	|	|	  |-> files.before	(files  before running)
	|	|	  |-> dirs.before	(dirs   before running)
	|	|	  |-> files.after	(files  after  running)
	|	|	  \-> dirs.after	(dirs   after  running)
	|	|->test02-\
	|	|	  |
	|	...	  ...
	|-rbind--\
	|        |--> 
	...       ...

An testXX/err file will only be left for those tests that had errors and
stderr was non-empty. mounts.*, files.*, and dirs.* files will be left for
tests that appear to have broken cleanup sections. The test_fs_bind.sh
script robustly handles cleanup so, unless the tests are run individually, this
is not an issue that prevents testing from completing successfully nor does it
interfere with test results.

These files make it easy to determine what happened during a given test.
It's easy to see which tests need to be debugged and which do not. It also
makes it easy to aggregate output or trace sandbox dirtying from test to test.

Running individual Tests:
-------------------------
Currently tests cannot be run individually because there are several important
LTP environment dependencies. Some of them are documented below:
	LTP test script environment variables:
		LTPROOT
		TCID
		TST_TOTAL
		TST_COUNT
	LTP commands/functions:
		tst_resm
		tst_brkm
		tst_exit
	LTP contents:
		LTPROOT/testcases/bin
 
It's important to note that the individual test scripts use the current working
directory extensively but never exit it. This may allow the tests to be run
individually once the above LTP environment dependencies are resolved.
Lastly none of the logging or debugging information will appear in the
LTPROOT/results/fs_bind directory when tests are invoked individually since
those are collected by the test_fs_bind.sh script.
