本文整理汇总了Golang中github.com/jacobsa/fuse/fuseops.DirOffset函数的典型用法代码示例。如果您正苦于以下问题:Golang DirOffset函数的具体用法?Golang DirOffset怎么用?Golang DirOffset使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了DirOffset函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: AddChild
// Add an entry for a child.
//
// REQUIRES: in.isDir()
// REQUIRES: dt != fuseutil.DT_Unknown
func (in *inode) AddChild(
id fuseops.InodeID,
name string,
dt fuseutil.DirentType) {
var index int
// Update the modification time.
in.attrs.Mtime = time.Now()
// No matter where we place the entry, make sure it has the correct Offset
// field.
defer func() {
in.entries[index].Offset = fuseops.DirOffset(index + 1)
}()
// Set up the entry.
e := fuseutil.Dirent{
Inode: id,
Name: name,
Type: dt,
}
// Look for a gap in which we can insert it.
for index = range in.entries {
if in.entries[index].Type == fuseutil.DT_Unknown {
in.entries[index] = e
return
}
}
// Append it to the end.
index = len(in.entries)
in.entries = append(in.entries, e)
}
开发者ID:andrewgaul,项目名称:fuse,代码行数:38,代码来源:inode.go
示例2: ReadDir
func (fs *helloFS) ReadDir(
op *fuseops.ReadDirOp) (err error) {
// Find the info for this inode.
info, ok := gInodeInfo[op.Inode]
if !ok {
err = fuse.ENOENT
return
}
if !info.dir {
err = fuse.EIO
return
}
entries := info.children
// Grab the range of interest.
if op.Offset > fuseops.DirOffset(len(entries)) {
err = fuse.EIO
return
}
entries = entries[op.Offset:]
// Resume at the specified offset into the array.
for _, e := range entries {
op.Data = fuseutil.AppendDirent(op.Data, e)
if len(op.Data) > op.Size {
op.Data = op.Data[:op.Size]
break
}
}
return
}
开发者ID:BanzaiMan,项目名称:gcsfuse,代码行数:35,代码来源:hello_fs.go
示例3: TestReadFiles
func (s *OssvfsTest) TestReadFiles(t *C) {
parent := s.getRoot(t)
dh := parent.OpenDir()
defer dh.CloseDir()
for i := fuseops.DirOffset(0); ; i++ {
en, err := dh.ReadDir(s.fs, i)
t.Assert(err, IsNil)
if en == nil {
break
}
if en.Type == fuseutil.DT_File {
in, err := parent.LookUp(s.fs, en.Name)
t.Assert(err, IsNil)
fh := in.OpenFile(s.fs)
buf := make([]byte, 4096)
nread, err := fh.ReadFile(s.fs, 0, buf)
if en.Name == "zero" {
t.Assert(nread, Equals, 0)
} else {
t.Assert(nread, Equals, len(en.Name))
buf = buf[0:nread]
t.Assert(string(buf), Equals, en.Name)
}
} else {
}
}
}
开发者ID:choleraehyq,项目名称:ossvfs,代码行数:33,代码来源:ossvfs_test.go
示例4: ReadEntries
// ReadEntries returns entries starting from specified offset position. If local
// cache is empty, it'll fetch from remote.
func (d *Dir) ReadEntries(offset fuseops.DirOffset) ([]*fuseutil.Dirent, error) {
d.Lock()
defer d.Unlock()
var entries = d.Entries
if len(entries) == 0 {
if err := d.updateEntriesFromRemote(); err != nil {
return nil, err
}
entries = d.Entries
}
// return err if offset is greather than list of entries
if offset > fuseops.DirOffset(len(entries)) {
return nil, fuse.EIO
}
// filter by entries whose type is not to set fuse.DT_Unknown
var liveEntries []*fuseutil.Dirent
for _, e := range entries[offset:] {
if e.Type != fuseutil.DT_Unknown {
liveEntries = append(liveEntries, e)
}
}
return liveEntries, nil
}
开发者ID:koding,项目名称:koding,代码行数:30,代码来源:dir.go
示例5: ReadDir
func (fs *flushFS) ReadDir(
op *fuseops.ReadDirOp) (err error) {
fs.mu.Lock()
defer fs.mu.Unlock()
// Create the appropriate listing.
var dirents []fuseutil.Dirent
switch op.Inode {
case fuseops.RootInodeID:
dirents = []fuseutil.Dirent{
fuseutil.Dirent{
Offset: 1,
Inode: fooID,
Name: "foo",
Type: fuseutil.DT_File,
},
fuseutil.Dirent{
Offset: 2,
Inode: barID,
Name: "bar",
Type: fuseutil.DT_Directory,
},
}
case barID:
default:
err = fmt.Errorf("Unexpected inode: %v", op.Inode)
return
}
// If the offset is for the end of the listing, we're done. Otherwise we
// expect it to be for the start.
switch op.Offset {
case fuseops.DirOffset(len(dirents)):
return
case 0:
default:
err = fmt.Errorf("Unexpected offset: %v", op.Offset)
return
}
// Fill in the listing.
for _, de := range dirents {
op.Data = fuseutil.AppendDirent(op.Data, de)
}
// We don't support doing this in anything more than one shot.
if len(op.Data) > op.Size {
err = fmt.Errorf("Couldn't fit listing in %v bytes", op.Size)
return
}
return
}
开发者ID:BanzaiMan,项目名称:gcsfuse,代码行数:59,代码来源:flush_fs.go
示例6: readAllEntries
// Read all entries for the directory, fix up conflicting names, and fill in
// offset fields.
//
// LOCKS_REQUIRED(in)
func readAllEntries(
ctx context.Context,
in inode.DirInode) (entries []fuseutil.Dirent, err error) {
// Read one batch at a time.
var tok string
for {
// Read a batch.
var batch []fuseutil.Dirent
batch, tok, err = in.ReadEntries(ctx, tok)
if err != nil {
err = fmt.Errorf("ReadEntries: %v", err)
return
}
// Accumulate.
entries = append(entries, batch...)
// Are we done?
if tok == "" {
break
}
}
// Ensure that the entries are sorted, for use in fixConflictingNames
// below.
sort.Sort(sortedDirents(entries))
// Fix name conflicts.
err = fixConflictingNames(entries)
if err != nil {
err = fmt.Errorf("fixConflictingNames: %v", err)
return
}
// Fix up offset fields.
for i := 0; i < len(entries); i++ {
entries[i].Offset = fuseops.DirOffset(i) + 1
}
// Return a bogus inode ID for each entry, but not the root inode ID.
//
// NOTE(jacobsa): As far as I can tell this is harmless. Minting and
// returning a real inode ID is difficult because fuse does not count
// readdir as an operation that increases the inode ID's lookup count and
// we therefore don't get a forget for it later, but we would like to not
// have to remember every inode ID that we've ever minted for readdir.
//
// If it turns out this is not harmless, we'll need to switch to something
// like inode IDs based on (object name, generation) hashes. But then what
// about the birthday problem? And more importantly, what about our
// semantic of not minting a new inode ID when the generation changes due
// to a local action?
for i, _ := range entries {
entries[i].Inode = fuseops.RootInodeID + 1
}
return
}
开发者ID:horzadome,项目名称:gcsfuse,代码行数:63,代码来源:dir_handle.go
示例7: CheckInvariants
func (in *inode) CheckInvariants() {
// INVARIANT: attrs.Mode &^ (os.ModePerm|os.ModeDir|os.ModeSymlink) == 0
if !(in.attrs.Mode&^(os.ModePerm|os.ModeDir|os.ModeSymlink) == 0) {
panic(fmt.Sprintf("Unexpected mode: %v", in.attrs.Mode))
}
// INVARIANT: !(isDir() && isSymlink())
if in.isDir() && in.isSymlink() {
panic(fmt.Sprintf("Unexpected mode: %v", in.attrs.Mode))
}
// INVARIANT: attrs.Size == len(contents)
if in.attrs.Size != uint64(len(in.contents)) {
panic(fmt.Sprintf(
"Size mismatch: %d vs. %d",
in.attrs.Size,
len(in.contents)))
}
// INVARIANT: If !isDir(), len(entries) == 0
if !in.isDir() && len(in.entries) != 0 {
panic(fmt.Sprintf("Unexpected entries length: %d", len(in.entries)))
}
// INVARIANT: For each i, entries[i].Offset == i+1
for i, e := range in.entries {
if !(e.Offset == fuseops.DirOffset(i+1)) {
panic(fmt.Sprintf("Unexpected offset for index %d: %d", i, e.Offset))
}
}
// INVARIANT: Contains no duplicate names in used entries.
childNames := make(map[string]struct{})
for _, e := range in.entries {
if e.Type != fuseutil.DT_Unknown {
if _, ok := childNames[e.Name]; ok {
panic(fmt.Sprintf("Duplicate name: %s", e.Name))
}
childNames[e.Name] = struct{}{}
}
}
// INVARIANT: If !isFile(), len(contents) == 0
if !in.isFile() && len(in.contents) != 0 {
panic(fmt.Sprintf("Unexpected length: %d", len(in.contents)))
}
// INVARIANT: If !isSymlink(), len(target) == 0
if !in.isSymlink() && len(in.target) != 0 {
panic(fmt.Sprintf("Unexpected target length: %d", len(in.target)))
}
return
}
开发者ID:andrewgaul,项目名称:fuse,代码行数:55,代码来源:inode.go
示例8: readDirFully
func (s *OssvfsTest) readDirFully(t *C, dh *DirHandle) (entries []fuseutil.Dirent) {
en, err := dh.ReadDir(s.fs, fuseops.DirOffset(0))
t.Assert(err, IsNil)
t.Assert(en.Name, Equals, ".")
en, err = dh.ReadDir(s.fs, fuseops.DirOffset(1))
t.Assert(err, IsNil)
t.Assert(en.Name, Equals, "..")
for i := fuseops.DirOffset(2); ; i++ {
en, err = dh.ReadDir(s.fs, i)
t.Assert(err, IsNil)
if en == nil {
return
}
entries = append(entries, *en)
}
}
开发者ID:choleraehyq,项目名称:ossvfs,代码行数:20,代码来源:ossvfs_test.go
示例9: readDirFully
func (s *GoofysTest) readDirFully(t *C, dh *DirHandle) (entries []fuseutil.Dirent) {
for i := fuseops.DirOffset(0); ; i++ {
en, err := dh.ReadDir(s.fs, i)
t.Assert(err, IsNil)
if en == nil {
return
}
entries = append(entries, *en)
}
}
开发者ID:ketqi,项目名称:goofys,代码行数:12,代码来源:goofys_test.go
示例10: initializeChild
func (d *Dir) initializeChild(e *tempEntry) (Node, error) {
node, err := d.findEntry(e.Name)
if err == nil {
return node, nil
}
var t = e.Time
if t.IsZero() {
t = time.Now()
}
attrs := &fuseops.InodeAttributes{
Size: e.Size,
Uid: d.Attrs.Uid,
Gid: d.Attrs.Gid,
Mode: e.Mode,
Atime: t,
Mtime: t,
Ctime: t,
Crtime: t,
}
n := NewEntry(d, e.Name)
n.Attrs = attrs
dirEntry := &fuseutil.Dirent{
Offset: fuseops.DirOffset(len(d.Entries)) + 1, // offset is 1 indexed
Inode: n.ID,
Name: e.Name,
Type: e.Type,
}
d.Entries = append(d.Entries, dirEntry)
var dt Node
switch e.Type {
case fuseutil.DT_Directory:
dt = NewDir(n, d.IDGen)
case fuseutil.DT_File:
dt = NewFile(n)
default:
return nil, fmt.Errorf("Unknown file type: %v", e.Type)
}
d.EntriesList[e.Name] = dt
return dt, nil
}
开发者ID:koding,项目名称:koding,代码行数:48,代码来源:dir.go
示例11: RemoveChild
// Remove an entry for a child.
//
// REQUIRES: in.isDir()
// REQUIRES: An entry for the given name exists.
func (in *inode) RemoveChild(name string) {
// Update the modification time.
in.attrs.Mtime = time.Now()
// Find the entry.
i, ok := in.findChild(name)
if !ok {
panic(fmt.Sprintf("Unknown child: %s", name))
}
// Mark it as unused.
in.entries[i] = fuseutil.Dirent{
Type: fuseutil.DT_Unknown,
Offset: fuseops.DirOffset(i + 1),
}
}
开发者ID:andrewgaul,项目名称:fuse,代码行数:20,代码来源:inode.go
示例12: ReadDir
func (fs *helloFS) ReadDir(
ctx context.Context,
op *fuseops.ReadDirOp) (err error) {
// Find the info for this inode.
info, ok := gInodeInfo[op.Inode]
if !ok {
err = fuse.ENOENT
return
}
if !info.dir {
err = fuse.EIO
return
}
entries := info.children
// Grab the range of interest.
if op.Offset > fuseops.DirOffset(len(entries)) {
err = fuse.EIO
return
}
entries = entries[op.Offset:]
// Resume at the specified offset into the array.
for _, e := range entries {
n := fuseutil.WriteDirent(op.Dst[op.BytesRead:], e)
if n == 0 {
break
}
op.BytesRead += n
}
return
}
开发者ID:andrewgaul,项目名称:fuse,代码行数:37,代码来源:hello_fs.go
示例13: ReadDir
func (dh *DirHandle) ReadDir(fs *Goofys, offset fuseops.DirOffset) (*fuseutil.Dirent, error) {
// If the request is for offset zero, we assume that either this is the first
// call or rewinddir has been called. Reset state.
if offset == 0 {
dh.Entries = nil
}
if offset == 0 {
e := makeDirEntry(".", fuseutil.DT_Directory)
e.Offset = 1
dh.NameToEntry["."] = fs.rootAttrs
return &e, nil
} else if offset == 1 {
e := makeDirEntry("..", fuseutil.DT_Directory)
e.Offset = 2
dh.NameToEntry[".."] = fs.rootAttrs
return &e, nil
}
i := int(offset) - dh.BaseOffset - 2
if i < 0 {
panic(fmt.Sprintf("invalid offset %v, base=%v", offset, dh.BaseOffset))
}
if i >= len(dh.Entries) {
if dh.Marker != nil {
// we need to fetch the next page
dh.Entries = nil
dh.BaseOffset += i
i = 0
}
}
if i > 5000 {
// XXX prevent infinite loop, raise the limit later
panic("too many results")
}
if dh.Entries == nil {
prefix := *dh.inode.FullName
if len(prefix) != 0 {
prefix += "/"
}
params := &s3.ListObjectsInput{
Bucket: &fs.bucket,
Delimiter: aws.String("/"),
Marker: dh.Marker,
Prefix: &prefix,
//MaxKeys: aws.Int64(3),
}
resp, err := fs.s3.ListObjects(params)
if err != nil {
return nil, mapAwsError(err)
}
s3Log.Debug(resp)
dh.Entries = make([]fuseutil.Dirent, 0, len(resp.CommonPrefixes)+len(resp.Contents))
for _, dir := range resp.CommonPrefixes {
// strip trailing /
dirName := (*dir.Prefix)[0 : len(*dir.Prefix)-1]
// strip previous prefix
dirName = dirName[len(*params.Prefix):]
dh.Entries = append(dh.Entries, makeDirEntry(dirName, fuseutil.DT_Directory))
dh.NameToEntry[dirName] = fs.rootAttrs
}
for _, obj := range resp.Contents {
baseName := (*obj.Key)[len(prefix):]
if len(baseName) == 0 {
// this is a directory blob
continue
}
dh.Entries = append(dh.Entries, makeDirEntry(baseName, fuseutil.DT_File))
dh.NameToEntry[baseName] = fuseops.InodeAttributes{
Size: uint64(*obj.Size),
Nlink: 1,
Mode: fs.flags.FileMode,
Atime: *obj.LastModified,
Mtime: *obj.LastModified,
Ctime: *obj.LastModified,
Crtime: *obj.LastModified,
Uid: fs.flags.Uid,
Gid: fs.flags.Gid,
}
}
sort.Sort(sortedDirents(dh.Entries))
// Fix up offset fields.
for i := 0; i < len(dh.Entries); i++ {
en := &dh.Entries[i]
// offset is 1 based, also need to account for "." and ".."
en.Offset = fuseops.DirOffset(i+dh.BaseOffset) + 1 + 2
}
if *resp.IsTruncated {
//.........这里部分代码省略.........
开发者ID:x5u,项目名称:goofys,代码行数:101,代码来源:handles.go
示例14: convertInMessage
//.........这里部分代码省略.........
err = errors.New("Corrupt OpRead")
return
}
to := &fuseops.ReadFileOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
Handle: fuseops.HandleID(in.Fh),
Offset: int64(in.Offset),
}
o = to
readSize := int(in.Size)
p := outMsg.GrowNoZero(uintptr(readSize))
if p == nil {
err = fmt.Errorf("Can't grow for %d-byte read", readSize)
return
}
sh := (*reflect.SliceHeader)(unsafe.Pointer(&to.Dst))
sh.Data = uintptr(p)
sh.Len = readSize
sh.Cap = readSize
case fusekernel.OpReaddir:
in := (*fusekernel.ReadIn)(inMsg.Consume(fusekernel.ReadInSize(protocol)))
if in == nil {
err = errors.New("Corrupt OpReaddir")
return
}
to := &fuseops.ReadDirOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
Handle: fuseops.HandleID(in.Fh),
Offset: fuseops.DirOffset(in.Offset),
}
o = to
readSize := int(in.Size)
p := outMsg.GrowNoZero(uintptr(readSize))
if p == nil {
err = fmt.Errorf("Can't grow for %d-byte read", readSize)
return
}
sh := (*reflect.SliceHeader)(unsafe.Pointer(&to.Dst))
sh.Data = uintptr(p)
sh.Len = readSize
sh.Cap = readSize
case fusekernel.OpRelease:
type input fusekernel.ReleaseIn
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{})))
if in == nil {
err = errors.New("Corrupt OpRelease")
return
}
o = &fuseops.ReleaseFileHandleOp{
Handle: fuseops.HandleID(in.Fh),
}
case fusekernel.OpReleasedir:
type input fusekernel.ReleaseIn
in := (*input)(inMsg.Consume(unsafe.Sizeof(input{})))
if in == nil {
err = errors.New("Corrupt OpReleasedir")
开发者ID:kahing,项目名称:gcsfuse,代码行数:67,代码来源:conversions.go
示例15: ReadDir
func (dh *DirHandle) ReadDir(fs *Ossvfs, offset fuseops.DirOffset) (*fuseutil.Dirent, error) {
// If the request is for offset zero, we assume that either this is the first
// call or rewinddir has been called. Reset state.
if offset == 0 {
dh.Entries = nil
}
if offset == 0 {
e := makeDirEntry(".", fuseutil.DT_Directory)
e.Offset = 1
dh.NameToEntry["."] = fs.rootAttrs
return &e, nil
} else if offset == 1 {
e := makeDirEntry("..", fuseutil.DT_Directory)
e.Offset = 2
dh.NameToEntry[".."] = fs.rootAttrs
return &e, nil
}
i := int(offset) - dh.BaseOffset - 2
if i < 0 {
panic(fmt.Sprintf("invalid offset %v, base=%v", offset, dh.BaseOffset))
}
if i >= len(dh.Entries) {
if dh.Marker != nil {
dh.Entries = nil
dh.BaseOffset += i
i = 0
}
}
if i > 5000 {
// XXX prevent infinite loop, raise the limit later
panic("too many results")
}
if dh.Entries == nil {
prefix := *dh.inode.FullName
if len(prefix) != 0 {
prefix += "/"
}
resp, err := fs.bucket.List(prefix, "/", *dh.Marker, 0)
if err != nil {
return nil, mapOssError(err)
}
ossLog.Debug(resp)
dh.Entries = make([]fuseutil.Dirent, 0, len(resp.CommonPrefixes)+len(resp.Contents))
for _, dir := range resp.CommonPrefixes {
// strip trailing /
dirName := dir[0 : len(dir)-1]
// strip previous prefix
dirName = dirName[len(prefix):]
dh.Entries = append(dh.Entries, makeDirEntry(dirName, fuseutil.DT_Directory))
dh.NameToEntry[dirName] = fs.rootAttrs
}
for _, obj := range resp.Contents {
baseName := obj.Key[len(prefix):]
if len(baseName) == 0 {
// this is a directory blob
continue
}
dh.Entries = append(dh.Entries, makeDirEntry(baseName, fuseutil.DT_File))
lastModifiedTime, err := time.Parse("2006-01-02T15:04:05.000Z", obj.LastModified)
if err != nil {
panic("Last " + obj.LastModified + " modified time is invalid")
}
dh.NameToEntry[baseName] = fuseops.InodeAttributes{
Size: uint64(obj.Size),
Nlink: 1,
Mode: fs.flags.FileMode,
Atime: lastModifiedTime,
Mtime: lastModifiedTime,
Ctime: lastModifiedTime,
Crtime: lastModifiedTime,
Uid: fs.flags.Uid,
Gid: fs.flags.Gid,
}
}
sort.Sort(sortedDirents(dh.Entries))
// Fix up offset fields.
for i := 0; i < len(dh.Entries); i++ {
en := &dh.Entries[i]
// offset is 1 based, also need to account for "." and ".."
en.Offset = fuseops.DirOffset(i+dh.BaseOffset) + 1 + 2
}
if resp.IsTruncated {
dh.Marker = &resp.NextMarker
} else {
dh.Marker = nil
}
}
//.........这里部分代码省略.........
开发者ID:choleraehyq,项目名称:ossvfs,代码行数:101,代码来源:handles.go
注:本文中的github.com/jacobsa/fuse/fuseops.DirOffset函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论