Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
go-fuse
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Levin Zimmermann
go-fuse
Commits
6267f14d
Commit
6267f14d
authored
Mar 01, 2019
by
Han-Wen Nienhuys
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
nodefs: rename File => FileHandle
Suggestion by Kirill Smelkov.
parent
ac4ae29a
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
50 additions
and
51 deletions
+50
-51
nodefs/api.go
nodefs/api.go
+22
-23
nodefs/bridge.go
nodefs/bridge.go
+3
-3
nodefs/default.go
nodefs/default.go
+17
-17
nodefs/interrupt_test.go
nodefs/interrupt_test.go
+3
-3
nodefs/loopback.go
nodefs/loopback.go
+5
-5
No files found.
nodefs/api.go
View file @
6267f14d
...
...
@@ -84,6 +84,15 @@ type Operations interface {
inode
()
*
Inode
setInode
(
*
Inode
)
// File locking
GetLk
(
ctx
context
.
Context
,
f
FileHandle
,
owner
uint64
,
lk
*
fuse
.
FileLock
,
flags
uint32
,
out
*
fuse
.
FileLock
)
(
code
fuse
.
Status
)
SetLk
(
ctx
context
.
Context
,
f
FileHandle
,
owner
uint64
,
lk
*
fuse
.
FileLock
,
flags
uint32
)
(
code
fuse
.
Status
)
SetLkw
(
ctx
context
.
Context
,
f
FileHandle
,
owner
uint64
,
lk
*
fuse
.
FileLock
,
flags
uint32
)
(
code
fuse
.
Status
)
// The methods below may be called on closed files, due to
// concurrency. In that case, you should return EBADF.
GetAttr
(
ctx
context
.
Context
,
f
FileHandle
,
out
*
fuse
.
AttrOut
)
fuse
.
Status
// Lookup should find a direct child of the node by child name.
//
// VFS makes sure to call Lookup only once for particular (node, name)
...
...
@@ -95,36 +104,26 @@ type Operations interface {
Rmdir
(
ctx
context
.
Context
,
name
string
)
fuse
.
Status
Unlink
(
ctx
context
.
Context
,
name
string
)
fuse
.
Status
Rename
(
ctx
context
.
Context
,
name
string
,
newParent
Operations
,
newName
string
,
flags
uint32
)
fuse
.
Status
Create
(
ctx
context
.
Context
,
name
string
,
flags
uint32
,
mode
uint32
)
(
node
*
Inode
,
fh
FileHandle
,
fuseFlags
uint32
,
code
fuse
.
Status
)
Open
(
ctx
context
.
Context
,
flags
uint32
)
(
fh
File
,
fuseFlags
uint32
,
code
fuse
.
Status
)
Create
(
ctx
context
.
Context
,
name
string
,
flags
uint32
,
mode
uint32
)
(
node
*
Inode
,
fh
File
,
fuseFlags
uint32
,
code
fuse
.
Status
)
Open
(
ctx
context
.
Context
,
flags
uint32
)
(
fh
FileHandle
,
fuseFlags
uint32
,
code
fuse
.
Status
)
Read
(
ctx
context
.
Context
,
f
File
,
dest
[]
byte
,
off
int64
)
(
fuse
.
ReadResult
,
fuse
.
Status
)
Read
(
ctx
context
.
Context
,
f
File
Handle
,
dest
[]
byte
,
off
int64
)
(
fuse
.
ReadResult
,
fuse
.
Status
)
Write
(
ctx
context
.
Context
,
f
File
,
data
[]
byte
,
off
int64
)
(
written
uint32
,
code
fuse
.
Status
)
Write
(
ctx
context
.
Context
,
f
File
Handle
,
data
[]
byte
,
off
int64
)
(
written
uint32
,
code
fuse
.
Status
)
Fsync
(
ctx
context
.
Context
,
f
File
,
flags
uint32
)
(
code
fuse
.
Status
)
// File locking
GetLk
(
ctx
context
.
Context
,
f
File
,
owner
uint64
,
lk
*
fuse
.
FileLock
,
flags
uint32
,
out
*
fuse
.
FileLock
)
(
code
fuse
.
Status
)
SetLk
(
ctx
context
.
Context
,
f
File
,
owner
uint64
,
lk
*
fuse
.
FileLock
,
flags
uint32
)
(
code
fuse
.
Status
)
SetLkw
(
ctx
context
.
Context
,
f
File
,
owner
uint64
,
lk
*
fuse
.
FileLock
,
flags
uint32
)
(
code
fuse
.
Status
)
Fsync
(
ctx
context
.
Context
,
f
FileHandle
,
flags
uint32
)
(
code
fuse
.
Status
)
// Flush is called for close() call on a file descriptor. In
// case of duplicated descriptor, it may be called more than
// once for a file.
Flush
(
ctx
context
.
Context
,
f
File
)
fuse
.
Status
Flush
(
ctx
context
.
Context
,
f
File
Handle
)
fuse
.
Status
// This is called to before the file handle is forgotten. This
// method has no return value, so nothing can synchronizes on
// the call. Any cleanup that requires specific synchronization or
// could fail with I/O errors should happen in Flush instead.
Release
(
ctx
context
.
Context
,
f
File
)
// The methods below may be called on closed files, due to
// concurrency. In that case, you should return EBADF.
GetAttr
(
ctx
context
.
Context
,
f
File
,
out
*
fuse
.
AttrOut
)
fuse
.
Status
Release
(
ctx
context
.
Context
,
f
FileHandle
)
/*
NOSUBMIT - fold into a setattr method, or expand methods?
...
...
@@ -133,14 +132,14 @@ type Operations interface {
types as args, we can't take apart SetAttr for the caller
*/
Truncate
(
ctx
context
.
Context
,
f
File
,
size
uint64
)
fuse
.
Status
Chown
(
ctx
context
.
Context
,
f
File
,
uid
uint32
,
gid
uint32
)
fuse
.
Status
Chmod
(
ctx
context
.
Context
,
f
File
,
perms
uint32
)
fuse
.
Status
Utimens
(
ctx
context
.
Context
,
f
File
,
atime
*
time
.
Time
,
mtime
*
time
.
Time
)
fuse
.
Status
Allocate
(
ctx
context
.
Context
,
f
File
,
off
uint64
,
size
uint64
,
mode
uint32
)
(
code
fuse
.
Status
)
Truncate
(
ctx
context
.
Context
,
f
File
Handle
,
size
uint64
)
fuse
.
Status
Chown
(
ctx
context
.
Context
,
f
File
Handle
,
uid
uint32
,
gid
uint32
)
fuse
.
Status
Chmod
(
ctx
context
.
Context
,
f
File
Handle
,
perms
uint32
)
fuse
.
Status
Utimens
(
ctx
context
.
Context
,
f
File
Handle
,
atime
*
time
.
Time
,
mtime
*
time
.
Time
)
fuse
.
Status
Allocate
(
ctx
context
.
Context
,
f
File
Handle
,
off
uint64
,
size
uint64
,
mode
uint32
)
(
code
fuse
.
Status
)
}
type
File
interface
{
type
File
Handle
interface
{
Read
(
ctx
context
.
Context
,
dest
[]
byte
,
off
int64
)
(
fuse
.
ReadResult
,
fuse
.
Status
)
Write
(
ctx
context
.
Context
,
data
[]
byte
,
off
int64
)
(
written
uint32
,
code
fuse
.
Status
)
...
...
nodefs/bridge.go
View file @
6267f14d
...
...
@@ -15,7 +15,7 @@ import (
)
type
fileEntry
struct
{
file
File
file
File
Handle
// space to hold directory stuff
}
...
...
@@ -197,7 +197,7 @@ func (b *rawBridge) Mknod(input *fuse.MknodIn, name string, out *fuse.EntryOut)
}
// addNewChild inserts the child into the tree. Returns file handle if file != nil.
func
(
b
*
rawBridge
)
addNewChild
(
parent
*
Inode
,
name
string
,
child
*
Inode
,
file
File
,
out
*
fuse
.
EntryOut
)
uint64
{
func
(
b
*
rawBridge
)
addNewChild
(
parent
*
Inode
,
name
string
,
child
*
Inode
,
file
File
Handle
,
out
*
fuse
.
EntryOut
)
uint64
{
lockNodes
(
parent
,
child
)
parent
.
setEntry
(
name
,
child
)
b
.
mu
.
Lock
()
...
...
@@ -423,7 +423,7 @@ func (b *rawBridge) Open(input *fuse.OpenIn, out *fuse.OpenOut) (status fuse.Sta
}
// registerFile hands out a file handle. Must have bridge.mu
func
(
b
*
rawBridge
)
registerFile
(
f
File
)
uint64
{
func
(
b
*
rawBridge
)
registerFile
(
f
File
Handle
)
uint64
{
var
fh
uint64
if
len
(
b
.
freeFiles
)
>
0
{
last
:=
uint64
(
len
(
b
.
freeFiles
)
-
1
)
...
...
nodefs/default.go
View file @
6267f14d
...
...
@@ -50,21 +50,21 @@ func (n *DefaultOperations) Rename(ctx context.Context, name string, newParent O
return
fuse
.
ENOSYS
}
func
(
n
*
DefaultOperations
)
Read
(
ctx
context
.
Context
,
f
File
,
dest
[]
byte
,
off
int64
)
(
fuse
.
ReadResult
,
fuse
.
Status
)
{
func
(
n
*
DefaultOperations
)
Read
(
ctx
context
.
Context
,
f
File
Handle
,
dest
[]
byte
,
off
int64
)
(
fuse
.
ReadResult
,
fuse
.
Status
)
{
if
f
!=
nil
{
return
f
.
Read
(
ctx
,
dest
,
off
)
}
return
nil
,
fuse
.
ENOSYS
}
func
(
n
*
DefaultOperations
)
Fsync
(
ctx
context
.
Context
,
f
File
,
flags
uint32
)
fuse
.
Status
{
func
(
n
*
DefaultOperations
)
Fsync
(
ctx
context
.
Context
,
f
File
Handle
,
flags
uint32
)
fuse
.
Status
{
if
f
!=
nil
{
return
f
.
Fsync
(
ctx
,
flags
)
}
return
fuse
.
ENOSYS
}
func
(
n
*
DefaultOperations
)
Write
(
ctx
context
.
Context
,
f
File
,
data
[]
byte
,
off
int64
)
(
written
uint32
,
code
fuse
.
Status
)
{
func
(
n
*
DefaultOperations
)
Write
(
ctx
context
.
Context
,
f
File
Handle
,
data
[]
byte
,
off
int64
)
(
written
uint32
,
code
fuse
.
Status
)
{
if
f
!=
nil
{
return
f
.
Write
(
ctx
,
data
,
off
)
}
...
...
@@ -72,7 +72,7 @@ func (n *DefaultOperations) Write(ctx context.Context, f File, data []byte, off
return
0
,
fuse
.
ENOSYS
}
func
(
n
*
DefaultOperations
)
GetLk
(
ctx
context
.
Context
,
f
File
,
owner
uint64
,
lk
*
fuse
.
FileLock
,
flags
uint32
,
out
*
fuse
.
FileLock
)
(
code
fuse
.
Status
)
{
func
(
n
*
DefaultOperations
)
GetLk
(
ctx
context
.
Context
,
f
File
Handle
,
owner
uint64
,
lk
*
fuse
.
FileLock
,
flags
uint32
,
out
*
fuse
.
FileLock
)
(
code
fuse
.
Status
)
{
if
f
!=
nil
{
return
f
.
GetLk
(
ctx
,
owner
,
lk
,
flags
,
out
)
}
...
...
@@ -80,7 +80,7 @@ func (n *DefaultOperations) GetLk(ctx context.Context, f File, owner uint64, lk
return
fuse
.
ENOSYS
}
func
(
n
*
DefaultOperations
)
SetLk
(
ctx
context
.
Context
,
f
File
,
owner
uint64
,
lk
*
fuse
.
FileLock
,
flags
uint32
)
(
code
fuse
.
Status
)
{
func
(
n
*
DefaultOperations
)
SetLk
(
ctx
context
.
Context
,
f
File
Handle
,
owner
uint64
,
lk
*
fuse
.
FileLock
,
flags
uint32
)
(
code
fuse
.
Status
)
{
if
f
!=
nil
{
return
f
.
SetLk
(
ctx
,
owner
,
lk
,
flags
)
}
...
...
@@ -88,14 +88,14 @@ func (n *DefaultOperations) SetLk(ctx context.Context, f File, owner uint64, lk
return
fuse
.
ENOSYS
}
func
(
n
*
DefaultOperations
)
SetLkw
(
ctx
context
.
Context
,
f
File
,
owner
uint64
,
lk
*
fuse
.
FileLock
,
flags
uint32
)
(
code
fuse
.
Status
)
{
func
(
n
*
DefaultOperations
)
SetLkw
(
ctx
context
.
Context
,
f
File
Handle
,
owner
uint64
,
lk
*
fuse
.
FileLock
,
flags
uint32
)
(
code
fuse
.
Status
)
{
if
f
!=
nil
{
return
f
.
SetLkw
(
ctx
,
owner
,
lk
,
flags
)
}
return
fuse
.
ENOSYS
}
func
(
n
*
DefaultOperations
)
Flush
(
ctx
context
.
Context
,
f
File
)
fuse
.
Status
{
func
(
n
*
DefaultOperations
)
Flush
(
ctx
context
.
Context
,
f
File
Handle
)
fuse
.
Status
{
if
f
!=
nil
{
return
f
.
Flush
(
ctx
)
}
...
...
@@ -103,13 +103,13 @@ func (n *DefaultOperations) Flush(ctx context.Context, f File) fuse.Status {
return
fuse
.
ENOSYS
}
func
(
n
*
DefaultOperations
)
Release
(
ctx
context
.
Context
,
f
File
)
{
func
(
n
*
DefaultOperations
)
Release
(
ctx
context
.
Context
,
f
File
Handle
)
{
if
f
!=
nil
{
f
.
Release
(
ctx
)
}
}
func
(
n
*
DefaultOperations
)
Allocate
(
ctx
context
.
Context
,
f
File
,
off
uint64
,
size
uint64
,
mode
uint32
)
(
code
fuse
.
Status
)
{
func
(
n
*
DefaultOperations
)
Allocate
(
ctx
context
.
Context
,
f
File
Handle
,
off
uint64
,
size
uint64
,
mode
uint32
)
(
code
fuse
.
Status
)
{
if
f
!=
nil
{
return
f
.
Allocate
(
ctx
,
off
,
size
,
mode
)
}
...
...
@@ -117,7 +117,7 @@ func (n *DefaultOperations) Allocate(ctx context.Context, f File, off uint64, si
return
fuse
.
ENOSYS
}
func
(
n
*
DefaultOperations
)
GetAttr
(
ctx
context
.
Context
,
f
File
,
out
*
fuse
.
AttrOut
)
fuse
.
Status
{
func
(
n
*
DefaultOperations
)
GetAttr
(
ctx
context
.
Context
,
f
File
Handle
,
out
*
fuse
.
AttrOut
)
fuse
.
Status
{
if
f
!=
nil
{
f
.
GetAttr
(
ctx
,
out
)
}
...
...
@@ -125,7 +125,7 @@ func (n *DefaultOperations) GetAttr(ctx context.Context, f File, out *fuse.AttrO
return
fuse
.
ENOSYS
}
func
(
n
*
DefaultOperations
)
Truncate
(
ctx
context
.
Context
,
f
File
,
size
uint64
)
fuse
.
Status
{
func
(
n
*
DefaultOperations
)
Truncate
(
ctx
context
.
Context
,
f
File
Handle
,
size
uint64
)
fuse
.
Status
{
if
f
!=
nil
{
return
f
.
Truncate
(
ctx
,
size
)
}
...
...
@@ -133,7 +133,7 @@ func (n *DefaultOperations) Truncate(ctx context.Context, f File, size uint64) f
return
fuse
.
ENOSYS
}
func
(
n
*
DefaultOperations
)
Chown
(
ctx
context
.
Context
,
f
File
,
uid
uint32
,
gid
uint32
)
fuse
.
Status
{
func
(
n
*
DefaultOperations
)
Chown
(
ctx
context
.
Context
,
f
File
Handle
,
uid
uint32
,
gid
uint32
)
fuse
.
Status
{
if
f
!=
nil
{
return
f
.
Chown
(
ctx
,
uid
,
gid
)
}
...
...
@@ -141,7 +141,7 @@ func (n *DefaultOperations) Chown(ctx context.Context, f File, uid uint32, gid u
return
fuse
.
ENOSYS
}
func
(
n
*
DefaultOperations
)
Chmod
(
ctx
context
.
Context
,
f
File
,
perms
uint32
)
fuse
.
Status
{
func
(
n
*
DefaultOperations
)
Chmod
(
ctx
context
.
Context
,
f
File
Handle
,
perms
uint32
)
fuse
.
Status
{
if
f
!=
nil
{
return
f
.
Chmod
(
ctx
,
perms
)
}
...
...
@@ -149,7 +149,7 @@ func (n *DefaultOperations) Chmod(ctx context.Context, f File, perms uint32) fus
return
fuse
.
ENOSYS
}
func
(
n
*
DefaultOperations
)
Utimens
(
ctx
context
.
Context
,
f
File
,
atime
*
time
.
Time
,
mtime
*
time
.
Time
)
fuse
.
Status
{
func
(
n
*
DefaultOperations
)
Utimens
(
ctx
context
.
Context
,
f
File
Handle
,
atime
*
time
.
Time
,
mtime
*
time
.
Time
)
fuse
.
Status
{
if
f
!=
nil
{
return
f
.
Utimens
(
ctx
,
atime
,
mtime
)
}
...
...
@@ -157,18 +157,18 @@ func (n *DefaultOperations) Utimens(ctx context.Context, f File, atime *time.Tim
return
fuse
.
ENOSYS
}
func
(
n
*
DefaultOperations
)
Open
(
ctx
context
.
Context
,
flags
uint32
)
(
fh
File
,
fuseFlags
uint32
,
code
fuse
.
Status
)
{
func
(
n
*
DefaultOperations
)
Open
(
ctx
context
.
Context
,
flags
uint32
)
(
fh
File
Handle
,
fuseFlags
uint32
,
code
fuse
.
Status
)
{
return
nil
,
0
,
fuse
.
ENOSYS
}
func
(
n
*
DefaultOperations
)
Create
(
ctx
context
.
Context
,
name
string
,
flags
uint32
,
mode
uint32
)
(
node
*
Inode
,
fh
File
,
fuseFlags
uint32
,
code
fuse
.
Status
)
{
func
(
n
*
DefaultOperations
)
Create
(
ctx
context
.
Context
,
name
string
,
flags
uint32
,
mode
uint32
)
(
node
*
Inode
,
fh
File
Handle
,
fuseFlags
uint32
,
code
fuse
.
Status
)
{
return
nil
,
nil
,
0
,
fuse
.
ENOSYS
}
type
DefaultFile
struct
{
}
var
_
=
File
((
*
DefaultFile
)(
nil
))
var
_
=
File
Handle
((
*
DefaultFile
)(
nil
))
func
(
f
*
DefaultFile
)
Read
(
ctx
context
.
Context
,
dest
[]
byte
,
off
int64
)
(
fuse
.
ReadResult
,
fuse
.
Status
)
{
return
nil
,
fuse
.
ENOSYS
...
...
nodefs/interrupt_test.go
View file @
6267f14d
...
...
@@ -43,7 +43,7 @@ func (r *interruptRoot) Lookup(ctx context.Context, name string, out *fuse.Entry
return
ch
,
fuse
.
OK
}
func
(
o
*
interruptOps
)
GetAttr
(
ctx
context
.
Context
,
f
File
,
out
*
fuse
.
AttrOut
)
fuse
.
Status
{
func
(
o
*
interruptOps
)
GetAttr
(
ctx
context
.
Context
,
f
File
Handle
,
out
*
fuse
.
AttrOut
)
fuse
.
Status
{
out
.
Mode
=
fuse
.
S_IFREG
|
0644
out
.
Size
=
uint64
(
len
(
o
.
Data
))
return
fuse
.
OK
...
...
@@ -57,11 +57,11 @@ func (f *interruptFile) Flush(ctx context.Context) fuse.Status {
return
fuse
.
OK
}
func
(
o
*
interruptOps
)
Open
(
ctx
context
.
Context
,
flags
uint32
)
(
File
,
uint32
,
fuse
.
Status
)
{
func
(
o
*
interruptOps
)
Open
(
ctx
context
.
Context
,
flags
uint32
)
(
File
Handle
,
uint32
,
fuse
.
Status
)
{
return
&
interruptFile
{},
0
,
fuse
.
OK
}
func
(
o
*
interruptOps
)
Read
(
ctx
context
.
Context
,
f
File
,
dest
[]
byte
,
off
int64
)
(
fuse
.
ReadResult
,
fuse
.
Status
)
{
func
(
o
*
interruptOps
)
Read
(
ctx
context
.
Context
,
f
File
Handle
,
dest
[]
byte
,
off
int64
)
(
fuse
.
ReadResult
,
fuse
.
Status
)
{
time
.
Sleep
(
100
*
time
.
Millisecond
)
end
:=
int
(
off
)
+
len
(
dest
)
if
end
>
len
(
o
.
Data
)
{
...
...
nodefs/loopback.go
View file @
6267f14d
...
...
@@ -27,7 +27,7 @@ func (n *loopbackRoot) newLoopbackNode() *loopbackNode {
}
}
func
(
n
*
loopbackRoot
)
GetAttr
(
ctx
context
.
Context
,
f
File
,
out
*
fuse
.
AttrOut
)
fuse
.
Status
{
func
(
n
*
loopbackRoot
)
GetAttr
(
ctx
context
.
Context
,
f
File
Handle
,
out
*
fuse
.
AttrOut
)
fuse
.
Status
{
var
err
error
=
nil
st
:=
syscall
.
Stat_t
{}
err
=
syscall
.
Stat
(
n
.
root
,
&
st
)
...
...
@@ -47,7 +47,7 @@ type loopbackNode struct {
openFiles
map
[
*
loopbackFile
]
struct
{}
}
func
(
n
*
loopbackNode
)
Release
(
ctx
context
.
Context
,
f
File
)
{
func
(
n
*
loopbackNode
)
Release
(
ctx
context
.
Context
,
f
File
Handle
)
{
if
f
!=
nil
{
n
.
mu
.
Lock
()
defer
n
.
mu
.
Unlock
()
...
...
@@ -158,7 +158,7 @@ func idFromStat(st *syscall.Stat_t) FileID {
}
}
func
(
n
*
loopbackNode
)
Create
(
ctx
context
.
Context
,
name
string
,
flags
uint32
,
mode
uint32
)
(
inode
*
Inode
,
fh
File
,
fuseFlags
uint32
,
code
fuse
.
Status
)
{
func
(
n
*
loopbackNode
)
Create
(
ctx
context
.
Context
,
name
string
,
flags
uint32
,
mode
uint32
)
(
inode
*
Inode
,
fh
File
Handle
,
fuseFlags
uint32
,
code
fuse
.
Status
)
{
p
:=
filepath
.
Join
(
n
.
path
(),
name
)
f
,
err
:=
os
.
OpenFile
(
p
,
int
(
flags
)
|
os
.
O_CREATE
,
os
.
FileMode
(
mode
))
...
...
@@ -181,7 +181,7 @@ func (n *loopbackNode) Create(ctx context.Context, name string, flags uint32, mo
return
ch
,
lf
,
0
,
fuse
.
OK
}
func
(
n
*
loopbackNode
)
Open
(
ctx
context
.
Context
,
flags
uint32
)
(
fh
File
,
fuseFlags
uint32
,
code
fuse
.
Status
)
{
func
(
n
*
loopbackNode
)
Open
(
ctx
context
.
Context
,
flags
uint32
)
(
fh
File
Handle
,
fuseFlags
uint32
,
code
fuse
.
Status
)
{
p
:=
n
.
path
()
f
,
err
:=
os
.
OpenFile
(
p
,
int
(
flags
),
0
)
if
err
!=
nil
{
...
...
@@ -205,7 +205,7 @@ func (n *loopbackNode) fGetAttr(ctx context.Context, out *fuse.AttrOut) (fuse.St
return
fuse
.
EBADF
,
false
}
func
(
n
*
loopbackNode
)
GetAttr
(
ctx
context
.
Context
,
f
File
,
out
*
fuse
.
AttrOut
)
fuse
.
Status
{
func
(
n
*
loopbackNode
)
GetAttr
(
ctx
context
.
Context
,
f
File
Handle
,
out
*
fuse
.
AttrOut
)
fuse
.
Status
{
if
f
!=
nil
{
// this never happens because the kernel never sends FH on getattr.
return
f
.
GetAttr
(
ctx
,
out
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment