summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/fsimpl/mqfs/registry.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/sentry/fsimpl/mqfs/registry.go')
-rw-r--r--pkg/sentry/fsimpl/mqfs/registry.go34
1 files changed, 27 insertions, 7 deletions
diff --git a/pkg/sentry/fsimpl/mqfs/registry.go b/pkg/sentry/fsimpl/mqfs/registry.go
index 3875b39ee..9361b7eb4 100644
--- a/pkg/sentry/fsimpl/mqfs/registry.go
+++ b/pkg/sentry/fsimpl/mqfs/registry.go
@@ -50,12 +50,32 @@ type RegistryImpl struct {
// NewRegistryImpl returns a new, initialized RegistryImpl, and takes a
// reference on root.
-func NewRegistryImpl(root *kernfs.Dentry, fs *filesystem) *RegistryImpl {
- root.IncRef()
- return &RegistryImpl{
- root: root,
- fs: fs,
+func NewRegistryImpl(ctx context.Context, vfsObj *vfs.VirtualFilesystem, creds *auth.Credentials) (*RegistryImpl, error) {
+ devMinor, err := vfsObj.GetAnonBlockDevMinor()
+ if err != nil {
+ return nil, err
+ }
+
+ var dentry kernfs.Dentry
+ fs := &filesystem{
+ devMinor: devMinor,
+ root: &dentry,
+ }
+ fs.VFSFilesystem().Init(vfsObj, &FilesystemType{}, fs)
+
+ dentry.InitRoot(&fs.Filesystem, fs.newRootInode(ctx, creds))
+ dentry.IncRef()
+
+ mount, err := vfsObj.NewDisconnectedMount(fs.VFSFilesystem(), dentry.VFSDentry(), &vfs.MountOptions{})
+ if err != nil {
+ return nil, err
}
+
+ return &RegistryImpl{
+ root: &dentry,
+ fs: fs,
+ mount: mount,
+ }, nil
}
// Lookup implements mq.RegistryImpl.Lookup.
@@ -83,11 +103,11 @@ func (r *RegistryImpl) New(ctx context.Context, name string, q *mq.Queue, perm l
}
fd := &queueFD{queue: q}
- err = fd.Init(r.mount, r.root, qInode.data, &qInode.locks, 0 /* flags */)
+ err = fd.Init(r.mount, r.root, q, qInode.Locks(), 0 /* flags */)
if err != nil {
return nil, err
}
- return fd.VFSFileDescription(), nil
+ return &fd.vfsfd, nil
}
// Unlink implements mq.RegistryImpl.Unlink.