func (d *etcDriver) Create(rq dkvolume.Request) dkvolume.Response { var res dkvolume.Response if !strings.HasPrefix(rq.Name, "@") { return responseErrorString("a etcd path has to start with a @") } d.mux.Lock() defer d.mux.Unlock() _, ok := d.mountpoints[rq.Name] if ok { return res } pt := d.createPath(rq.Name) if err := os.MkdirAll(pt, 0755); err != nil { return responseError(fmt.Errorf("cannot mkdir: %s", err)) } rootfs := "/" + d.asEtcdRoot(rq.Name) root := pathfs.NewPrefixFileSystem(&d.etcdbackend, rootfs) nfs := pathfs.NewPathNodeFs(root, nil) server, _, err := nodefs.MountRoot(pt, nfs.Root(), nil) if err != nil { return responseError(fmt.Errorf("cannot mount root : %s", err)) } es := etcdFuseServer{pt, server, 0} d.mountpoints[rq.Name] = &es go server.Serve() return res }
func (fuseFS *fuseFS) newWorkerFS(id string) (*workerFS, error) { fs := &workerFS{ id: id, fuseFS: fuseFS, tmpDir: filepath.Join(fuseFS.tmpDir, id), } fs.state = newWorkerFSState(fs) type dirInit struct { dst *string val string } fs.rwDir = filepath.Join(fs.tmpDir, "rw") if err := os.MkdirAll(fs.rwDir, 0700); err != nil { return nil, err } prefixFS := pathfs.NewPrefixFileSystem(fuseFS.rpcFS, fs.fuseFS.writableRoot) fs.annotatingFS = NewAnnotatingFS(prefixFS) var err error fs.unionFs, err = termitefs.NewMemUnionFs( fs.rwDir, fs.annotatingFS) if err != nil { return nil, err } fs.rootDir = filepath.Join(fuseFS.mount, id) if code := fs.fuseFS.rpcNodeFS.Mount( id, fs.unionFs.Root(), nodeFSOptions()); !code.Ok() { return nil, errors.New(fmt.Sprintf("submount writable root %s: %v", fs.fuseFS.writableRoot, code)) } return fs, nil }