From 3de7f26e41d20400d469d3de4cc15d9552d80a97 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Sun, 17 Apr 2016 14:58:40 -0700 Subject: [PATCH] fs: fix XFS and other FS related issue due to missing d_type. --- Makefile | 2 ++ docker/Dockerfile | 1 + fs-dir-nix.go | 17 +++++++++++++---- server-main.go | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 4b4c9e022..10d44eca1 100644 --- a/Makefile +++ b/Makefile @@ -131,9 +131,11 @@ install: gomake-all dockerimage: checkdocker getdeps verifiers $(UI_ASSETS) @echo "Building docker image:" minio:$(TAG) @GO15VENDOREXPERIMENT=1 GOOS=linux GOARCH=amd64 go build --ldflags $(DOCKER_LDFLAGS) -o docker/minio.dockerimage + @touch docker/dockerinit @cd docker; mkdir -p export; sudo docker build --rm --tag=minio/minio:$(TAG) . @rmdir docker/export @rm docker/minio.dockerimage + @rm docker/dockerinit release: verifiers @MINIO_RELEASE=RELEASE ./buildscripts/build.sh diff --git a/docker/Dockerfile b/docker/Dockerfile index ea97892f1..01be7a52e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -2,6 +2,7 @@ FROM alpine:3.3 RUN apk add --no-cache ca-certificates bash ADD minio.dockerimage /minio +ADD dockerinit /.dockerinit ADD export /export EXPOSE 9000 COPY start.sh /start.sh diff --git a/fs-dir-nix.go b/fs-dir-nix.go index 132c8d681..79188e470 100644 --- a/fs-dir-nix.go +++ b/fs-dir-nix.go @@ -48,7 +48,7 @@ func clen(n []byte) int { // parseDirents - inspired from // https://golang.org/src/syscall/syscall_.go -func parseDirents(buf []byte) []fsDirent { +func parseDirents(dirPath string, buf []byte) []fsDirent { bufidx := 0 dirents := []fsDirent{} for bufidx < len(buf) { @@ -87,7 +87,16 @@ func parseDirents(buf []byte) []fsDirent { case syscall.DT_SOCK: mode = os.ModeSocket case syscall.DT_UNKNOWN: - mode = 0xffffffff + // On Linux XFS and few other file systems do not implement d_type in dirents. + // Fall back to Stat() in these scenarios. + if fi, err := os.Stat(filepath.Join(dirPath, name)); err == nil { + mode = fi.Mode() + } else { + // Stat failed, caller listing files would fail. But we will not crash + // the server. + mode = 0xffffffff + } + } dirents = append(dirents, fsDirent{ @@ -115,7 +124,7 @@ func readDirAll(readDirPath, entryPrefixMatch string) ([]fsDirent, error) { if nbuf <= 0 { break } - for _, dirent := range parseDirents(buf[:nbuf]) { + for _, dirent := range parseDirents(readDirPath, buf[:nbuf]) { if dirent.IsDir() { dirent.name += string(os.PathSeparator) dirent.size = 0 @@ -151,7 +160,7 @@ func scandir(dirPath string, filter func(fsDirent) bool, namesOnly bool) ([]fsDi if nbuf <= 0 { break } - for _, dirent := range parseDirents(buf[:nbuf]) { + for _, dirent := range parseDirents(dirPath, buf[:nbuf]) { if !namesOnly { dirent.name = filepath.Join(dirPath, dirent.name) } diff --git a/server-main.go b/server-main.go index 360bd888f..e82f90642 100644 --- a/server-main.go +++ b/server-main.go @@ -148,7 +148,7 @@ func initServerConfig(c *cli.Context) { // Check server arguments. func checkServerSyntax(c *cli.Context) { - if c.Args().First() == "help" { + if !c.Args().Present() || c.Args().First() == "help" { cli.ShowCommandHelpAndExit(c, "server", 1) } if len(c.Args()) > 2 {