update to recent bazil.org/fuse (drop custom Error, Intr dropped in favor or context.Context)
Henry committed
Feb 24, 2015 at 01:06 UTC
faef01a17e116cc78e1edd89044a0c1b6035b0f1
16 files changed
+247
-232
Godeps/Godeps.json
+1
-1
@@ -7,7 +7,7 @@
7
"Deps": [
8
{
9
"ImportPath": "bazil.org/fuse",
10
- "Rev": "d62a1291477b51b24becf4def173bd843138c4b6"
10
+ "Rev": "489e985dcb429718328be2bb055adb685c4ae1e3"
11
},
12
{
13
"ImportPath": "code.google.com/p/go-uuid/uuid",
Godeps/_workspace/src/bazil.org/fuse/error_darwin.go
+1
-1
@@ -22,7 +22,7 @@ func (getxattrError) Errno() Errno {
22
// http://mail-index.netbsd.org/tech-kern/2012/04/30/msg013090.html
23
// http://mail-index.netbsd.org/tech-kern/2012/04/30/msg013097.html
24
// http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
25
-func translateGetxattrError(err Error) Error {
25
+func translateGetxattrError(err error) error {
26
ferr, ok := err.(ErrorNumber)
27
if !ok {
28
return err
Godeps/_workspace/src/bazil.org/fuse/error_std.go
+1
-1
@@ -2,6 +2,6 @@
2
3
package fuse
4
5
-func translateGetxattrError(err Error) Error {
5
+func translateGetxattrError(err error) error {
6
return err
7
}
Godeps/_workspace/src/bazil.org/fuse/fs/bench/bench_test.go
+10
-9
@@ -10,6 +10,7 @@ import (
10
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse"
11
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/fs"
12
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/fs/fstestutil"
13
+ "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
14
)
15
16
type benchConfig struct {
@@ -23,13 +24,13 @@ type benchFS struct {
24
var _ = fs.FS(benchFS{})
25
var _ = fs.FSIniter(benchFS{})
26
26
-func (benchFS) Init(req *fuse.InitRequest, resp *fuse.InitResponse, intr fs.Intr) fuse.Error {
27
+func (benchFS) Init(ctx context.Context, req *fuse.InitRequest, resp *fuse.InitResponse) error {
28
resp.MaxReadahead = 64 * 1024 * 1024
29
resp.Flags |= fuse.InitAsyncRead
30
return nil
31
}
32
32
-func (f benchFS) Root() (fs.Node, fuse.Error) {
33
+func (f benchFS) Root() (fs.Node, error) {
34
return benchDir{conf: f.conf}, nil
35
}
36
@@ -40,20 +41,20 @@ type benchDir struct {
41
var _ = fs.Node(benchDir{})
42
var _ = fs.NodeStringLookuper(benchDir{})
43
var _ = fs.Handle(benchDir{})
43
-var _ = fs.HandleReadDirer(benchDir{})
44
+var _ = fs.HandleReadDirAller(benchDir{})
45
46
func (benchDir) Attr() fuse.Attr {
47
return fuse.Attr{Inode: 1, Mode: os.ModeDir | 0555}
48
}
49
49
-func (d benchDir) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
50
+func (d benchDir) Lookup(ctx context.Context, name string) (fs.Node, error) {
51
if name == "bench" {
52
return benchFile{conf: d.conf}, nil
53
}
54
return nil, fuse.ENOENT
55
}
56
56
-func (benchDir) ReadDir(intr fs.Intr) ([]fuse.Dirent, fuse.Error) {
57
+func (benchDir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
58
l := []fuse.Dirent{
59
{Inode: 2, Name: "bench", Type: fuse.DT_File},
60
}
@@ -75,7 +76,7 @@ func (benchFile) Attr() fuse.Attr {
76
return fuse.Attr{Inode: 2, Mode: 0644, Size: 9999999999999999}
77
}
78
78
-func (f benchFile) Open(req *fuse.OpenRequest, resp *fuse.OpenResponse, intr fs.Intr) (fs.Handle, fuse.Error) {
79
+func (f benchFile) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fs.Handle, error) {
80
if f.conf.directIO {
81
resp.Flags |= fuse.OpenDirectIO
82
}
@@ -84,17 +85,17 @@ func (f benchFile) Open(req *fuse.OpenRequest, resp *fuse.OpenResponse, intr fs.
85
return f, nil
86
}
87
87
-func (benchFile) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fs.Intr) fuse.Error {
88
+func (benchFile) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
89
resp.Data = resp.Data[:cap(resp.Data)]
90
return nil
91
}
92
92
-func (benchFile) Write(req *fuse.WriteRequest, resp *fuse.WriteResponse, intr fs.Intr) fuse.Error {
93
+func (benchFile) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error {
94
resp.Size = len(req.Data)
95
return nil
96
}
97
97
-func (benchFile) Fsync(req *fuse.FsyncRequest, intr fs.Intr) fuse.Error {
98
+func (benchFile) Fsync(ctx context.Context, req *fuse.FsyncRequest) error {
99
return nil
100
}
101
Godeps/_workspace/src/bazil.org/fuse/fs/fstestutil/record/record.go
+14
-13
@@ -6,6 +6,7 @@ import (
6
7
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse"
8
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/fs"
9
+ "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
10
)
11
12
// Writes gathers data from FUSE Write calls.
@@ -15,7 +16,7 @@ type Writes struct {
16
17
var _ = fs.HandleWriter(&Writes{})
18
18
-func (w *Writes) Write(req *fuse.WriteRequest, resp *fuse.WriteResponse, intr fs.Intr) fuse.Error {
19
+func (w *Writes) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error {
20
n, err := w.buf.Write(req.Data)
21
resp.Size = n
22
if err != nil {
@@ -62,7 +63,7 @@ type Flushes struct {
63
64
var _ = fs.HandleFlusher(&Flushes{})
65
65
-func (r *Flushes) Flush(req *fuse.FlushRequest, intr fs.Intr) fuse.Error {
66
+func (r *Flushes) Flush(ctx context.Context, req *fuse.FlushRequest) error {
67
r.rec.Mark()
68
return nil
69
}
@@ -120,7 +121,7 @@ type Setattrs struct {
121
122
var _ = fs.NodeSetattrer(&Setattrs{})
123
123
-func (r *Setattrs) Setattr(req *fuse.SetattrRequest, resp *fuse.SetattrResponse, intr fs.Intr) fuse.Error {
124
+func (r *Setattrs) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error {
125
tmp := *req
126
r.rec.RecordRequest(&tmp)
127
return nil
@@ -141,7 +142,7 @@ type Fsyncs struct {
142
143
var _ = fs.NodeFsyncer(&Fsyncs{})
144
144
-func (r *Fsyncs) Fsync(req *fuse.FsyncRequest, intr fs.Intr) fuse.Error {
145
+func (r *Fsyncs) Fsync(ctx context.Context, req *fuse.FsyncRequest) error {
146
tmp := *req
147
r.rec.RecordRequest(&tmp)
148
return nil
@@ -164,7 +165,7 @@ var _ = fs.NodeMkdirer(&Mkdirs{})
165
166
// Mkdir records the request and returns an error. Most callers should
167
// wrap this call in a function that returns a more useful result.
167
-func (r *Mkdirs) Mkdir(req *fuse.MkdirRequest, intr fs.Intr) (fs.Node, fuse.Error) {
168
+func (r *Mkdirs) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, error) {
169
tmp := *req
170
r.rec.RecordRequest(&tmp)
171
return nil, fuse.EIO
@@ -189,7 +190,7 @@ var _ = fs.NodeSymlinker(&Symlinks{})
190
191
// Symlink records the request and returns an error. Most callers should
192
// wrap this call in a function that returns a more useful result.
192
-func (r *Symlinks) Symlink(req *fuse.SymlinkRequest, intr fs.Intr) (fs.Node, fuse.Error) {
193
+func (r *Symlinks) Symlink(ctx context.Context, req *fuse.SymlinkRequest) (fs.Node, error) {
194
tmp := *req
195
r.rec.RecordRequest(&tmp)
196
return nil, fuse.EIO
@@ -214,7 +215,7 @@ var _ = fs.NodeLinker(&Links{})
215
216
// Link records the request and returns an error. Most callers should
217
// wrap this call in a function that returns a more useful result.
217
-func (r *Links) Link(req *fuse.LinkRequest, old fs.Node, intr fs.Intr) (fs.Node, fuse.Error) {
218
+func (r *Links) Link(ctx context.Context, req *fuse.LinkRequest, old fs.Node) (fs.Node, error) {
219
tmp := *req
220
r.rec.RecordRequest(&tmp)
221
return nil, fuse.EIO
@@ -239,7 +240,7 @@ var _ = fs.NodeMknoder(&Mknods{})
240
241
// Mknod records the request and returns an error. Most callers should
242
// wrap this call in a function that returns a more useful result.
242
-func (r *Mknods) Mknod(req *fuse.MknodRequest, intr fs.Intr) (fs.Node, fuse.Error) {
243
+func (r *Mknods) Mknod(ctx context.Context, req *fuse.MknodRequest) (fs.Node, error) {
244
tmp := *req
245
r.rec.RecordRequest(&tmp)
246
return nil, fuse.EIO
@@ -264,7 +265,7 @@ var _ = fs.NodeOpener(&Opens{})
265
266
// Open records the request and returns an error. Most callers should
267
// wrap this call in a function that returns a more useful result.
267
-func (r *Opens) Open(req *fuse.OpenRequest, resp *fuse.OpenResponse, intr fs.Intr) (fs.Handle, fuse.Error) {
268
+func (r *Opens) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fs.Handle, error) {
269
tmp := *req
270
r.rec.RecordRequest(&tmp)
271
return nil, fuse.EIO
@@ -289,7 +290,7 @@ var _ = fs.NodeGetxattrer(&Getxattrs{})
290
291
// Getxattr records the request and returns an error. Most callers should
292
// wrap this call in a function that returns a more useful result.
292
-func (r *Getxattrs) Getxattr(req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse, intr fs.Intr) fuse.Error {
293
+func (r *Getxattrs) Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error {
294
tmp := *req
295
r.rec.RecordRequest(&tmp)
296
return fuse.ENODATA
@@ -314,7 +315,7 @@ var _ = fs.NodeListxattrer(&Listxattrs{})
315
316
// Listxattr records the request and returns an error. Most callers should
317
// wrap this call in a function that returns a more useful result.
317
-func (r *Listxattrs) Listxattr(req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse, intr fs.Intr) fuse.Error {
318
+func (r *Listxattrs) Listxattr(ctx context.Context, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error {
319
tmp := *req
320
r.rec.RecordRequest(&tmp)
321
return fuse.ENODATA
@@ -339,7 +340,7 @@ var _ = fs.NodeSetxattrer(&Setxattrs{})
340
341
// Setxattr records the request and returns an error. Most callers should
342
// wrap this call in a function that returns a more useful result.
342
-func (r *Setxattrs) Setxattr(req *fuse.SetxattrRequest, intr fs.Intr) fuse.Error {
343
+func (r *Setxattrs) Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error {
344
tmp := *req
345
r.rec.RecordRequest(&tmp)
346
return nil
@@ -364,7 +365,7 @@ var _ = fs.NodeRemovexattrer(&Removexattrs{})
365
366
// Removexattr records the request and returns an error. Most callers should
367
// wrap this call in a function that returns a more useful result.
367
-func (r *Removexattrs) Removexattr(req *fuse.RemovexattrRequest, intr fs.Intr) fuse.Error {
368
+func (r *Removexattrs) Removexattr(ctx context.Context, req *fuse.RemovexattrRequest) error {
369
tmp := *req
370
r.rec.RecordRequest(&tmp)
371
return nil
Godeps/_workspace/src/bazil.org/fuse/fs/fstestutil/record/wait.go
+2
-1
@@ -6,6 +6,7 @@ import (
6
7
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse"
8
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/fs"
9
+ "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
10
)
11
12
type nothing struct{}
@@ -27,7 +28,7 @@ func (r *ReleaseWaiter) init() {
28
})
29
}
30
30
-func (r *ReleaseWaiter) Release(req *fuse.ReleaseRequest, intr fs.Intr) fuse.Error {
31
+func (r *ReleaseWaiter) Release(ctx context.Context, req *fuse.ReleaseRequest) error {
32
r.init()
33
close(r.seen)
34
return nil
Godeps/_workspace/src/bazil.org/fuse/fs/fstestutil/testfs.go
+1
-1
@@ -14,7 +14,7 @@ type SimpleFS struct {
14
15
var _ = fs.FS(SimpleFS{})
16
17
-func (f SimpleFS) Root() (fs.Node, fuse.Error) {
17
+func (f SimpleFS) Root() (fs.Node, error) {
18
return f.Node, nil
19
}
20
Godeps/_workspace/src/bazil.org/fuse/fs/serve.go
+80
-77
@@ -11,6 +11,8 @@ import (
11
"strings"
12
"sync"
13
"time"
14
+
15
+ "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
16
)
17
18
import (
@@ -25,33 +27,26 @@ const (
27
28
// TODO: FINISH DOCS
29
28
-// An Intr is a channel that signals that a request has been interrupted.
29
-// Being able to receive from the channel means the request has been
30
-// interrupted.
31
-type Intr chan struct{}
32
-
33
-func (Intr) String() string { return "fuse.Intr" }
34
-
30
// An FS is the interface required of a file system.
31
//
32
// Other FUSE requests can be handled by implementing methods from the
33
// FS* interfaces, for example FSIniter.
34
type FS interface {
35
// Root is called to obtain the Node for the file system root.
41
- Root() (Node, fuse.Error)
36
+ Root() (Node, error)
37
}
38
39
type FSIniter interface {
40
// Init is called to initialize the FUSE connection.
41
// It can inspect the request and adjust the response as desired.
42
// Init must return promptly.
48
- Init(req *fuse.InitRequest, resp *fuse.InitResponse, intr Intr) fuse.Error
43
+ Init(ctx context.Context, req *fuse.InitRequest, resp *fuse.InitResponse) error
44
}
45
46
type FSStatfser interface {
47
// Statfs is called to obtain file system metadata.
48
// It should write that data to resp.
54
- Statfs(req *fuse.StatfsRequest, resp *fuse.StatfsResponse, intr Intr) fuse.Error
49
+ Statfs(ctx context.Context, req *fuse.StatfsRequest, resp *fuse.StatfsResponse) error
50
}
51
52
type FSDestroyer interface {
@@ -101,38 +96,38 @@ type NodeGetattrer interface {
96
//
97
// If this method is not implemented, the attributes will be
98
// generated based on Attr(), with zero values filled in.
104
- Getattr(req *fuse.GetattrRequest, resp *fuse.GetattrResponse, intr Intr) fuse.Error
99
+ Getattr(ctx context.Context, req *fuse.GetattrRequest, resp *fuse.GetattrResponse) error
100
}
101
102
type NodeSetattrer interface {
103
// Setattr sets the standard metadata for the receiver.
109
- Setattr(req *fuse.SetattrRequest, resp *fuse.SetattrResponse, intr Intr) fuse.Error
104
+ Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error
105
}
106
107
type NodeSymlinker interface {
108
// Symlink creates a new symbolic link in the receiver, which must be a directory.
109
//
110
// TODO is the above true about directories?
116
- Symlink(req *fuse.SymlinkRequest, intr Intr) (Node, fuse.Error)
111
+ Symlink(ctx context.Context, req *fuse.SymlinkRequest) (Node, error)
112
}
113
114
// This optional request will be called only for symbolic link nodes.
115
type NodeReadlinker interface {
116
// Readlink reads a symbolic link.
122
- Readlink(req *fuse.ReadlinkRequest, intr Intr) (string, fuse.Error)
117
+ Readlink(ctx context.Context, req *fuse.ReadlinkRequest) (string, error)
118
}
119
120
type NodeLinker interface {
121
// Link creates a new directory entry in the receiver based on an
122
// existing Node. Receiver must be a directory.
128
- Link(req *fuse.LinkRequest, old Node, intr Intr) (Node, fuse.Error)
123
+ Link(ctx context.Context, req *fuse.LinkRequest, old Node) (Node, error)
124
}
125
126
type NodeRemover interface {
127
// Remove removes the entry with the given name from
128
// the receiver, which must be a directory. The entry to be removed
129
// may correspond to a file (unlink) or to a directory (rmdir).
135
- Remove(req *fuse.RemoveRequest, intr Intr) fuse.Error
130
+ Remove(ctx context.Context, req *fuse.RemoveRequest) error
131
}
132
133
type NodeAccesser interface {
@@ -144,7 +139,7 @@ type NodeAccesser interface {
139
// call but not the open(2) system call. If Access is not
140
// implemented, the Node behaves as if it always returns nil
141
// (permission granted), relying on checks in Open instead.
147
- Access(req *fuse.AccessRequest, intr Intr) fuse.Error
142
+ Access(ctx context.Context, req *fuse.AccessRequest) error
143
}
144
145
type NodeStringLookuper interface {
@@ -154,30 +149,37 @@ type NodeStringLookuper interface {
149
// the directory, Lookup should return nil, err.
150
//
151
// Lookup need not to handle the names "." and "..".
157
- Lookup(name string, intr Intr) (Node, fuse.Error)
152
+ Lookup(ctx context.Context, name string) (Node, error)
153
}
154
155
type NodeRequestLookuper interface {
156
// Lookup looks up a specific entry in the receiver.
157
// See NodeStringLookuper for more.
163
- Lookup(req *fuse.LookupRequest, resp *fuse.LookupResponse, intr Intr) (Node, fuse.Error)
158
+ Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse.LookupResponse) (Node, error)
159
}
160
161
type NodeMkdirer interface {
167
- Mkdir(req *fuse.MkdirRequest, intr Intr) (Node, fuse.Error)
162
+ Mkdir(ctx context.Context, req *fuse.MkdirRequest) (Node, error)
163
}
164
165
type NodeOpener interface {
171
- // Open opens the receiver.
166
+ // Open opens the receiver. After a successful open, a client
167
+ // process has a file descriptor referring to this Handle.
168
+ //
169
+ // Open can also be also called on non-files. For example,
170
+ // directories are Opened for ReadDir or fchdir(2).
171
+ //
172
+ // If this method is not implemented, the open will always
173
+ // succeed, and the Node itself will be used as the Handle.
174
+ //
175
// XXX note about access. XXX OpenFlags.
173
- // XXX note that the Node may be a file or directory.
174
- Open(req *fuse.OpenRequest, resp *fuse.OpenResponse, intr Intr) (Handle, fuse.Error)
176
+ Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (Handle, error)
177
}
178
179
type NodeCreater interface {
180
// Create creates a new directory entry in the receiver, which
181
// must be a directory.
180
- Create(req *fuse.CreateRequest, resp *fuse.CreateResponse, intr Intr) (Node, Handle, fuse.Error)
182
+ Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (Node, Handle, error)
183
}
184
185
type NodeForgetter interface {
@@ -185,16 +187,16 @@ type NodeForgetter interface {
187
}
188
189
type NodeRenamer interface {
188
- Rename(req *fuse.RenameRequest, newDir Node, intr Intr) fuse.Error
190
+ Rename(ctx context.Context, req *fuse.RenameRequest, newDir Node) error
191
}
192
193
type NodeMknoder interface {
192
- Mknod(req *fuse.MknodRequest, intr Intr) (Node, fuse.Error)
194
+ Mknod(ctx context.Context, req *fuse.MknodRequest) (Node, error)
195
}
196
197
// TODO this should be on Handle not Node
198
type NodeFsyncer interface {
197
- Fsync(req *fuse.FsyncRequest, intr Intr) fuse.Error
199
+ Fsync(ctx context.Context, req *fuse.FsyncRequest) error
200
}
201
202
type NodeGetxattrer interface {
@@ -204,18 +206,18 @@ type NodeGetxattrer interface {
206
// If there is no xattr by that name, returns fuse.ENODATA. This
207
// will be translated to the platform-specific correct error code
208
// by the framework.
207
- Getxattr(req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse, intr Intr) fuse.Error
209
+ Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error
210
}
211
212
type NodeListxattrer interface {
213
// Listxattr lists the extended attributes recorded for the node.
212
- Listxattr(req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse, intr Intr) fuse.Error
214
+ Listxattr(ctx context.Context, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error
215
}
216
217
type NodeSetxattrer interface {
218
// Setxattr sets an extended attribute with the given name and
219
// value for the node.
218
- Setxattr(req *fuse.SetxattrRequest, intr Intr) fuse.Error
220
+ Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error
221
}
222
223
type NodeRemovexattrer interface {
@@ -224,7 +226,7 @@ type NodeRemovexattrer interface {
226
// If there is no xattr by that name, returns fuse.ENODATA. This
227
// will be translated to the platform-specific correct error code
228
// by the framework.
227
- Removexattr(req *fuse.RemovexattrRequest, intr Intr) fuse.Error
229
+ Removexattr(ctx context.Context, req *fuse.RemovexattrRequest) error
230
}
231
232
var startTime = time.Now()
@@ -254,8 +256,8 @@ func nodeAttr(n Node) (attr fuse.Attr) {
256
// pertaining to all methods.
257
//
258
// Other FUSE requests can be handled by implementing methods from the
257
-// Node* interfaces. The most common to implement are
258
-// HandleReader, HandleReadDirer, and HandleWriter.
259
+// Handle* interfaces. The most common to implement are HandleReader,
260
+// HandleReadDirer, and HandleWriter.
261
//
262
// TODO implement methods: Getlk, Setlk, Setlkw
263
type Handle interface {
@@ -265,27 +267,27 @@ type HandleFlusher interface {
267
// Flush is called each time the file or directory is closed.
268
// Because there can be multiple file descriptors referring to a
269
// single opened file, Flush can be called multiple times.
268
- Flush(req *fuse.FlushRequest, intr Intr) fuse.Error
270
+ Flush(ctx context.Context, req *fuse.FlushRequest) error
271
}
272
273
type HandleReadAller interface {
272
- ReadAll(intr Intr) ([]byte, fuse.Error)
274
+ ReadAll(ctx context.Context) ([]byte, error)
275
}
276
275
-type HandleReadDirer interface {
276
- ReadDir(intrt Intr) ([]fuse.Dirent, fuse.Error)
277
+type HandleReadDirAller interface {
278
+ ReadDirAll(ctx context.Context) ([]fuse.Dirent, error)
279
}
280
281
type HandleReader interface {
280
- Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr Intr) fuse.Error
282
+ Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error
283
}
284
285
type HandleWriter interface {
284
- Write(req *fuse.WriteRequest, resp *fuse.WriteResponse, intr Intr) fuse.Error
286
+ Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error
287
}
288
289
type HandleReleaser interface {
288
- Release(req *fuse.ReleaseRequest, intr Intr) fuse.Error
290
+ Release(ctx context.Context, req *fuse.ReleaseRequest) error
291
}
292
293
type Server struct {
@@ -363,7 +365,7 @@ type serveConn struct {
365
366
type serveRequest struct {
367
Request fuse.Request
366
- Intr Intr
368
+ cancel func()
369
}
370
371
type serveNode struct {
@@ -621,8 +623,10 @@ func (m *renameNewDirNodeNotFound) String() string {
623
}
624
625
func (c *serveConn) serve(r fuse.Request) {
624
- intr := make(Intr)
625
- req := &serveRequest{Request: r, Intr: intr}
626
+ ctx, cancel := context.WithCancel(context.Background())
627
+ defer cancel()
628
+
629
+ req := &serveRequest{Request: r, cancel: cancel}
630
631
c.debug(request{
632
Op: opName(r),
@@ -661,7 +665,6 @@ func (c *serveConn) serve(r fuse.Request) {
665
// Otherwise everything wedges. TODO: Report to OSXFUSE?
666
//
667
// TODO this might have been because of missing done() calls
664
- intr = nil
668
} else {
669
c.req[hdr.ID] = req
670
}
@@ -713,7 +716,7 @@ func (c *serveConn) serve(r fuse.Request) {
716
Flags: fuse.InitBigWrites,
717
}
718
if fs, ok := c.fs.(FSIniter); ok {
716
- if err := fs.Init(r, s, intr); err != nil {
719
+ if err := fs.Init(ctx, r, s); err != nil {
720
done(err)
721
r.RespondError(err)
722
break
@@ -725,7 +728,7 @@ func (c *serveConn) serve(r fuse.Request) {
728
case *fuse.StatfsRequest:
729
s := &fuse.StatfsResponse{}
730
if fs, ok := c.fs.(FSStatfser); ok {
728
- if err := fs.Statfs(r, s, intr); err != nil {
731
+ if err := fs.Statfs(ctx, r, s); err != nil {
732
done(err)
733
r.RespondError(err)
734
break
@@ -738,7 +741,7 @@ func (c *serveConn) serve(r fuse.Request) {
741
case *fuse.GetattrRequest:
742
s := &fuse.GetattrResponse{}
743
if n, ok := node.(NodeGetattrer); ok {
741
- if err := n.Getattr(r, s, intr); err != nil {
744
+ if err := n.Getattr(ctx, r, s); err != nil {
745
done(err)
746
r.RespondError(err)
747
break
@@ -753,7 +756,7 @@ func (c *serveConn) serve(r fuse.Request) {
756
case *fuse.SetattrRequest:
757
s := &fuse.SetattrResponse{}
758
if n, ok := node.(NodeSetattrer); ok {
756
- if err := n.Setattr(r, s, intr); err != nil {
759
+ if err := n.Setattr(ctx, r, s); err != nil {
760
done(err)
761
r.RespondError(err)
762
break
@@ -778,7 +781,7 @@ func (c *serveConn) serve(r fuse.Request) {
781
r.RespondError(fuse.EIO)
782
break
783
}
781
- n2, err := n.Symlink(r, intr)
784
+ n2, err := n.Symlink(ctx, r)
785
if err != nil {
786
done(err)
787
r.RespondError(err)
@@ -795,7 +798,7 @@ func (c *serveConn) serve(r fuse.Request) {
798
r.RespondError(fuse.EIO)
799
break
800
}
798
- target, err := n.Readlink(r, intr)
801
+ target, err := n.Readlink(ctx, r)
802
if err != nil {
803
done(err)
804
r.RespondError(err)
@@ -826,7 +829,7 @@ func (c *serveConn) serve(r fuse.Request) {
829
r.RespondError(fuse.EIO)
830
break
831
}
829
- n2, err := n.Link(r, oldNode.node, intr)
832
+ n2, err := n.Link(ctx, r, oldNode.node)
833
if err != nil {
834
done(err)
835
r.RespondError(err)
@@ -844,7 +847,7 @@ func (c *serveConn) serve(r fuse.Request) {
847
r.RespondError(fuse.EIO)
848
break
849
}
847
- err := n.Remove(r, intr)
850
+ err := n.Remove(ctx, r)
851
if err != nil {
852
done(err)
853
r.RespondError(err)
@@ -855,7 +858,7 @@ func (c *serveConn) serve(r fuse.Request) {
858
859
case *fuse.AccessRequest:
860
if n, ok := node.(NodeAccesser); ok {
858
- if err := n.Access(r, intr); err != nil {
861
+ if err := n.Access(ctx, r); err != nil {
862
done(err)
863
r.RespondError(err)
864
break
@@ -866,12 +869,12 @@ func (c *serveConn) serve(r fuse.Request) {
869
870
case *fuse.LookupRequest:
871
var n2 Node
869
- var err fuse.Error
872
+ var err error
873
s := &fuse.LookupResponse{}
874
if n, ok := node.(NodeStringLookuper); ok {
872
- n2, err = n.Lookup(r.Name, intr)
875
+ n2, err = n.Lookup(ctx, r.Name)
876
} else if n, ok := node.(NodeRequestLookuper); ok {
874
- n2, err = n.Lookup(r, s, intr)
877
+ n2, err = n.Lookup(ctx, r, s)
878
} else {
879
done(fuse.ENOENT)
880
r.RespondError(fuse.ENOENT)
@@ -894,7 +897,7 @@ func (c *serveConn) serve(r fuse.Request) {
897
r.RespondError(fuse.EPERM)
898
break
899
}
897
- n2, err := n.Mkdir(r, intr)
900
+ n2, err := n.Mkdir(ctx, r)
901
if err != nil {
902
done(err)
903
r.RespondError(err)
@@ -908,7 +911,7 @@ func (c *serveConn) serve(r fuse.Request) {
911
s := &fuse.OpenResponse{}
912
var h2 Handle
913
if n, ok := node.(NodeOpener); ok {
911
- hh, err := n.Open(r, s, intr)
914
+ hh, err := n.Open(ctx, r, s)
915
if err != nil {
916
done(err)
917
r.RespondError(err)
@@ -931,7 +934,7 @@ func (c *serveConn) serve(r fuse.Request) {
934
break
935
}
936
s := &fuse.CreateResponse{OpenResponse: fuse.OpenResponse{}}
934
- n2, h2, err := n.Create(r, s, intr)
937
+ n2, h2, err := n.Create(ctx, r, s)
938
if err != nil {
939
done(err)
940
r.RespondError(err)
@@ -950,7 +953,7 @@ func (c *serveConn) serve(r fuse.Request) {
953
break
954
}
955
s := &fuse.GetxattrResponse{}
953
- err := n.Getxattr(r, s, intr)
956
+ err := n.Getxattr(ctx, r, s)
957
if err != nil {
958
done(err)
959
r.RespondError(err)
@@ -972,7 +975,7 @@ func (c *serveConn) serve(r fuse.Request) {
975
break
976
}
977
s := &fuse.ListxattrResponse{}
975
- err := n.Listxattr(r, s, intr)
978
+ err := n.Listxattr(ctx, r, s)
979
if err != nil {
980
done(err)
981
r.RespondError(err)
@@ -993,7 +996,7 @@ func (c *serveConn) serve(r fuse.Request) {
996
r.RespondError(fuse.ENOTSUP)
997
break
998
}
996
- err := n.Setxattr(r, intr)
999
+ err := n.Setxattr(ctx, r)
1000
if err != nil {
1001
done(err)
1002
r.RespondError(err)
@@ -1009,7 +1012,7 @@ func (c *serveConn) serve(r fuse.Request) {
1012
r.RespondError(fuse.ENOTSUP)
1013
break
1014
}
1012
- err := n.Removexattr(r, intr)
1015
+ err := n.Removexattr(ctx, r)
1016
if err != nil {
1017
done(err)
1018
r.RespondError(err)
@@ -1041,9 +1044,9 @@ func (c *serveConn) serve(r fuse.Request) {
1044
1045
s := &fuse.ReadResponse{Data: make([]byte, 0, r.Size)}
1046
if r.Dir {
1044
- if h, ok := handle.(HandleReadDirer); ok {
1047
+ if h, ok := handle.(HandleReadDirAller); ok {
1048
if shandle.readData == nil {
1046
- dirs, err := h.ReadDir(intr)
1049
+ dirs, err := h.ReadDirAll(ctx)
1050
if err != nil {
1051
done(err)
1052
r.RespondError(err)
@@ -1066,7 +1069,7 @@ func (c *serveConn) serve(r fuse.Request) {
1069
} else {
1070
if h, ok := handle.(HandleReadAller); ok {
1071
if shandle.readData == nil {
1069
- data, err := h.ReadAll(intr)
1072
+ data, err := h.ReadAll(ctx)
1073
if err != nil {
1074
done(err)
1075
r.RespondError(err)
@@ -1089,7 +1092,7 @@ func (c *serveConn) serve(r fuse.Request) {
1092
r.RespondError(fuse.EIO)
1093
break
1094
}
1092
- if err := h.Read(r, s, intr); err != nil {
1095
+ if err := h.Read(ctx, r, s); err != nil {
1096
done(err)
1097
r.RespondError(err)
1098
break
@@ -1108,7 +1111,7 @@ func (c *serveConn) serve(r fuse.Request) {
1111
1112
s := &fuse.WriteResponse{}
1113
if h, ok := shandle.handle.(HandleWriter); ok {
1111
- if err := h.Write(r, s, intr); err != nil {
1114
+ if err := h.Write(ctx, r, s); err != nil {
1115
done(err)
1116
r.RespondError(err)
1117
break
@@ -1130,7 +1133,7 @@ func (c *serveConn) serve(r fuse.Request) {
1133
handle := shandle.handle
1134
1135
if h, ok := handle.(HandleFlusher); ok {
1133
- if err := h.Flush(r, intr); err != nil {
1136
+ if err := h.Flush(ctx, r); err != nil {
1137
done(err)
1138
r.RespondError(err)
1139
break
@@ -1152,7 +1155,7 @@ func (c *serveConn) serve(r fuse.Request) {
1155
c.dropHandle(r.Handle)
1156
1157
if h, ok := handle.(HandleReleaser); ok {
1155
- if err := h.Release(r, intr); err != nil {
1158
+ if err := h.Release(ctx, r); err != nil {
1159
done(err)
1160
r.RespondError(err)
1161
break
@@ -1190,7 +1193,7 @@ func (c *serveConn) serve(r fuse.Request) {
1193
r.RespondError(fuse.EIO)
1194
break
1195
}
1193
- err := n.Rename(r, newDirNode.node, intr)
1196
+ err := n.Rename(ctx, r, newDirNode.node)
1197
if err != nil {
1198
done(err)
1199
r.RespondError(err)
@@ -1206,7 +1209,7 @@ func (c *serveConn) serve(r fuse.Request) {
1209
r.RespondError(fuse.EIO)
1210
break
1211
}
1209
- n2, err := n.Mknod(r, intr)
1212
+ n2, err := n.Mknod(ctx, r)
1213
if err != nil {
1214
done(err)
1215
r.RespondError(err)
@@ -1224,7 +1227,7 @@ func (c *serveConn) serve(r fuse.Request) {
1227
r.RespondError(fuse.EIO)
1228
break
1229
}
1227
- err := n.Fsync(r, intr)
1230
+ err := n.Fsync(ctx, r)
1231
if err != nil {
1232
done(err)
1233
r.RespondError(err)
@@ -1236,9 +1239,9 @@ func (c *serveConn) serve(r fuse.Request) {
1239
case *fuse.InterruptRequest:
1240
c.meta.Lock()
1241
ireq := c.req[r.IntrID]
1239
- if ireq != nil && ireq.Intr != nil {
1240
- close(ireq.Intr)
1241
- ireq.Intr = nil
1242
+ if ireq != nil && ireq.cancel != nil {
1243
+ ireq.cancel()
1244
+ ireq.cancel = nil
1245
}
1246
c.meta.Unlock()
1247
done(nil)
@@ -1288,7 +1291,7 @@ type dataHandle struct {
1291
data []byte
1292
}
1293
1291
-func (d *dataHandle) ReadAll(intr Intr) ([]byte, fuse.Error) {
1294
+func (d *dataHandle) ReadAll(ctx context.Context) ([]byte, error) {
1295
return d.data, nil
1296
}
1297
Godeps/_workspace/src/bazil.org/fuse/fs/serve_test.go
+83
-50
@@ -4,6 +4,7 @@ import (
4
"bytes"
5
"errors"
6
"flag"
7
+ "io"
8
"io/ioutil"
9
"log"
10
"os"
@@ -22,6 +23,7 @@ import (
23
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/fs/fstestutil/record"
24
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/fuseutil"
25
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/syscallx"
26
+ "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
27
)
28
29
// TO TEST:
@@ -75,11 +77,11 @@ func (f childMapFS) Attr() fuse.Attr {
77
return fuse.Attr{Inode: 1, Mode: os.ModeDir | 0777}
78
}
79
78
-func (f childMapFS) Root() (fs.Node, fuse.Error) {
80
+func (f childMapFS) Root() (fs.Node, error) {
81
return f, nil
82
}
83
82
-func (f childMapFS) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
84
+func (f childMapFS) Lookup(ctx context.Context, name string) (fs.Node, error) {
85
child, ok := f[name]
86
if !ok {
87
return nil, fuse.ENOENT
@@ -101,7 +103,7 @@ func (f fifo) Attr() fuse.Attr { return fuse.Attr{Mode: os.ModeNamedPipe | 0666}
103
104
type badRootFS struct{}
105
104
-func (badRootFS) Root() (fs.Node, fuse.Error) {
106
+func (badRootFS) Root() (fs.Node, error) {
107
// pick a really distinct error, to identify it later
108
return nil, fuse.Errno(syscall.ENAMETOOLONG)
109
}
@@ -131,7 +133,7 @@ func TestRootErr(t *testing.T) {
133
134
type testStatFS struct{}
135
134
-func (f testStatFS) Root() (fs.Node, fuse.Error) {
136
+func (f testStatFS) Root() (fs.Node, error) {
137
return f, nil
138
}
139
@@ -139,7 +141,7 @@ func (f testStatFS) Attr() fuse.Attr {
141
return fuse.Attr{Inode: 1, Mode: os.ModeDir | 0777}
142
}
143
142
-func (f testStatFS) Statfs(req *fuse.StatfsRequest, resp *fuse.StatfsResponse, int fs.Intr) fuse.Error {
144
+func (f testStatFS) Statfs(ctx context.Context, req *fuse.StatfsRequest, resp *fuse.StatfsResponse) error {
145
resp.Blocks = 42
146
resp.Files = 13
147
return nil
@@ -194,7 +196,7 @@ func TestStatfs(t *testing.T) {
196
197
type root struct{}
198
197
-func (f root) Root() (fs.Node, fuse.Error) {
199
+func (f root) Root() (fs.Node, error) {
200
return f, nil
201
}
202
@@ -253,7 +255,7 @@ func (readAll) Attr() fuse.Attr {
255
}
256
}
257
256
-func (readAll) ReadAll(intr fs.Intr) ([]byte, fuse.Error) {
258
+func (readAll) ReadAll(ctx context.Context) ([]byte, error) {
259
return []byte(hi), nil
260
}
261
@@ -291,7 +293,7 @@ func (readWithHandleRead) Attr() fuse.Attr {
293
}
294
}
295
294
-func (readWithHandleRead) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fs.Intr) fuse.Error {
296
+func (readWithHandleRead) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
297
fuseutil.HandleRead(req, resp, []byte(hi))
298
return nil
299
}
@@ -466,8 +468,8 @@ type mkdir1 struct {
468
record.Mkdirs
469
}
470
469
-func (f *mkdir1) Mkdir(req *fuse.MkdirRequest, intr fs.Intr) (fs.Node, fuse.Error) {
470
- f.Mkdirs.Mkdir(req, intr)
471
+func (f *mkdir1) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, error) {
472
+ f.Mkdirs.Mkdir(ctx, req)
473
return &mkdir1{}, nil
474
}
475
@@ -505,7 +507,7 @@ type create1 struct {
507
f create1file
508
}
509
508
-func (f *create1) Create(req *fuse.CreateRequest, resp *fuse.CreateResponse, intr fs.Intr) (fs.Node, fs.Handle, fuse.Error) {
510
+func (f *create1) Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) {
511
if req.Name != "foo" {
512
log.Printf("ERROR create1.Create unexpected name: %q\n", req.Name)
513
return nil, nil, fuse.EPERM
@@ -577,7 +579,7 @@ type create3 struct {
579
fooRemoved record.MarkRecorder
580
}
581
580
-func (f *create3) Create(req *fuse.CreateRequest, resp *fuse.CreateResponse, intr fs.Intr) (fs.Node, fs.Handle, fuse.Error) {
582
+func (f *create3) Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) {
583
if req.Name != "foo" {
584
log.Printf("ERROR create3.Create unexpected name: %q\n", req.Name)
585
return nil, nil, fuse.EPERM
@@ -586,14 +588,14 @@ func (f *create3) Create(req *fuse.CreateRequest, resp *fuse.CreateResponse, int
588
return &f.f, &f.f, nil
589
}
590
589
-func (f *create3) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
591
+func (f *create3) Lookup(ctx context.Context, name string) (fs.Node, error) {
592
if f.fooCreated.Recorded() && !f.fooRemoved.Recorded() && name == "foo" {
593
return &f.f, nil
594
}
595
return nil, fuse.ENOENT
596
}
597
596
-func (f *create3) Remove(r *fuse.RemoveRequest, intr fs.Intr) fuse.Error {
598
+func (f *create3) Remove(ctx context.Context, r *fuse.RemoveRequest) error {
599
if f.fooCreated.Recorded() && !f.fooRemoved.Recorded() &&
600
r.Name == "foo" && !r.Dir {
601
f.fooRemoved.Mark()
@@ -637,7 +639,7 @@ type symlink1link struct {
639
target string
640
}
641
640
-func (f symlink1link) Readlink(*fuse.ReadlinkRequest, fs.Intr) (string, fuse.Error) {
642
+func (f symlink1link) Readlink(ctx context.Context, req *fuse.ReadlinkRequest) (string, error) {
643
return f.target, nil
644
}
645
@@ -646,8 +648,8 @@ type symlink1 struct {
648
record.Symlinks
649
}
650
649
-func (f *symlink1) Symlink(req *fuse.SymlinkRequest, intr fs.Intr) (fs.Node, fuse.Error) {
650
- f.Symlinks.Symlink(req, intr)
651
+func (f *symlink1) Symlink(ctx context.Context, req *fuse.SymlinkRequest) (fs.Node, error) {
652
+ f.Symlinks.Symlink(ctx, req)
653
return symlink1link{target: req.Target}, nil
654
}
655
@@ -688,15 +690,15 @@ type link1 struct {
690
record.Links
691
}
692
691
-func (f *link1) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
693
+func (f *link1) Lookup(ctx context.Context, name string) (fs.Node, error) {
694
if name == "old" {
695
return fstestutil.File{}, nil
696
}
697
return nil, fuse.ENOENT
698
}
699
698
-func (f *link1) Link(r *fuse.LinkRequest, old fs.Node, intr fs.Intr) (fs.Node, fuse.Error) {
699
- f.Links.Link(r, old, intr)
700
+func (f *link1) Link(ctx context.Context, r *fuse.LinkRequest, old fs.Node) (fs.Node, error) {
701
+ f.Links.Link(ctx, r, old)
702
return fstestutil.File{}, nil
703
}
704
@@ -732,14 +734,14 @@ type rename1 struct {
734
renamed record.Counter
735
}
736
735
-func (f *rename1) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
737
+func (f *rename1) Lookup(ctx context.Context, name string) (fs.Node, error) {
738
if name == "old" {
739
return fstestutil.File{}, nil
740
}
741
return nil, fuse.ENOENT
742
}
743
742
-func (f *rename1) Rename(r *fuse.RenameRequest, newDir fs.Node, intr fs.Intr) fuse.Error {
744
+func (f *rename1) Rename(ctx context.Context, r *fuse.RenameRequest, newDir fs.Node) error {
745
if r.OldName == "old" && r.NewName == "new" && newDir == f {
746
f.renamed.Inc()
747
return nil
@@ -776,8 +778,8 @@ type mknod1 struct {
778
record.Mknods
779
}
780
779
-func (f *mknod1) Mknod(r *fuse.MknodRequest, intr fs.Intr) (fs.Node, fuse.Error) {
780
- f.Mknods.Mknod(r, intr)
781
+func (f *mknod1) Mknod(ctx context.Context, r *fuse.MknodRequest) (fs.Node, error) {
782
+ f.Mknods.Mknod(ctx, r)
783
return fifo{}, nil
784
}
785
@@ -829,7 +831,7 @@ func (dataHandleTest) Attr() fuse.Attr {
831
}
832
}
833
832
-func (dataHandleTest) Open(*fuse.OpenRequest, *fuse.OpenResponse, fs.Intr) (fs.Handle, fuse.Error) {
834
+func (dataHandleTest) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fs.Handle, error) {
835
return fs.DataHandle([]byte(hi)), nil
836
}
837
@@ -868,12 +870,12 @@ func (interrupt) Attr() fuse.Attr {
870
}
871
}
872
871
-func (it *interrupt) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fs.Intr) fuse.Error {
873
+func (it *interrupt) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
874
select {
875
case it.hanging <- struct{}{}:
876
default:
877
}
876
- <-intr
878
+ <-ctx.Done()
879
return fuse.EINTR
880
}
881
@@ -1063,13 +1065,13 @@ func TestTruncateWithOpen(t *testing.T) {
1065
t.Logf("Got request: %#v", gotr)
1066
}
1067
1066
-// Test readdir
1068
+// Test readdir calling ReadDirAll
1069
1068
-type readdir struct {
1070
+type readDirAll struct {
1071
fstestutil.Dir
1072
}
1073
1072
-func (d *readdir) ReadDir(intr fs.Intr) ([]fuse.Dirent, fuse.Error) {
1074
+func (d *readDirAll) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
1075
return []fuse.Dirent{
1076
{Name: "one", Inode: 11, Type: fuse.DT_Dir},
1077
{Name: "three", Inode: 13},
@@ -1077,9 +1079,9 @@ func (d *readdir) ReadDir(intr fs.Intr) ([]fuse.Dirent, fuse.Error) {
1079
}, nil
1080
}
1081
1080
-func TestReadDir(t *testing.T) {
1082
+func TestReadDirAll(t *testing.T) {
1083
t.Parallel()
1082
- f := &readdir{}
1084
+ f := &readDirAll{}
1085
mnt, err := fstestutil.MountedT(t, fstestutil.SimpleFS{f})
1086
if err != nil {
1087
t.Fatal(err)
@@ -1113,6 +1115,37 @@ func TestReadDir(t *testing.T) {
1115
}
1116
}
1117
1118
+// Test readdir without any ReadDir methods implemented.
1119
+
1120
+type readDirNotImplemented struct {
1121
+ fstestutil.Dir
1122
+}
1123
+
1124
+func TestReadDirNotImplemented(t *testing.T) {
1125
+ t.Parallel()
1126
+ f := &readDirNotImplemented{}
1127
+ mnt, err := fstestutil.MountedT(t, fstestutil.SimpleFS{f})
1128
+ if err != nil {
1129
+ t.Fatal(err)
1130
+ }
1131
+ defer mnt.Close()
1132
+
1133
+ fil, err := os.Open(mnt.Dir)
1134
+ if err != nil {
1135
+ t.Error(err)
1136
+ return
1137
+ }
1138
+ defer fil.Close()
1139
+
1140
+ // go Readdir is just Readdirnames + Lstat, there's no point in
1141
+ // testing that here; we have no consumption API for the real
1142
+ // dirent data
1143
+ names, err := fil.Readdirnames(100)
1144
+ if len(names) > 0 || err != io.EOF {
1145
+ t.Fatalf("expected EOF got names=%v err=%v", names, err)
1146
+ }
1147
+}
1148
+
1149
// Test Chmod.
1150
1151
type chmod struct {
@@ -1120,12 +1153,12 @@ type chmod struct {
1153
record.Setattrs
1154
}
1155
1123
-func (f *chmod) Setattr(req *fuse.SetattrRequest, resp *fuse.SetattrResponse, intr fs.Intr) fuse.Error {
1156
+func (f *chmod) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error {
1157
if !req.Valid.Mode() {
1158
log.Printf("setattr not a chmod: %v", req.Valid)
1159
return fuse.EIO
1160
}
1128
- f.Setattrs.Setattr(req, resp, intr)
1161
+ f.Setattrs.Setattr(ctx, req, resp)
1162
return nil
1163
}
1164
@@ -1156,8 +1189,8 @@ type open struct {
1189
record.Opens
1190
}
1191
1159
-func (f *open) Open(req *fuse.OpenRequest, resp *fuse.OpenResponse, intr fs.Intr) (fs.Handle, fuse.Error) {
1160
- f.Opens.Open(req, resp, intr)
1192
+func (f *open) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fs.Handle, error) {
1193
+ f.Opens.Open(ctx, req, resp)
1194
// pick a really distinct error, to identify it later
1195
return nil, fuse.Errno(syscall.ENAMETOOLONG)
1196
@@ -1265,8 +1298,8 @@ type getxattr struct {
1298
record.Getxattrs
1299
}
1300
1268
-func (f *getxattr) Getxattr(req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse, intr fs.Intr) fuse.Error {
1269
- f.Getxattrs.Getxattr(req, resp, intr)
1301
+func (f *getxattr) Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error {
1302
+ f.Getxattrs.Getxattr(ctx, req, resp)
1303
resp.Xattr = []byte("hello, world")
1304
return nil
1305
}
@@ -1302,7 +1335,7 @@ type getxattrTooSmall struct {
1335
fstestutil.File
1336
}
1337
1305
-func (f *getxattrTooSmall) Getxattr(req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse, intr fs.Intr) fuse.Error {
1338
+func (f *getxattrTooSmall) Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error {
1339
resp.Xattr = []byte("hello, world")
1340
return nil
1341
}
@@ -1333,7 +1366,7 @@ type getxattrSize struct {
1366
fstestutil.File
1367
}
1368
1336
-func (f *getxattrSize) Getxattr(req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse, intr fs.Intr) fuse.Error {
1369
+func (f *getxattrSize) Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error {
1370
resp.Xattr = []byte("hello, world")
1371
return nil
1372
}
@@ -1364,8 +1397,8 @@ type listxattr struct {
1397
record.Listxattrs
1398
}
1399
1367
-func (f *listxattr) Listxattr(req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse, intr fs.Intr) fuse.Error {
1368
- f.Listxattrs.Listxattr(req, resp, intr)
1400
+func (f *listxattr) Listxattr(ctx context.Context, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error {
1401
+ f.Listxattrs.Listxattr(ctx, req, resp)
1402
resp.Append("one", "two")
1403
return nil
1404
}
@@ -1404,7 +1437,7 @@ type listxattrTooSmall struct {
1437
fstestutil.File
1438
}
1439
1407
-func (f *listxattrTooSmall) Listxattr(req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse, intr fs.Intr) fuse.Error {
1440
+func (f *listxattrTooSmall) Listxattr(ctx context.Context, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error {
1441
resp.Xattr = []byte("one\x00two\x00")
1442
return nil
1443
}
@@ -1435,7 +1468,7 @@ type listxattrSize struct {
1468
fstestutil.File
1469
}
1470
1438
-func (f *listxattrSize) Listxattr(req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse, intr fs.Intr) fuse.Error {
1471
+func (f *listxattrSize) Listxattr(ctx context.Context, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error {
1472
resp.Xattr = []byte("one\x00two\x00")
1473
return nil
1474
}
@@ -1551,7 +1584,7 @@ type defaultErrno struct {
1584
fstestutil.Dir
1585
}
1586
1554
-func (f defaultErrno) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
1587
+func (f defaultErrno) Lookup(ctx context.Context, name string) (fs.Node, error) {
1588
return nil, errors.New("bork")
1589
}
1590
@@ -1595,7 +1628,7 @@ func (myCustomError) Error() string {
1628
return "bork"
1629
}
1630
1598
-func (f customErrNode) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
1631
+func (f customErrNode) Lookup(ctx context.Context, name string) (fs.Node, error) {
1632
return nil, myCustomError{
1633
ErrorNumber: fuse.Errno(syscall.ENAMETOOLONG),
1634
}
@@ -1638,12 +1671,12 @@ func (f *inMemoryFile) Attr() fuse.Attr {
1671
}
1672
}
1673
1641
-func (f *inMemoryFile) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fs.Intr) fuse.Error {
1674
+func (f *inMemoryFile) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
1675
fuseutil.HandleRead(req, resp, f.data)
1676
return nil
1677
}
1678
1646
-func (f *inMemoryFile) Write(req *fuse.WriteRequest, resp *fuse.WriteResponse, intr fs.Intr) fuse.Error {
1679
+func (f *inMemoryFile) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error {
1680
resp.Size = copy(f.data[req.Offset:], req.Data)
1681
return nil
1682
}
@@ -1744,13 +1777,13 @@ type directRead struct {
1777
1778
// explicitly not defining Attr and setting Size
1779
1747
-func (f directRead) Open(req *fuse.OpenRequest, resp *fuse.OpenResponse, intr fs.Intr) (fs.Handle, fuse.Error) {
1780
+func (f directRead) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fs.Handle, error) {
1781
// do not allow the kernel to use page cache
1782
resp.Flags |= fuse.OpenDirectIO
1783
return f, nil
1784
}
1785
1753
-func (directRead) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fs.Intr) fuse.Error {
1786
+func (directRead) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
1787
fuseutil.HandleRead(req, resp, []byte(hi))
1788
return nil
1789
}
Godeps/_workspace/src/bazil.org/fuse/fs/tree.go
+5
-3
@@ -6,6 +6,8 @@ import (
6
"os"
7
pathpkg "path"
8
"strings"
9
+
10
+ "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
11
)
12
13
import (
@@ -18,7 +20,7 @@ type Tree struct {
20
tree
21
}
22
21
-func (t *Tree) Root() (Node, fuse.Error) {
23
+func (t *Tree) Root() (Node, error) {
24
return &t.tree, nil
25
}
26
@@ -79,7 +81,7 @@ func (t *tree) Attr() fuse.Attr {
81
return fuse.Attr{Mode: os.ModeDir | 0555}
82
}
83
82
-func (t *tree) Lookup(name string, intr Intr) (Node, fuse.Error) {
84
+func (t *tree) Lookup(ctx context.Context, name string) (Node, error) {
85
n := t.lookup(name)
86
if n != nil {
87
return n, nil
@@ -87,7 +89,7 @@ func (t *tree) Lookup(name string, intr Intr) (Node, fuse.Error) {
89
return nil, fuse.ENOENT
90
}
91
90
-func (t *tree) ReadDir(intr Intr) ([]fuse.Dirent, fuse.Error) {
92
+func (t *tree) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
93
var out []fuse.Dirent
94
for _, d := range t.dir {
95
out = append(out, fuse.Dirent{Name: d.name})
Godeps/_workspace/src/bazil.org/fuse/fuse.go
+21
-23
@@ -45,7 +45,7 @@
45
// The required and optional methods for the FS, Node, and Handle interfaces
46
// have the general form
47
//
48
-// Op(req *OpRequest, resp *OpResponse, intr Intr) Error
48
+// Op(ctx context.Context, req *OpRequest, resp *OpResponse) Error
49
//
50
// where Op is the name of a FUSE operation. Op reads request parameters
51
// from req and writes results to resp. An operation whose only result is
@@ -53,18 +53,29 @@
53
// service methods simultaneously; the methods being called are responsible
54
// for appropriate synchronization.
55
//
56
+// Errors
57
+//
58
+// Operations can return errors. The FUSE interface can only
59
+// communicate POSIX errno error numbers to file system clients, the
60
+// message is not visible to file system clients. The returned error
61
+// can implement ErrorNumber to control the errno returned. Without
62
+// ErrorNumber, a generic errno (EIO) is returned.
63
+//
64
+// Errors messages will be visible in the debug log as part of the
65
+// response.
66
+//
67
// Interrupted Operations
68
//
69
// In some file systems, some operations
70
// may take an undetermined amount of time. For example, a Read waiting for
71
// a network message or a matching Write might wait indefinitely. If the request
61
-// is cancelled and no longer needed, the package will close intr, a chan struct{}.
62
-// Blocking operations should select on a receive from intr and attempt to
72
+// is cancelled and no longer needed, the context will be cancelled.
73
+// Blocking operations should select on a receive from ctx.Done() and attempt to
74
// abort the operation early if the receive succeeds (meaning the channel is closed).
75
// To indicate that the operation failed because it was aborted, return fuse.EINTR.
76
//
66
-// If an operation does not block for an indefinite amount of time, the intr parameter
67
-// can be ignored.
77
+// If an operation does not block for an indefinite amount of time, supporting
78
+// cancellation is not necessary.
79
//
80
// Authentication
81
//
@@ -151,7 +162,7 @@ type Request interface {
162
Hdr() *Header
163
164
// RespondError responds to the request with the given error.
154
- RespondError(Error)
165
+ RespondError(error)
166
167
String() string
168
}
@@ -206,18 +217,6 @@ func (h *Header) respondData(out *outHeader, n uintptr, data []byte) {
217
putMessage(h.msg)
218
}
219
209
-// An Error is a FUSE error.
210
-//
211
-// Errors messages will be visible in the debug log as part of the
212
-// response.
213
-//
214
-// The FUSE interface can only communicate POSIX errno error numbers
215
-// to file system clients, the message is not visible to file system
216
-// clients. The returned error can implement ErrorNumber to control
217
-// the errno returned. Without ErrorNumber, a generic errno (EIO) is
218
-// returned.
219
-type Error error
220
-
220
// An ErrorNumber is an error with a specific error number.
221
//
222
// Operations may return an error value that implements ErrorNumber to
@@ -267,7 +266,6 @@ var errnoNames = map[Errno]string{
266
type Errno syscall.Errno
267
268
var _ = ErrorNumber(Errno(0))
270
-var _ = Error(Errno(0))
269
var _ = error(Errno(0))
270
271
func (e Errno) Errno() Errno {
@@ -297,7 +295,7 @@ func (e Errno) MarshalText() ([]byte, error) {
295
return []byte(s), nil
296
}
297
300
-func (h *Header) RespondError(err Error) {
298
+func (h *Header) RespondError(err error) {
299
errno := DefaultErrno
300
if ferr, ok := err.(ErrorNumber); ok {
301
errno = ferr.Errno()
@@ -1197,7 +1195,7 @@ func (r *GetxattrRequest) Respond(resp *GetxattrResponse) {
1195
}
1196
}
1197
1200
-func (r *GetxattrRequest) RespondError(err Error) {
1198
+func (r *GetxattrRequest) RespondError(err error) {
1199
err = translateGetxattrError(err)
1200
r.Header.RespondError(err)
1201
}
@@ -1273,7 +1271,7 @@ func (r *RemovexattrRequest) Respond() {
1271
r.respond(out, unsafe.Sizeof(*out))
1272
}
1273
1276
-func (r *RemovexattrRequest) RespondError(err Error) {
1274
+func (r *RemovexattrRequest) RespondError(err error) {
1275
err = translateGetxattrError(err)
1276
r.Header.RespondError(err)
1277
}
@@ -1323,7 +1321,7 @@ func (r *SetxattrRequest) Respond() {
1321
r.respond(out, unsafe.Sizeof(*out))
1322
}
1323
1326
-func (r *SetxattrRequest) RespondError(err Error) {
1324
+func (r *SetxattrRequest) RespondError(err error) {
1325
err = translateGetxattrError(err)
1326
r.Header.RespondError(err)
1327
}
Godeps/_workspace/src/bazil.org/fuse/hellofs/hello.go
+5
-4
@@ -10,6 +10,7 @@ import (
10
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse"
11
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/fs"
12
_ "github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/fs/fstestutil"
13
+ "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
14
)
15
16
var Usage = func() {
@@ -55,7 +56,7 @@ func main() {
56
// FS implements the hello world file system.
57
type FS struct{}
58
58
-func (FS) Root() (fs.Node, fuse.Error) {
59
+func (FS) Root() (fs.Node, error) {
60
return Dir{}, nil
61
}
62
@@ -66,7 +67,7 @@ func (Dir) Attr() fuse.Attr {
67
return fuse.Attr{Inode: 1, Mode: os.ModeDir | 0555}
68
}
69
69
-func (Dir) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
70
+func (Dir) Lookup(ctx context.Context, name string) (fs.Node, error) {
71
if name == "hello" {
72
return File{}, nil
73
}
@@ -77,7 +78,7 @@ var dirDirs = []fuse.Dirent{
78
{Inode: 2, Name: "hello", Type: fuse.DT_File},
79
}
80
80
-func (Dir) ReadDir(intr fs.Intr) ([]fuse.Dirent, fuse.Error) {
81
+func (Dir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
82
return dirDirs, nil
83
}
84
@@ -90,6 +91,6 @@ func (File) Attr() fuse.Attr {
91
return fuse.Attr{Inode: 2, Mode: 0444, Size: uint64(len(greeting))}
92
}
93
93
-func (File) ReadAll(intr fs.Intr) ([]byte, fuse.Error) {
94
+func (File) ReadAll(ctx context.Context) ([]byte, error) {
95
return []byte(greeting), nil
96
}
Godeps/_workspace/src/bazil.org/fuse/hellofs/hellofs
Binary files a/Godeps/_workspace/src/bazil.org/fuse/hellofs/hellofs and /dev/null differ
fuse/ipns/ipns_unix.go
+15
-28
@@ -145,7 +145,7 @@ func CreateRoot(n *core.IpfsNode, keys []ci.PrivKey, ipfsroot string) (*Root, er
145
}
146
147
// Root constructs the Root of the filesystem, a Root object.
148
-func (f FileSystem) Root() (fs.Node, fuse.Error) {
148
+func (f FileSystem) Root() (fs.Node, error) {
149
return f.RootNode, nil
150
}
151
@@ -167,7 +167,7 @@ func (*Root) Attr() fuse.Attr {
167
}
168
169
// Lookup performs a lookup under this node.
170
-func (s *Root) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
170
+func (s *Root) Lookup(name string, ctx context.Context) (fs.Node, error) {
171
switch name {
172
case "mach_kernel", ".hidden", "._.":
173
// Just quiet some log noise on OS X.
@@ -196,7 +196,7 @@ func (s *Root) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
196
}
197
198
// ReadDir reads a particular directory. Disallowed for root.
199
-func (r *Root) ReadDir(intr fs.Intr) ([]fuse.Dirent, fuse.Error) {
199
+func (r *Root) ReadDir(ctx context.Context) ([]fuse.Dirent, error) {
200
listing := []fuse.Dirent{
201
fuse.Dirent{
202
Name: "local",
@@ -285,7 +285,7 @@ func (s *Node) Attr() fuse.Attr {
285
}
286
287
// Lookup performs a lookup under this node.
288
-func (s *Node) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
288
+func (s *Node) Lookup(name string, ctx context.Context) (fs.Node, error) {
289
nodes, err := s.Ipfs.Resolver.ResolveLinks(s.Nd, []string{name})
290
if err != nil {
291
// todo: make this error more versatile.
@@ -315,7 +315,7 @@ func (n *Node) makeChild(name string, node *mdag.Node) *Node {
315
}
316
317
// ReadDir reads the link structure as directory entries
318
-func (s *Node) ReadDir(intr fs.Intr) ([]fuse.Dirent, fuse.Error) {
318
+func (s *Node) ReadDir(ctx context.Context) ([]fuse.Dirent, error) {
319
entries := make([]fuse.Dirent, len(s.Nd.Links))
320
for i, link := range s.Nd.Links {
321
n := link.Name
@@ -331,20 +331,7 @@ func (s *Node) ReadDir(intr fs.Intr) ([]fuse.Dirent, fuse.Error) {
331
return nil, fuse.ENOENT
332
}
333
334
-func (s *Node) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fs.Intr) fuse.Error {
335
- // intr will be closed by fuse if the request is cancelled. turn this into a context.
336
- ctx, cancel := context.WithCancel(context.TODO())
337
- defer cancel() // make sure all operations we started close.
338
-
339
- // we wait on intr and cancel our context if it closes.
340
- go func() {
341
- select {
342
- case <-intr: // closed by fuse
343
- cancel() // cancel our context
344
- case <-ctx.Done():
345
- }
346
- }()
347
-
334
+func (s *Node) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, ctx context.Context) error {
335
k, err := s.Nd.Key()
336
if err != nil {
337
return err
@@ -373,7 +360,7 @@ func (s *Node) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fs.Intr
360
return err // may be non-nil / not succeeded
361
}
362
376
-func (n *Node) Write(req *fuse.WriteRequest, resp *fuse.WriteResponse, intr fs.Intr) fuse.Error {
363
+func (n *Node) Write(req *fuse.WriteRequest, resp *fuse.WriteResponse, ctx context.Context) error {
364
// log.Debugf("ipns: Node Write [%s]: flags = %s, offset = %d, size = %d", n.name, req.Flags.String(), req.Offset, len(req.Data))
365
if IpnsReadonly {
366
log.Debug("Attempted to write on readonly ipns filesystem.")
@@ -396,7 +383,7 @@ func (n *Node) Write(req *fuse.WriteRequest, resp *fuse.WriteResponse, intr fs.I
383
return nil
384
}
385
399
-func (n *Node) Flush(req *fuse.FlushRequest, intr fs.Intr) fuse.Error {
386
+func (n *Node) Flush(req *fuse.FlushRequest, ctx context.Context) error {
387
if IpnsReadonly {
388
return nil
389
}
@@ -483,11 +470,11 @@ func (n *Node) republishRoot() error {
470
return nil
471
}
472
486
-func (n *Node) Fsync(req *fuse.FsyncRequest, intr fs.Intr) fuse.Error {
473
+func (n *Node) Fsync(req *fuse.FsyncRequest, ctx context.Context) error {
474
return nil
475
}
476
490
-func (n *Node) Mkdir(req *fuse.MkdirRequest, intr fs.Intr) (fs.Node, fuse.Error) {
477
+func (n *Node) Mkdir(req *fuse.MkdirRequest, ctx context.Context) (fs.Node, error) {
478
if IpnsReadonly {
479
return nil, fuse.EPERM
480
}
@@ -521,7 +508,7 @@ func (n *Node) Mkdir(req *fuse.MkdirRequest, intr fs.Intr) (fs.Node, fuse.Error)
508
return child, nil
509
}
510
524
-func (n *Node) Open(req *fuse.OpenRequest, resp *fuse.OpenResponse, intr fs.Intr) (fs.Handle, fuse.Error) {
511
+func (n *Node) Open(req *fuse.OpenRequest, resp *fuse.OpenResponse, ctx context.Context) (fs.Handle, error) {
512
//log.Debug("[%s] Received open request! flags = %s", n.name, req.Flags.String())
513
//TODO: check open flags and truncate if necessary
514
if req.Flags&fuse.OpenTruncate != 0 {
@@ -534,11 +521,11 @@ func (n *Node) Open(req *fuse.OpenRequest, resp *fuse.OpenResponse, intr fs.Intr
521
return n, nil
522
}
523
537
-func (n *Node) Mknod(req *fuse.MknodRequest, intr fs.Intr) (fs.Node, fuse.Error) {
524
+func (n *Node) Mknod(req *fuse.MknodRequest, ctx context.Context) (fs.Node, error) {
525
return nil, nil
526
}
527
541
-func (n *Node) Create(req *fuse.CreateRequest, resp *fuse.CreateResponse, intr fs.Intr) (fs.Node, fs.Handle, fuse.Error) {
528
+func (n *Node) Create(req *fuse.CreateRequest, resp *fuse.CreateResponse, ctx context.Context) (fs.Node, fs.Handle, error) {
529
if IpnsReadonly {
530
log.Debug("Attempted to call Create on a readonly filesystem.")
531
return nil, nil, fuse.EPERM
@@ -568,7 +555,7 @@ func (n *Node) Create(req *fuse.CreateRequest, resp *fuse.CreateResponse, intr f
555
return child, child, nil
556
}
557
571
-func (n *Node) Remove(req *fuse.RemoveRequest, intr fs.Intr) fuse.Error {
558
+func (n *Node) Remove(req *fuse.RemoveRequest, ctx context.Context) error {
559
if IpnsReadonly {
560
return fuse.EPERM
561
}
@@ -591,7 +578,7 @@ func (n *Node) Remove(req *fuse.RemoveRequest, intr fs.Intr) fuse.Error {
578
return nil
579
}
580
594
-func (n *Node) Rename(req *fuse.RenameRequest, newDir fs.Node, intr fs.Intr) fuse.Error {
581
+func (n *Node) Rename(req *fuse.RenameRequest, newDir fs.Node, ctx context.Context) error {
582
if IpnsReadonly {
583
log.Debug("Attempted to call Rename on a readonly filesystem.")
584
return fuse.EPERM
fuse/ipns/link_unix.go
+2
-2
@@ -4,7 +4,7 @@ import (
4
"os"
5
6
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse"
7
- "github.com/jbenet/go-ipfs/Godeps/_workspace/src/bazil.org/fuse/fs"
7
+ "github.com/jbenet/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
8
)
9
10
type Link struct {
@@ -18,7 +18,7 @@ func (l *Link) Attr() fuse.Attr {
18
}
19
}
20
21
-func (l *Link) Readlink(req *fuse.ReadlinkRequest, intr fs.Intr) (string, fuse.Error) {
21
+func (l *Link) Readlink(req *fuse.ReadlinkRequest, ctx context.Context) (string, error) {
22
log.Debugf("ReadLink: %s", l.Target)
23
return l.Target, nil
24
}
fuse/readonly/readonly_unix.go
+6
-18
@@ -35,7 +35,7 @@ func NewFileSystem(ipfs *core.IpfsNode) *FileSystem {
35
}
36
37
// Root constructs the Root of the filesystem, a Root object.
38
-func (f FileSystem) Root() (fs.Node, fuse.Error) {
38
+func (f FileSystem) Root() (fs.Node, error) {
39
return &Root{Ipfs: f.Ipfs}, nil
40
}
41
@@ -50,7 +50,7 @@ func (*Root) Attr() fuse.Attr {
50
}
51
52
// Lookup performs a lookup under this node.
53
-func (s *Root) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
53
+func (s *Root) Lookup(name string, ctx context.Context) (fs.Node, error) {
54
log.Debugf("Root Lookup: '%s'", name)
55
switch name {
56
case "mach_kernel", ".hidden", "._.":
@@ -68,7 +68,7 @@ func (s *Root) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
68
}
69
70
// ReadDir reads a particular directory. Disallowed for root.
71
-func (*Root) ReadDir(intr fs.Intr) ([]fuse.Dirent, fuse.Error) {
71
+func (*Root) ReadDir(ctx context.Context) ([]fuse.Dirent, error) {
72
log.Debug("Read Root.")
73
return nil, fuse.EPERM
74
}
@@ -116,7 +116,7 @@ func (s *Node) Attr() fuse.Attr {
116
}
117
118
// Lookup performs a lookup under this node.
119
-func (s *Node) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
119
+func (s *Node) Lookup(name string, ctx context.Context) (fs.Node, error) {
120
log.Debugf("Lookup '%s'", name)
121
nodes, err := s.Ipfs.Resolver.ResolveLinks(s.Nd, []string{name})
122
if err != nil {
@@ -128,7 +128,7 @@ func (s *Node) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) {
128
}
129
130
// ReadDir reads the link structure as directory entries
131
-func (s *Node) ReadDir(intr fs.Intr) ([]fuse.Dirent, fuse.Error) {
131
+func (s *Node) ReadDir(ctx context.Context) ([]fuse.Dirent, error) {
132
log.Debug("Node ReadDir")
133
entries := make([]fuse.Dirent, len(s.Nd.Links))
134
for i, link := range s.Nd.Links {
@@ -145,19 +145,7 @@ func (s *Node) ReadDir(intr fs.Intr) ([]fuse.Dirent, fuse.Error) {
145
return nil, fuse.ENOENT
146
}
147
148
-func (s *Node) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fs.Intr) fuse.Error {
149
- // intr will be closed by fuse if the request is cancelled. turn this into a context.
150
- ctx, cancel := context.WithCancel(context.TODO())
151
- defer cancel() // make sure all operations we started close.
152
-
153
- // we wait on intr and cancel our context if it closes.
154
- go func() {
155
- select {
156
- case <-intr: // closed by fuse
157
- cancel() // cancel our context
158
- case <-ctx.Done():
159
- }
160
- }()
148
+func (s *Node) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, ctx context.Context) error {
149
150
k, err := s.Nd.Key()
151
if err != nil {