aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Unterwurzacher2020-05-03 20:21:11 +0200
committerJakob Unterwurzacher2020-05-03 20:21:11 +0200
commit8c9c68fb724150654721bd665cc9233c641a0ea5 (patch)
treef4e032bf93d7f2e2014d6b03c9b51ebb9ca65ca7
parent91f5c242a8f4527f3266c09d7f18ff997593bafa (diff)
inomap: fix spillBit not set on 2nd hit
Also add a test for this. Thanks @slackner for the comment.
-rw-r--r--internal/inomap/inomap.go6
-rw-r--r--internal/inomap/inomap_test.go17
2 files changed, 21 insertions, 2 deletions
diff --git a/internal/inomap/inomap.go b/internal/inomap/inomap.go
index d3177ae..fb6faf6 100644
--- a/internal/inomap/inomap.go
+++ b/internal/inomap/inomap.go
@@ -27,6 +27,8 @@ const (
maxPassthruIno = 1<<48 - 1
// max value of 63 bit spill inode number
maxSpillIno = 1<<63 - 1
+ // bit 63 is used as the spill bit
+ spillBit = 1 << 63
)
// InoMap stores the maps using for inode number translation.
@@ -57,7 +59,7 @@ func New() *InoMap {
func (m *InoMap) spill(in QIno) (out uint64) {
out, found := m.spillMap[in]
if found {
- return out
+ return out | spillBit
}
if m.spillNext >= maxSpillIno {
log.Panicf("spillMap overflow: spillNext = 0x%x", m.spillNext)
@@ -65,7 +67,7 @@ func (m *InoMap) spill(in QIno) (out uint64) {
out = m.spillNext
m.spillNext++
m.spillMap[in] = out
- return 1<<63 | out
+ return out | spillBit
}
// Translate maps the passed-in (device, inode) pair to a unique inode number.
diff --git a/internal/inomap/inomap_test.go b/internal/inomap/inomap_test.go
index 78cb405..931547e 100644
--- a/internal/inomap/inomap_test.go
+++ b/internal/inomap/inomap_test.go
@@ -99,6 +99,23 @@ func TestTranslateStress(t *testing.T) {
}
}
+func TestSpill(t *testing.T) {
+ m := New()
+ var q QIno
+ q.Ino = maxPassthruIno + 1
+ out1 := m.Translate(q)
+ if out1|spillBit == 0 {
+ t.Error("spill bit not set")
+ }
+ out2 := m.Translate(q)
+ if out2|spillBit == 0 {
+ t.Error("spill bit not set")
+ }
+ if out1 != out2 {
+ t.Errorf("unstable mapping: %d vs %d", out1, out2)
+ }
+}
+
// TestUniqueness checks that unique (Dev, Flags, Ino) tuples get unique inode
// numbers
func TestUniqueness(t *testing.T) {