diff --git a/pkg/donut/disk/disk.go b/pkg/donut/disk/disk.go index f899f8ed0..24fa729dc 100644 --- a/pkg/donut/disk/disk.go +++ b/pkg/donut/disk/disk.go @@ -153,13 +153,7 @@ func (disk Disk) CreateFile(filename string) (*atomic.File, error) { return nil, iodine.New(InvalidArgument{}, nil) } - filePath := filepath.Join(disk.path, filename) - // Create directories if they don't exist - if err := os.MkdirAll(filepath.Dir(filePath), 0700); err != nil { - return nil, iodine.New(err, nil) - } - - f, err := atomic.FileCreate(filePath) + f, err := atomic.FileCreate(filepath.Join(disk.path, filename)) if err != nil { return nil, iodine.New(err, nil) } diff --git a/pkg/utils/atomic/atomic.go b/pkg/utils/atomic/atomic.go index 6b6368aa5..ba0c61815 100644 --- a/pkg/utils/atomic/atomic.go +++ b/pkg/utils/atomic/atomic.go @@ -58,8 +58,13 @@ func (f *File) CloseAndPurge() error { return nil } -// FileCreate creates a new file at filePath for atomic writes +// FileCreate creates a new file at filePath for atomic writes, it also creates parent directories if they don't exist func FileCreate(filePath string) (*File, error) { + // if parent directories do not exist, ioutil.TempFile doesn't create them + // handle such a case with os.MkdirAll() + if err := os.MkdirAll(filepath.Dir(filePath), 0700); err != nil { + return nil, iodine.New(err, nil) + } f, err := ioutil.TempFile(filepath.Dir(filePath), filepath.Base(filePath)) if err != nil { return nil, iodine.New(err, nil)