func (t *fsTest) SetUp(ti *TestInfo) { var err error t.ctx = ti.Ctx // Set up the clocks. t.mtimeClock = timeutil.RealClock() t.cacheClock.SetTime(time.Date(2015, 4, 5, 2, 15, 0, 0, time.Local)) t.serverCfg.CacheClock = &t.cacheClock // And the bucket. if t.bucket == nil { t.bucket = gcsfake.NewFakeBucket(t.mtimeClock, "some_bucket") } t.serverCfg.Bucket = t.bucket // Set up ownership. t.serverCfg.Uid, t.serverCfg.Gid, err = perms.MyUserAndGroup() AssertEq(nil, err) // Set up permissions. t.serverCfg.FilePerms = filePerms t.serverCfg.DirPerms = dirPerms // Set up the append optimization. t.serverCfg.AppendThreshold = 0 t.serverCfg.TmpObjectPrefix = ".gcsfuse_tmp/" // Set up a temporary directory for mounting. t.Dir, err = ioutil.TempDir("", "fs_test") AssertEq(nil, err) // Create a file system server. server, err := fs.NewServer(&t.serverCfg) AssertEq(nil, err) // Mount the file system. mountCfg := t.mountCfg mountCfg.OpContext = t.ctx if *fDebug { mountCfg.DebugLogger = log.New(os.Stderr, "fuse: ", 0) } t.mfs, err = fuse.Mount(t.Dir, server, &mountCfg) AssertEq(nil, err) }
// Mount the file system based on the supplied arguments, returning a // fuse.MountedFileSystem that can be joined to wait for unmounting. func mount( ctx context.Context, bucketName string, mountPoint string, flags *flagStorage, conn gcs.Conn) (mfs *fuse.MountedFileSystem, err error) { // Sanity check: make sure the temporary directory exists and is writable // currently. This gives a better user experience than harder to debug EIO // errors when reading files in the future. if flags.TempDir != "" { var f *os.File f, err = fsutil.AnonymousFile(flags.TempDir) f.Close() if err != nil { err = fmt.Errorf( "Error writing to temporary directory (%q); are you sure it exists "+ "with the correct permissions?", err.Error()) return } } // Choose UID and GID. uid, gid, err := perms.MyUserAndGroup() if err != nil { err = fmt.Errorf("MyUserAndGroup: %v", err) return } if flags.Uid >= 0 { uid = uint32(flags.Uid) } if flags.Gid >= 0 { gid = uint32(flags.Gid) } // Set up the bucket. bucket, err := setUpBucket( ctx, flags, conn, bucketName) if err != nil { err = fmt.Errorf("setUpBucket: %v", err) return } // Create a file system server. serverCfg := &fs.ServerConfig{ CacheClock: timeutil.RealClock(), Bucket: bucket, TempDir: flags.TempDir, ImplicitDirectories: flags.ImplicitDirs, InodeAttributeCacheTTL: flags.StatCacheTTL, DirTypeCacheTTL: flags.TypeCacheTTL, Uid: uid, Gid: gid, FilePerms: os.FileMode(flags.FileMode), DirPerms: os.FileMode(flags.DirMode), AppendThreshold: 1 << 21, // 2 MiB, a total guess. TmpObjectPrefix: ".gcsfuse_tmp/", } server, err := fs.NewServer(serverCfg) if err != nil { err = fmt.Errorf("fs.NewServer: %v", err) return } // Mount the file system. mountCfg := &fuse.MountConfig{ FSName: bucket.Name(), Options: flags.MountOptions, ErrorLogger: log.New(os.Stderr, "fuse: ", log.Flags()), } if flags.DebugFuse { mountCfg.DebugLogger = log.New(os.Stderr, "fuse_debug: ", 0) } mfs, err = fuse.Mount(mountPoint, server, mountCfg) if err != nil { err = fmt.Errorf("Mount: %v", err) return } return }
// Mount the file system based on the supplied arguments, returning a // fuse.MountedFileSystem that can be joined to wait for unmounting. func mountWithConn( ctx context.Context, bucketName string, mountPoint string, flags *flagStorage, conn gcs.Conn, status *log.Logger) (mfs *fuse.MountedFileSystem, err error) { // Sanity check: make sure the temporary directory exists and is writable // currently. This gives a better user experience than harder to debug EIO // errors when reading files in the future. if flags.TempDir != "" { var f *os.File f, err = fsutil.AnonymousFile(flags.TempDir) f.Close() if err != nil { err = fmt.Errorf( "Error writing to temporary directory (%q); are you sure it exists "+ "with the correct permissions?", err.Error()) return } } // Find the current process's UID and GID. If it was invoked as root and the // user hasn't explicitly overridden --uid, everything is going to be owned // by root. This is probably not what the user wants, so print a warning. uid, gid, err := perms.MyUserAndGroup() if err != nil { err = fmt.Errorf("MyUserAndGroup: %v", err) return } if uid == 0 && flags.Uid < 0 { fmt.Fprintln(os.Stderr, ` WARNING: gcsfuse invoked as root. This will cause all files to be owned by root. If this is not what you intended, invoke gcsfuse as the user that will be interacting with the file system. `) } // Choose UID and GID. if flags.Uid >= 0 { uid = uint32(flags.Uid) } if flags.Gid >= 0 { gid = uint32(flags.Gid) } // Set up the bucket. status.Println("Opening bucket...") bucket, err := setUpBucket( ctx, flags, conn, bucketName) if err != nil { err = fmt.Errorf("setUpBucket: %v", err) return } // Create a file system server. serverCfg := &fs.ServerConfig{ CacheClock: timeutil.RealClock(), Bucket: bucket, TempDir: flags.TempDir, ImplicitDirectories: flags.ImplicitDirs, InodeAttributeCacheTTL: flags.StatCacheTTL, DirTypeCacheTTL: flags.TypeCacheTTL, Uid: uid, Gid: gid, FilePerms: os.FileMode(flags.FileMode), DirPerms: os.FileMode(flags.DirMode), AppendThreshold: 1 << 21, // 2 MiB, a total guess. TmpObjectPrefix: ".gcsfuse_tmp/", } server, err := fs.NewServer(serverCfg) if err != nil { err = fmt.Errorf("fs.NewServer: %v", err) return } // Mount the file system. status.Println("Mounting file system...") mountCfg := &fuse.MountConfig{ FSName: bucket.Name(), VolumeName: bucket.Name(), Options: flags.MountOptions, ErrorLogger: log.New(os.Stderr, "fuse: ", log.Flags()), } if flags.DebugFuse { mountCfg.DebugLogger = log.New(os.Stderr, "fuse_debug: ", 0) } mfs, err = fuse.Mount(mountPoint, server, mountCfg) if err != nil { err = fmt.Errorf("Mount: %v", err) return } return }