patch-2.1.81 linux/fs/nfsd/export.c
Next file: linux/fs/nfsd/nfsfh.c
Previous file: linux/fs/msdos/namei.c
Back to the patch index
Back to the overall index
-  Lines: 43
-  Date:
Fri Jan 23 16:35:35 1998
-  Orig file: 
v2.1.80/linux/fs/nfsd/export.c
-  Orig date: 
Wed Nov 26 13:08:38 1997
diff -u --recursive --new-file v2.1.80/linux/fs/nfsd/export.c linux/fs/nfsd/export.c
@@ -433,19 +433,37 @@
 int
 exp_writelock(void)
 {
+	/* fast track */
+	if (!hash_count && !hash_lock) {
+	lock_it:
+		hash_lock = 1;
+		return 0;
+	}
+
+	current->sigpending = 0;
 	want_lock++;
-	while (hash_count || hash_lock)
+	while (hash_count || hash_lock) {
 		interruptible_sleep_on(&hash_wait);
+		if (signal_pending(current))
+			break;
+	}
 	want_lock--;
-	if (signal_pending(current))
-		return -EINTR;
-	hash_lock = 1;
-	return 0;
+
+	/* restore the task's signals */
+	spin_lock_irq(¤t->sigmask_lock);
+	recalc_sigpending(current);
+	spin_unlock_irq(¤t->sigmask_lock);
+
+	if (!hash_count && !hash_lock)
+		goto lock_it;
+	return -EINTR;
 }
 
 void
 exp_unlock(void)
 {
+	if (!hash_count && !hash_lock)
+		printk(KERN_WARNING "exp_unlock: not locked!\n");
 	if (hash_count)
 		hash_count--;
 	else
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov