fix locking
Jeromy committed
Mar 14, 2015 at 21:45 UTC
0718bd73a72cc49a70d8eea19e5c9d99f1e8135f
1 file changed
+15
-16
ipnsfs/dir.go
+15
-16
@@ -70,7 +70,6 @@ func (d *Directory) Open(tpath []string, mode int) (*File, error) {
70
return dir.Open(tpath[1:], mode)
71
}
72
73
-// consider combining into a single method...
73
type childCloser interface {
74
closeChild(string, *dag.Node) error
75
}
@@ -82,18 +81,16 @@ func (d *Directory) closeChild(name string, nd *dag.Node) error {
81
}
82
83
d.lock.Lock()
84
+ defer d.lock.Unlock()
85
err = d.node.RemoveNodeLink(name)
86
if err != nil && err != dag.ErrNotFound {
87
- d.lock.Unlock()
87
return err
88
}
89
90
err = d.node.AddNodeLinkClean(name, nd)
91
if err != nil {
93
- d.lock.Unlock()
92
return err
93
}
96
- d.lock.Unlock()
94
95
return d.parent.closeChild(d.name, d.node)
96
}
@@ -179,6 +176,10 @@ func (d *Directory) childDir(name string) (*Directory, error) {
176
func (d *Directory) Child(name string) (FSNode, error) {
177
d.lock.Lock()
178
defer d.lock.Unlock()
179
+ return d.childUnsync(name)
180
+}
181
+
182
+func (d *Directory) childUnsync(name string) (FSNode, error) {
183
dir, err := d.childDir(name)
184
if err == nil {
185
return dir, nil
@@ -204,54 +205,50 @@ func (d *Directory) List() []string {
205
206
func (d *Directory) Mkdir(name string) (*Directory, error) {
207
d.lock.Lock()
208
+ defer d.lock.Unlock()
209
210
_, err := d.childDir(name)
211
if err == nil {
210
- d.lock.Unlock()
211
- return nil, errors.New("directory by that name already exists")
212
+ return nil, os.ErrExist
213
}
214
_, err = d.childFile(name)
215
if err == nil {
215
- d.lock.Unlock()
216
- return nil, errors.New("file by that name already exists")
216
+ return nil, os.ErrExist
217
}
218
219
ndir := &dag.Node{Data: ft.FolderPBData()}
220
err = d.node.AddNodeLinkClean(name, ndir)
221
if err != nil {
222
- d.lock.Unlock()
222
return nil, err
223
}
225
- d.lock.Unlock()
224
225
err = d.parent.closeChild(d.name, d.node)
226
if err != nil {
227
return nil, err
228
}
229
232
- d.lock.Lock()
233
- defer d.lock.Unlock()
234
-
230
return d.childDir(name)
231
}
232
233
func (d *Directory) Unlink(name string) error {
234
d.lock.Lock()
235
+ defer d.lock.Unlock()
236
+
237
delete(d.childDirs, name)
238
delete(d.files, name)
239
240
err := d.node.RemoveNodeLink(name)
241
if err != nil {
245
- d.lock.Unlock()
242
return err
243
}
248
- d.lock.Unlock()
244
245
return d.parent.closeChild(d.name, d.node)
246
}
247
248
// RenameEntry renames the child by 'oldname' of this directory to 'newname'
249
func (d *Directory) RenameEntry(oldname, newname string) error {
250
+ d.Lock()
251
+ defer d.Unlock()
252
// Is the child a directory?
253
dir, err := d.childDir(oldname)
254
if err == nil {
@@ -300,12 +297,14 @@ func (d *Directory) RenameEntry(oldname, newname string) error {
297
298
// AddChild adds the node 'nd' under this directory giving it the name 'name'
299
func (d *Directory) AddChild(name string, nd *dag.Node) error {
300
+ d.Lock()
301
+ defer d.Unlock()
302
pbn, err := ft.FromBytes(nd.Data)
303
if err != nil {
304
return err
305
}
306
308
- _, err = d.Child(name)
307
+ _, err = d.childUnsync(name)
308
if err == nil {
309
return errors.New("directory already has entry by that name")
310
}