diff --git a/mount/losetup_linux.go b/mount/losetup_linux.go index f88a9d41c..a0040dc18 100644 --- a/mount/losetup_linux.go +++ b/mount/losetup_linux.go @@ -143,7 +143,7 @@ func setupLoopDev(backingFile, loopDev string, param LoopParams) error { // // Upon success, the file handle to the loop device is returned. func setupLoop(backingFile string, param LoopParams) (string, error) { - for retry := 1; retry < 200; retry++ { + for retry := 1; retry < 100; retry++ { num, err := getFreeLoopDev() if err != nil { return "", err diff --git a/mount/losetup_linux_test.go b/mount/losetup_linux_test.go index 2b5383250..445bb05d0 100644 --- a/mount/losetup_linux_test.go +++ b/mount/losetup_linux_test.go @@ -26,85 +26,89 @@ import ( "github.com/containerd/continuity/testutil" ) -func TestSetupLoop(t *testing.T) { - testutil.RequiresRoot(t) - const randomdata = "randomdata" +var randomData = []byte("randomdata") - /* Non-existing loop */ - backingFile := "setup-loop-test-no-such-file" - _, err := setupLoop(backingFile, LoopParams{}) - if err == nil { - t.Fatalf("setupLoop with non-existing file should fail") - } +func createTempFile(t *testing.T) string { + t.Helper() f, err := ioutil.TempFile("", "losetup") if err != nil { t.Fatal(err) } + defer f.Close() + if err = f.Truncate(512); err != nil { t.Fatal(err) } - backingFile = f.Name() - f.Close() + + return f.Name() +} + +func TestNonExistingLoop(t *testing.T) { + testutil.RequiresRoot(t) + + backingFile := "setup-loop-test-no-such-file" + _, err := setupLoop(backingFile, LoopParams{}) + if err == nil { + t.Fatalf("setupLoop with non-existing file should fail") + } +} + +func TestRoLoop(t *testing.T) { + testutil.RequiresRoot(t) + + backingFile := createTempFile(t) defer func() { if err := os.Remove(backingFile); err != nil { t.Fatal(err) } }() - /* RO loop */ path, err := setupLoop(backingFile, LoopParams{Readonly: true, Autoclear: true}) if err != nil { t.Fatal(err) } - ff, err := os.OpenFile(path, os.O_RDWR, 0) - if err != nil { - t.Fatal(err) - } - if _, err = ff.Write([]byte(randomdata)); err == nil { + + if err := ioutil.WriteFile(path, randomData, os.ModePerm); err == nil { t.Fatalf("writing to readonly loop device should fail") } - if err = ff.Close(); err != nil { +} + +func TestRwLoop(t *testing.T) { + testutil.RequiresRoot(t) + + backingFile := createTempFile(t) + defer func() { + if err := os.Remove(backingFile); err != nil { + t.Fatal(err) + } + }() + + path, err := setupLoop(backingFile, LoopParams{Autoclear: true}) + if err != nil { t.Fatal(err) } - /* RW loop */ - path, err = setupLoop(backingFile, LoopParams{Autoclear: true}) - if err != nil { - t.Fatal(err) - } - ff, err = os.OpenFile(path, os.O_RDWR, 0) - if err != nil { - t.Fatal(err) - } - if _, err = ff.Write([]byte(randomdata)); err != nil { - t.Fatal(err) - } - if err = ff.Close(); err != nil { + if err := ioutil.WriteFile(path, randomData, os.ModePerm); err != nil { t.Fatal(err) } } func TestAttachDetachLoopDevice(t *testing.T) { testutil.RequiresRoot(t) - f, err := ioutil.TempFile("", "losetup") - if err != nil { - t.Fatal(err) - } - if err = f.Truncate(512); err != nil { - t.Fatal(err) - } - f.Close() + + path := createTempFile(t) defer func() { - if err := os.Remove(f.Name()); err != nil { + if err := os.Remove(path); err != nil { t.Fatal(err) } }() - dev, err := AttachLoopDevice(f.Name()) + dev, err := AttachLoopDevice(path) if err != nil { t.Fatal(err) } + if err = DetachLoopDevice(dev); err != nil { t.Fatal(err) }