diff --git a/lib/spack/llnl/util/lock.py b/lib/spack/llnl/util/lock.py
index aa8272d5fe9de110e08b804891bf87f9ec85a688..b5e3a3a8f80619c3bbd9b5345719ea4bf427d4a6 100644
--- a/lib/spack/llnl/util/lock.py
+++ b/lib/spack/llnl/util/lock.py
@@ -70,7 +70,8 @@ def _lock(self, op, timeout):
         while (time.time() - start_time) < timeout:
             try:
                 if self._fd is None:
-                    self._fd = os.open(self._file_path, os.O_RDWR)
+                    mode = os.O_RDWR if op == fcntl.LOCK_EX else os.O_RDONLY
+                    self._fd = os.open(self._file_path, mode)
 
                 fcntl.lockf(self._fd, op | fcntl.LOCK_NB)
                 if op == fcntl.LOCK_EX: