diff options
| author | Jakob Unterwurzacher | 2025-05-06 09:11:49 +0200 | 
|---|---|---|
| committer | Jakob Unterwurzacher | 2025-05-06 09:11:49 +0200 | 
| commit | 9b6e47fc0a2ed65d462424152a13f995a8d7dd9a (patch) | |
| tree | dd3cdf0f52008f79f075df66a5f282de3b53c128 /internal/inomap | |
| parent | e59f97806b12d593b972bbd17988f061fcc09043 (diff) | |
Switch to the new atomic Uint64.Add api
The new api guarantees that the value is aligned, preventing
stuff like this on 32 bit platforms:
	goroutine 26 [running]:
	internal/runtime/atomic.panicUnaligned()
		/usr/lib/go-1.24/src/internal/runtime/atomic/unaligned.go:8 +0x24
	internal/runtime/atomic.Xadd64(0x2496c74, 0x1)
		/usr/lib/go-1.24/src/internal/runtime/atomic/atomic_arm.s:318 +0x14
	github.com/rfjakob/gocryptfs/internal/inomap.(*InoMap).NextSpillIno(0x2496c60)
Fixes https://github.com/rfjakob/gocryptfs/issues/912
Diffstat (limited to 'internal/inomap')
| -rw-r--r-- | internal/inomap/inomap.go | 11 | 
1 files changed, 6 insertions, 5 deletions
diff --git a/internal/inomap/inomap.go b/internal/inomap/inomap.go index b4dbf27..5749202 100644 --- a/internal/inomap/inomap.go +++ b/internal/inomap/inomap.go @@ -45,7 +45,7 @@ type InoMap struct {  	// spill is used once the namespaces map is full  	spillMap map[QIno]uint64  	// spillNext is the next free inode number in the spill map -	spillNext uint64 +	spillNext atomic.Uint64  }  // New returns a new InoMap. @@ -57,8 +57,9 @@ func New(rootDev uint64) *InoMap {  		namespaceMap:  make(map[namespaceData]uint16),  		namespaceNext: 0,  		spillMap:      make(map[QIno]uint64), -		spillNext:     spillSpaceStart,  	} +	m.spillNext.Store(spillSpaceStart) +  	if rootDev > 0 {  		// Reserve namespace 0 for rootDev  		m.namespaceMap[namespaceData{rootDev, 0}] = 0 @@ -74,10 +75,10 @@ var spillWarn sync.Once  // Reverse mode NextSpillIno() for gocryptfs.longname.*.name files where a stable  // mapping is not needed.  func (m *InoMap) NextSpillIno() (out uint64) { -	if m.spillNext == math.MaxUint64 { -		log.Panicf("spillMap overflow: spillNext = 0x%x", m.spillNext) +	if m.spillNext.Load() == math.MaxUint64 { +		log.Panicf("spillMap overflow: spillNext = 0x%x", m.spillNext.Load())  	} -	return atomic.AddUint64(&m.spillNext, 1) - 1 +	return m.spillNext.Add(1) - 1  }  func (m *InoMap) spill(in QIno) (out uint64) {  | 
