mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Implement flock(2) in VFS2
LockFD is the generic implementation that can be embedded in FileDescriptionImpl implementations. Unique lock ID is maintained in vfs.FileDescription and is created on demand. Updates #1480 PiperOrigin-RevId: 315604825
This commit is contained in:
committed by
gVisor bot
parent
52c922f7c0
commit
67565078bb
@@ -39,6 +39,7 @@ go_library(
|
||||
"//pkg/sentry/unimpl",
|
||||
"//pkg/sentry/uniqueid",
|
||||
"//pkg/sentry/vfs",
|
||||
"//pkg/sentry/vfs/lock",
|
||||
"//pkg/sync",
|
||||
"//pkg/syserr",
|
||||
"//pkg/syserror",
|
||||
|
||||
@@ -34,6 +34,7 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/sentry/memmap"
|
||||
unixsocket "gvisor.dev/gvisor/pkg/sentry/socket/unix"
|
||||
"gvisor.dev/gvisor/pkg/sentry/vfs"
|
||||
"gvisor.dev/gvisor/pkg/sentry/vfs/lock"
|
||||
"gvisor.dev/gvisor/pkg/sync"
|
||||
"gvisor.dev/gvisor/pkg/syserror"
|
||||
"gvisor.dev/gvisor/pkg/usermem"
|
||||
@@ -182,6 +183,8 @@ type inode struct {
|
||||
kernfs.InodeNotDirectory
|
||||
kernfs.InodeNotSymlink
|
||||
|
||||
locks lock.FileLocks
|
||||
|
||||
// When the reference count reaches zero, the host fd is closed.
|
||||
refs.AtomicRefCount
|
||||
|
||||
@@ -468,7 +471,7 @@ func (i *inode) open(ctx context.Context, d *vfs.Dentry, mnt *vfs.Mount, flags u
|
||||
return nil, err
|
||||
}
|
||||
// Currently, we only allow Unix sockets to be imported.
|
||||
return unixsocket.NewFileDescription(ep, ep.Type(), flags, mnt, d)
|
||||
return unixsocket.NewFileDescription(ep, ep.Type(), flags, mnt, d, &i.locks)
|
||||
}
|
||||
|
||||
// TODO(gvisor.dev/issue/1672): Whitelist specific file types here, so that
|
||||
@@ -478,6 +481,7 @@ func (i *inode) open(ctx context.Context, d *vfs.Dentry, mnt *vfs.Mount, flags u
|
||||
fileDescription: fileDescription{inode: i},
|
||||
termios: linux.DefaultSlaveTermios,
|
||||
}
|
||||
fd.LockFD.Init(&i.locks)
|
||||
vfsfd := &fd.vfsfd
|
||||
if err := vfsfd.Init(fd, flags, mnt, d, &vfs.FileDescriptionOptions{}); err != nil {
|
||||
return nil, err
|
||||
@@ -486,6 +490,7 @@ func (i *inode) open(ctx context.Context, d *vfs.Dentry, mnt *vfs.Mount, flags u
|
||||
}
|
||||
|
||||
fd := &fileDescription{inode: i}
|
||||
fd.LockFD.Init(&i.locks)
|
||||
vfsfd := &fd.vfsfd
|
||||
if err := vfsfd.Init(fd, flags, mnt, d, &vfs.FileDescriptionOptions{}); err != nil {
|
||||
return nil, err
|
||||
@@ -497,6 +502,7 @@ func (i *inode) open(ctx context.Context, d *vfs.Dentry, mnt *vfs.Mount, flags u
|
||||
type fileDescription struct {
|
||||
vfsfd vfs.FileDescription
|
||||
vfs.FileDescriptionDefaultImpl
|
||||
vfs.LockFD
|
||||
|
||||
// inode is vfsfd.Dentry().Impl().(*kernfs.Dentry).Inode().(*inode), but
|
||||
// cached to reduce indirections and casting. fileDescription does not hold
|
||||
|
||||
Reference in New Issue
Block a user