diff options
Diffstat (limited to 'internal/inomap')
-rw-r--r-- | internal/inomap/inomap.go | 13 | ||||
-rw-r--r-- | internal/inomap/inomap_test.go | 17 |
2 files changed, 17 insertions, 13 deletions
diff --git a/internal/inomap/inomap.go b/internal/inomap/inomap.go index 97f9b61..997ea9b 100644 --- a/internal/inomap/inomap.go +++ b/internal/inomap/inomap.go @@ -49,13 +49,22 @@ type InoMap struct { } // New returns a new InoMap. -func New() *InoMap { - return &InoMap{ +// Inode numbers on device `rootDev` will be passed through as-is. +// If `rootDev` is zero, the first Translate() call decides the effective +// rootDev. +func New(rootDev uint64) *InoMap { + m := &InoMap{ namespaceMap: make(map[namespaceData]uint16), namespaceNext: 0, spillMap: make(map[QIno]uint64), spillNext: 0, } + if rootDev > 0 { + // Reserve namespace 0 for rootDev + m.namespaceMap[namespaceData{rootDev, 0}] = 0 + m.namespaceNext = 1 + } + return m } var spillWarn sync.Once diff --git a/internal/inomap/inomap_test.go b/internal/inomap/inomap_test.go index 6fbb4ef..9ec2932 100644 --- a/internal/inomap/inomap_test.go +++ b/internal/inomap/inomap_test.go @@ -6,7 +6,7 @@ import ( ) func TestTranslate(t *testing.T) { - m := New() + m := New(0) q := QIno{Ino: 1} out := m.Translate(q) if out != 1 { @@ -25,12 +25,7 @@ func TestTranslate(t *testing.T) { func TestTranslateStress(t *testing.T) { const baseDev = 12345 - m := New() - - // Make sure baseDev gets namespace id zero - var q QIno - q.Dev = baseDev - m.Translate(q) + m := New(baseDev) var wg sync.WaitGroup wg.Add(4) @@ -100,7 +95,7 @@ func TestTranslateStress(t *testing.T) { } func TestSpill(t *testing.T) { - m := New() + m := New(0) var q QIno q.Ino = maxPassthruIno + 1 out1 := m.Translate(q) @@ -119,7 +114,7 @@ func TestSpill(t *testing.T) { // TestUniqueness checks that unique (Dev, Flags, Ino) tuples get unique inode // numbers func TestUniqueness(t *testing.T) { - m := New() + m := New(0) var q QIno outMap := make(map[uint64]struct{}) for q.Dev = 0; q.Dev < 10; q.Dev++ { @@ -141,7 +136,7 @@ func TestUniqueness(t *testing.T) { } func BenchmarkTranslateSingleDev(b *testing.B) { - m := New() + m := New(0) var q QIno for n := 0; n < b.N; n++ { q.Ino = uint64(n % 1000) @@ -150,7 +145,7 @@ func BenchmarkTranslateSingleDev(b *testing.B) { } func BenchmarkTranslateManyDevs(b *testing.B) { - m := New() + m := New(0) var q QIno for n := 0; n < b.N; n++ { q.Dev = uint64(n % 10) |