mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Move ERESTART* error definitions to syserror package.
This is needed to avoid circular dependencies between the vfs and kernel packages. PiperOrigin-RevId: 327355524
This commit is contained in:
@@ -358,7 +358,7 @@ func (t *TTYFileOperations) checkChange(ctx context.Context, sig linux.Signal) e
|
||||
//
|
||||
// Linux ignores the result of kill_pgrp().
|
||||
_ = pg.SendSignal(kernel.SignalInfoPriv(sig))
|
||||
return kernel.ERESTARTSYS
|
||||
return syserror.ERESTARTSYS
|
||||
}
|
||||
|
||||
// LINT.ThenChange(../../fsimpl/host/tty.go)
|
||||
|
||||
@@ -376,7 +376,7 @@ func (t *TTYFileDescription) checkChange(ctx context.Context, sig linux.Signal)
|
||||
//
|
||||
// Linux ignores the result of kill_pgrp().
|
||||
_ = pg.SendSignal(kernel.SignalInfoPriv(sig))
|
||||
return kernel.ERESTARTSYS
|
||||
return syserror.ERESTARTSYS
|
||||
}
|
||||
|
||||
// LockPOSIX implements vfs.FileDescriptionImpl.LockPOSIX.
|
||||
|
||||
@@ -26,6 +26,7 @@ import (
|
||||
ktime "gvisor.dev/gvisor/pkg/sentry/kernel/time"
|
||||
"gvisor.dev/gvisor/pkg/sentry/memmap"
|
||||
"gvisor.dev/gvisor/pkg/sentry/platform"
|
||||
"gvisor.dev/gvisor/pkg/syserror"
|
||||
"gvisor.dev/gvisor/pkg/usermem"
|
||||
)
|
||||
|
||||
@@ -189,8 +190,8 @@ func (app *runApp) execute(t *Task) taskRunState {
|
||||
// a pending signal, causing another interruption, but that signal should
|
||||
// not interact with the interrupted syscall.)
|
||||
if t.haveSyscallReturn {
|
||||
if sre, ok := SyscallRestartErrnoFromReturn(t.Arch().Return()); ok {
|
||||
if sre == ERESTART_RESTARTBLOCK {
|
||||
if sre, ok := syserror.SyscallRestartErrnoFromReturn(t.Arch().Return()); ok {
|
||||
if sre == syserror.ERESTART_RESTARTBLOCK {
|
||||
t.Debugf("Restarting syscall %d with restart block after errno %d: not interrupted by handled signal", t.Arch().SyscallNo(), sre)
|
||||
t.Arch().RestartSyscallWithRestartBlock()
|
||||
} else {
|
||||
|
||||
@@ -159,7 +159,7 @@ func (t *Task) deliverSignal(info *arch.SignalInfo, act arch.SignalAct) taskRunS
|
||||
sigact := computeAction(linux.Signal(info.Signo), act)
|
||||
|
||||
if t.haveSyscallReturn {
|
||||
if sre, ok := SyscallRestartErrnoFromReturn(t.Arch().Return()); ok {
|
||||
if sre, ok := syserror.SyscallRestartErrnoFromReturn(t.Arch().Return()); ok {
|
||||
// Signals that are ignored, cause a thread group stop, or
|
||||
// terminate the thread group do not interact with interrupted
|
||||
// syscalls; in Linux terms, they are never returned to the signal
|
||||
@@ -168,11 +168,11 @@ func (t *Task) deliverSignal(info *arch.SignalInfo, act arch.SignalAct) taskRunS
|
||||
// signal that is actually handled (by userspace).
|
||||
if sigact == SignalActionHandler {
|
||||
switch {
|
||||
case sre == ERESTARTNOHAND:
|
||||
case sre == syserror.ERESTARTNOHAND:
|
||||
fallthrough
|
||||
case sre == ERESTART_RESTARTBLOCK:
|
||||
case sre == syserror.ERESTART_RESTARTBLOCK:
|
||||
fallthrough
|
||||
case (sre == ERESTARTSYS && !act.IsRestart()):
|
||||
case (sre == syserror.ERESTARTSYS && !act.IsRestart()):
|
||||
t.Debugf("Not restarting syscall %d after errno %d: interrupted by signal %d", t.Arch().SyscallNo(), sre, info.Signo)
|
||||
t.Arch().SetReturn(uintptr(-ExtractErrno(syserror.EINTR, -1)))
|
||||
default:
|
||||
|
||||
@@ -29,75 +29,8 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/usermem"
|
||||
)
|
||||
|
||||
// SyscallRestartErrno represents a ERESTART* errno defined in the Linux's kernel
|
||||
// include/linux/errno.h. These errnos are never returned to userspace
|
||||
// directly, but are used to communicate the expected behavior of an
|
||||
// interrupted syscall from the syscall to signal handling.
|
||||
type SyscallRestartErrno int
|
||||
|
||||
// These numeric values are significant because ptrace syscall exit tracing can
|
||||
// observe them.
|
||||
//
|
||||
// For all of the following errnos, if the syscall is not interrupted by a
|
||||
// signal delivered to a user handler, the syscall is restarted.
|
||||
const (
|
||||
// ERESTARTSYS is returned by an interrupted syscall to indicate that it
|
||||
// should be converted to EINTR if interrupted by a signal delivered to a
|
||||
// user handler without SA_RESTART set, and restarted otherwise.
|
||||
ERESTARTSYS = SyscallRestartErrno(512)
|
||||
|
||||
// ERESTARTNOINTR is returned by an interrupted syscall to indicate that it
|
||||
// should always be restarted.
|
||||
ERESTARTNOINTR = SyscallRestartErrno(513)
|
||||
|
||||
// ERESTARTNOHAND is returned by an interrupted syscall to indicate that it
|
||||
// should be converted to EINTR if interrupted by a signal delivered to a
|
||||
// user handler, and restarted otherwise.
|
||||
ERESTARTNOHAND = SyscallRestartErrno(514)
|
||||
|
||||
// ERESTART_RESTARTBLOCK is returned by an interrupted syscall to indicate
|
||||
// that it should be restarted using a custom function. The interrupted
|
||||
// syscall must register a custom restart function by calling
|
||||
// Task.SetRestartSyscallFn.
|
||||
ERESTART_RESTARTBLOCK = SyscallRestartErrno(516)
|
||||
)
|
||||
|
||||
var vsyscallCount = metric.MustCreateNewUint64Metric("/kernel/vsyscall_count", false /* sync */, "Number of times vsyscalls were invoked by the application")
|
||||
|
||||
// Error implements error.Error.
|
||||
func (e SyscallRestartErrno) Error() string {
|
||||
// Descriptions are borrowed from strace.
|
||||
switch e {
|
||||
case ERESTARTSYS:
|
||||
return "to be restarted if SA_RESTART is set"
|
||||
case ERESTARTNOINTR:
|
||||
return "to be restarted"
|
||||
case ERESTARTNOHAND:
|
||||
return "to be restarted if no handler"
|
||||
case ERESTART_RESTARTBLOCK:
|
||||
return "interrupted by signal"
|
||||
default:
|
||||
return "(unknown interrupt error)"
|
||||
}
|
||||
}
|
||||
|
||||
// SyscallRestartErrnoFromReturn returns the SyscallRestartErrno represented by
|
||||
// rv, the value in a syscall return register.
|
||||
func SyscallRestartErrnoFromReturn(rv uintptr) (SyscallRestartErrno, bool) {
|
||||
switch int(rv) {
|
||||
case -int(ERESTARTSYS):
|
||||
return ERESTARTSYS, true
|
||||
case -int(ERESTARTNOINTR):
|
||||
return ERESTARTNOINTR, true
|
||||
case -int(ERESTARTNOHAND):
|
||||
return ERESTARTNOHAND, true
|
||||
case -int(ERESTART_RESTARTBLOCK):
|
||||
return ERESTART_RESTARTBLOCK, true
|
||||
default:
|
||||
return 0, false
|
||||
}
|
||||
}
|
||||
|
||||
// SyscallRestartBlock represents the restart block for a syscall restartable
|
||||
// with a custom function. It encapsulates the state required to restart a
|
||||
// syscall across a S/R.
|
||||
@@ -447,7 +380,7 @@ func ExtractErrno(err error, sysno int) int {
|
||||
return 0
|
||||
case syscall.Errno:
|
||||
return int(err)
|
||||
case SyscallRestartErrno:
|
||||
case syserror.SyscallRestartErrno:
|
||||
return int(err)
|
||||
case *memmap.BusError:
|
||||
// Bus errors may generate SIGBUS, but for syscalls they still
|
||||
|
||||
@@ -147,7 +147,7 @@ func handleIOErrorImpl(t *kernel.Task, partialResult bool, err, intr error, op s
|
||||
}
|
||||
|
||||
switch err.(type) {
|
||||
case kernel.SyscallRestartErrno:
|
||||
case syserror.SyscallRestartErrno:
|
||||
// Identical to the EINTR case.
|
||||
return true, nil
|
||||
}
|
||||
|
||||
@@ -184,7 +184,7 @@ func openAt(t *kernel.Task, dirFD int32, addr usermem.Addr, flags uint) (fd uint
|
||||
|
||||
file, err := d.Inode.GetFile(t, d, fileFlags)
|
||||
if err != nil {
|
||||
return syserror.ConvertIntr(err, kernel.ERESTARTSYS)
|
||||
return syserror.ConvertIntr(err, syserror.ERESTARTSYS)
|
||||
}
|
||||
defer file.DecRef(t)
|
||||
|
||||
@@ -414,7 +414,7 @@ func createAt(t *kernel.Task, dirFD int32, addr usermem.Addr, flags uint, mode l
|
||||
// Create a new fs.File.
|
||||
newFile, err = found.Inode.GetFile(t, found, fileFlags)
|
||||
if err != nil {
|
||||
return syserror.ConvertIntr(err, kernel.ERESTARTSYS)
|
||||
return syserror.ConvertIntr(err, syserror.ERESTARTSYS)
|
||||
}
|
||||
defer newFile.DecRef(t)
|
||||
case syserror.ENOENT:
|
||||
|
||||
@@ -74,7 +74,7 @@ func futexWaitAbsolute(t *kernel.Task, clockRealtime bool, ts linux.Timespec, fo
|
||||
}
|
||||
|
||||
t.Futex().WaitComplete(w, t)
|
||||
return 0, syserror.ConvertIntr(err, kernel.ERESTARTSYS)
|
||||
return 0, syserror.ConvertIntr(err, syserror.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// futexWaitDuration performs a FUTEX_WAIT, blocking until the wait is
|
||||
@@ -110,7 +110,7 @@ func futexWaitDuration(t *kernel.Task, duration time.Duration, forever bool, add
|
||||
|
||||
// The wait duration was absolute, restart with the original arguments.
|
||||
if forever {
|
||||
return 0, kernel.ERESTARTSYS
|
||||
return 0, syserror.ERESTARTSYS
|
||||
}
|
||||
|
||||
// The wait duration was relative, restart with the remaining duration.
|
||||
@@ -121,7 +121,7 @@ func futexWaitDuration(t *kernel.Task, duration time.Duration, forever bool, add
|
||||
val: val,
|
||||
mask: mask,
|
||||
})
|
||||
return 0, kernel.ERESTART_RESTARTBLOCK
|
||||
return 0, syserror.ERESTART_RESTARTBLOCK
|
||||
}
|
||||
|
||||
func futexLockPI(t *kernel.Task, ts linux.Timespec, forever bool, addr usermem.Addr, private bool) error {
|
||||
@@ -149,7 +149,7 @@ func futexLockPI(t *kernel.Task, ts linux.Timespec, forever bool, addr usermem.A
|
||||
}
|
||||
|
||||
t.Futex().WaitComplete(w, t)
|
||||
return syserror.ConvertIntr(err, kernel.ERESTARTSYS)
|
||||
return syserror.ConvertIntr(err, syserror.ERESTARTSYS)
|
||||
}
|
||||
|
||||
func tryLockPI(t *kernel.Task, addr usermem.Addr, private bool) error {
|
||||
|
||||
@@ -82,7 +82,7 @@ func getdents(t *kernel.Task, fd int32, addr usermem.Addr, size int, f func(*dir
|
||||
ds := newDirentSerializer(f, w, t.Arch(), size)
|
||||
rerr := dir.Readdir(t, ds)
|
||||
|
||||
switch err := handleIOError(t, ds.Written() > 0, rerr, kernel.ERESTARTSYS, "getdents", dir); err {
|
||||
switch err := handleIOError(t, ds.Written() > 0, rerr, syserror.ERESTARTSYS, "getdents", dir); err {
|
||||
case nil:
|
||||
dir.Dirent.InotifyEvent(linux.IN_ACCESS, 0)
|
||||
return uintptr(ds.Written()), nil
|
||||
|
||||
@@ -48,7 +48,7 @@ func Lseek(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Syscall
|
||||
}
|
||||
|
||||
offset, serr := file.Seek(t, sw, offset)
|
||||
err := handleIOError(t, false /* partialResult */, serr, kernel.ERESTARTSYS, "lseek", file)
|
||||
err := handleIOError(t, false /* partialResult */, serr, syserror.ERESTARTSYS, "lseek", file)
|
||||
if err != nil {
|
||||
return 0, nil, err
|
||||
}
|
||||
|
||||
@@ -267,7 +267,7 @@ func Msync(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Syscall
|
||||
})
|
||||
// MSync calls fsync, the same interrupt conversion rules apply, see
|
||||
// mm/msync.c, fsync POSIX.1-2008.
|
||||
return 0, nil, syserror.ConvertIntr(err, kernel.ERESTARTSYS)
|
||||
return 0, nil, syserror.ConvertIntr(err, syserror.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// Mlock implements linux syscall mlock(2).
|
||||
|
||||
@@ -410,7 +410,7 @@ func poll(t *kernel.Task, pfdAddr usermem.Addr, nfds uint, timeout time.Duration
|
||||
nfds: nfds,
|
||||
timeout: remainingTimeout,
|
||||
})
|
||||
return 0, kernel.ERESTART_RESTARTBLOCK
|
||||
return 0, syserror.ERESTART_RESTARTBLOCK
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
@@ -464,7 +464,7 @@ func Ppoll(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Syscall
|
||||
// Note that this means that if err is nil but copyErr is not, copyErr is
|
||||
// ignored. This is consistent with Linux.
|
||||
if err == syserror.EINTR && copyErr == nil {
|
||||
err = kernel.ERESTARTNOHAND
|
||||
err = syserror.ERESTARTNOHAND
|
||||
}
|
||||
return n, nil, err
|
||||
}
|
||||
@@ -494,7 +494,7 @@ func Select(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Syscal
|
||||
copyErr := copyOutTimevalRemaining(t, startNs, timeout, timevalAddr)
|
||||
// See comment in Ppoll.
|
||||
if err == syserror.EINTR && copyErr == nil {
|
||||
err = kernel.ERESTARTNOHAND
|
||||
err = syserror.ERESTARTNOHAND
|
||||
}
|
||||
return n, nil, err
|
||||
}
|
||||
@@ -539,7 +539,7 @@ func Pselect(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysca
|
||||
copyErr := copyOutTimespecRemaining(t, startNs, timeout, timespecAddr)
|
||||
// See comment in Ppoll.
|
||||
if err == syserror.EINTR && copyErr == nil {
|
||||
err = kernel.ERESTARTNOHAND
|
||||
err = syserror.ERESTARTNOHAND
|
||||
}
|
||||
return n, nil, err
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ func Read(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.SyscallC
|
||||
|
||||
n, err := readv(t, file, dst)
|
||||
t.IOUsage().AccountReadSyscall(n)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, kernel.ERESTARTSYS, "read", file)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, syserror.ERESTARTSYS, "read", file)
|
||||
}
|
||||
|
||||
// Readahead implements readahead(2).
|
||||
@@ -151,7 +151,7 @@ func Pread64(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysca
|
||||
|
||||
n, err := preadv(t, file, dst, offset)
|
||||
t.IOUsage().AccountReadSyscall(n)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, kernel.ERESTARTSYS, "pread64", file)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, syserror.ERESTARTSYS, "pread64", file)
|
||||
}
|
||||
|
||||
// Readv implements linux syscall readv(2).
|
||||
@@ -181,7 +181,7 @@ func Readv(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Syscall
|
||||
|
||||
n, err := readv(t, file, dst)
|
||||
t.IOUsage().AccountReadSyscall(n)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, kernel.ERESTARTSYS, "readv", file)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, syserror.ERESTARTSYS, "readv", file)
|
||||
}
|
||||
|
||||
// Preadv implements linux syscall preadv(2).
|
||||
@@ -222,7 +222,7 @@ func Preadv(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Syscal
|
||||
|
||||
n, err := preadv(t, file, dst, offset)
|
||||
t.IOUsage().AccountReadSyscall(n)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, kernel.ERESTARTSYS, "preadv", file)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, syserror.ERESTARTSYS, "preadv", file)
|
||||
}
|
||||
|
||||
// Preadv2 implements linux syscall preadv2(2).
|
||||
@@ -280,12 +280,12 @@ func Preadv2(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysca
|
||||
if offset == -1 {
|
||||
n, err := readv(t, file, dst)
|
||||
t.IOUsage().AccountReadSyscall(n)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, kernel.ERESTARTSYS, "preadv2", file)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, syserror.ERESTARTSYS, "preadv2", file)
|
||||
}
|
||||
|
||||
n, err := preadv(t, file, dst, offset)
|
||||
t.IOUsage().AccountReadSyscall(n)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, kernel.ERESTARTSYS, "preadv2", file)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, syserror.ERESTARTSYS, "preadv2", file)
|
||||
}
|
||||
|
||||
func readv(t *kernel.Task, f *fs.File, dst usermem.IOSequence) (int64, error) {
|
||||
|
||||
@@ -348,7 +348,7 @@ func Sigaltstack(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.S
|
||||
|
||||
// Pause implements linux syscall pause(2).
|
||||
func Pause(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.SyscallControl, error) {
|
||||
return 0, nil, syserror.ConvertIntr(t.Block(nil), kernel.ERESTARTNOHAND)
|
||||
return 0, nil, syserror.ConvertIntr(t.Block(nil), syserror.ERESTARTNOHAND)
|
||||
}
|
||||
|
||||
// RtSigpending implements linux syscall rt_sigpending(2).
|
||||
@@ -496,7 +496,7 @@ func RtSigsuspend(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.
|
||||
t.SetSavedSignalMask(oldmask)
|
||||
|
||||
// Perform the wait.
|
||||
return 0, nil, syserror.ConvertIntr(t.Block(nil), kernel.ERESTARTNOHAND)
|
||||
return 0, nil, syserror.ConvertIntr(t.Block(nil), syserror.ERESTARTNOHAND)
|
||||
}
|
||||
|
||||
// RestartSyscall implements the linux syscall restart_syscall(2).
|
||||
|
||||
@@ -285,7 +285,7 @@ func Connect(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysca
|
||||
}
|
||||
|
||||
blocking := !file.Flags().NonBlocking
|
||||
return 0, nil, syserror.ConvertIntr(s.Connect(t, a, blocking).ToError(), kernel.ERESTARTSYS)
|
||||
return 0, nil, syserror.ConvertIntr(s.Connect(t, a, blocking).ToError(), syserror.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// accept is the implementation of the accept syscall. It is called by accept
|
||||
@@ -316,7 +316,7 @@ func accept(t *kernel.Task, fd int32, addr usermem.Addr, addrLen usermem.Addr, f
|
||||
peerRequested := addrLen != 0
|
||||
nfd, peer, peerLen, e := s.Accept(t, peerRequested, flags, blocking)
|
||||
if e != nil {
|
||||
return 0, syserror.ConvertIntr(e.ToError(), kernel.ERESTARTSYS)
|
||||
return 0, syserror.ConvertIntr(e.ToError(), syserror.ERESTARTSYS)
|
||||
}
|
||||
if peerRequested {
|
||||
// NOTE(magi): Linux does not give you an error if it can't
|
||||
@@ -771,7 +771,7 @@ func recvSingleMsg(t *kernel.Task, s socket.Socket, msgPtr usermem.Addr, flags i
|
||||
if msg.ControlLen == 0 && msg.NameLen == 0 {
|
||||
n, mflags, _, _, cms, err := s.RecvMsg(t, dst, int(flags), haveDeadline, deadline, false, 0)
|
||||
if err != nil {
|
||||
return 0, syserror.ConvertIntr(err.ToError(), kernel.ERESTARTSYS)
|
||||
return 0, syserror.ConvertIntr(err.ToError(), syserror.ERESTARTSYS)
|
||||
}
|
||||
if !cms.Unix.Empty() {
|
||||
mflags |= linux.MSG_CTRUNC
|
||||
@@ -793,7 +793,7 @@ func recvSingleMsg(t *kernel.Task, s socket.Socket, msgPtr usermem.Addr, flags i
|
||||
}
|
||||
n, mflags, sender, senderLen, cms, e := s.RecvMsg(t, dst, int(flags), haveDeadline, deadline, msg.NameLen != 0, msg.ControlLen)
|
||||
if e != nil {
|
||||
return 0, syserror.ConvertIntr(e.ToError(), kernel.ERESTARTSYS)
|
||||
return 0, syserror.ConvertIntr(e.ToError(), syserror.ERESTARTSYS)
|
||||
}
|
||||
defer cms.Release(t)
|
||||
|
||||
@@ -882,7 +882,7 @@ func recvFrom(t *kernel.Task, fd int32, bufPtr usermem.Addr, bufLen uint64, flag
|
||||
n, _, sender, senderLen, cm, e := s.RecvMsg(t, dst, int(flags), haveDeadline, deadline, nameLenPtr != 0, 0)
|
||||
cm.Release(t)
|
||||
if e != nil {
|
||||
return 0, syserror.ConvertIntr(e.ToError(), kernel.ERESTARTSYS)
|
||||
return 0, syserror.ConvertIntr(e.ToError(), syserror.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// Copy the address to the caller.
|
||||
@@ -1064,7 +1064,7 @@ func sendSingleMsg(t *kernel.Task, s socket.Socket, file *fs.File, msgPtr userme
|
||||
|
||||
// Call the syscall implementation.
|
||||
n, e := s.SendMsg(t, src, to, int(flags), haveDeadline, deadline, controlMessages)
|
||||
err = handleIOError(t, n != 0, e.ToError(), kernel.ERESTARTSYS, "sendmsg", file)
|
||||
err = handleIOError(t, n != 0, e.ToError(), syserror.ERESTARTSYS, "sendmsg", file)
|
||||
if err != nil {
|
||||
controlMessages.Release(t)
|
||||
}
|
||||
@@ -1124,7 +1124,7 @@ func sendTo(t *kernel.Task, fd int32, bufPtr usermem.Addr, bufLen uint64, flags
|
||||
|
||||
// Call the syscall implementation.
|
||||
n, e := s.SendMsg(t, src, to, int(flags), haveDeadline, deadline, socket.ControlMessages{Unix: control.New(t, s, nil)})
|
||||
return uintptr(n), handleIOError(t, n != 0, e.ToError(), kernel.ERESTARTSYS, "sendto", file)
|
||||
return uintptr(n), handleIOError(t, n != 0, e.ToError(), syserror.ERESTARTSYS, "sendto", file)
|
||||
}
|
||||
|
||||
// SendTo implements the linux syscall sendto(2).
|
||||
|
||||
@@ -170,7 +170,7 @@ func Sendfile(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysc
|
||||
|
||||
// We can only pass a single file to handleIOError, so pick inFile
|
||||
// arbitrarily. This is used only for debugging purposes.
|
||||
return uintptr(n), nil, handleIOError(t, false, err, kernel.ERESTARTSYS, "sendfile", inFile)
|
||||
return uintptr(n), nil, handleIOError(t, false, err, syserror.ERESTARTSYS, "sendfile", inFile)
|
||||
}
|
||||
|
||||
// Splice implements splice(2).
|
||||
@@ -280,7 +280,7 @@ func Splice(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Syscal
|
||||
}
|
||||
|
||||
// See above; inFile is chosen arbitrarily here.
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, kernel.ERESTARTSYS, "splice", inFile)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, syserror.ERESTARTSYS, "splice", inFile)
|
||||
}
|
||||
|
||||
// Tee imlements tee(2).
|
||||
@@ -333,5 +333,5 @@ func Tee(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.SyscallCo
|
||||
}
|
||||
|
||||
// See above; inFile is chosen arbitrarily here.
|
||||
return uintptr(n), nil, handleIOError(t, false, err, kernel.ERESTARTSYS, "tee", inFile)
|
||||
return uintptr(n), nil, handleIOError(t, false, err, syserror.ERESTARTSYS, "tee", inFile)
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ func Fsync(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Syscall
|
||||
defer file.DecRef(t)
|
||||
|
||||
err := file.Fsync(t, 0, fs.FileMaxOffset, fs.SyncAll)
|
||||
return 0, nil, syserror.ConvertIntr(err, kernel.ERESTARTSYS)
|
||||
return 0, nil, syserror.ConvertIntr(err, syserror.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// Fdatasync implements linux syscall fdatasync(2).
|
||||
@@ -73,7 +73,7 @@ func Fdatasync(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sys
|
||||
defer file.DecRef(t)
|
||||
|
||||
err := file.Fsync(t, 0, fs.FileMaxOffset, fs.SyncData)
|
||||
return 0, nil, syserror.ConvertIntr(err, kernel.ERESTARTSYS)
|
||||
return 0, nil, syserror.ConvertIntr(err, syserror.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// SyncFileRange implements linux syscall sync_file_rage(2)
|
||||
@@ -135,7 +135,7 @@ func SyncFileRange(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel
|
||||
err = file.Fsync(t, offset, fs.FileMaxOffset, fs.SyncData)
|
||||
}
|
||||
|
||||
return 0, nil, syserror.ConvertIntr(err, kernel.ERESTARTSYS)
|
||||
return 0, nil, syserror.ConvertIntr(err, syserror.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// LINT.ThenChange(vfs2/sync.go)
|
||||
|
||||
@@ -262,7 +262,7 @@ func parseCommonWaitOptions(wopts *kernel.WaitOptions, options int) error {
|
||||
wopts.Events |= kernel.EventGroupContinue
|
||||
}
|
||||
if options&linux.WNOHANG == 0 {
|
||||
wopts.BlockInterruptErr = kernel.ERESTARTSYS
|
||||
wopts.BlockInterruptErr = syserror.ERESTARTSYS
|
||||
}
|
||||
if options&linux.WNOTHREAD == 0 {
|
||||
wopts.SiblingChildren = true
|
||||
|
||||
@@ -213,7 +213,7 @@ func clockNanosleepUntil(t *kernel.Task, c ktime.Clock, ts linux.Timespec) error
|
||||
return nil
|
||||
}
|
||||
|
||||
return syserror.ConvertIntr(err, kernel.ERESTARTNOHAND)
|
||||
return syserror.ConvertIntr(err, syserror.ERESTARTNOHAND)
|
||||
}
|
||||
|
||||
// clockNanosleepFor blocks for a specified duration.
|
||||
@@ -254,7 +254,7 @@ func clockNanosleepFor(t *kernel.Task, c ktime.Clock, dur time.Duration, rem use
|
||||
duration: remaining,
|
||||
rem: rem,
|
||||
})
|
||||
return kernel.ERESTART_RESTARTBLOCK
|
||||
return syserror.ERESTART_RESTARTBLOCK
|
||||
default:
|
||||
panic(fmt.Sprintf("Impossible BlockWithTimer error %v", err))
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ func Write(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Syscall
|
||||
|
||||
n, err := writev(t, file, src)
|
||||
t.IOUsage().AccountWriteSyscall(n)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, kernel.ERESTARTSYS, "write", file)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, syserror.ERESTARTSYS, "write", file)
|
||||
}
|
||||
|
||||
// Pwrite64 implements linux syscall pwrite64(2).
|
||||
@@ -118,7 +118,7 @@ func Pwrite64(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysc
|
||||
|
||||
n, err := pwritev(t, file, src, offset)
|
||||
t.IOUsage().AccountWriteSyscall(n)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, kernel.ERESTARTSYS, "pwrite64", file)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, syserror.ERESTARTSYS, "pwrite64", file)
|
||||
}
|
||||
|
||||
// Writev implements linux syscall writev(2).
|
||||
@@ -148,7 +148,7 @@ func Writev(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Syscal
|
||||
|
||||
n, err := writev(t, file, src)
|
||||
t.IOUsage().AccountWriteSyscall(n)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, kernel.ERESTARTSYS, "writev", file)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, syserror.ERESTARTSYS, "writev", file)
|
||||
}
|
||||
|
||||
// Pwritev implements linux syscall pwritev(2).
|
||||
@@ -189,7 +189,7 @@ func Pwritev(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysca
|
||||
|
||||
n, err := pwritev(t, file, src, offset)
|
||||
t.IOUsage().AccountWriteSyscall(n)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, kernel.ERESTARTSYS, "pwritev", file)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, syserror.ERESTARTSYS, "pwritev", file)
|
||||
}
|
||||
|
||||
// Pwritev2 implements linux syscall pwritev2(2).
|
||||
@@ -250,12 +250,12 @@ func Pwritev2(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysc
|
||||
if offset == -1 {
|
||||
n, err := writev(t, file, src)
|
||||
t.IOUsage().AccountWriteSyscall(n)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, kernel.ERESTARTSYS, "pwritev2", file)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, syserror.ERESTARTSYS, "pwritev2", file)
|
||||
}
|
||||
|
||||
n, err := pwritev(t, file, src, offset)
|
||||
t.IOUsage().AccountWriteSyscall(n)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, kernel.ERESTARTSYS, "pwritev2", file)
|
||||
return uintptr(n), nil, handleIOError(t, n != 0, err, syserror.ERESTARTSYS, "pwritev2", file)
|
||||
}
|
||||
|
||||
func writev(t *kernel.Task, f *fs.File, src usermem.IOSequence) (int64, error) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user