Port fadvise64 to vfs2.
Like vfs1, we have a trivial implementation that ignores all valid advice. Updates #2923. PiperOrigin-RevId: 317349505
This commit is contained in:
parent
d962f9f384
commit
7db196c4db
|
@ -23,6 +23,7 @@ go_library(
|
|||
"errors.go",
|
||||
"eventfd.go",
|
||||
"exec.go",
|
||||
"fadvise.go",
|
||||
"fcntl.go",
|
||||
"file.go",
|
||||
"file_amd64.go",
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
// Copyright 2020 The gVisor Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package linux
|
||||
|
||||
const (
|
||||
POSIX_FADV_NORMAL = 0
|
||||
POSIX_FADV_RANDOM = 1
|
||||
POSIX_FADV_SEQUENTIAL = 2
|
||||
POSIX_FADV_WILLNEED = 3
|
||||
POSIX_FADV_DONTNEED = 4
|
||||
POSIX_FADV_NOREUSE = 5
|
||||
)
|
|
@ -1111,17 +1111,6 @@ func Fcntl(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Syscall
|
|||
}
|
||||
}
|
||||
|
||||
// LINT.ThenChange(vfs2/fd.go)
|
||||
|
||||
const (
|
||||
_FADV_NORMAL = 0
|
||||
_FADV_RANDOM = 1
|
||||
_FADV_SEQUENTIAL = 2
|
||||
_FADV_WILLNEED = 3
|
||||
_FADV_DONTNEED = 4
|
||||
_FADV_NOREUSE = 5
|
||||
)
|
||||
|
||||
// Fadvise64 implements linux syscall fadvise64(2).
|
||||
// This implementation currently ignores the provided advice.
|
||||
func Fadvise64(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.SyscallControl, error) {
|
||||
|
@ -1146,12 +1135,12 @@ func Fadvise64(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sys
|
|||
}
|
||||
|
||||
switch advice {
|
||||
case _FADV_NORMAL:
|
||||
case _FADV_RANDOM:
|
||||
case _FADV_SEQUENTIAL:
|
||||
case _FADV_WILLNEED:
|
||||
case _FADV_DONTNEED:
|
||||
case _FADV_NOREUSE:
|
||||
case linux.POSIX_FADV_NORMAL:
|
||||
case linux.POSIX_FADV_RANDOM:
|
||||
case linux.POSIX_FADV_SEQUENTIAL:
|
||||
case linux.POSIX_FADV_WILLNEED:
|
||||
case linux.POSIX_FADV_DONTNEED:
|
||||
case linux.POSIX_FADV_NOREUSE:
|
||||
default:
|
||||
return 0, nil, syserror.EINVAL
|
||||
}
|
||||
|
@ -1160,8 +1149,6 @@ func Fadvise64(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sys
|
|||
return 0, nil, nil
|
||||
}
|
||||
|
||||
// LINT.IfChange
|
||||
|
||||
func mkdirAt(t *kernel.Task, dirFD int32, addr usermem.Addr, mode linux.FileMode) error {
|
||||
path, _, err := copyInPath(t, addr, false /* allowEmpty */)
|
||||
if err != nil {
|
||||
|
|
|
@ -210,3 +210,41 @@ func posixLock(t *kernel.Task, args arch.SyscallArguments, file *vfs.FileDescrip
|
|||
return syserror.EINVAL
|
||||
}
|
||||
}
|
||||
|
||||
// Fadvise64 implements fadvise64(2).
|
||||
// This implementation currently ignores the provided advice.
|
||||
func Fadvise64(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.SyscallControl, error) {
|
||||
fd := args[0].Int()
|
||||
length := args[2].Int64()
|
||||
advice := args[3].Int()
|
||||
|
||||
// Note: offset is allowed to be negative.
|
||||
if length < 0 {
|
||||
return 0, nil, syserror.EINVAL
|
||||
}
|
||||
|
||||
file := t.GetFileVFS2(fd)
|
||||
if file == nil {
|
||||
return 0, nil, syserror.EBADF
|
||||
}
|
||||
defer file.DecRef()
|
||||
|
||||
// If the FD refers to a pipe or FIFO, return error.
|
||||
if _, isPipe := file.Impl().(*pipe.VFSPipeFD); isPipe {
|
||||
return 0, nil, syserror.ESPIPE
|
||||
}
|
||||
|
||||
switch advice {
|
||||
case linux.POSIX_FADV_NORMAL:
|
||||
case linux.POSIX_FADV_RANDOM:
|
||||
case linux.POSIX_FADV_SEQUENTIAL:
|
||||
case linux.POSIX_FADV_WILLNEED:
|
||||
case linux.POSIX_FADV_DONTNEED:
|
||||
case linux.POSIX_FADV_NOREUSE:
|
||||
default:
|
||||
return 0, nil, syserror.EINVAL
|
||||
}
|
||||
|
||||
// Sure, whatever.
|
||||
return 0, nil, nil
|
||||
}
|
||||
|
|
|
@ -108,7 +108,7 @@ func Override() {
|
|||
s.Table[209] = syscalls.PartiallySupported("io_submit", IoSubmit, "Generally supported with exceptions. User ring optimizations are not implemented.", []string{"gvisor.dev/issue/204"})
|
||||
s.Table[213] = syscalls.Supported("epoll_create", EpollCreate)
|
||||
s.Table[217] = syscalls.Supported("getdents64", Getdents64)
|
||||
delete(s.Table, 221) // fdavise64
|
||||
s.Table[221] = syscalls.PartiallySupported("fadvise64", Fadvise64, "The syscall is 'supported', but ignores all provided advice.", nil)
|
||||
s.Table[232] = syscalls.Supported("epoll_wait", EpollWait)
|
||||
s.Table[233] = syscalls.Supported("epoll_ctl", EpollCtl)
|
||||
s.Table[235] = syscalls.Supported("utimes", Utimes)
|
||||
|
|
|
@ -191,6 +191,7 @@ syscall_test(
|
|||
syscall_test(
|
||||
add_overlay = True,
|
||||
test = "//test/syscalls/linux:fadvise64_test",
|
||||
vfs2 = "True",
|
||||
)
|
||||
|
||||
syscall_test(
|
||||
|
|
Loading…
Reference in New Issue