diff options
| author | Jakob Unterwurzacher | 2020-05-03 20:21:11 +0200 | 
|---|---|---|
| committer | Jakob Unterwurzacher | 2020-05-03 20:21:11 +0200 | 
| commit | 8c9c68fb724150654721bd665cc9233c641a0ea5 (patch) | |
| tree | f4e032bf93d7f2e2014d6b03c9b51ebb9ca65ca7 /internal/inomap | |
| parent | 91f5c242a8f4527f3266c09d7f18ff997593bafa (diff) | |
inomap: fix spillBit not set on 2nd hit
Also add a test for this.
Thanks @slackner for the comment.
Diffstat (limited to 'internal/inomap')
| -rw-r--r-- | internal/inomap/inomap.go | 6 | ||||
| -rw-r--r-- | internal/inomap/inomap_test.go | 17 | 
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) { | 
