From a39bd656622c7dbea534fe34710ed6cb21dd5a90 Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Wed, 20 Nov 2013 13:05:17 -0800 Subject: [PATCH] Remove os from devmapper --- graphdriver/devmapper/deviceset.go | 30 +++++++++++++--------------- graphdriver/devmapper/devmapper.go | 25 +++++++++++------------ graphdriver/devmapper/driver.go | 5 ++--- graphdriver/devmapper/driver_test.go | 11 +++++----- graphdriver/devmapper/mount.go | 7 +++---- graphdriver/devmapper/sys.go | 18 +++++++++++++++-- 6 files changed, 52 insertions(+), 44 deletions(-) diff --git a/graphdriver/devmapper/deviceset.go b/graphdriver/devmapper/deviceset.go index ce66211ca..02d6e6bc3 100644 --- a/graphdriver/devmapper/deviceset.go +++ b/graphdriver/devmapper/deviceset.go @@ -6,7 +6,6 @@ import ( "github.com/dotcloud/docker/utils" "io" "io/ioutil" - "os" "os/exec" "path" "path/filepath" @@ -104,7 +103,7 @@ func (devices *DeviceSet) hasImage(name string) bool { dirname := devices.loopbackDir() filename := path.Join(dirname, name) - _, err := os.Stat(filename) + _, err := osStat(filename) return err == nil } @@ -116,16 +115,16 @@ func (devices *DeviceSet) ensureImage(name string, size int64) (string, error) { dirname := devices.loopbackDir() filename := path.Join(dirname, name) - if err := os.MkdirAll(dirname, 0700); err != nil && !os.IsExist(err) { + if err := osMkdirAll(dirname, 0700); err != nil && !osIsExist(err) { return "", err } - if _, err := os.Stat(filename); err != nil { - if !os.IsNotExist(err) { + if _, err := osStat(filename); err != nil { + if !osIsNotExist(err) { return "", err } utils.Debugf("Creating loopback file %s for device-manage use", filename) - file, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, 0600) + file, err := osOpenFile(filename, osORdWr|osOCreate, 0600) if err != nil { return "", err } @@ -173,7 +172,7 @@ func (devices *DeviceSet) saveMetadata() error { if err := tmpFile.Close(); err != nil { return fmt.Errorf("Error closing metadata file %s: %s", tmpFile.Name(), err) } - if err := os.Rename(tmpFile.Name(), devices.jsonFile()); err != nil { + if err := osRename(tmpFile.Name(), devices.jsonFile()); err != nil { return fmt.Errorf("Error committing metadata file", err) } @@ -251,7 +250,7 @@ func (devices *DeviceSet) loadMetaData() error { devices.NewTransactionId = devices.TransactionId jsonData, err := ioutil.ReadFile(devices.jsonFile()) - if err != nil && !os.IsNotExist(err) { + if err != nil && !osIsNotExist(err) { utils.Debugf("\n--->Err: %s\n", err) return err } @@ -336,10 +335,9 @@ func (devices *DeviceSet) setupBaseImage() error { } func setCloseOnExec(name string) { - fileInfos, _ := ioutil.ReadDir("/proc/self/fd") - if fileInfos != nil { + if fileInfos, _ := ioutil.ReadDir("/proc/self/fd"); fileInfos != nil { for _, i := range fileInfos { - link, _ := os.Readlink(filepath.Join("/proc/self/fd", i.Name())) + link, _ := osReadlink(filepath.Join("/proc/self/fd", i.Name())) if link == name { fd, err := strconv.Atoi(i.Name()) if err == nil { @@ -371,7 +369,7 @@ func (devices *DeviceSet) ResizePool(size int64) error { datafilename := path.Join(dirname, "data") metadatafilename := path.Join(dirname, "metadata") - datafile, err := os.OpenFile(datafilename, os.O_RDWR, 0) + datafile, err := osOpenFile(datafilename, osORdWr, 0) if datafile == nil { return err } @@ -386,19 +384,19 @@ func (devices *DeviceSet) ResizePool(size int64) error { return fmt.Errorf("Can't shrink file") } - dataloopback := FindLoopDeviceFor(datafile) + dataloopback := FindLoopDeviceFor(&osFile{File: datafile}) if dataloopback == nil { return fmt.Errorf("Unable to find loopback mount for: %s", datafilename) } defer dataloopback.Close() - metadatafile, err := os.OpenFile(metadatafilename, os.O_RDWR, 0) + metadatafile, err := osOpenFile(metadatafilename, osORdWr, 0) if metadatafile == nil { return err } defer metadatafile.Close() - metadataloopback := FindLoopDeviceFor(metadatafile) + metadataloopback := FindLoopDeviceFor(&osFile{File: metadatafile}) if metadataloopback == nil { return fmt.Errorf("Unable to find loopback mount for: %s", metadatafilename) } @@ -463,7 +461,7 @@ func (devices *DeviceSet) initDevmapper(doInit bool) error { // Set the device prefix from the device id and inode of the docker root dir - st, err := os.Stat(devices.root) + st, err := osStat(devices.root) if err != nil { return fmt.Errorf("Error looking up dir %s: %s", devices.root, err) } diff --git a/graphdriver/devmapper/devmapper.go b/graphdriver/devmapper/devmapper.go index cccb168f9..103937b7a 100644 --- a/graphdriver/devmapper/devmapper.go +++ b/graphdriver/devmapper/devmapper.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "github.com/dotcloud/docker/utils" - "os" "runtime" ) @@ -179,16 +178,16 @@ func (t *Task) GetNextTarget(next uintptr) (nextPtr uintptr, start uint64, start, length, targetType, params } -func AttachLoopDevice(filename string) (*os.File, error) { +func AttachLoopDevice(filename string) (*osFile, error) { var fd int res := DmAttachLoopDevice(filename, &fd) if res == "" { return nil, ErrAttachLoopbackDevice } - return os.NewFile(uintptr(fd), res), nil + return &osFile{File: osNewFile(uintptr(fd), res)}, nil } -func getLoopbackBackingFile(file *os.File) (uint64, uint64, error) { +func getLoopbackBackingFile(file *osFile) (uint64, uint64, error) { dev, inode, err := dmGetLoopbackBackingFile(file.Fd()) if err != 0 { return 0, 0, ErrGetLoopbackBackingFile @@ -196,7 +195,7 @@ func getLoopbackBackingFile(file *os.File) (uint64, uint64, error) { return dev, inode, nil } -func LoopbackSetCapacity(file *os.File) error { +func LoopbackSetCapacity(file *osFile) error { err := dmLoopbackSetCapacity(file.Fd()) if err != 0 { return ErrLoopbackSetCapacity @@ -204,7 +203,7 @@ func LoopbackSetCapacity(file *os.File) error { return nil } -func FindLoopDeviceFor(file *os.File) *os.File { +func FindLoopDeviceFor(file *osFile) *osFile { stat, err := file.Stat() if err != nil { return nil @@ -215,9 +214,9 @@ func FindLoopDeviceFor(file *os.File) *os.File { for i := 0; true; i++ { path := fmt.Sprintf("/dev/loop%d", i) - file, err := osOpenFile(path, os.O_RDWR, 0) + file, err := osOpenFile(path, osORdWr, 0) if err != nil { - if os.IsNotExist(err) { + if osIsNotExist(err) { return nil } @@ -226,9 +225,9 @@ func FindLoopDeviceFor(file *os.File) *os.File { continue } - dev, inode, err := getLoopbackBackingFile(file) + dev, inode, err := getLoopbackBackingFile(&osFile{File: file}) if err == nil && dev == targetDevice && inode == targetInode { - return file + return &osFile{File: file} } file.Close() @@ -288,7 +287,7 @@ func RemoveDevice(name string) error { return nil } -func GetBlockDeviceSize(file *os.File) (uint64, error) { +func GetBlockDeviceSize(file *osFile) (uint64, error) { size, errno := DmGetBlockSize(file.Fd()) if size == -1 || errno != 0 { return 0, ErrGetBlockSize @@ -297,7 +296,7 @@ func GetBlockDeviceSize(file *os.File) (uint64, error) { } // This is the programmatic example of "dmsetup create" -func createPool(poolName string, dataFile *os.File, metadataFile *os.File) error { +func createPool(poolName string, dataFile, metadataFile *osFile) error { task, err := createTask(DeviceCreate, poolName) if task == nil { return err @@ -327,7 +326,7 @@ func createPool(poolName string, dataFile *os.File, metadataFile *os.File) error return nil } -func reloadPool(poolName string, dataFile *os.File, metadataFile *os.File) error { +func reloadPool(poolName string, dataFile, metadataFile *osFile) error { task, err := createTask(DeviceReload, poolName) if task == nil { return err diff --git a/graphdriver/devmapper/driver.go b/graphdriver/devmapper/driver.go index 55b8e3e72..70e62a0a8 100644 --- a/graphdriver/devmapper/driver.go +++ b/graphdriver/devmapper/driver.go @@ -4,7 +4,6 @@ import ( "fmt" "github.com/dotcloud/docker/graphdriver" "io/ioutil" - "os" "path" ) @@ -67,7 +66,7 @@ func (d *Driver) Create(id string, parent string) error { return err } - if err := os.MkdirAll(path.Join(mp, "rootfs"), 0755); err != nil && !os.IsExist(err) { + if err := osMkdirAll(path.Join(mp, "rootfs"), 0755); err != nil && !osIsExist(err) { return err } @@ -98,7 +97,7 @@ func (d *Driver) Get(id string) (string, error) { func (d *Driver) mount(id, mountPoint string) error { // Create the target directories if they don't exist - if err := os.MkdirAll(mountPoint, 0755); err != nil && !os.IsExist(err) { + if err := osMkdirAll(mountPoint, 0755); err != nil && !osIsExist(err) { return err } // If mountpoint is already mounted, do nothing diff --git a/graphdriver/devmapper/driver_test.go b/graphdriver/devmapper/driver_test.go index f8704950a..02c614a27 100644 --- a/graphdriver/devmapper/driver_test.go +++ b/graphdriver/devmapper/driver_test.go @@ -2,7 +2,6 @@ package devmapper import ( "io/ioutil" - "os" "path" "testing" ) @@ -34,12 +33,12 @@ func newDriver(t *testing.T) *Driver { func cleanup(d *Driver) { d.Cleanup() - os.RemoveAll(d.home) + osRemoveAll(d.home) } func TestInit(t *testing.T) { home := mkTestDirectory(t) - defer os.RemoveAll(home) + defer osRemoveAll(home) driver, err := Init(home) if err != nil { t.Fatal(err) @@ -58,7 +57,7 @@ func TestInit(t *testing.T) { if err != nil { t.Fatal(err) } - if st, err := os.Stat(dir); err != nil { + if st, err := osStat(dir); err != nil { t.Fatal(err) } else if !st.IsDir() { t.Fatalf("Get(%V) did not return a directory", id) @@ -99,7 +98,7 @@ func TestDriverRemove(t *testing.T) { func TestCleanup(t *testing.T) { t.Skip("Unimplemented") d := newDriver(t) - defer os.RemoveAll(d.home) + defer osRemoveAll(d.home) mountPoints := make([]string, 2) @@ -284,7 +283,7 @@ func TestDriverGetSize(t *testing.T) { size := int64(1024) - f, err := os.Create(path.Join(mountPoint, "test_file")) + f, err := osCreate(path.Join(mountPoint, "test_file")) if err != nil { t.Fatal(err) } diff --git a/graphdriver/devmapper/mount.go b/graphdriver/devmapper/mount.go index f066c51bb..3f75cfbcf 100644 --- a/graphdriver/devmapper/mount.go +++ b/graphdriver/devmapper/mount.go @@ -1,7 +1,6 @@ package devmapper import ( - "os" "path/filepath" ) @@ -9,14 +8,14 @@ import ( // It should be moved into the core. func Mounted(mountpoint string) (bool, error) { - mntpoint, err := os.Stat(mountpoint) + mntpoint, err := osStat(mountpoint) if err != nil { - if os.IsNotExist(err) { + if osIsNotExist(err) { return false, nil } return false, err } - parent, err := os.Stat(filepath.Join(mountpoint, "..")) + parent, err := osStat(filepath.Join(mountpoint, "..")) if err != nil { return false, err } diff --git a/graphdriver/devmapper/sys.go b/graphdriver/devmapper/sys.go index d5fcde490..8250e3ed7 100644 --- a/graphdriver/devmapper/sys.go +++ b/graphdriver/devmapper/sys.go @@ -8,15 +8,26 @@ import ( type ( sysStatT syscall.Stat_t sysErrno syscall.Errno + + osFile struct{ *os.File } ) var ( - // functions sysMount = syscall.Mount sysUnmount = syscall.Unmount sysCloseOnExec = syscall.CloseOnExec sysSyscall = syscall.Syscall - osOpenFile = os.OpenFile + + osOpenFile = os.OpenFile + osNewFile = os.NewFile + osCreate = os.Create + osStat = os.Stat + osIsNotExist = os.IsNotExist + osIsExist = os.IsExist + osMkdirAll = os.MkdirAll + osRemoveAll = os.RemoveAll + osRename = os.Rename + osReadlink = os.Readlink ) const ( @@ -24,6 +35,9 @@ const ( sysMsRdOnly = syscall.MS_RDONLY sysEInval = syscall.EINVAL sysSysIoctl = syscall.SYS_IOCTL + + osORdWr = os.O_RDWR + osOCreate = os.O_CREATE ) func toSysStatT(i interface{}) *sysStatT {