github.com/MerlinKodo/gvisor@v0.0.0-20231110090155-957f62ecf90e/pkg/sentry/vfs/mount_ring.go (about) 1 package vfs 2 3 // Entry is an element in the circular linked list. 4 // 5 // +stateify savable 6 type mountEntry struct { 7 next *mountEntry 8 prev *mountEntry 9 container *Mount 10 } 11 12 // Init instantiates an Element to be an item in a ring (circularly-linked 13 // list). 14 // 15 //go:nosplit 16 func (e *mountEntry) Init(container *Mount) { 17 e.next = e 18 e.prev = e 19 e.container = container 20 } 21 22 // Add adds new to old's ring. 23 // 24 //go:nosplit 25 func (e *mountEntry) Add(new *mountEntry) { 26 next := e.next 27 prev := e 28 29 next.prev = new 30 new.next = next 31 new.prev = prev 32 e.next = new 33 } 34 35 // Remove removes e from its ring and reinitializes it. 36 // 37 //go:nosplit 38 func (e *mountEntry) Remove() { 39 next := e.next 40 prev := e.prev 41 42 next.prev = prev 43 prev.next = next 44 e.Init(e.container) 45 } 46 47 // Empty returns true if there are no other elements in the ring. 48 // 49 //go:nosplit 50 func (e *mountEntry) Empty() bool { 51 return e.next == e 52 } 53 54 // Next returns the next containing object pointed to by the list. 55 // 56 //go:nosplit 57 func (e *mountEntry) Next() *Mount { 58 return e.next.container 59 } 60 61 // Prev returns the previous containing object pointed to by the list. 62 // 63 //go:nosplit 64 func (e *mountEntry) Prev() *Mount { 65 return e.prev.container 66 }