From 7093ec1902294c710306d445ea79c78c27abba5b Mon Sep 17 00:00:00 2001
From: "Michael I. Bushnell" <mib@gnu.org>
Date: Fri, 16 Sep 1994 18:56:48 +0000
Subject: Formerly file-set-trans.c.~14~

---
 libdiskfs/file-set-trans.c | 42 ++++++++++++++++++++++++++----------------
 1 file changed, 26 insertions(+), 16 deletions(-)

diff --git a/libdiskfs/file-set-trans.c b/libdiskfs/file-set-trans.c
index 3729fdad..f8a1dcde 100644
--- a/libdiskfs/file-set-trans.c
+++ b/libdiskfs/file-set-trans.c
@@ -52,21 +52,41 @@ diskfs_S_file_set_translator (struct protid *cred,
     }
 
   /* Handle exclusive bits */
-  if (((active_flags & FS_TRANS_SET)
-       && (active_flags & FS_TRANS_EXCL)
-       && np->translator.control != MACH_PORT_NULL)
-      || ((passive_flags & FS_TRANS_SET)
-	  && (passive_flags & FS_TRANS_EXCL)
-	  && diskfs_node_translated (np)))
+  if ((passive_flags & FS_TRANS_SET)
+      && (passive_flags & FS_TRANS_EXCL)
+      && diskfs_node_translated (np))
     {
       mutex_unlock (&np->lock);
       return EBUSY;
     }
   
+  mutex_unlock (&np->lock);
+  mutex_lock (&np->translator.lock);
+  
+  if ((active_flags & FS_TRANS_SET)
+      && (active_flags & FS_TRANS_EXCL)
+      && np->translator.control != MACH_PORT_NULL)
+    {
+      mutex_unlock (&np->translator.lock);
+      return EBUSY;
+    }
+  
   /* Kill existing active translator */
   if (np->translator.control != MACH_PORT_NULL)
     diskfs_destroy_translator (np, killtrans_flags);
 
+  if (active_flags & FS_TRANS_SET)
+    {
+      if (active != MACH_PORT_NULL)
+	fshelp_set_control (&np->translator, active);
+      else
+	/* Should have been cleared above. */
+	assert (np->translator.control == MACH_PORT_NULL);
+    }
+
+  mutex_unlock (&np->translator.lock);
+  mutex_lock (&np->lock);
+
   /* Set passive translator */
   if (passive_flags & FS_TRANS_SET)
     {
@@ -159,16 +179,6 @@ diskfs_S_file_set_translator (struct protid *cred,
       error = diskfs_set_translator (np, passive, passivelen, cred);
     }
 
-  /* Set active translator */
-  if (active_flags & FS_TRANS_SET)
-    {
-      if (active != MACH_PORT_NULL)
-	fshelp_set_control (&np->translator, active);
-      else
-	/* Should have been cleared above. */
-	assert (np->translator.control == MACH_PORT_NULL);
-    }
-
   mutex_unlock (&np->lock);
   return error;
 }
-- 
cgit v1.2.3