diff --git a/mercurial/configitems.py b/mercurial/configitems.py
--- a/mercurial/configitems.py
+++ b/mercurial/configitems.py
@@ -1084,6 +1084,11 @@ coreconfigitem(
 )
 coreconfigitem(
     b'experimental',
+    b'sharesafe-auto-upgrade-fail-error',
+    default=False,
+)
+coreconfigitem(
+    b'experimental',
     b'sharesafe-warn-outdated-shares',
     default=True,
 )
diff --git a/mercurial/upgrade.py b/mercurial/upgrade.py
--- a/mercurial/upgrade.py
+++ b/mercurial/upgrade.py
@@ -257,7 +257,12 @@ def upgrade_share_to_safe(ui, hgvfs, sto
         current_requirements.add(requirementsmod.SHARESAFE_REQUIREMENT)
         ui.warn(_(b'repository upgraded to use share-safe mode\n'))
     except error.LockError as e:
-        if ui.configbool(b'experimental', b'sharesafe-warn-outdated-shares'):
+        if ui.configbool(b'experimental', b'sharesafe-auto-upgrade-fail-error'):
+            raise error.Abort(
+                _(b'failed to upgrade share, got error: %s')
+                % stringutil.forcebytestr(e.strerror)
+            )
+        elif ui.configbool(b'experimental', b'sharesafe-warn-outdated-shares'):
             ui.warn(
                 _(b'failed to upgrade share, got error: %s\n')
                 % stringutil.forcebytestr(e.strerror)
diff --git a/tests/test-share-safe.t b/tests/test-share-safe.t
--- a/tests/test-share-safe.t
+++ b/tests/test-share-safe.t
@@ -557,6 +557,10 @@ Check that if lock is taken, upgrade fai
   o  f3ba8b99bb6f897c87bbc1c07b75c6ddf43a4f77: added foo
   
 
+  $ hg log -GT "{node}: {desc}\n" -R ../nss-share --config experimental.sharesafe-auto-upgrade-shares=true --config experimental.sharesafe-auto-upgrade-fail-error=true
+  abort: failed to upgrade share, got error: Lock held
+  [255]
+
   $ rm ../nss-share/.hg/wlock
   $ hg log -GT "{node}: {desc}\n" -R ../nss-share --config experimental.sharesafe-auto-upgrade-shares=true
   repository upgraded to use share-safe mode