diff mbox series

[v2] utils: Fix lockfile_to_exclusive to avoid deadlock

Message ID 20260820104452.2680721-1-richard.purdie@linuxfoundation.org
State Accepted, archived
Commit f56f63b89c02adfa0289a197f8eac2ed7054ca2f
Headers show
Series [v2] utils: Fix lockfile_to_exclusive to avoid deadlock | expand

Commit Message

Richard Purdie Aug. 20, 2026, 10:44 a.m. UTC
We need to drop the existing lock when trying to get the exclusive lock
else we'd deadlock with another process trying to do the same thing.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 lib/bb/fetch2/__init__.py | 2 +-
 lib/bb/utils.py           | 7 ++++---
 2 files changed, 5 insertions(+), 4 deletions(-)
diff mbox series

Patch

diff --git a/lib/bb/fetch2/__init__.py b/lib/bb/fetch2/__init__.py
index 4a3119ad09d..9cb268be503 100644
--- a/lib/bb/fetch2/__init__.py
+++ b/lib/bb/fetch2/__init__.py
@@ -1907,7 +1907,7 @@  class Fetch(object):
                 if m.verify_donestamp(ud, self.d) and not m.need_update(ud, self.d):
                     done = True
                 if not done:
-                    bb.utils.lockfile_to_exclusive(lf)
+                    lf = bb.utils.lockfile_to_exclusive(lf)
                     if m.try_premirror(ud, self.d):
                         done = m.try_mirrors(self, ud, self.d, 'PREMIRRORS')
 
diff --git a/lib/bb/utils.py b/lib/bb/utils.py
index b635f68a153..37edd435350 100644
--- a/lib/bb/utils.py
+++ b/lib/bb/utils.py
@@ -587,12 +587,13 @@  def lockfile(name, shared=False, retry=True, block=False):
         if not retry:
             return None
 
+# We have to drop the existing lock to avoid deadlocks
 def lockfile_to_exclusive(lf):
     if not lf:
         return
-    fileno = lf.fileno()
-    fcntl.flock(fileno, fcntl.LOCK_EX)
-    return
+    name = lf.name
+    unlockfile(lf)
+    return lockfile(name)
 
 def unlockfile(lf):
     """