[ARVADOS] updated: 1.1.1-250-gfd4f528
Git user
git at public.curoverse.com
Sun Dec 17 17:55:47 EST 2017
Summary of changes:
cmd/arvados/.gitignore | 1 +
cmd/arvados/Makefile | 7 ++
cmd/arvados/cmd.go | 28 +++++
lib/cmd/cmd.go | 39 ++++++
services/mount/main.go => lib/mount/command.go | 25 +++-
{services => lib}/mount/fs.go | 165 ++++++++++++++++++++-----
lib/mount/fs_test.go | 7 ++
sdk/go/arvados/collection_fs.go | 10 +-
services/mount/.gitignore | 1 -
services/mount/Makefile | 5 -
services/mount/fs_test.go | 7 --
11 files changed, 246 insertions(+), 49 deletions(-)
create mode 100644 cmd/arvados/.gitignore
create mode 100644 cmd/arvados/Makefile
create mode 100644 cmd/arvados/cmd.go
create mode 100644 lib/cmd/cmd.go
rename services/mount/main.go => lib/mount/command.go (51%)
rename {services => lib}/mount/fs.go (50%)
create mode 100644 lib/mount/fs_test.go
delete mode 100644 services/mount/.gitignore
delete mode 100644 services/mount/Makefile
delete mode 100644 services/mount/fs_test.go
via fd4f528b055d4167d3b9e8c803db0641b2e0b2e8 (commit)
via 2bf148fcd15bef004d8053764203e5447a139764 (commit)
via 532e4f688fdf40bcd4f295d83a070d568cd647dc (commit)
via a93884ad7b7088a3099bf12127c2dc68d112d2be (commit)
via 237c21a490e5bed32d96cc02211060782d422e16 (commit)
from 7054b8ac176da77107f4195ddce2b46aacd2af81 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
commit fd4f528b055d4167d3b9e8c803db0641b2e0b2e8
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date: Sun Dec 17 17:54:52 2017 -0500
go-fuse: Implement rm, mv, chmod, truncate.
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>
diff --git a/lib/mount/fs.go b/lib/mount/fs.go
index aa81a2a..331c3cb 100644
--- a/lib/mount/fs.go
+++ b/lib/mount/fs.go
@@ -96,6 +96,8 @@ func (fs *keepFS) errCode(err error) int {
return -fuse.EINVAL
case arvados.ErrInvalidOperation:
return -fuse.ENOSYS
+ case arvados.ErrDirectoryNotEmpty:
+ return -fuse.ENOTEMPTY
case nil:
return 0
default:
@@ -128,11 +130,11 @@ func (fs *keepFS) Opendir(path string) (errc int, fh uint64) {
return 0, fs.newFH(f)
}
-func (fs *keepFS) Releasedir(path string, fh uint64) int {
+func (fs *keepFS) Releasedir(path string, fh uint64) (errc int) {
return fs.Release(path, fh)
}
-func (fs *keepFS) Release(path string, fh uint64) int {
+func (fs *keepFS) Release(path string, fh uint64) (errc int) {
fs.Lock()
defer fs.Unlock()
defer delete(fs.open, fh)
@@ -145,15 +147,63 @@ func (fs *keepFS) Release(path string, fh uint64) int {
return 0
}
+func (fs *keepFS) Rename(oldname, newname string) (errc int) {
+ if fs.ReadOnly {
+ return -fuse.EROFS
+ }
+ return fs.errCode(fs.root.Rename(oldname, newname))
+}
+
+func (fs *keepFS) Unlink(path string) (errc int) {
+ if fs.ReadOnly {
+ return -fuse.EROFS
+ }
+ return fs.errCode(fs.root.Remove(path))
+}
+
+func (fs *keepFS) Truncate(path string, size int64, fh uint64) (errc int) {
+ if fs.ReadOnly {
+ return -fuse.EROFS
+ }
+ f := fs.lookupFH(fh)
+ if f == nil {
+ var err error
+ if f, err = fs.root.OpenFile(path, os.O_RDWR, 0); err != nil {
+ return fs.errCode(err)
+ }
+ defer f.Close()
+ }
+ return fs.errCode(f.Truncate(size))
+}
+
func (fs *keepFS) Getattr(path string, stat *fuse.Stat_t, fh uint64) (errc int) {
- fi, err := fs.root.Stat(path)
+ var fi os.FileInfo
+ var err error
+ if f := fs.lookupFH(fh); f != nil {
+ fi, err = f.Stat()
+ } else {
+ fi, err = fs.root.Stat(path)
+ }
if err != nil {
- return -fuse.ENOENT
+ return fs.errCode(err)
}
fs.fillStat(stat, fi)
return 0
}
+func (fs *keepFS) Chmod(path string, mode uint32) (errc int) {
+ if fs.ReadOnly {
+ return -fuse.EROFS
+ }
+ if fi, err := fs.root.Stat(path); err != nil {
+ return fs.errCode(err)
+ } else if (os.FileMode(mode)^fi.Mode())&os.ModePerm != 0 {
+ return -fuse.ENOSYS
+ } else {
+ return 0
+ }
+}
+
func (fs *keepFS) fillStat(stat *fuse.Stat_t, fi os.FileInfo) {
var m uint32
if fi.IsDir() {
@@ -183,30 +233,25 @@ func (fs *keepFS) fillStat(stat *fuse.Stat_t, fi os.FileInfo) {
func (fs *keepFS) Write(path string, buf []byte, ofst int64, fh uint64) (n int) {
if fs.ReadOnly {
return -fuse.EROFS
- }
- f := fs.lookupFH(fh)
- if f == nil {
+ } else if f := fs.lookupFH(fh); f == nil {
return -fuse.EBADF
+ } else if _, err := f.Seek(ofst, io.SeekStart); err != nil {
+ return fs.errCode(err)
+ } else {
+ n, _ = f.Write(buf)
+ return
}
- _, err := f.Seek(ofst, io.SeekStart)
- if err != nil {
- return -fuse.EINVAL
- }
- n, _ = f.Write(buf)
- return
}
func (fs *keepFS) Read(path string, buf []byte, ofst int64, fh uint64) (n int) {
- f := fs.lookupFH(fh)
- if f == nil {
- return 0
- }
- _, err := f.Seek(ofst, io.SeekStart)
- if err != nil {
- return 0
+ if f := fs.lookupFH(fh); f == nil {
+ return -fuse.EBADF
+ } else if _, err := f.Seek(ofst, io.SeekStart); err != nil {
+ return fs.errCode(err)
+ } else {
+ n, _ = f.Read(buf)
+ return
}
- n, _ = f.Read(buf)
- return
}
func (fs *keepFS) Readdir(path string,
@@ -222,12 +267,11 @@ func (fs *keepFS) Readdir(path string,
var stat fuse.Stat_t
fis, err := f.Readdir(-1)
if err != nil {
- return -fuse.ENOSYS // ???
+ return fs.errCode(err)
}
for _, fi := range fis {
fs.fillStat(&stat, fi)
- //fill(fi.Name(), &stat, 0)
- fill(fi.Name(), nil, 0)
+ fill(fi.Name(), &stat, 0)
}
return 0
}
commit 2bf148fcd15bef004d8053764203e5447a139764
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date: Sun Dec 17 17:46:53 2017 -0500
go-fuse: Fix inode not updated during rename().
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>
diff --git a/sdk/go/arvados/collection_fs.go b/sdk/go/arvados/collection_fs.go
index dcfd098..4647055 100644
--- a/sdk/go/arvados/collection_fs.go
+++ b/sdk/go/arvados/collection_fs.go
@@ -356,14 +356,22 @@ func (fs *fileSystem) Rename(oldname, newname string) error {
if err != nil {
return oldinode
}
+ oldinode.Lock()
+ defer oldinode.Unlock()
+ olddn := olddirf.inode.(*dirnode)
+ newdn := newdirf.inode.(*dirnode)
switch n := oldinode.(type) {
case *dirnode:
n.parent = newdirf.inode
+ n.treenode.fileinfo.name = newname
case *filenode:
- n.parent = newdirf.inode.(*dirnode)
+ n.parent = newdn
+ n.fileinfo.name = newname
default:
panic(fmt.Sprintf("bad inode type %T", n))
}
+ olddn.treenode.fileinfo.modTime = time.Now()
+ newdn.treenode.fileinfo.modTime = time.Now()
return nil
})
return err
commit 532e4f688fdf40bcd4f295d83a070d568cd647dc
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date: Sun Dec 17 00:43:30 2017 -0500
go-fuse: Use mounting user/group as file owner/group.
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>
diff --git a/lib/mount/command.go b/lib/mount/command.go
index 9df7f7b..ed105e4 100644
--- a/lib/mount/command.go
+++ b/lib/mount/command.go
@@ -3,6 +3,7 @@ package mount
import (
"flag"
"log"
+ "os"
"git.curoverse.com/arvados.git/sdk/go/arvados"
"git.curoverse.com/arvados.git/sdk/go/arvadosclient"
@@ -32,6 +33,8 @@ func Run(prog string, args []string) int {
Client: client,
KeepClient: kc,
ReadOnly: *ro,
+ Uid: os.Getuid(),
+ Gid: os.Getgid(),
})
notOK := host.Mount("", flags.Args())
if notOK {
diff --git a/lib/mount/fs.go b/lib/mount/fs.go
index 3c01410..aa81a2a 100644
--- a/lib/mount/fs.go
+++ b/lib/mount/fs.go
@@ -15,6 +15,8 @@ type keepFS struct {
Client *arvados.Client
KeepClient *keepclient.KeepClient
ReadOnly bool
+ Uid int
+ Gid int
root arvados.FileSystem
open map[uint64]arvados.File
@@ -152,7 +154,7 @@ func (fs *keepFS) Getattr(path string, stat *fuse.Stat_t, fh uint64) (errc int)
return 0
}
-func (*keepFS) fillStat(stat *fuse.Stat_t, fi os.FileInfo) {
+func (fs *keepFS) fillStat(stat *fuse.Stat_t, fi os.FileInfo) {
var m uint32
if fi.IsDir() {
m = m | fuse.S_IFDIR
@@ -170,6 +172,12 @@ func (*keepFS) fillStat(stat *fuse.Stat_t, fi os.FileInfo) {
stat.Birthtim = t
stat.Blksize = 1024
stat.Blocks = (stat.Size + stat.Blksize - 1) / stat.Blksize
+ if fs.Uid > 0 && int64(fs.Uid) < 1<<31 {
+ stat.Uid = uint32(fs.Uid)
+ }
+ if fs.Gid > 0 && int64(fs.Gid) < 1<<31 {
+ stat.Gid = uint32(fs.Gid)
+ }
}
func (fs *keepFS) Write(path string, buf []byte, ofst int64, fh uint64) (n int) {
commit a93884ad7b7088a3099bf12127c2dc68d112d2be
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date: Sun Dec 17 00:42:32 2017 -0500
go-fuse: Split cli prog from mount lib.
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>
diff --git a/cmd/arvados/.gitignore b/cmd/arvados/.gitignore
new file mode 100644
index 0000000..21dd863
--- /dev/null
+++ b/cmd/arvados/.gitignore
@@ -0,0 +1 @@
+arvados-*
diff --git a/cmd/arvados/Makefile b/cmd/arvados/Makefile
new file mode 100644
index 0000000..d02fb78
--- /dev/null
+++ b/cmd/arvados/Makefile
@@ -0,0 +1,7 @@
+all:
+ go get .
+ docker build --tag=cgofuse --build-arg=http_proxy="$(http_proxy)" --build-arg=https_proxy="$(https_proxy)" "$(GOPATH)"/src/github.com/curoverse/cgofuse
+ go get github.com/karalabe/xgo
+ xgo --image=cgofuse --targets=linux/amd64,linux/386,darwin/amd64,darwin/386,windows/amd64,windows/386 .
+ install arvados-* "$(GOPATH)"/bin/
+ rm --interactive=never arvados-*
diff --git a/cmd/arvados/cmd.go b/cmd/arvados/cmd.go
new file mode 100644
index 0000000..b8db9d8
--- /dev/null
+++ b/cmd/arvados/cmd.go
@@ -0,0 +1,28 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "runtime"
+
+ "git.curoverse.com/arvados.git/lib/cmd"
+ "git.curoverse.com/arvados.git/lib/mount"
+)
+
+var version = "dev"
+
+var Run = cmd.Multi(map[string]cmd.RunFunc{
+ "mount": mount.Run,
+ "version": cmdVersion,
+ "-version": cmdVersion,
+ "--version": cmdVersion,
+})
+
+func cmdVersion(string, []string) int {
+ fmt.Printf("%s %s (%s)\n", os.Args[0], version, runtime.Version())
+ return 0
+}
+
+func main() {
+ os.Exit(Run(os.Args[0], os.Args[1:]))
+}
diff --git a/lib/cmd/cmd.go b/lib/cmd/cmd.go
new file mode 100644
index 0000000..bcb1c7d
--- /dev/null
+++ b/lib/cmd/cmd.go
@@ -0,0 +1,39 @@
+// package cmd defines a RunFunc type, representing a process that can
+// be invoked from a command line.
+package cmd
+
+import "log"
+
+// A RunFunc runs a command with the given args, and returns an exit
+// code.
+type RunFunc func(prog string, args []string) int
+
+// Multi returns a command that looks up its first argument in m, and
+// runs the resulting RunFunc with the remaining args.
+//
+// Example:
+//
+// os.Exit(Multi(map[string]RunFunc{
+// "foobar": func(prog string, args []string) int {
+// fmt.Println(args[0])
+// return 2
+// },
+// })("/usr/bin/multi", []string{"foobar", "baz"}))
+//
+// ...prints "baz" and exits 2.
+func Multi(m map[string]RunFunc) RunFunc {
+ return func(prog string, args []string) int {
+ if len(args) < 1 {
+ log.Printf("usage: %s command [args]", prog)
+ return 2
+ }
+ prog = args[0]
+ args = args[1:]
+ if cmd, ok := m[prog]; !ok {
+ log.Printf("unrecognized command %q", prog)
+ return 2
+ } else {
+ return cmd(prog, args)
+ }
+ }
+}
diff --git a/services/mount/main.go b/lib/mount/command.go
similarity index 57%
rename from services/mount/main.go
rename to lib/mount/command.go
index c388368..9df7f7b 100644
--- a/services/mount/main.go
+++ b/lib/mount/command.go
@@ -1,4 +1,4 @@
-package main
+package mount
import (
"flag"
@@ -7,12 +7,17 @@ import (
"git.curoverse.com/arvados.git/sdk/go/arvados"
"git.curoverse.com/arvados.git/sdk/go/arvadosclient"
"git.curoverse.com/arvados.git/sdk/go/keepclient"
- "github.com/billziss-gh/cgofuse/fuse"
+ "github.com/curoverse/cgofuse/fuse"
)
-func main() {
- ro := flag.Bool("ro", false, "read-only")
- flag.Parse()
+func Run(prog string, args []string) int {
+ flags := flag.NewFlagSet(args[0], flag.ContinueOnError)
+ ro := flags.Bool("ro", false, "read-only")
+ err := flags.Parse(args)
+ if err != nil {
+ log.Print(err)
+ return 2
+ }
client := arvados.NewClientFromEnv()
ac, err := arvadosclient.New(client)
@@ -28,5 +33,10 @@ func main() {
KeepClient: kc,
ReadOnly: *ro,
})
- host.Mount("", flag.Args())
+ notOK := host.Mount("", flags.Args())
+ if notOK {
+ return 1
+ } else {
+ return 0
+ }
}
diff --git a/services/mount/fs.go b/lib/mount/fs.go
similarity index 98%
rename from services/mount/fs.go
rename to lib/mount/fs.go
index 5377803..3c01410 100644
--- a/services/mount/fs.go
+++ b/lib/mount/fs.go
@@ -1,4 +1,4 @@
-package main
+package mount
import (
"io"
@@ -7,7 +7,7 @@ import (
"git.curoverse.com/arvados.git/sdk/go/arvados"
"git.curoverse.com/arvados.git/sdk/go/keepclient"
- "github.com/billziss-gh/cgofuse/fuse"
+ "github.com/curoverse/cgofuse/fuse"
)
type keepFS struct {
diff --git a/lib/mount/fs_test.go b/lib/mount/fs_test.go
new file mode 100644
index 0000000..a178d6a
--- /dev/null
+++ b/lib/mount/fs_test.go
@@ -0,0 +1,7 @@
+package mount
+
+import (
+ "github.com/curoverse/cgofuse/fuse"
+)
+
+var _ fuse.FileSystem = &keepFS{}
diff --git a/services/mount/.gitignore b/services/mount/.gitignore
deleted file mode 100644
index 8c9846d..0000000
--- a/services/mount/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-mount-*
diff --git a/services/mount/Makefile b/services/mount/Makefile
deleted file mode 100644
index 3730673..0000000
--- a/services/mount/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-all:
- go get .
- docker build --tag=cgofuse $(GOPATH)/src/github.com/billziss-gh/cgofuse
- go get github.com/karalabe/xgo
- xgo --image=cgofuse --targets=linux/amd64,linux/386,darwin/amd64,darwin/386,windows/amd64,windows/386 .
diff --git a/services/mount/fs_test.go b/services/mount/fs_test.go
deleted file mode 100644
index fadda1a..0000000
--- a/services/mount/fs_test.go
+++ /dev/null
@@ -1,7 +0,0 @@
-package main
-
-import (
- "github.com/billziss-gh/cgofuse/fuse"
-)
-
-var _ fuse.FileSystem = &keepFS{}
commit 237c21a490e5bed32d96cc02211060782d422e16
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date: Sat Dec 16 04:51:39 2017 -0500
go-fuse: read-only mode, mkdir, touch.
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>
diff --git a/services/mount/fs.go b/services/mount/fs.go
index 4789976..5377803 100644
--- a/services/mount/fs.go
+++ b/services/mount/fs.go
@@ -12,9 +12,9 @@ import (
type keepFS struct {
fuse.FileSystemBase
- Collection arvados.Collection
Client *arvados.Client
KeepClient *keepclient.KeepClient
+ ReadOnly bool
root arvados.FileSystem
open map[uint64]arvados.File
@@ -43,6 +43,9 @@ func (fs *keepFS) Init() {
}
func (fs *keepFS) Create(path string, flags int, mode uint32) (errc int, fh uint64) {
+ if fs.ReadOnly {
+ return -fuse.EROFS, invalidFH
+ }
f, err := fs.root.OpenFile(path, flags|os.O_CREATE, os.FileMode(mode))
if err == os.ErrExist {
return -fuse.EEXIST, invalidFH
@@ -53,6 +56,9 @@ func (fs *keepFS) Create(path string, flags int, mode uint32) (errc int, fh uint
}
func (fs *keepFS) Open(path string, flags int) (errc int, fh uint64) {
+ if fs.ReadOnly && flags&(os.O_RDWR|os.O_WRONLY|os.O_CREATE) != 0 {
+ return -fuse.EROFS, invalidFH
+ }
f, err := fs.root.OpenFile(path, flags, 0)
if err != nil {
return -fuse.ENOENT, invalidFH
@@ -65,12 +71,54 @@ func (fs *keepFS) Open(path string, flags int) (errc int, fh uint64) {
return 0, fs.newFH(f)
}
+func (fs *keepFS) Utimens(path string, tmsp []fuse.Timespec) int {
+ if fs.ReadOnly {
+ return -fuse.EROFS
+ }
+ f, err := fs.root.OpenFile(path, 0, 0)
+ if err != nil {
+ return fs.errCode(err)
+ }
+ f.Close()
+ return 0
+}
+
+func (fs *keepFS) errCode(err error) int {
+ if os.IsNotExist(err) {
+ return -fuse.ENOENT
+ }
+ switch err {
+ case os.ErrExist:
+ return -fuse.EEXIST
+ case arvados.ErrInvalidArgument:
+ return -fuse.EINVAL
+ case arvados.ErrInvalidOperation:
+ return -fuse.ENOSYS
+ case nil:
+ return 0
+ default:
+ return -fuse.EIO
+ }
+}
+
+func (fs *keepFS) Mkdir(path string, mode uint32) int {
+ if fs.ReadOnly {
+ return -fuse.EROFS
+ }
+ f, err := fs.root.OpenFile(path, os.O_CREATE|os.O_EXCL, os.FileMode(mode)|os.ModeDir)
+ if err != nil {
+ return fs.errCode(err)
+ }
+ f.Close()
+ return 0
+}
+
func (fs *keepFS) Opendir(path string) (errc int, fh uint64) {
f, err := fs.root.OpenFile(path, 0, 0)
if err != nil {
- return -fuse.ENOENT, invalidFH
+ return fs.errCode(err), invalidFH
} else if fi, err := f.Stat(); err != nil {
- return -fuse.EIO, invalidFH
+ return fs.errCode(err), invalidFH
} else if !fi.IsDir() {
f.Close()
return -fuse.ENOTDIR, invalidFH
@@ -125,13 +173,16 @@ func (*keepFS) fillStat(stat *fuse.Stat_t, fi os.FileInfo) {
}
func (fs *keepFS) Write(path string, buf []byte, ofst int64, fh uint64) (n int) {
+ if fs.ReadOnly {
+ return -fuse.EROFS
+ }
f := fs.lookupFH(fh)
if f == nil {
- return 0
+ return -fuse.EBADF
}
_, err := f.Seek(ofst, io.SeekStart)
if err != nil {
- return 0
+ return -fuse.EINVAL
}
n, _ = f.Write(buf)
return
diff --git a/services/mount/main.go b/services/mount/main.go
index c0ef380..c388368 100644
--- a/services/mount/main.go
+++ b/services/mount/main.go
@@ -1,8 +1,8 @@
package main
import (
+ "flag"
"log"
- "os"
"git.curoverse.com/arvados.git/sdk/go/arvados"
"git.curoverse.com/arvados.git/sdk/go/arvadosclient"
@@ -11,6 +11,9 @@ import (
)
func main() {
+ ro := flag.Bool("ro", false, "read-only")
+ flag.Parse()
+
client := arvados.NewClientFromEnv()
ac, err := arvadosclient.New(client)
if err != nil {
@@ -23,6 +26,7 @@ func main() {
host := fuse.NewFileSystemHost(&keepFS{
Client: client,
KeepClient: kc,
+ ReadOnly: *ro,
})
- host.Mount("", os.Args[1:])
+ host.Mount("", flag.Args())
}
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list