@cryptotaxi247 / kubo / commits / faef01a17

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 {