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:
Dean Deng 2020-06-19 11:48:24 -07:00 committed by gVisor bot
parent d962f9f384
commit 7db196c4db
6 changed files with 71 additions and 20 deletions

View File

@ -23,6 +23,7 @@ go_library(
"errors.go",
"eventfd.go",
"exec.go",
"fadvise.go",
"fcntl.go",
"file.go",
"file_amd64.go",

24
pkg/abi/linux/fadvise.go Normal file
View File

@ -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
)

View File

@ -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 {

View File

@ -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
}

View File

@ -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)

View File

@ -191,6 +191,7 @@ syscall_test(
syscall_test(
add_overlay = True,
test = "//test/syscalls/linux:fadvise64_test",
vfs2 = "True",
)
syscall_test(