@@ -272,9 +272,7 @@ func (parent *Inode) listObjectsSlurp(inode *Inode, startAfter string, lock bool
272
272
}
273
273
resp , err := cloud .ListBlobs (params )
274
274
if err != nil {
275
- parent .fs .mu .Lock ()
276
- parent .fs .completeInflightListingUnlocked (myList )
277
- parent .fs .mu .Unlock ()
275
+ parent .fs .completeInflightListing (myList )
278
276
s3Log .Errorf ("ListObjects %v = %v" , params , err )
279
277
return
280
278
}
@@ -283,8 +281,7 @@ func (parent *Inode) listObjectsSlurp(inode *Inode, startAfter string, lock bool
283
281
if lock {
284
282
parent .mu .Lock ()
285
283
}
286
- parent .fs .mu .Lock ()
287
- skipListing := parent .fs .completeInflightListingUnlocked (myList )
284
+ skipListing := parent .fs .completeInflightListing (myList )
288
285
dirs := make (map [* Inode ]bool )
289
286
for _ , obj := range resp .Items {
290
287
if skipListing != nil && skipListing [* obj .Key ] {
@@ -295,7 +292,6 @@ func (parent *Inode) listObjectsSlurp(inode *Inode, startAfter string, lock bool
295
292
parent .insertSubTree (baseName , & obj , dirs )
296
293
}
297
294
}
298
- parent .fs .mu .Unlock ()
299
295
if lock {
300
296
parent .mu .Unlock ()
301
297
}
@@ -394,6 +390,7 @@ func listBlobsSafe(cloud StorageBackend, param *ListBlobsInput) (*ListBlobsOutpu
394
390
return res , nil
395
391
}
396
392
393
+ // LOCKS_EXCLUDED(dh.inode.fs)
397
394
func (dh * DirHandle ) handleListResult (resp * ListBlobsOutput , prefix string , skipListing map [string ]bool ) {
398
395
parent := dh .inode
399
396
fs := parent .fs
@@ -484,25 +481,20 @@ func (dh *DirHandle) listObjectsFlat() (err error) {
484
481
ContinuationToken : dh .inode .dir .listMarker ,
485
482
Prefix : & prefix ,
486
483
}
487
- dh .mu .Unlock ()
488
484
485
+ dh .mu .Unlock ()
489
486
resp , err := listBlobsSafe (cloud , params )
490
487
dh .mu .Lock ()
488
+
491
489
if err != nil {
492
- dh .inode .fs .mu .Lock ()
493
- dh .inode .fs .completeInflightListingUnlocked (myList )
494
- dh .inode .fs .mu .Unlock ()
490
+ dh .inode .fs .completeInflightListing (myList )
495
491
return
496
492
}
497
493
498
494
s3Log .Debug (resp )
499
495
500
496
dh .inode .mu .Lock ()
501
- dh .inode .fs .mu .Lock ()
502
-
503
- dh .handleListResult (resp , prefix , dh .inode .fs .completeInflightListingUnlocked (myList ))
504
-
505
- dh .inode .fs .mu .Unlock ()
497
+ dh .handleListResult (resp , prefix , dh .inode .fs .completeInflightListing (myList ))
506
498
dh .inode .mu .Unlock ()
507
499
508
500
if resp .IsTruncated {
@@ -1006,9 +998,6 @@ func (parent *Inode) Create(name string) (inode *Inode, fh *FileHandle) {
1006
998
parent .mu .Lock ()
1007
999
defer parent .mu .Unlock ()
1008
1000
1009
- fs .mu .Lock ()
1010
- defer fs .mu .Unlock ()
1011
-
1012
1001
now := time .Now ()
1013
1002
inode = NewInode (fs , parent , name )
1014
1003
inode .userMetadata = make (map [string ][]byte )
@@ -1041,9 +1030,6 @@ func (parent *Inode) MkDir(
1041
1030
parent .mu .Lock ()
1042
1031
defer parent .mu .Unlock ()
1043
1032
1044
- parent .fs .mu .Lock ()
1045
- defer parent .fs .mu .Unlock ()
1046
-
1047
1033
inode = parent .doMkDir (name )
1048
1034
inode .mu .Unlock ()
1049
1035
parent .fs .WakeupFlusher ()
@@ -1052,7 +1038,7 @@ func (parent *Inode) MkDir(
1052
1038
}
1053
1039
1054
1040
// LOCKS_REQUIRED(parent.mu)
1055
- // LOCKS_REQUIRED( fs.mu)
1041
+ // LOCKS_EXCLUDED(parent. fs.mu)
1056
1042
// Returns locked inode (!)
1057
1043
func (parent * Inode ) doMkDir (name string ) (inode * Inode ) {
1058
1044
if parent .dir .DeletedChildren != nil {
@@ -1078,10 +1064,12 @@ func (parent *Inode) doMkDir(name string) (inode *Inode) {
1078
1064
inode .Id = oldInode .Id
1079
1065
// We leave the older inode in place only for forget() calls
1080
1066
inode .refcnt = oldInode .refcnt
1081
- parent .fs .inodes [oldInode .Id ] = inode
1082
1067
oldInode .mu .Lock ()
1068
+ parent .fs .mu .Lock ()
1069
+ parent .fs .inodes [oldInode .Id ] = inode
1083
1070
oldInode .Id = parent .fs .allocateInodeId ()
1084
1071
parent .fs .inodes [oldInode .Id ] = oldInode
1072
+ parent .fs .mu .Unlock ()
1085
1073
oldInode .userMetadataDirty = 0
1086
1074
oldInode .userMetadata = make (map [string ][]byte )
1087
1075
oldInode .touch ()
@@ -1132,9 +1120,6 @@ func (parent *Inode) CreateSymlink(
1132
1120
parent .mu .Lock ()
1133
1121
defer parent .mu .Unlock ()
1134
1122
1135
- fs .mu .Lock ()
1136
- defer fs .mu .Unlock ()
1137
-
1138
1123
now := time .Now ()
1139
1124
inode = NewInode (fs , parent , name )
1140
1125
inode .userMetadata = make (map [string ][]byte )
@@ -1387,9 +1372,7 @@ func (parent *Inode) Rename(from string, newParent *Inode, to string) (err error
1387
1372
}
1388
1373
1389
1374
func renameRecursive (fromInode * Inode , newParent * Inode , to string ) {
1390
- newParent .fs .mu .Lock ()
1391
1375
toDir := newParent .doMkDir (to )
1392
- newParent .fs .mu .Unlock ()
1393
1376
toDir .userMetadata = fromInode .userMetadata
1394
1377
toDir .ImplicitDir = fromInode .ImplicitDir
1395
1378
// Trick IDs
@@ -1518,9 +1501,8 @@ func sealPastDirs(dirs map[*Inode]bool, d *Inode) {
1518
1501
dirs [d ] = false
1519
1502
}
1520
1503
1521
- // LOCKS_REQUIRED(fs.mu)
1522
1504
// LOCKS_REQUIRED(parent.mu)
1523
- // LOCKS_REQUIRED (parent.fs.mu)
1505
+ // LOCKS_EXCLUDED (parent.fs.mu)
1524
1506
func (parent * Inode ) insertSubTree (path string , obj * BlobItemOutput , dirs map [* Inode ]bool ) {
1525
1507
fs := parent .fs
1526
1508
slash := strings .Index (path , "/" )
@@ -1531,14 +1513,12 @@ func (parent *Inode) insertSubTree(path string, obj *BlobItemOutput, dirs map[*I
1531
1513
_ , deleted := parent .dir .DeletedChildren [path ]
1532
1514
if ! deleted {
1533
1515
inode = NewInode (fs , parent , path )
1516
+ // our locking order is parent before child, inode before fs. try to respect it
1534
1517
fs .insertInode (parent , inode )
1535
1518
inode .SetFromBlobItem (obj )
1536
1519
}
1537
1520
} else {
1538
- // our locking order is parent before child, inode before fs. try to respect it
1539
- fs .mu .Unlock ()
1540
1521
inode .SetFromBlobItem (obj )
1541
- fs .mu .Lock ()
1542
1522
}
1543
1523
sealPastDirs (dirs , parent )
1544
1524
} else {
@@ -1558,12 +1538,10 @@ func (parent *Inode) insertSubTree(path string, obj *BlobItemOutput, dirs map[*I
1558
1538
} else if ! inode .isDir () {
1559
1539
// replace unmodified file item with a directory
1560
1540
if atomic .LoadInt32 (& inode .CacheState ) == ST_CACHED {
1561
- fs .mu .Unlock ()
1562
1541
inode .mu .Lock ()
1563
1542
atomic .StoreInt32 (& inode .refreshed , - 1 )
1564
1543
parent .removeChildUnlocked (inode )
1565
1544
inode .mu .Unlock ()
1566
- fs .mu .Lock ()
1567
1545
// create a directory inode instead
1568
1546
inode = NewInode (fs , parent , dir )
1569
1547
inode .ToDir ()
@@ -1590,13 +1568,9 @@ func (parent *Inode) insertSubTree(path string, obj *BlobItemOutput, dirs map[*I
1590
1568
dirs [inode ] = false
1591
1569
1592
1570
if ! isDirBlob {
1593
- fs .mu .Unlock ()
1594
1571
inode .mu .Lock ()
1595
- fs .mu .Lock ()
1596
1572
inode .insertSubTree (path , obj , dirs )
1597
- fs .mu .Unlock ()
1598
1573
inode .mu .Unlock ()
1599
- fs .mu .Lock ()
1600
1574
}
1601
1575
}
1602
1576
}
@@ -1622,9 +1596,7 @@ func (parent *Inode) LookUp(name string) (*Inode, error) {
1622
1596
myList := parent .fs .addInflightListing ()
1623
1597
blob , err := parent .LookUpInodeMaybeDir (name )
1624
1598
if err != nil {
1625
- parent .fs .mu .Lock ()
1626
- parent .fs .completeInflightListingUnlocked (myList )
1627
- parent .fs .mu .Unlock ()
1599
+ parent .fs .completeInflightListing (myList )
1628
1600
return nil , err
1629
1601
}
1630
1602
dirs := make (map [* Inode ]bool )
@@ -1634,12 +1606,10 @@ func (parent *Inode) LookUp(name string) (*Inode, error) {
1634
1606
prefixLen ++
1635
1607
}
1636
1608
parent .mu .Lock ()
1637
- parent .fs .mu .Lock ()
1638
- skipListing := parent .fs .completeInflightListingUnlocked (myList )
1609
+ skipListing := parent .fs .completeInflightListing (myList )
1639
1610
if skipListing == nil || ! skipListing [* blob .Key ] {
1640
1611
parent .insertSubTree ((* blob .Key )[prefixLen : ], blob , dirs )
1641
1612
}
1642
- parent .fs .mu .Unlock ()
1643
1613
inode := parent .findChildUnlocked (name )
1644
1614
parent .mu .Unlock ()
1645
1615
return inode , nil
0 commit comments