summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/sentry')
-rw-r--r--pkg/sentry/fs/inotify.go13
1 files changed, 9 insertions, 4 deletions
diff --git a/pkg/sentry/fs/inotify.go b/pkg/sentry/fs/inotify.go
index f251df0d1..51ece5ed0 100644
--- a/pkg/sentry/fs/inotify.go
+++ b/pkg/sentry/fs/inotify.go
@@ -42,14 +42,14 @@ type Inotify struct {
// user, since we may aggressively reuse an id on S/R.
id uint64
- // evMu *only* protects the event queue. We need a separate lock because
+ waiter.Queue `state:"nosave"`
+
+ // evMu *only* protects the events list. We need a separate lock because
// while queuing events, a watch needs to lock the event queue, and using mu
// for that would violate lock ordering since at that point the calling
// goroutine already holds Watch.target.Watches.mu.
evMu sync.Mutex `state:"nosave"`
- waiter.Queue `state:"nosave"`
-
// A list of pending events for this inotify instance. Protected by evMu.
events ilist.List
@@ -212,7 +212,6 @@ func (i *Inotify) Ioctl(ctx context.Context, io usermem.IO, args arch.SyscallArg
func (i *Inotify) queueEvent(ev *Event) {
i.evMu.Lock()
- defer i.evMu.Unlock()
// Check if we should coalesce the event we're about to queue with the last
// one currently in the queue. Events are coalesced if they are identical.
@@ -221,11 +220,17 @@ func (i *Inotify) queueEvent(ev *Event) {
// "Coalesce" the two events by simply not queuing the new one. We
// don't need to raise a waiter.EventIn notification because no new
// data is available for reading.
+ i.evMu.Unlock()
return
}
}
i.events.PushBack(ev)
+
+ // Release mutex before notifying waiters because we don't control what they
+ // can do.
+ i.evMu.Unlock()
+
i.Queue.Notify(waiter.EventIn)
}