mount: use ioctl helpers from x/sys/unix
Use the IoctlRetInt, IoctlSetInt and IoctlLoopSetStatus64 helper functions defined in the golang.org/x/sys/unix package instead of manually wrapping these using a locally defined ioctl function. Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
This commit is contained in:
parent
0c6553bfda
commit
3cc3d8a560
@ -22,9 +22,7 @@ import (
|
|||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
|
||||||
"time"
|
"time"
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
@ -47,22 +45,13 @@ type LoopParams struct {
|
|||||||
Direct bool
|
Direct bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func ioctl(fd, req, args uintptr) (uintptr, uintptr, error) {
|
|
||||||
r1, r2, errno := syscall.Syscall(syscall.SYS_IOCTL, fd, req, args)
|
|
||||||
if errno != 0 {
|
|
||||||
return 0, 0, errno
|
|
||||||
}
|
|
||||||
|
|
||||||
return r1, r2, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getFreeLoopDev() (uint32, error) {
|
func getFreeLoopDev() (uint32, error) {
|
||||||
ctrl, err := os.OpenFile(loopControlPath, os.O_RDWR, 0)
|
ctrl, err := os.OpenFile(loopControlPath, os.O_RDWR, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("could not open %v: %v", loopControlPath, err)
|
return 0, fmt.Errorf("could not open %v: %v", loopControlPath, err)
|
||||||
}
|
}
|
||||||
defer ctrl.Close()
|
defer ctrl.Close()
|
||||||
num, _, err := ioctl(ctrl.Fd(), unix.LOOP_CTL_GET_FREE, 0)
|
num, err := unix.IoctlRetInt(int(ctrl.Fd()), unix.LOOP_CTL_GET_FREE)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("could not get free loop device: %w", err)
|
return 0, fmt.Errorf("could not get free loop device: %w", err)
|
||||||
}
|
}
|
||||||
@ -96,7 +85,7 @@ func setupLoopDev(backingFile, loopDev string, param LoopParams) (_ *os.File, re
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
// 2. Set FD
|
// 2. Set FD
|
||||||
if _, _, err = ioctl(loop.Fd(), unix.LOOP_SET_FD, back.Fd()); err != nil {
|
if err := unix.IoctlSetInt(int(loop.Fd()), unix.LOOP_SET_FD, int(back.Fd())); err != nil {
|
||||||
return nil, fmt.Errorf("could not set loop fd for device: %s: %w", loopDev, err)
|
return nil, fmt.Errorf("could not set loop fd for device: %s: %w", loopDev, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,7 +104,7 @@ func setupLoopDev(backingFile, loopDev string, param LoopParams) (_ *os.File, re
|
|||||||
info.Flags |= unix.LO_FLAGS_DIRECT_IO
|
info.Flags |= unix.LO_FLAGS_DIRECT_IO
|
||||||
}
|
}
|
||||||
|
|
||||||
_, _, err = ioctl(loop.Fd(), unix.LOOP_SET_STATUS64, uintptr(unsafe.Pointer(&info)))
|
err = unix.IoctlLoopSetStatus64(int(loop.Fd()), &info)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return loop, nil
|
return loop, nil
|
||||||
}
|
}
|
||||||
@ -124,13 +113,13 @@ func setupLoopDev(backingFile, loopDev string, param LoopParams) (_ *os.File, re
|
|||||||
// Retry w/o direct IO flag in case kernel does not support it. The downside is that
|
// Retry w/o direct IO flag in case kernel does not support it. The downside is that
|
||||||
// it will suffer from double cache problem.
|
// it will suffer from double cache problem.
|
||||||
info.Flags &= ^(uint32(unix.LO_FLAGS_DIRECT_IO))
|
info.Flags &= ^(uint32(unix.LO_FLAGS_DIRECT_IO))
|
||||||
_, _, err = ioctl(loop.Fd(), unix.LOOP_SET_STATUS64, uintptr(unsafe.Pointer(&info)))
|
err = unix.IoctlLoopSetStatus64(int(loop.Fd()), &info)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return loop, nil
|
return loop, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_, _, _ = ioctl(loop.Fd(), unix.LOOP_CLR_FD, 0)
|
_ = unix.IoctlSetInt(int(loop.Fd()), unix.LOOP_CLR_FD, 0)
|
||||||
return nil, fmt.Errorf("failed to set loop device info: %v", err)
|
return nil, fmt.Errorf("failed to set loop device info: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,8 +171,7 @@ func removeLoop(loopdev string) error {
|
|||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
_, _, err = ioctl(file.Fd(), unix.LOOP_CLR_FD, 0)
|
return unix.IoctlSetInt(int(file.Fd()), unix.LOOP_CLR_FD, 0)
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AttachLoopDevice attaches a specified backing file to a loop device
|
// AttachLoopDevice attaches a specified backing file to a loop device
|
||||||
|
Loading…
Reference in New Issue
Block a user