mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
93e120e7d6
This works around the fact that deleting a device in a thin pool doesn't discard the free space. Unfortunately even this is not perfect, as it seems discards are respected only for blocks that has never been shared in the thin device code. However, this has been fixed in the upstream kernel device-mapper tree: http://git.kernel.org/cgit/linux/kernel/git/device-mapper/linux-dm.git/commit/?h=for-next&id=0ab1c92ff748b745c1ed7cde31bb37ad2c5f901a When this hits the kernel I belive this will fully return space for removed images/containers to the host FS. For now it only helps partially (which is better than nothing). Docker-DCO-1.1-Signed-off-by: Alexander Larsson <alexl@redhat.com> (github: alexlarsson)
71 lines
1.6 KiB
Go
71 lines
1.6 KiB
Go
// +build linux
|
|
|
|
package devmapper
|
|
|
|
import (
|
|
"unsafe"
|
|
)
|
|
|
|
func ioctlLoopCtlGetFree(fd uintptr) (int, error) {
|
|
index, _, err := sysSyscall(sysSysIoctl, fd, LoopCtlGetFree, 0)
|
|
if err != 0 {
|
|
return 0, err
|
|
}
|
|
return int(index), nil
|
|
}
|
|
|
|
func ioctlLoopSetFd(loopFd, sparseFd uintptr) error {
|
|
if _, _, err := sysSyscall(sysSysIoctl, loopFd, LoopSetFd, sparseFd); err != 0 {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func ioctlLoopSetStatus64(loopFd uintptr, loopInfo *LoopInfo64) error {
|
|
if _, _, err := sysSyscall(sysSysIoctl, loopFd, LoopSetStatus64, uintptr(unsafe.Pointer(loopInfo))); err != 0 {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func ioctlLoopClrFd(loopFd uintptr) error {
|
|
if _, _, err := sysSyscall(sysSysIoctl, loopFd, LoopClrFd, 0); err != 0 {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func ioctlLoopGetStatus64(loopFd uintptr) (*LoopInfo64, error) {
|
|
loopInfo := &LoopInfo64{}
|
|
|
|
if _, _, err := sysSyscall(sysSysIoctl, loopFd, LoopGetStatus64, uintptr(unsafe.Pointer(loopInfo))); err != 0 {
|
|
return nil, err
|
|
}
|
|
return loopInfo, nil
|
|
}
|
|
|
|
func ioctlLoopSetCapacity(loopFd uintptr, value int) error {
|
|
if _, _, err := sysSyscall(sysSysIoctl, loopFd, LoopSetCapacity, uintptr(value)); err != 0 {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func ioctlBlkGetSize64(fd uintptr) (int64, error) {
|
|
var size int64
|
|
if _, _, err := sysSyscall(sysSysIoctl, fd, BlkGetSize64, uintptr(unsafe.Pointer(&size))); err != 0 {
|
|
return 0, err
|
|
}
|
|
return size, nil
|
|
}
|
|
|
|
func ioctlBlkDiscard(fd uintptr, offset, length uint64) error {
|
|
var r [2]uint64
|
|
r[0] = offset
|
|
r[1] = length
|
|
|
|
if _, _, err := sysSyscall(sysSysIoctl, fd, BlkDiscard, uintptr(unsafe.Pointer(&r[0]))); err != 0 {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|