summaryrefslogtreecommitdiff
path: root/libpod/lock/shm_lock_manager_linux.go
diff options
context:
space:
mode:
authorOpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com>2019-05-07 19:50:54 +0200
committerGitHub <noreply@github.com>2019-05-07 19:50:54 +0200
commit7b67c9601e1eab6c881ac44503c285c71b0a4a3a (patch)
treecf0802d1dee6beefd68e20b2a8345c9edeaec80f /libpod/lock/shm_lock_manager_linux.go
parent3b5ac1818f09514039fdfec20aa874ae68e6ab7c (diff)
parentf881e32f12c9a30d903b15d8d51729b23928cfa3 (diff)
downloadpodman-7b67c9601e1eab6c881ac44503c285c71b0a4a3a.tar.gz
podman-7b67c9601e1eab6c881ac44503c285c71b0a4a3a.tar.bz2
podman-7b67c9601e1eab6c881ac44503c285c71b0a4a3a.zip
Merge pull request #3073 from mheon/force_lock_realloc
When refreshing after a reboot, force lock allocation
Diffstat (limited to 'libpod/lock/shm_lock_manager_linux.go')
-rw-r--r--libpod/lock/shm_lock_manager_linux.go19
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)