|
@ -128,28 +128,59 @@ func (dir *Dir) newDirectory(fullpath util.FullPath, entry *filer_pb.Entry) fs.N |
|
|
func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, |
|
|
func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, |
|
|
resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) { |
|
|
resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) { |
|
|
|
|
|
|
|
|
|
|
|
request, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, req.Flags&fuse.OpenExclusive != 0) |
|
|
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, nil, err |
|
|
|
|
|
} |
|
|
|
|
|
var node fs.Node |
|
|
|
|
|
if request.Entry.IsDirectory { |
|
|
|
|
|
node = dir.newDirectory(util.NewFullPath(dir.FullPath(), req.Name), request.Entry) |
|
|
|
|
|
return node, nil, nil |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
node = dir.newFile(req.Name, request.Entry) |
|
|
|
|
|
file := node.(*File) |
|
|
|
|
|
fh := dir.wfs.AcquireHandle(file, req.Uid, req.Gid) |
|
|
|
|
|
return file, fh, nil |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (dir *Dir) Mknod(ctx context.Context, req *fuse.MknodRequest) (fs.Node, error) { |
|
|
|
|
|
|
|
|
|
|
|
request, err := dir.doCreateEntry(req.Name, req.Mode, req.Uid, req.Gid, false) |
|
|
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, err |
|
|
|
|
|
} |
|
|
|
|
|
var node fs.Node |
|
|
|
|
|
node = dir.newFile(req.Name, request.Entry) |
|
|
|
|
|
return node, nil |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (dir *Dir) doCreateEntry(name string, mode os.FileMode, uid, gid uint32, exlusive bool) (*filer_pb.CreateEntryRequest, error) { |
|
|
request := &filer_pb.CreateEntryRequest{ |
|
|
request := &filer_pb.CreateEntryRequest{ |
|
|
Directory: dir.FullPath(), |
|
|
Directory: dir.FullPath(), |
|
|
Entry: &filer_pb.Entry{ |
|
|
Entry: &filer_pb.Entry{ |
|
|
Name: req.Name, |
|
|
|
|
|
IsDirectory: req.Mode&os.ModeDir > 0, |
|
|
|
|
|
|
|
|
Name: name, |
|
|
|
|
|
IsDirectory: mode&os.ModeDir > 0, |
|
|
Attributes: &filer_pb.FuseAttributes{ |
|
|
Attributes: &filer_pb.FuseAttributes{ |
|
|
Mtime: time.Now().Unix(), |
|
|
Mtime: time.Now().Unix(), |
|
|
Crtime: time.Now().Unix(), |
|
|
Crtime: time.Now().Unix(), |
|
|
FileMode: uint32(req.Mode &^ dir.wfs.option.Umask), |
|
|
|
|
|
Uid: req.Uid, |
|
|
|
|
|
Gid: req.Gid, |
|
|
|
|
|
|
|
|
FileMode: uint32(mode &^ dir.wfs.option.Umask), |
|
|
|
|
|
Uid: uid, |
|
|
|
|
|
Gid: gid, |
|
|
Collection: dir.wfs.option.Collection, |
|
|
Collection: dir.wfs.option.Collection, |
|
|
Replication: dir.wfs.option.Replication, |
|
|
Replication: dir.wfs.option.Replication, |
|
|
TtlSec: dir.wfs.option.TtlSec, |
|
|
TtlSec: dir.wfs.option.TtlSec, |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
OExcl: req.Flags&fuse.OpenExclusive != 0, |
|
|
|
|
|
|
|
|
OExcl: exlusive, |
|
|
Signatures: []int32{dir.wfs.signature}, |
|
|
Signatures: []int32{dir.wfs.signature}, |
|
|
} |
|
|
} |
|
|
glog.V(1).Infof("create %s/%s: %v", dir.FullPath(), req.Name, req.Flags) |
|
|
|
|
|
|
|
|
glog.V(1).Infof("create %s/%s: %v", dir.FullPath(), name) |
|
|
|
|
|
|
|
|
if err := dir.wfs.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { |
|
|
|
|
|
|
|
|
err := dir.wfs.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error { |
|
|
|
|
|
|
|
|
dir.wfs.mapPbIdFromLocalToFiler(request.Entry) |
|
|
dir.wfs.mapPbIdFromLocalToFiler(request.Entry) |
|
|
defer dir.wfs.mapPbIdFromFilerToLocal(request.Entry) |
|
|
defer dir.wfs.mapPbIdFromFilerToLocal(request.Entry) |
|
@ -158,41 +189,15 @@ func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, |
|
|
if strings.Contains(err.Error(), "EEXIST") { |
|
|
if strings.Contains(err.Error(), "EEXIST") { |
|
|
return fuse.EEXIST |
|
|
return fuse.EEXIST |
|
|
} |
|
|
} |
|
|
glog.V(0).Infof("create %s/%s: %v", dir.FullPath(), req.Name, err) |
|
|
|
|
|
|
|
|
glog.V(0).Infof("create %s/%s: %v", dir.FullPath(), name, err) |
|
|
return fuse.EIO |
|
|
return fuse.EIO |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
dir.wfs.metaCache.InsertEntry(context.Background(), filer.FromPbEntry(request.Directory, request.Entry)) |
|
|
dir.wfs.metaCache.InsertEntry(context.Background(), filer.FromPbEntry(request.Directory, request.Entry)) |
|
|
|
|
|
|
|
|
return nil |
|
|
return nil |
|
|
}); err != nil { |
|
|
|
|
|
return nil, nil, err |
|
|
|
|
|
} |
|
|
|
|
|
var node fs.Node |
|
|
|
|
|
if request.Entry.IsDirectory { |
|
|
|
|
|
node = dir.newDirectory(util.NewFullPath(dir.FullPath(), req.Name), request.Entry) |
|
|
|
|
|
return node, nil, nil |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
node = dir.newFile(req.Name, request.Entry) |
|
|
|
|
|
file := node.(*File) |
|
|
|
|
|
fh := dir.wfs.AcquireHandle(file, req.Uid, req.Gid) |
|
|
|
|
|
return file, fh, nil |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (dir *Dir) Mknod(ctx context.Context, req *fuse.MknodRequest) (fs.Node, error) { |
|
|
|
|
|
if req.Mode&os.ModeNamedPipe != 0 { |
|
|
|
|
|
glog.V(1).Infof("mknod named pipe %s", req.String()) |
|
|
|
|
|
return nil, fuse.ENOSYS |
|
|
|
|
|
} |
|
|
|
|
|
if req.Mode&req.Mode&os.ModeSocket != 0 { |
|
|
|
|
|
glog.V(1).Infof("mknod socket %s", req.String()) |
|
|
|
|
|
return nil, fuse.ENOSYS |
|
|
|
|
|
} |
|
|
|
|
|
// not going to support mknod for normal files either
|
|
|
|
|
|
glog.V(1).Infof("mknod %s", req.String()) |
|
|
|
|
|
return nil, fuse.ENOSYS |
|
|
|
|
|
|
|
|
}) |
|
|
|
|
|
return request, err |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func (dir *Dir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, error) { |
|
|
func (dir *Dir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, error) { |
|
|