diff --git a/cmd/cmount/fs.go b/cmd/cmount/fs.go index fb502e43e..5af4acf06 100644 --- a/cmd/cmount/fs.go +++ b/cmd/cmount/fs.go @@ -282,7 +282,7 @@ func (fsys *FS) Open(path string, flags int) (errc int, fh uint64) { defer fs.Trace(path, "flags=0x%X", flags)("errc=%d, fh=0x%X", &errc, &fh) // translate the fuse flags to os flags - flags = translateOpenFlags(flags) + flags = translateOpenFlags(flags) | os.O_CREATE handle, err := fsys.VFS.OpenFile(path, flags, 0777) if errc != 0 { return translateError(err), fhUnset @@ -303,7 +303,7 @@ func (fsys *FS) Create(filePath string, flags int, mode uint32) (errc int, fh ui return translateError(err), fhUnset } // translate the fuse flags to os flags - flags = translateOpenFlags(flags) + flags = translateOpenFlags(flags) | os.O_CREATE handle, err := file.Open(flags) if err != nil { return translateError(err), fhUnset diff --git a/cmd/mount/dir.go b/cmd/mount/dir.go index 9e301d62d..8cef250a5 100644 --- a/cmd/mount/dir.go +++ b/cmd/mount/dir.go @@ -116,7 +116,7 @@ func (d *Dir) Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.Cr if err != nil { return nil, nil, translateError(err) } - fh, err := file.Open(int(req.Flags)) + fh, err := file.Open(int(req.Flags) | os.O_CREATE) if err != nil { return nil, nil, translateError(err) } diff --git a/cmd/mount/file.go b/cmd/mount/file.go index 016d47334..706936c55 100644 --- a/cmd/mount/file.go +++ b/cmd/mount/file.go @@ -3,6 +3,7 @@ package mount import ( + "os" "time" "bazil.org/fuse" @@ -64,7 +65,10 @@ func (f *File) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenR // fuse flags are based off syscall flags as are os flags, so // should be compatible - handle, err := f.File.Open(int(req.Flags)) + // + // we seem to be missing O_CREATE here so add it in to allow + // file creation + handle, err := f.File.Open(int(req.Flags) | os.O_CREATE) if err != nil { return nil, translateError(err) }