diff options
author | Matthew Heon <matthew.heon@pm.me> | 2019-05-06 13:44:01 -0400 |
---|---|---|
committer | Matthew Heon <matthew.heon@pm.me> | 2019-05-06 14:17:54 -0400 |
commit | faae3a7065980a735ad60ab5f6d9e8421296dbf5 (patch) | |
tree | ca4e9dcdaaf1684fa446b3d4a48f686d1b86333a /libpod/lock/shm_lock_manager_linux.go | |
parent | ff260f07e2be55c7fbda24b8727686fc55c650a6 (diff) | |
download | podman-faae3a7065980a735ad60ab5f6d9e8421296dbf5.tar.gz podman-faae3a7065980a735ad60ab5f6d9e8421296dbf5.tar.bz2 podman-faae3a7065980a735ad60ab5f6d9e8421296dbf5.zip |
When refreshing after a reboot, force lock allocation
After a reboot, when we refresh Podman's state, we retrieved the
lock from the fresh SHM instance, but we did not mark it as
allocated to prevent it being handed out to other containers and
pods.
Provide a method for marking locks as in-use, and use it when we
refresh Podman state after a reboot.
Fixes #2900
Signed-off-by: Matthew Heon <matthew.heon@pm.me>
Diffstat (limited to 'libpod/lock/shm_lock_manager_linux.go')
-rw-r--r-- | libpod/lock/shm_lock_manager_linux.go | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/libpod/lock/shm_lock_manager_linux.go b/libpod/lock/shm_lock_manager_linux.go index 8678958ee..5f31939f8 100644 --- a/libpod/lock/shm_lock_manager_linux.go +++ b/libpod/lock/shm_lock_manager_linux.go @@ -57,6 +57,25 @@ func (m *SHMLockManager) AllocateLock() (Locker, error) { return lock, nil } +// AllocateAndRetrieveLock allocates the lock with the given ID and returns it. +// If the lock is already allocated, error. +func (m *SHMLockManager) AllocateAndRetrieveLock(id uint32) (Locker, error) { + lock := new(SHMLock) + lock.lockID = id + lock.manager = m + + if id >= m.locks.GetMaxLocks() { + return nil, errors.Wrapf(syscall.EINVAL, "lock ID %d is too large - max lock size is %d", + id, m.locks.GetMaxLocks()-1) + } + + if err := m.locks.AllocateGivenSemaphore(id); err != nil { + return nil, err + } + + return lock, nil +} + // RetrieveLock retrieves a lock from the manager given its ID. func (m *SHMLockManager) RetrieveLock(id uint32) (Locker, error) { lock := new(SHMLock) |