Skip to content

Commit

Permalink
refactor: wrap rebundant used code into ioctl()
Browse files Browse the repository at this point in the history
  • Loading branch information
Snshadow committed Sep 13, 2024
1 parent 9219b7e commit 991ee09
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 84 deletions.
42 changes: 3 additions & 39 deletions plat_linux/nvme_driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,20 +95,8 @@ func (s *LinuxNvmeDriverHandle) DoNvmeAdminPassthru(cmd *nvme.NvmeAdminCmd) erro
data.Cdw15 = cmd.Cdw15
data.TimeoutMs = cmd.TimeoutMs
data.Result = cmd.Result
ret, _, err := unix.Syscall(
unix.SYS_IOCTL,
uintptr(s.fd),
NVME_IOCTL_ADMIN_CMD,
uintptr(unsafe.Pointer(&data)),
)
if err != 0 {
return err
}
if ret != 0 {
return unix.Errno(ret)
}

return nil
return ioctl(s.fd, NVME_IOCTL_ADMIN_CMD, uintptr(unsafe.Pointer(&data)))
}

func (s *LinuxNvmeDriverHandle) DoNvmeIoPassthru(cmd *nvme.PassthruCmd) error {
Expand All @@ -130,20 +118,8 @@ func (s *LinuxNvmeDriverHandle) DoNvmeIoPassthru(cmd *nvme.PassthruCmd) error {
data.Cdw15 = cmd.Cdw15
data.TimeoutMs = cmd.TimeoutMs
data.Result = cmd.Result
ret, _, err := unix.Syscall(
unix.SYS_IOCTL,
uintptr(s.fd),
NVME_IOCTL_IO_CMD,
uintptr(unsafe.Pointer(&data)),
)
if err != 0 {
return err
}
if ret != 0 {
return unix.Errno(ret)
}

return nil
return ioctl(s.fd, NVME_IOCTL_IO_CMD, uintptr(unsafe.Pointer(&data)))
}

func (s *LinuxNvmeDriverHandle) DoNvmeIo(io *nvme.UserIo) error {
Expand All @@ -160,20 +136,8 @@ func (s *LinuxNvmeDriverHandle) DoNvmeIo(io *nvme.UserIo) error {
data.Reftag = io.Reftag
data.Apptag = io.Apptag
data.Appmask = io.Appmask
ret, _, err := unix.Syscall(
unix.SYS_IOCTL,
uintptr(s.fd),
NVME_IOCTL_SUBMIT_IO,
uintptr(unsafe.Pointer(&data)),
)
if err != 0 {
return err
}
if ret != 0 {
return unix.Errno(ret)
}

return nil
return ioctl(s.fd, NVME_IOCTL_SUBMIT_IO, uintptr(unsafe.Pointer(&data)))
}

func (s *LinuxNvmeDriverHandle) GetDriverName() string {
Expand Down
38 changes: 4 additions & 34 deletions plat_linux/sg_driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,16 +209,8 @@ func (d *SgDriver) doTaskFileCmd(fd int, rw bool, dma bool, tf *ata.Tf, data []b
}
}

ret, _, err := unix.Syscall(
unix.SYS_IOCTL,
uintptr(fd),
uintptr(SG_IO),
uintptr(unsafe.Pointer(&sgParams)),
)
if err != 0 {
if err := ioctl(fd, SG_IO, uintptr(unsafe.Pointer(&sgParams))); err != nil {
rootError = err
} else if ret != 0 {
rootError = unix.Errno(ret)
} else {
if !rw && alignedBuffer != nil {
alignedBuffer.ResetRead()
Expand All @@ -236,16 +228,8 @@ func (d *SgDriver) doTaskFileCmd(fd int, rw bool, dma bool, tf *ata.Tf, data []b
copy(buffer[n:], data)
}

ret, _, err := unix.Syscall(
unix.SYS_IOCTL,
uintptr(fd),
uintptr(SG_IO),
uintptr(unsafe.Pointer(&sgParams)),
)
if err != 0 {
if err := ioctl(fd, SG_IO, uintptr(unsafe.Pointer(&sgParams))); err != nil {
rootError = err
} else if ret != 0 {
rootError = unix.Errno(ret)
} else {
rootError = nil
copyToPointer(unsafe.Pointer(&sgParams), buffer[:], int(unsafe.Sizeof(sgParams)))
Expand Down Expand Up @@ -381,15 +365,8 @@ func scsiSecurityCommand(fd int, rw bool, dma bool, protocol uint8, comId uint16
sgParams.Dxferp = uintptr(unsafe.Pointer(alignedBuffer.GetPointer()))
}

if ret, _, err := unix.Syscall(
unix.SYS_IOCTL,
uintptr(fd),
uintptr(SG_IO),
uintptr(unsafe.Pointer(&sgParams)),
); err != 0 {
if err := ioctl(fd, SG_IO, uintptr(unsafe.Pointer(&sgParams))); err != nil {
rootError = err
} else if ret != 0 {
rootError = unix.Errno(ret)
} else {
if !rw && alignedBuffer != nil {
alignedBuffer.ResetRead()
Expand All @@ -405,15 +382,8 @@ func scsiSecurityCommand(fd int, rw bool, dma bool, protocol uint8, comId uint16
copyFromPointer(buffer, unsafe.Pointer(&sgParams), int(unsafe.Sizeof(sgParams)))
copy(buffer[n:], data)

if ret, _, err := unix.Syscall(
unix.SYS_IOCTL,
uintptr(fd),
uintptr(SG_IO),
uintptr(unsafe.Pointer(&sgParams)),
); err != 0 {
if err := ioctl(fd, SG_IO, uintptr(unsafe.Pointer(&sgParams))); err != nil {
rootError = err
} else if ret != 0 {
rootError = unix.Errno(ret)
} else {
rootError = nil
copyToPointer(unsafe.Pointer(&sgParams), buffer[:], int(unsafe.Sizeof(sgParams)))
Expand Down
30 changes: 19 additions & 11 deletions plat_linux/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,20 +50,11 @@ func ReadBasicInfo(fd int, path string) (*LinuxBasicInfo, error) {

// Get device size in bytes
var size uint64
if _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), unix.BLKGETSIZE64, uintptr(unsafe.Pointer(&size))); errno == 0 {
if err := ioctl(fd, unix.BLKGETSIZE64, uintptr(unsafe.Pointer(&size))); err == nil {
result.BlockTotalBytes = int64(size)
}

ret, _, err := unix.Syscall(
unix.SYS_IOCTL,
uintptr(fd),
unix.HDIO_GETGEO,
uintptr(unsafe.Pointer(&result.DiskGeometry)),
)
if err != unix.Errno(0) || ret != 0 {
if err == unix.Errno(0) && ret != 0 {
err = unix.Errno(ret)
}
if err = ioctl(fd, unix.HDIO_GETGEO, uintptr(unsafe.Pointer(&result.DiskGeometry))); err != nil {
return nil, common.NewNestedError(path+" HDIO_GETGEO failed", err)
}

Expand All @@ -86,6 +77,23 @@ func ReadBasicInfo(fd int, path string) (*LinuxBasicInfo, error) {
return result, nil
}

func ioctl(fd int, op, arg uintptr) error {
ret, _, err := unix.Syscall(
unix.SYS_IOCTL,
uintptr(fd),
op,
uintptr(unsafe.Pointer(&arg)),
)

if err != 0 {
return err
} else if ret != 0 {
return unix.Errno(ret)
}

return nil
}

func readNullTerminatedAscii(buf []byte, offset int) string {
if offset <= 0 {
return ""
Expand Down

0 comments on commit 991ee09

Please sign in to comment.