Add VFS.NewDisconnectedMount().

Analogous to Linux's kern_mount().

PiperOrigin-RevId: 297259580
This commit is contained in:
Jamie Liu
2020-02-25 19:13:30 -08:00
committed by gVisor bot
parent fba479b3c7
commit a92087f0f8
2 changed files with 28 additions and 5 deletions
+17
View File
@@ -139,6 +139,23 @@ func (vfs *VirtualFilesystem) NewMountNamespace(ctx context.Context, creds *auth
return mntns, nil
}
// NewDisconnectedMount returns a Mount representing fs with the given root
// (which may be nil). The new Mount is not associated with any MountNamespace
// and is not connected to any other Mounts. References are taken on fs and
// root.
func (vfs *VirtualFilesystem) NewDisconnectedMount(fs *Filesystem, root *Dentry, opts *MountOptions) (*Mount, error) {
fs.IncRef()
if root != nil {
root.IncRef()
}
return &Mount{
vfs: vfs,
fs: fs,
root: root,
refs: 1,
}, nil
}
// MountAt creates and mounts a Filesystem configured by the given arguments.
func (vfs *VirtualFilesystem) MountAt(ctx context.Context, creds *auth.Credentials, source string, target *PathOperation, fsTypeName string, opts *MountOptions) error {
rft := vfs.getFilesystemType(fsTypeName)
+11 -5
View File
@@ -126,17 +126,23 @@ func (vfs *VirtualFilesystem) Init() error {
// Construct vfs.anonMount.
anonfsDevMinor, err := vfs.GetAnonBlockDevMinor()
if err != nil {
return err
// This shouldn't be possible since anonBlockDevMinorNext was
// initialized to 1 above (no device numbers have been allocated yet).
panic(fmt.Sprintf("VirtualFilesystem.Init: device number allocation for anonfs failed: %v", err))
}
anonfs := anonFilesystem{
devMinor: anonfsDevMinor,
}
anonfs.vfsfs.Init(vfs, &anonfs)
vfs.anonMount = &Mount{
vfs: vfs,
fs: &anonfs.vfsfs,
refs: 1,
defer anonfs.vfsfs.DecRef()
anonMount, err := vfs.NewDisconnectedMount(&anonfs.vfsfs, nil, &MountOptions{})
if err != nil {
// We should not be passing any MountOptions that would cause
// construction of this mount to fail.
panic(fmt.Sprintf("VirtualFilesystem.Init: anonfs mount failed: %v", err))
}
vfs.anonMount = anonMount
return nil
}