mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Update inotify documentation for gofer filesystem.
We now allow hard links to be created within gofer fs (see github.com/google/gvisor/commit/f20e63e31b56784c596897e86f03441f9d05f567). Update the inotify documentation accordingly. PiperOrigin-RevId: 328177485
This commit is contained in:
@@ -703,6 +703,13 @@ type dentry struct {
|
||||
locks vfs.FileLocks
|
||||
|
||||
// Inotify watches for this dentry.
|
||||
//
|
||||
// Note that inotify may behave unexpectedly in the presence of hard links,
|
||||
// because dentries corresponding to the same file have separate inotify
|
||||
// watches when they should share the same set. This is the case because it is
|
||||
// impossible for us to know for sure whether two dentries correspond to the
|
||||
// same underlying file (see the gofer filesystem section fo vfs/inotify.md for
|
||||
// a more in-depth discussion on this matter).
|
||||
watches vfs.Watches
|
||||
}
|
||||
|
||||
|
||||
@@ -305,9 +305,9 @@ var AMD64 = &kernel.SyscallTable{
|
||||
250: syscalls.Error("keyctl", syserror.EACCES, "Not available to user.", nil),
|
||||
251: syscalls.CapError("ioprio_set", linux.CAP_SYS_ADMIN, "", nil), // requires cap_sys_nice or cap_sys_admin (depending)
|
||||
252: syscalls.CapError("ioprio_get", linux.CAP_SYS_ADMIN, "", nil), // requires cap_sys_nice or cap_sys_admin (depending)
|
||||
253: syscalls.PartiallySupported("inotify_init", InotifyInit, "inotify events are only available inside the sandbox.", nil),
|
||||
254: syscalls.PartiallySupported("inotify_add_watch", InotifyAddWatch, "inotify events are only available inside the sandbox.", nil),
|
||||
255: syscalls.PartiallySupported("inotify_rm_watch", InotifyRmWatch, "inotify events are only available inside the sandbox.", nil),
|
||||
253: syscalls.PartiallySupported("inotify_init", InotifyInit, "Inotify events are only available inside the sandbox. Hard links are treated as different watch targets in gofer fs.", nil),
|
||||
254: syscalls.PartiallySupported("inotify_add_watch", InotifyAddWatch, "Inotify events are only available inside the sandbox. Hard links are treated as different watch targets in gofer fs.", nil),
|
||||
255: syscalls.PartiallySupported("inotify_rm_watch", InotifyRmWatch, "Inotify events are only available inside the sandbox. Hard links are treated as different watch targets in gofer fs.", nil),
|
||||
256: syscalls.CapError("migrate_pages", linux.CAP_SYS_NICE, "", nil),
|
||||
257: syscalls.Supported("openat", Openat),
|
||||
258: syscalls.Supported("mkdirat", Mkdirat),
|
||||
@@ -346,7 +346,7 @@ var AMD64 = &kernel.SyscallTable{
|
||||
291: syscalls.Supported("epoll_create1", EpollCreate1),
|
||||
292: syscalls.Supported("dup3", Dup3),
|
||||
293: syscalls.Supported("pipe2", Pipe2),
|
||||
294: syscalls.Supported("inotify_init1", InotifyInit1),
|
||||
294: syscalls.PartiallySupported("inotify_init1", InotifyInit1, "Inotify events are only available inside the sandbox. Hard links are treated as different watch targets in gofer fs.", nil),
|
||||
295: syscalls.Supported("preadv", Preadv),
|
||||
296: syscalls.Supported("pwritev", Pwritev),
|
||||
297: syscalls.Supported("rt_tgsigqueueinfo", RtTgsigqueueinfo),
|
||||
@@ -454,9 +454,9 @@ var ARM64 = &kernel.SyscallTable{
|
||||
23: syscalls.Supported("dup", Dup),
|
||||
24: syscalls.Supported("dup3", Dup3),
|
||||
25: syscalls.PartiallySupported("fcntl", Fcntl, "Not all options are supported.", nil),
|
||||
26: syscalls.Supported("inotify_init1", InotifyInit1),
|
||||
27: syscalls.PartiallySupported("inotify_add_watch", InotifyAddWatch, "inotify events are only available inside the sandbox.", nil),
|
||||
28: syscalls.PartiallySupported("inotify_rm_watch", InotifyRmWatch, "inotify events are only available inside the sandbox.", nil),
|
||||
26: syscalls.PartiallySupported("inotify_init1", InotifyInit1, "Inotify events are only available inside the sandbox. Hard links are treated as different watch targets in gofer fs.", nil),
|
||||
27: syscalls.PartiallySupported("inotify_add_watch", InotifyAddWatch, "Inotify events are only available inside the sandbox. Hard links are treated as different watch targets in gofer fs.", nil),
|
||||
28: syscalls.PartiallySupported("inotify_rm_watch", InotifyRmWatch, "Inotify events are only available inside the sandbox. Hard links are treated as different watch targets in gofer fs.", nil),
|
||||
29: syscalls.PartiallySupported("ioctl", Ioctl, "Only a few ioctls are implemented for backing devices and file systems.", nil),
|
||||
30: syscalls.CapError("ioprio_set", linux.CAP_SYS_ADMIN, "", nil), // requires cap_sys_nice or cap_sys_admin (depending)
|
||||
31: syscalls.CapError("ioprio_get", linux.CAP_SYS_ADMIN, "", nil), // requires cap_sys_nice or cap_sys_admin (depending)
|
||||
|
||||
@@ -28,9 +28,9 @@ The set of all watches held on a single file (i.e., the watch target) is stored
|
||||
in vfs.Watches. Each watch will belong to a different inotify instance (an
|
||||
instance can only have one watch on any watch target). The watches are stored in
|
||||
a map indexed by their vfs.Inotify owner’s id. Hard links and file descriptions
|
||||
to a single file will all share the same vfs.Watches. Activity on the target
|
||||
causes its vfs.Watches to generate notifications on its watches’ inotify
|
||||
instances.
|
||||
to a single file will all share the same vfs.Watches (with the exception of the
|
||||
gofer filesystem, described in a later section). Activity on the target causes
|
||||
its vfs.Watches to generate notifications on its watches’ inotify instances.
|
||||
|
||||
### vfs.Watch
|
||||
|
||||
@@ -103,12 +103,12 @@ inotify:
|
||||
unopened p9 file (and possibly an open FID), through which the Sentry
|
||||
interacts with the gofer.
|
||||
* *Solution:* Because there is no inode structure stored in the sandbox,
|
||||
inotify watches must be held on the dentry. This would be an issue in
|
||||
the presence of hard links, where multiple dentries would need to share
|
||||
the same set of watches, but in VFS2, we do not support the internal
|
||||
creation of hard links on gofer fs. As a result, we make the assumption
|
||||
that every dentry corresponds to a unique inode. However, the next point
|
||||
raises an issue with this assumption:
|
||||
inotify watches must be held on the dentry. For the purposes of inotify,
|
||||
we assume that every dentry corresponds to a unique inode, which may
|
||||
cause unexpected behavior in the presence of hard links, where multiple
|
||||
dentries should share the same set of watches. Indeed, it is impossible
|
||||
for us to be absolutely sure whether dentries correspond to the same
|
||||
file or not, due to the following point:
|
||||
* **The Sentry cannot always be aware of hard links on the remote
|
||||
filesystem.** There is no way for us to confirm whether two files on the
|
||||
remote filesystem are actually links to the same inode. QIDs and inodes are
|
||||
|
||||
Reference in New Issue
Block a user