|
@@ -20,6 +20,7 @@ import (
|
|
|
|
|
|
log "github.com/Sirupsen/logrus"
|
|
log "github.com/Sirupsen/logrus"
|
|
"github.com/docker/docker/daemon/graphdriver"
|
|
"github.com/docker/docker/daemon/graphdriver"
|
|
|
|
+ "github.com/docker/docker/pkg/devicemapper"
|
|
"github.com/docker/docker/pkg/parsers"
|
|
"github.com/docker/docker/pkg/parsers"
|
|
"github.com/docker/docker/pkg/units"
|
|
"github.com/docker/docker/pkg/units"
|
|
"github.com/docker/libcontainer/label"
|
|
"github.com/docker/libcontainer/label"
|
|
@@ -228,7 +229,7 @@ func (devices *DeviceSet) saveMetadata(info *DevInfo) error {
|
|
}
|
|
}
|
|
|
|
|
|
if devices.NewTransactionId != devices.TransactionId {
|
|
if devices.NewTransactionId != devices.TransactionId {
|
|
- if err = setTransactionId(devices.getPoolDevName(), devices.TransactionId, devices.NewTransactionId); err != nil {
|
|
|
|
|
|
+ if err = devicemapper.SetTransactionId(devices.getPoolDevName(), devices.TransactionId, devices.NewTransactionId); err != nil {
|
|
return fmt.Errorf("Error setting devmapper transition ID: %s", err)
|
|
return fmt.Errorf("Error setting devmapper transition ID: %s", err)
|
|
}
|
|
}
|
|
devices.TransactionId = devices.NewTransactionId
|
|
devices.TransactionId = devices.NewTransactionId
|
|
@@ -280,11 +281,11 @@ func (devices *DeviceSet) registerDevice(id int, hash string, size uint64) (*Dev
|
|
func (devices *DeviceSet) activateDeviceIfNeeded(info *DevInfo) error {
|
|
func (devices *DeviceSet) activateDeviceIfNeeded(info *DevInfo) error {
|
|
log.Debugf("activateDeviceIfNeeded(%v)", info.Hash)
|
|
log.Debugf("activateDeviceIfNeeded(%v)", info.Hash)
|
|
|
|
|
|
- if devinfo, _ := getInfo(info.Name()); devinfo != nil && devinfo.Exists != 0 {
|
|
|
|
|
|
+ if devinfo, _ := devicemapper.GetInfo(info.Name()); devinfo != nil && devinfo.Exists != 0 {
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
- return activateDevice(devices.getPoolDevName(), info.Name(), info.DeviceId, info.Size)
|
|
|
|
|
|
+ return devicemapper.ActivateDevice(devices.getPoolDevName(), info.Name(), info.DeviceId, info.Size)
|
|
}
|
|
}
|
|
|
|
|
|
func (devices *DeviceSet) createFilesystem(info *DevInfo) error {
|
|
func (devices *DeviceSet) createFilesystem(info *DevInfo) error {
|
|
@@ -321,7 +322,7 @@ func (devices *DeviceSet) createFilesystem(info *DevInfo) error {
|
|
}
|
|
}
|
|
|
|
|
|
func (devices *DeviceSet) initMetaData() error {
|
|
func (devices *DeviceSet) initMetaData() error {
|
|
- _, _, _, params, err := getStatus(devices.getPoolName())
|
|
|
|
|
|
+ _, _, _, params, err := devicemapper.GetStatus(devices.getPoolName())
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -400,7 +401,7 @@ func (devices *DeviceSet) setupBaseImage() error {
|
|
id := devices.nextDeviceId
|
|
id := devices.nextDeviceId
|
|
|
|
|
|
// Create initial device
|
|
// Create initial device
|
|
- if err := createDevice(devices.getPoolDevName(), &id); err != nil {
|
|
|
|
|
|
+ if err := devicemapper.CreateDevice(devices.getPoolDevName(), &id); err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
@@ -410,7 +411,7 @@ func (devices *DeviceSet) setupBaseImage() error {
|
|
log.Debugf("Registering base device (id %v) with FS size %v", id, devices.baseFsSize)
|
|
log.Debugf("Registering base device (id %v) with FS size %v", id, devices.baseFsSize)
|
|
info, err := devices.registerDevice(id, "", devices.baseFsSize)
|
|
info, err := devices.registerDevice(id, "", devices.baseFsSize)
|
|
if err != nil {
|
|
if err != nil {
|
|
- _ = deleteDevice(devices.getPoolDevName(), id)
|
|
|
|
|
|
+ _ = devicemapper.DeleteDevice(devices.getPoolDevName(), id)
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
@@ -447,11 +448,12 @@ func setCloseOnExec(name string) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-func (devices *DeviceSet) log(level int, file string, line int, dmError int, message string) {
|
|
|
|
|
|
+func (devices *DeviceSet) DMLog(level int, file string, line int, dmError int, message string) {
|
|
if level >= 7 {
|
|
if level >= 7 {
|
|
return // Ignore _LOG_DEBUG
|
|
return // Ignore _LOG_DEBUG
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // FIXME(vbatts) push this back into ./pkg/devicemapper/
|
|
log.Debugf("libdevmapper(%d): %s:%d (%d) %s", level, file, line, dmError, message)
|
|
log.Debugf("libdevmapper(%d): %s:%d (%d) %s", level, file, line, dmError, message)
|
|
}
|
|
}
|
|
|
|
|
|
@@ -489,7 +491,7 @@ func (devices *DeviceSet) ResizePool(size int64) error {
|
|
return fmt.Errorf("Can't shrink file")
|
|
return fmt.Errorf("Can't shrink file")
|
|
}
|
|
}
|
|
|
|
|
|
- dataloopback := FindLoopDeviceFor(datafile)
|
|
|
|
|
|
+ dataloopback := devicemapper.FindLoopDeviceFor(datafile)
|
|
if dataloopback == nil {
|
|
if dataloopback == nil {
|
|
return fmt.Errorf("Unable to find loopback mount for: %s", datafilename)
|
|
return fmt.Errorf("Unable to find loopback mount for: %s", datafilename)
|
|
}
|
|
}
|
|
@@ -501,7 +503,7 @@ func (devices *DeviceSet) ResizePool(size int64) error {
|
|
}
|
|
}
|
|
defer metadatafile.Close()
|
|
defer metadatafile.Close()
|
|
|
|
|
|
- metadataloopback := FindLoopDeviceFor(metadatafile)
|
|
|
|
|
|
+ metadataloopback := devicemapper.FindLoopDeviceFor(metadatafile)
|
|
if metadataloopback == nil {
|
|
if metadataloopback == nil {
|
|
return fmt.Errorf("Unable to find loopback mount for: %s", metadatafilename)
|
|
return fmt.Errorf("Unable to find loopback mount for: %s", metadatafilename)
|
|
}
|
|
}
|
|
@@ -513,22 +515,22 @@ func (devices *DeviceSet) ResizePool(size int64) error {
|
|
}
|
|
}
|
|
|
|
|
|
// Reload size for loopback device
|
|
// Reload size for loopback device
|
|
- if err := LoopbackSetCapacity(dataloopback); err != nil {
|
|
|
|
|
|
+ if err := devicemapper.LoopbackSetCapacity(dataloopback); err != nil {
|
|
return fmt.Errorf("Unable to update loopback capacity: %s", err)
|
|
return fmt.Errorf("Unable to update loopback capacity: %s", err)
|
|
}
|
|
}
|
|
|
|
|
|
// Suspend the pool
|
|
// Suspend the pool
|
|
- if err := suspendDevice(devices.getPoolName()); err != nil {
|
|
|
|
|
|
+ if err := devicemapper.SuspendDevice(devices.getPoolName()); err != nil {
|
|
return fmt.Errorf("Unable to suspend pool: %s", err)
|
|
return fmt.Errorf("Unable to suspend pool: %s", err)
|
|
}
|
|
}
|
|
|
|
|
|
// Reload with the new block sizes
|
|
// Reload with the new block sizes
|
|
- if err := reloadPool(devices.getPoolName(), dataloopback, metadataloopback, devices.thinpBlockSize); err != nil {
|
|
|
|
|
|
+ if err := devicemapper.ReloadPool(devices.getPoolName(), dataloopback, metadataloopback, devices.thinpBlockSize); err != nil {
|
|
return fmt.Errorf("Unable to reload pool: %s", err)
|
|
return fmt.Errorf("Unable to reload pool: %s", err)
|
|
}
|
|
}
|
|
|
|
|
|
// Resume the pool
|
|
// Resume the pool
|
|
- if err := resumeDevice(devices.getPoolName()); err != nil {
|
|
|
|
|
|
+ if err := devicemapper.ResumeDevice(devices.getPoolName()); err != nil {
|
|
return fmt.Errorf("Unable to resume pool: %s", err)
|
|
return fmt.Errorf("Unable to resume pool: %s", err)
|
|
}
|
|
}
|
|
|
|
|
|
@@ -536,9 +538,10 @@ func (devices *DeviceSet) ResizePool(size int64) error {
|
|
}
|
|
}
|
|
|
|
|
|
func (devices *DeviceSet) initDevmapper(doInit bool) error {
|
|
func (devices *DeviceSet) initDevmapper(doInit bool) error {
|
|
- logInit(devices)
|
|
|
|
|
|
+ // give ourselves to libdm as a log handler
|
|
|
|
+ devicemapper.LogInit(devices)
|
|
|
|
|
|
- _, err := getDriverVersion()
|
|
|
|
|
|
+ _, err := devicemapper.GetDriverVersion()
|
|
if err != nil {
|
|
if err != nil {
|
|
// Can't even get driver version, assume not supported
|
|
// Can't even get driver version, assume not supported
|
|
return graphdriver.ErrNotSupported
|
|
return graphdriver.ErrNotSupported
|
|
@@ -566,9 +569,9 @@ func (devices *DeviceSet) initDevmapper(doInit bool) error {
|
|
|
|
|
|
// Check for the existence of the device <prefix>-pool
|
|
// Check for the existence of the device <prefix>-pool
|
|
log.Debugf("Checking for existence of the pool '%s'", devices.getPoolName())
|
|
log.Debugf("Checking for existence of the pool '%s'", devices.getPoolName())
|
|
- info, err := getInfo(devices.getPoolName())
|
|
|
|
|
|
+ info, err := devicemapper.GetInfo(devices.getPoolName())
|
|
if info == nil {
|
|
if info == nil {
|
|
- log.Debugf("Error device getInfo: %s", err)
|
|
|
|
|
|
+ log.Debugf("Error device devicemapper.GetInfo: %s", err)
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
@@ -610,7 +613,7 @@ func (devices *DeviceSet) initDevmapper(doInit bool) error {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
- dataFile, err = attachLoopDevice(data)
|
|
|
|
|
|
+ dataFile, err = devicemapper.AttachLoopDevice(data)
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -641,7 +644,7 @@ func (devices *DeviceSet) initDevmapper(doInit bool) error {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
- metadataFile, err = attachLoopDevice(metadata)
|
|
|
|
|
|
+ metadataFile, err = devicemapper.AttachLoopDevice(metadata)
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -653,7 +656,7 @@ func (devices *DeviceSet) initDevmapper(doInit bool) error {
|
|
}
|
|
}
|
|
defer metadataFile.Close()
|
|
defer metadataFile.Close()
|
|
|
|
|
|
- if err := createPool(devices.getPoolName(), dataFile, metadataFile, devices.thinpBlockSize); err != nil {
|
|
|
|
|
|
+ if err := devicemapper.CreatePool(devices.getPoolName(), dataFile, metadataFile, devices.thinpBlockSize); err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -695,7 +698,7 @@ func (devices *DeviceSet) AddDevice(hash, baseHash string) error {
|
|
|
|
|
|
deviceId := devices.nextDeviceId
|
|
deviceId := devices.nextDeviceId
|
|
|
|
|
|
- if err := createSnapDevice(devices.getPoolDevName(), &deviceId, baseInfo.Name(), baseInfo.DeviceId); err != nil {
|
|
|
|
|
|
+ if err := devicemapper.CreateSnapDevice(devices.getPoolDevName(), &deviceId, baseInfo.Name(), baseInfo.DeviceId); err != nil {
|
|
log.Debugf("Error creating snap device: %s", err)
|
|
log.Debugf("Error creating snap device: %s", err)
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -704,7 +707,7 @@ func (devices *DeviceSet) AddDevice(hash, baseHash string) error {
|
|
devices.nextDeviceId = (deviceId + 1) & 0xffffff
|
|
devices.nextDeviceId = (deviceId + 1) & 0xffffff
|
|
|
|
|
|
if _, err := devices.registerDevice(deviceId, hash, baseInfo.Size); err != nil {
|
|
if _, err := devices.registerDevice(deviceId, hash, baseInfo.Size); err != nil {
|
|
- deleteDevice(devices.getPoolDevName(), deviceId)
|
|
|
|
|
|
+ devicemapper.DeleteDevice(devices.getPoolDevName(), deviceId)
|
|
log.Debugf("Error registering device: %s", err)
|
|
log.Debugf("Error registering device: %s", err)
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -717,13 +720,13 @@ func (devices *DeviceSet) deleteDevice(info *DevInfo) error {
|
|
// on the thin pool when we remove a thinp device, so we do it
|
|
// on the thin pool when we remove a thinp device, so we do it
|
|
// manually
|
|
// manually
|
|
if err := devices.activateDeviceIfNeeded(info); err == nil {
|
|
if err := devices.activateDeviceIfNeeded(info); err == nil {
|
|
- if err := BlockDeviceDiscard(info.DevName()); err != nil {
|
|
|
|
|
|
+ if err := devicemapper.BlockDeviceDiscard(info.DevName()); err != nil {
|
|
log.Debugf("Error discarding block on device: %s (ignoring)", err)
|
|
log.Debugf("Error discarding block on device: %s (ignoring)", err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- devinfo, _ := getInfo(info.Name())
|
|
|
|
|
|
+ devinfo, _ := devicemapper.GetInfo(info.Name())
|
|
if devinfo != nil && devinfo.Exists != 0 {
|
|
if devinfo != nil && devinfo.Exists != 0 {
|
|
if err := devices.removeDeviceAndWait(info.Name()); err != nil {
|
|
if err := devices.removeDeviceAndWait(info.Name()); err != nil {
|
|
log.Debugf("Error removing device: %s", err)
|
|
log.Debugf("Error removing device: %s", err)
|
|
@@ -731,7 +734,7 @@ func (devices *DeviceSet) deleteDevice(info *DevInfo) error {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if err := deleteDevice(devices.getPoolDevName(), info.DeviceId); err != nil {
|
|
|
|
|
|
+ if err := devicemapper.DeleteDevice(devices.getPoolDevName(), info.DeviceId); err != nil {
|
|
log.Debugf("Error deleting device: %s", err)
|
|
log.Debugf("Error deleting device: %s", err)
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -772,16 +775,16 @@ func (devices *DeviceSet) deactivatePool() error {
|
|
defer log.Debugf("[devmapper] deactivatePool END")
|
|
defer log.Debugf("[devmapper] deactivatePool END")
|
|
devname := devices.getPoolDevName()
|
|
devname := devices.getPoolDevName()
|
|
|
|
|
|
- devinfo, err := getInfo(devname)
|
|
|
|
|
|
+ devinfo, err := devicemapper.GetInfo(devname)
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
- if d, err := getDeps(devname); err == nil {
|
|
|
|
|
|
+ if d, err := devicemapper.GetDeps(devname); err == nil {
|
|
// Access to more Debug output
|
|
// Access to more Debug output
|
|
- log.Debugf("[devmapper] getDeps() %s: %#v", devname, d)
|
|
|
|
|
|
+ log.Debugf("[devmapper] devicemapper.GetDeps() %s: %#v", devname, d)
|
|
}
|
|
}
|
|
if devinfo.Exists != 0 {
|
|
if devinfo.Exists != 0 {
|
|
- return removeDevice(devname)
|
|
|
|
|
|
+ return devicemapper.RemoveDevice(devname)
|
|
}
|
|
}
|
|
|
|
|
|
return nil
|
|
return nil
|
|
@@ -797,7 +800,7 @@ func (devices *DeviceSet) deactivateDevice(info *DevInfo) error {
|
|
log.Errorf("Warning: error waiting for device %s to close: %s", info.Hash, err)
|
|
log.Errorf("Warning: error waiting for device %s to close: %s", info.Hash, err)
|
|
}
|
|
}
|
|
|
|
|
|
- devinfo, err := getInfo(info.Name())
|
|
|
|
|
|
+ devinfo, err := devicemapper.GetInfo(info.Name())
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -816,11 +819,11 @@ func (devices *DeviceSet) removeDeviceAndWait(devname string) error {
|
|
var err error
|
|
var err error
|
|
|
|
|
|
for i := 0; i < 1000; i++ {
|
|
for i := 0; i < 1000; i++ {
|
|
- err = removeDevice(devname)
|
|
|
|
|
|
+ err = devicemapper.RemoveDevice(devname)
|
|
if err == nil {
|
|
if err == nil {
|
|
break
|
|
break
|
|
}
|
|
}
|
|
- if err != ErrBusy {
|
|
|
|
|
|
+ if err != devicemapper.ErrBusy {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
@@ -848,7 +851,7 @@ func (devices *DeviceSet) waitRemove(devname string) error {
|
|
defer log.Debugf("[deviceset %s] waitRemove(%s) END", devices.devicePrefix, devname)
|
|
defer log.Debugf("[deviceset %s] waitRemove(%s) END", devices.devicePrefix, devname)
|
|
i := 0
|
|
i := 0
|
|
for ; i < 1000; i++ {
|
|
for ; i < 1000; i++ {
|
|
- devinfo, err := getInfo(devname)
|
|
|
|
|
|
+ devinfo, err := devicemapper.GetInfo(devname)
|
|
if err != nil {
|
|
if err != nil {
|
|
// If there is an error we assume the device doesn't exist.
|
|
// If there is an error we assume the device doesn't exist.
|
|
// The error might actually be something else, but we can't differentiate.
|
|
// The error might actually be something else, but we can't differentiate.
|
|
@@ -877,7 +880,7 @@ func (devices *DeviceSet) waitRemove(devname string) error {
|
|
func (devices *DeviceSet) waitClose(info *DevInfo) error {
|
|
func (devices *DeviceSet) waitClose(info *DevInfo) error {
|
|
i := 0
|
|
i := 0
|
|
for ; i < 1000; i++ {
|
|
for ; i < 1000; i++ {
|
|
- devinfo, err := getInfo(info.Name())
|
|
|
|
|
|
+ devinfo, err := devicemapper.GetInfo(info.Name())
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -898,7 +901,6 @@ func (devices *DeviceSet) waitClose(info *DevInfo) error {
|
|
}
|
|
}
|
|
|
|
|
|
func (devices *DeviceSet) Shutdown() error {
|
|
func (devices *DeviceSet) Shutdown() error {
|
|
-
|
|
|
|
log.Debugf("[deviceset %s] shutdown()", devices.devicePrefix)
|
|
log.Debugf("[deviceset %s] shutdown()", devices.devicePrefix)
|
|
log.Debugf("[devmapper] Shutting down DeviceSet: %s", devices.root)
|
|
log.Debugf("[devmapper] Shutting down DeviceSet: %s", devices.root)
|
|
defer log.Debugf("[deviceset %s] shutdown END", devices.devicePrefix)
|
|
defer log.Debugf("[deviceset %s] shutdown END", devices.devicePrefix)
|
|
@@ -1065,7 +1067,7 @@ func (devices *DeviceSet) HasActivatedDevice(hash string) bool {
|
|
devices.Lock()
|
|
devices.Lock()
|
|
defer devices.Unlock()
|
|
defer devices.Unlock()
|
|
|
|
|
|
- devinfo, _ := getInfo(info.Name())
|
|
|
|
|
|
+ devinfo, _ := devicemapper.GetInfo(info.Name())
|
|
return devinfo != nil && devinfo.Exists != 0
|
|
return devinfo != nil && devinfo.Exists != 0
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1087,7 +1089,7 @@ func (devices *DeviceSet) List() []string {
|
|
|
|
|
|
func (devices *DeviceSet) deviceStatus(devName string) (sizeInSectors, mappedSectors, highestMappedSector uint64, err error) {
|
|
func (devices *DeviceSet) deviceStatus(devName string) (sizeInSectors, mappedSectors, highestMappedSector uint64, err error) {
|
|
var params string
|
|
var params string
|
|
- _, sizeInSectors, _, params, err = getStatus(devName)
|
|
|
|
|
|
+ _, sizeInSectors, _, params, err = devicemapper.GetStatus(devName)
|
|
if err != nil {
|
|
if err != nil {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
@@ -1132,7 +1134,7 @@ func (devices *DeviceSet) GetDeviceStatus(hash string) (*DevStatus, error) {
|
|
|
|
|
|
func (devices *DeviceSet) poolStatus() (totalSizeInSectors, transactionId, dataUsed, dataTotal, metadataUsed, metadataTotal uint64, err error) {
|
|
func (devices *DeviceSet) poolStatus() (totalSizeInSectors, transactionId, dataUsed, dataTotal, metadataUsed, metadataTotal uint64, err error) {
|
|
var params string
|
|
var params string
|
|
- if _, totalSizeInSectors, _, params, err = getStatus(devices.getPoolName()); err == nil {
|
|
|
|
|
|
+ if _, totalSizeInSectors, _, params, err = devicemapper.GetStatus(devices.getPoolName()); err == nil {
|
|
_, err = fmt.Sscanf(params, "%d %d/%d %d/%d", &transactionId, &metadataUsed, &metadataTotal, &dataUsed, &dataTotal)
|
|
_, err = fmt.Sscanf(params, "%d %d/%d %d/%d", &transactionId, &metadataUsed, &metadataTotal, &dataUsed, &dataTotal)
|
|
}
|
|
}
|
|
return
|
|
return
|
|
@@ -1175,7 +1177,7 @@ func (devices *DeviceSet) Status() *Status {
|
|
}
|
|
}
|
|
|
|
|
|
func NewDeviceSet(root string, doInit bool, options []string) (*DeviceSet, error) {
|
|
func NewDeviceSet(root string, doInit bool, options []string) (*DeviceSet, error) {
|
|
- SetDevDir("/dev")
|
|
|
|
|
|
+ devicemapper.SetDevDir("/dev")
|
|
|
|
|
|
devices := &DeviceSet{
|
|
devices := &DeviceSet{
|
|
root: root,
|
|
root: root,
|