Merge pull request #2487 from moricho:fix/bindmount

PiperOrigin-RevId: 309082540
This commit is contained in:
gVisor bot 2020-04-29 13:13:51 -07:00
commit d5c34ba2ff
4 changed files with 49 additions and 2 deletions

View File

@ -219,6 +219,9 @@ func mountFlags(opts []string) fs.MountSourceFlags {
mf.NoAtime = true
case "noexec":
mf.NoExec = true
case "bind", "rbind":
// When options include either "bind" or "rbind",
// it's converted to a 9P mount.
default:
log.Warningf("ignoring unknown mount option %q", o)
}
@ -765,6 +768,16 @@ func (c *containerMounter) getMountNameAndOptions(conf *Config, m specs.Mount) (
useOverlay bool
)
for _, opt := range m.Options {
// When options include either "bind" or "rbind", this behaves as
// bind mount even if the mount type is equal to a filesystem supported
// on runsc.
if opt == "bind" || opt == "rbind" {
m.Type = bind
break
}
}
switch m.Type {
case devpts, devtmpfs, proc, sysfs:
fsName = m.Type

View File

@ -1535,6 +1535,28 @@ func TestReadonlyMount(t *testing.T) {
}
}
func TestBindMountByOption(t *testing.T) {
for _, conf := range configs(t, overlay) {
t.Logf("Running test with conf: %+v", conf)
dir, err := ioutil.TempDir(testutil.TmpDir(), "bind-mount")
spec := testutil.NewSpecWithArgs("/bin/touch", path.Join(dir, "file"))
if err != nil {
t.Fatalf("ioutil.TempDir() failed: %v", err)
}
spec.Mounts = append(spec.Mounts, specs.Mount{
Destination: dir,
Source: dir,
Type: "none",
Options: []string{"rw", "bind"},
})
if err := run(spec, conf); err != nil {
t.Fatalf("error running sandbox: %v", err)
}
}
}
// TestAbbreviatedIDs checks that runsc supports using abbreviated container
// IDs in place of full IDs.
func TestAbbreviatedIDs(t *testing.T) {

View File

@ -1394,7 +1394,7 @@ func TestMultiContainerSharedMountUnsupportedOptions(t *testing.T) {
Destination: "/mydir/test",
Source: "/some/dir",
Type: "tmpfs",
Options: []string{"rw", "rbind", "relatime"},
Options: []string{"rw", "relatime"},
}
podSpec[0].Mounts = append(podSpec[0].Mounts, mnt0)

View File

@ -311,7 +311,19 @@ func capsFromNames(names []string, skipSet map[linux.Capability]struct{}) (auth.
// Is9PMount returns true if the given mount can be mounted as an external gofer.
func Is9PMount(m specs.Mount) bool {
return m.Type == "bind" && m.Source != "" && IsSupportedDevMount(m)
var isBind bool
switch m.Type {
case "bind":
isBind = true
default:
for _, opt := range m.Options {
if opt == "bind" || opt == "rbind" {
isBind = true
break
}
}
}
return isBind && m.Source != "" && IsSupportedDevMount(m)
}
// IsSupportedDevMount returns true if the mount is a supported /dev mount.