mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
[syserr] Move ConvertIntr function to linuxerr package
Move ConverIntr out of syserr package and delete an unused function. PiperOrigin-RevId: 407676258
This commit is contained in:
committed by
gVisor bot
parent
23a115dae8
commit
fe8e48fc6d
@@ -118,3 +118,12 @@ func SyscallRestartErrorFromReturn(rv uintptr) (*errors.Error, bool) {
|
||||
err, ok := restartMap[int(rv)]
|
||||
return err, ok
|
||||
}
|
||||
|
||||
// ConvertIntr converts the provided error code (err) to another one (intr) if
|
||||
// the first error corresponds to an interrupted operation.
|
||||
func ConvertIntr(err, intr error) error {
|
||||
if err == ErrInterrupted {
|
||||
return intr
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -32,7 +32,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/errors/linuxerr"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel/auth"
|
||||
"gvisor.dev/gvisor/pkg/syserr"
|
||||
"gvisor.dev/gvisor/pkg/waiter"
|
||||
)
|
||||
|
||||
@@ -866,7 +865,7 @@ func (t *Task) Wait(opts *WaitOptions) (*WaitResult, error) {
|
||||
return wr, err
|
||||
}
|
||||
if err := t.Block(ch); err != nil {
|
||||
return wr, syserr.ConvertIntr(err, opts.BlockInterruptErr)
|
||||
return wr, linuxerr.ConvertIntr(err, opts.BlockInterruptErr)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel/eventfd"
|
||||
ktime "gvisor.dev/gvisor/pkg/sentry/kernel/time"
|
||||
"gvisor.dev/gvisor/pkg/sentry/mm"
|
||||
"gvisor.dev/gvisor/pkg/syserr"
|
||||
"gvisor.dev/gvisor/pkg/usermem"
|
||||
)
|
||||
|
||||
@@ -138,7 +137,7 @@ func IoGetevents(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.S
|
||||
if count > 0 || linuxerr.Equals(linuxerr.ETIMEDOUT, err) {
|
||||
return uintptr(count), nil, nil
|
||||
}
|
||||
return 0, nil, syserr.ConvertIntr(err, linuxerr.EINTR)
|
||||
return 0, nil, linuxerr.ConvertIntr(err, linuxerr.EINTR)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel/epoll"
|
||||
"gvisor.dev/gvisor/pkg/sentry/syscalls"
|
||||
"gvisor.dev/gvisor/pkg/syserr"
|
||||
"gvisor.dev/gvisor/pkg/waiter"
|
||||
)
|
||||
|
||||
@@ -109,7 +108,7 @@ func EpollCtl(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysc
|
||||
func waitEpoll(t *kernel.Task, fd int32, eventsAddr hostarch.Addr, max int, timeoutInNanos int64) (uintptr, *kernel.SyscallControl, error) {
|
||||
r, err := syscalls.WaitEpoll(t, fd, max, timeoutInNanos)
|
||||
if err != nil {
|
||||
return 0, nil, syserr.ConvertIntr(err, linuxerr.EINTR)
|
||||
return 0, nil, linuxerr.ConvertIntr(err, linuxerr.EINTR)
|
||||
}
|
||||
|
||||
if len(r) != 0 {
|
||||
|
||||
@@ -30,7 +30,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel/fasync"
|
||||
ktime "gvisor.dev/gvisor/pkg/sentry/kernel/time"
|
||||
"gvisor.dev/gvisor/pkg/sentry/limits"
|
||||
"gvisor.dev/gvisor/pkg/syserr"
|
||||
)
|
||||
|
||||
// fileOpAt performs an operation on the second last component in the path.
|
||||
@@ -177,7 +176,7 @@ func openAt(t *kernel.Task, dirFD int32, addr hostarch.Addr, flags uint) (fd uin
|
||||
|
||||
file, err := d.Inode.GetFile(t, d, fileFlags)
|
||||
if err != nil {
|
||||
return syserr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
return linuxerr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
}
|
||||
defer file.DecRef(t)
|
||||
|
||||
@@ -416,7 +415,7 @@ func createAt(t *kernel.Task, dirFD int32, addr hostarch.Addr, flags uint, mode
|
||||
// Create a new fs.File.
|
||||
newFile, err = found.Inode.GetFile(t, found, fileFlags)
|
||||
if err != nil {
|
||||
return syserr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
return linuxerr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
}
|
||||
defer newFile.DecRef(t)
|
||||
case linuxerr.Equals(linuxerr.ENOENT, err):
|
||||
|
||||
@@ -23,7 +23,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/sentry/arch"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel"
|
||||
ktime "gvisor.dev/gvisor/pkg/sentry/kernel/time"
|
||||
"gvisor.dev/gvisor/pkg/syserr"
|
||||
)
|
||||
|
||||
// futexWaitRestartBlock encapsulates the state required to restart futex(2)
|
||||
@@ -75,7 +74,7 @@ func futexWaitAbsolute(t *kernel.Task, clockRealtime bool, ts linux.Timespec, fo
|
||||
}
|
||||
|
||||
t.Futex().WaitComplete(w, t)
|
||||
return 0, syserr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
return 0, linuxerr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// futexWaitDuration performs a FUTEX_WAIT, blocking until the wait is
|
||||
@@ -150,7 +149,7 @@ func futexLockPI(t *kernel.Task, ts linux.Timespec, forever bool, addr hostarch.
|
||||
}
|
||||
|
||||
t.Futex().WaitComplete(w, t)
|
||||
return syserr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
return linuxerr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
}
|
||||
|
||||
func tryLockPI(t *kernel.Task, addr hostarch.Addr, private bool) error {
|
||||
|
||||
@@ -24,7 +24,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel"
|
||||
"gvisor.dev/gvisor/pkg/sentry/memmap"
|
||||
"gvisor.dev/gvisor/pkg/sentry/mm"
|
||||
"gvisor.dev/gvisor/pkg/syserr"
|
||||
)
|
||||
|
||||
// Brk implements linux syscall brk(2).
|
||||
@@ -277,7 +276,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, syserr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
return 0, nil, linuxerr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// Mlock implements linux syscall mlock(2).
|
||||
|
||||
@@ -25,7 +25,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel"
|
||||
ktime "gvisor.dev/gvisor/pkg/sentry/kernel/time"
|
||||
"gvisor.dev/gvisor/pkg/sentry/limits"
|
||||
"gvisor.dev/gvisor/pkg/syserr"
|
||||
"gvisor.dev/gvisor/pkg/waiter"
|
||||
)
|
||||
|
||||
@@ -185,7 +184,7 @@ func doPoll(t *kernel.Task, addr hostarch.Addr, nfds uint, timeout time.Duration
|
||||
pfd[i].Events |= linux.POLLHUP | linux.POLLERR
|
||||
}
|
||||
remainingTimeout, n, err := pollBlock(t, pfd, timeout)
|
||||
err = syserr.ConvertIntr(err, linuxerr.EINTR)
|
||||
err = linuxerr.ConvertIntr(err, linuxerr.EINTR)
|
||||
|
||||
// The poll entries are copied out regardless of whether
|
||||
// any are set or not. This aligns with the Linux behavior.
|
||||
@@ -295,7 +294,7 @@ func doSelect(t *kernel.Task, nfds int, readFDs, writeFDs, exceptFDs hostarch.Ad
|
||||
|
||||
// Do the syscall, then count the number of bits set.
|
||||
if _, _, err = pollBlock(t, pfd, timeout); err != nil {
|
||||
return 0, syserr.ConvertIntr(err, linuxerr.EINTR)
|
||||
return 0, linuxerr.ConvertIntr(err, linuxerr.EINTR)
|
||||
}
|
||||
|
||||
// r, w, and e are currently event mask bitsets; unset bits corresponding
|
||||
|
||||
@@ -25,7 +25,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/sentry/fs"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel/signalfd"
|
||||
"gvisor.dev/gvisor/pkg/syserr"
|
||||
)
|
||||
|
||||
// "For a process to have permission to send a signal it must
|
||||
@@ -348,7 +347,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, syserr.ConvertIntr(t.Block(nil), linuxerr.ERESTARTNOHAND)
|
||||
return 0, nil, linuxerr.ConvertIntr(t.Block(nil), linuxerr.ERESTARTNOHAND)
|
||||
}
|
||||
|
||||
// RtSigpending implements linux syscall rt_sigpending(2).
|
||||
@@ -496,7 +495,7 @@ func RtSigsuspend(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.
|
||||
t.SetSavedSignalMask(oldmask)
|
||||
|
||||
// Perform the wait.
|
||||
return 0, nil, syserr.ConvertIntr(t.Block(nil), linuxerr.ERESTARTNOHAND)
|
||||
return 0, nil, linuxerr.ConvertIntr(t.Block(nil), linuxerr.ERESTARTNOHAND)
|
||||
}
|
||||
|
||||
// RestartSyscall implements the linux syscall restart_syscall(2).
|
||||
|
||||
@@ -269,7 +269,7 @@ func Connect(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysca
|
||||
}
|
||||
|
||||
blocking := !file.Flags().NonBlocking
|
||||
return 0, nil, syserr.ConvertIntr(s.Connect(t, a, blocking).ToError(), linuxerr.ERESTARTSYS)
|
||||
return 0, nil, linuxerr.ConvertIntr(s.Connect(t, a, blocking).ToError(), linuxerr.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// accept is the implementation of the accept syscall. It is called by accept
|
||||
@@ -300,7 +300,7 @@ func accept(t *kernel.Task, fd int32, addr hostarch.Addr, addrLen hostarch.Addr,
|
||||
peerRequested := addrLen != 0
|
||||
nfd, peer, peerLen, e := s.Accept(t, peerRequested, flags, blocking)
|
||||
if e != nil {
|
||||
return 0, syserr.ConvertIntr(e.ToError(), linuxerr.ERESTARTSYS)
|
||||
return 0, linuxerr.ConvertIntr(e.ToError(), linuxerr.ERESTARTSYS)
|
||||
}
|
||||
if peerRequested {
|
||||
// NOTE(magi): Linux does not give you an error if it can't
|
||||
@@ -762,7 +762,7 @@ func recvSingleMsg(t *kernel.Task, s socket.Socket, msgPtr hostarch.Addr, flags
|
||||
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, syserr.ConvertIntr(err.ToError(), linuxerr.ERESTARTSYS)
|
||||
return 0, linuxerr.ConvertIntr(err.ToError(), linuxerr.ERESTARTSYS)
|
||||
}
|
||||
if !cms.Unix.Empty() {
|
||||
mflags |= linux.MSG_CTRUNC
|
||||
@@ -784,7 +784,7 @@ func recvSingleMsg(t *kernel.Task, s socket.Socket, msgPtr hostarch.Addr, flags
|
||||
}
|
||||
n, mflags, sender, senderLen, cms, e := s.RecvMsg(t, dst, int(flags), haveDeadline, deadline, msg.NameLen != 0, msg.ControlLen)
|
||||
if e != nil {
|
||||
return 0, syserr.ConvertIntr(e.ToError(), linuxerr.ERESTARTSYS)
|
||||
return 0, linuxerr.ConvertIntr(e.ToError(), linuxerr.ERESTARTSYS)
|
||||
}
|
||||
defer cms.Release(t)
|
||||
|
||||
@@ -873,7 +873,7 @@ func recvFrom(t *kernel.Task, fd int32, bufPtr hostarch.Addr, bufLen uint64, fla
|
||||
n, _, sender, senderLen, cm, e := s.RecvMsg(t, dst, int(flags), haveDeadline, deadline, nameLenPtr != 0, 0)
|
||||
cm.Release(t)
|
||||
if e != nil {
|
||||
return 0, syserr.ConvertIntr(e.ToError(), linuxerr.ERESTARTSYS)
|
||||
return 0, linuxerr.ConvertIntr(e.ToError(), linuxerr.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// Copy the address to the caller.
|
||||
|
||||
@@ -20,7 +20,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/sentry/arch"
|
||||
"gvisor.dev/gvisor/pkg/sentry/fs"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel"
|
||||
"gvisor.dev/gvisor/pkg/syserr"
|
||||
)
|
||||
|
||||
// LINT.IfChange
|
||||
@@ -58,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, syserr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
return 0, nil, linuxerr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// Fdatasync implements linux syscall fdatasync(2).
|
||||
@@ -74,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, syserr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
return 0, nil, linuxerr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// SyncFileRange implements linux syscall sync_file_rage(2)
|
||||
@@ -137,7 +136,7 @@ func SyncFileRange(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel
|
||||
err = file.Fsync(t, offset, fs.FileMaxOffset, fs.SyncData)
|
||||
}
|
||||
|
||||
return 0, nil, syserr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
return 0, nil, linuxerr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// LINT.ThenChange(vfs2/sync.go)
|
||||
|
||||
@@ -26,7 +26,6 @@ import (
|
||||
ktime "gvisor.dev/gvisor/pkg/sentry/kernel/time"
|
||||
"gvisor.dev/gvisor/pkg/sentry/limits"
|
||||
"gvisor.dev/gvisor/pkg/sentry/vfs"
|
||||
"gvisor.dev/gvisor/pkg/syserr"
|
||||
"gvisor.dev/gvisor/pkg/waiter"
|
||||
)
|
||||
|
||||
@@ -188,7 +187,7 @@ func doPoll(t *kernel.Task, addr hostarch.Addr, nfds uint, timeout time.Duration
|
||||
pfd[i].Events |= linux.POLLHUP | linux.POLLERR
|
||||
}
|
||||
remainingTimeout, n, err := pollBlock(t, pfd, timeout)
|
||||
err = syserr.ConvertIntr(err, linuxerr.EINTR)
|
||||
err = linuxerr.ConvertIntr(err, linuxerr.EINTR)
|
||||
|
||||
// The poll entries are copied out regardless of whether
|
||||
// any are set or not. This aligns with the Linux behavior.
|
||||
@@ -298,7 +297,7 @@ func doSelect(t *kernel.Task, nfds int, readFDs, writeFDs, exceptFDs hostarch.Ad
|
||||
|
||||
// Do the syscall, then count the number of bits set.
|
||||
if _, _, err = pollBlock(t, pfd, timeout); err != nil {
|
||||
return 0, syserr.ConvertIntr(err, linuxerr.EINTR)
|
||||
return 0, linuxerr.ConvertIntr(err, linuxerr.EINTR)
|
||||
}
|
||||
|
||||
// r, w, and e are currently event mask bitsets; unset bits corresponding
|
||||
|
||||
@@ -272,7 +272,7 @@ func Connect(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysca
|
||||
}
|
||||
|
||||
blocking := (file.StatusFlags() & linux.SOCK_NONBLOCK) == 0
|
||||
return 0, nil, syserr.ConvertIntr(s.Connect(t, a, blocking).ToError(), linuxerr.ERESTARTSYS)
|
||||
return 0, nil, linuxerr.ConvertIntr(s.Connect(t, a, blocking).ToError(), linuxerr.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// accept is the implementation of the accept syscall. It is called by accept
|
||||
@@ -303,7 +303,7 @@ func accept(t *kernel.Task, fd int32, addr hostarch.Addr, addrLen hostarch.Addr,
|
||||
peerRequested := addrLen != 0
|
||||
nfd, peer, peerLen, e := s.Accept(t, peerRequested, flags, blocking)
|
||||
if e != nil {
|
||||
return 0, syserr.ConvertIntr(e.ToError(), linuxerr.ERESTARTSYS)
|
||||
return 0, linuxerr.ConvertIntr(e.ToError(), linuxerr.ERESTARTSYS)
|
||||
}
|
||||
if peerRequested {
|
||||
// NOTE(magi): Linux does not give you an error if it can't
|
||||
@@ -765,7 +765,7 @@ func recvSingleMsg(t *kernel.Task, s socket.SocketVFS2, msgPtr hostarch.Addr, fl
|
||||
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, syserr.ConvertIntr(err.ToError(), linuxerr.ERESTARTSYS)
|
||||
return 0, linuxerr.ConvertIntr(err.ToError(), linuxerr.ERESTARTSYS)
|
||||
}
|
||||
if !cms.Unix.Empty() {
|
||||
mflags |= linux.MSG_CTRUNC
|
||||
@@ -787,7 +787,7 @@ func recvSingleMsg(t *kernel.Task, s socket.SocketVFS2, msgPtr hostarch.Addr, fl
|
||||
}
|
||||
n, mflags, sender, senderLen, cms, e := s.RecvMsg(t, dst, int(flags), haveDeadline, deadline, msg.NameLen != 0, msg.ControlLen)
|
||||
if e != nil {
|
||||
return 0, syserr.ConvertIntr(e.ToError(), linuxerr.ERESTARTSYS)
|
||||
return 0, linuxerr.ConvertIntr(e.ToError(), linuxerr.ERESTARTSYS)
|
||||
}
|
||||
defer cms.Release(t)
|
||||
|
||||
@@ -876,7 +876,7 @@ func recvFrom(t *kernel.Task, fd int32, bufPtr hostarch.Addr, bufLen uint64, fla
|
||||
n, _, sender, senderLen, cm, e := s.RecvMsg(t, dst, int(flags), haveDeadline, deadline, nameLenPtr != 0, 0)
|
||||
cm.Release(t)
|
||||
if e != nil {
|
||||
return 0, syserr.ConvertIntr(e.ToError(), linuxerr.ERESTARTSYS)
|
||||
return 0, linuxerr.ConvertIntr(e.ToError(), linuxerr.ERESTARTSYS)
|
||||
}
|
||||
|
||||
// Copy the address to the caller.
|
||||
|
||||
@@ -19,7 +19,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/errors/linuxerr"
|
||||
"gvisor.dev/gvisor/pkg/sentry/arch"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel"
|
||||
"gvisor.dev/gvisor/pkg/syserr"
|
||||
)
|
||||
|
||||
// Sync implements Linux syscall sync(2).
|
||||
@@ -113,7 +112,7 @@ func SyncFileRange(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel
|
||||
|
||||
if flags&linux.SYNC_FILE_RANGE_WAIT_AFTER != 0 {
|
||||
if err := file.Sync(t); err != nil {
|
||||
return 0, nil, syserr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
return 0, nil, linuxerr.ConvertIntr(err, linuxerr.ERESTARTSYS)
|
||||
}
|
||||
}
|
||||
return 0, nil, nil
|
||||
|
||||
@@ -74,15 +74,6 @@ func NewDynamic(message string, linuxTranslation errno.Errno) *Error {
|
||||
return &Error{message: message, errno: linuxTranslation}
|
||||
}
|
||||
|
||||
// NewWithoutTranslation creates a new Error. If translation is attempted on
|
||||
// the error, translation will fail.
|
||||
//
|
||||
// NewWithoutTranslation may be called at any time, but static errors should
|
||||
// be declared as global variables and dynamic errors should be used sparingly.
|
||||
func NewWithoutTranslation(message string) *Error {
|
||||
return &Error{message: message, noTranslation: true}
|
||||
}
|
||||
|
||||
func newWithHost(message string, linuxTranslation errno.Errno, hostErrno unix.Errno) *Error {
|
||||
e := New(message, linuxTranslation)
|
||||
addLinuxHostTranslation(hostErrno, e)
|
||||
@@ -292,12 +283,3 @@ func FromError(err error) *Error {
|
||||
msg := fmt.Sprintf("err: %s type: %T", err.Error(), err)
|
||||
panic(msg)
|
||||
}
|
||||
|
||||
// ConvertIntr converts the provided error code (err) to another one (intr) if
|
||||
// the first error corresponds to an interrupted operation.
|
||||
func ConvertIntr(err, intr error) error {
|
||||
if err == linuxerr.ErrInterrupted {
|
||||
return intr
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user