[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