diff -r -u arla-0.35.2/xfs/linux/xfs_dev.c arla-0.35.2-mod/xfs/linux/xfs_dev.c
--- arla-0.35.2/xfs/linux/xfs_dev.c	Wed Oct 18 03:06:29 2000
+++ arla-0.35.2-mod/xfs/linux/xfs_dev.c	Mon Mar 12 17:12:49 2001
@@ -57,6 +57,42 @@
 }
 #endif
 
+static char *semaphore_log_s[10];
+static int semaphore_log_pid[10];
+
+static void
+log_semaphore(char *s, int pid)
+{
+    int i;
+    for (i = 0; i < 9; i++) {
+	semaphore_log_s[i + 1] = semaphore_log_s[i];
+	semaphore_log_pid[i + 1] = semaphore_log_pid[i];
+    }
+    semaphore_log_s[0] = s;
+    semaphore_log_pid[0] = pid;
+}
+
+void
+print_semaphore(void)
+{
+    int i;
+    for (i = 0; i < 10; i++)
+	printk("%s %d\n", semaphore_log_s[i], semaphore_log_pid[i]);
+}
+
+
+static void xfs_down(struct semaphore * sem)
+{
+    log_semaphore("down channel", current->pid);
+    down(sem);
+}
+
+static void xfs_up(struct semaphore * sem)
+{
+    log_semaphore("up channel", current->pid);
+    up(sem);
+}
+
 /*
  * Queues of xfs_links hold outbound messages and processes sleeping
  * for replies. The last field is used to return error to sleepers and
@@ -143,14 +179,14 @@
     memmove(&t->msg, message, size);
     t->this_message.message = &t->msg;
 
-    down(&chan->channel_sem);
+    xfs_down(&chan->channel_sem);
     
     t->msg.sequence_num = chan->nsequence++;
     XFSDEB(XDEBMSG, ("enqueue_message seq = %d\n", t->msg.sequence_num));
 
     xfs_appendq(&chan->messageq, &t->this_message);
     init_waitqueue_head(&(t->this_message.wait_queue));
-    up(&chan->channel_sem);
+    xfs_up(&chan->channel_sem);
 
     return 0;
 }
@@ -167,9 +203,9 @@
 
     XFSDEB(XDEBDEV, ("xfs_queue_inactive\n"));
 
-    down(&chan->channel_sem);
+    xfs_down(&chan->channel_sem);
     list_add (&xn->inactive_list, &chan->inactive_list);
-    up(&chan->channel_sem);
+    xfs_up(&chan->channel_sem);
     wake_up(&chan->wait_queue);
 }
 
@@ -183,7 +219,7 @@
     int i = 0;
     int ret;
 
-    down(&chan->channel_sem);
+    xfs_down(&chan->channel_sem);
     for (;;) {
 	struct list_head *lh = chan->inactive_list.next;
 	struct xfs_node *xn;
@@ -202,9 +238,9 @@
 	
 	list_del (&xn->inactive_list);
 
-	up(&chan->channel_sem);
+	xfs_up(&chan->channel_sem);
 	ret = enqueue_message (chan, &msg.header, sizeof(msg));
-	down(&chan->channel_sem);
+	xfs_down(&chan->channel_sem);
  	if (ret == 0) {
 	    xfs_free(xn, XFS_MEM_XNODE);
 	} else {
@@ -213,7 +249,7 @@
 			     "failed enqueue-ing msg %d\n", ret));
 	}
     }
-    up(&chan->channel_sem);
+    xfs_up(&chan->channel_sem);
     if (i)
 	XFSDEB(XDEBDEV, ("xfs_process_inactive_queue: done (%d)\n", i));
 }
@@ -312,7 +348,7 @@
     chan->status &= ~CHANNEL_OPENED;
     xfs[MINOR(inode->i_rdev)].status &= ~XFS_DEVOPEN;
     
-    down(&chan->channel_sem);
+    xfs_down(&chan->channel_sem);
 
     /* No one is going to read those messages so empty queue! */
     while (!xfs_emptyq(&chan->messageq)) {
@@ -329,16 +365,16 @@
 	XFSDEB(XDEBDEV, ("before outq(sleepq)\n"));
 	first = chan->sleepq.next;
 	xfs_outq(first);
-	up(&chan->channel_sem);
+	xfs_up(&chan->channel_sem);
 	first->error_or_size = -ENODEV;
 	wake_up(&first->wait_queue);
 	first->woken = 1;
 	XFSDEB(XDEBDEV, ("after outq(sleepq)\n"));
-	down(&chan->channel_sem);
+	xfs_down(&chan->channel_sem);
     }
     xfs_empty_inactive_queue (chan);
 
-    up(&chan->channel_sem);
+    xfs_up(&chan->channel_sem);
     
     if (chan->message_buffer) {
 	xfs_free(chan->message_buffer, XFS_MEM_MSGBUF);
@@ -373,7 +409,7 @@
     
     xfs_process_inactive_queue (chan);
 
-    down(&chan->channel_sem);
+    xfs_down(&chan->channel_sem);
     while (!xfs_emptyq (&chan->messageq)) {
 	first = chan->messageq.next;
 	XFSDEB(XDEBDEV, ("xfs_devread: first = %p, "
@@ -396,7 +432,7 @@
 	if (first->error_or_size != 0)
 	    xfs_free(first, XFS_MEM_SENDRPC);
     }
-    up(&chan->channel_sem);
+    xfs_up(&chan->channel_sem);
     
     *ppos += ret;
     
@@ -486,10 +522,10 @@
     
     xfs_process_inactive_queue (chan);
 
-    down(&chan->channel_sem);
+    xfs_down(&chan->channel_sem);
     if (!xfs_emptyq(&chan->messageq))
 	ret = POLLIN;
-    up(&chan->channel_sem);
+    xfs_up(&chan->channel_sem);
     unlock_kernel ();
     return ret;
 }
@@ -601,7 +637,7 @@
     this_message->message = msg;
     this_process->message = msg;
 
-    down(&chan->channel_sem);
+    xfs_down(&chan->channel_sem);
     
     msg->sequence_num = chan->nsequence++;
     XFSDEB(XDEBMSG, ("xfs_message_rpc seq = %d\n", msg->sequence_num));
@@ -611,7 +647,7 @@
     
     this_process->error_or_size = 0;
 
-    up(&chan->channel_sem);
+    xfs_up(&chan->channel_sem);
     
     wake_up(&chan->wait_queue);
     
@@ -641,14 +677,14 @@
      * Caught signal, got reply message or device was closed.
      * Need to clean up both messageq and sleepq.
      */
-    down(&chan->channel_sem);
+    xfs_down(&chan->channel_sem);
     if (xfs_onq(this_message)) {
 	xfs_outq(this_message);
     }
     if (xfs_onq(this_process)) {
 	xfs_outq(this_process);
     }
-    up(&chan->channel_sem);
+    xfs_up(&chan->channel_sem);
     ret = this_process->error_or_size;
     XFSDEB(XDEBMSG, ("xfs_message_rpc opcode this_process"
 		     "->error_or_size = %d\n", this_process->error_or_size));
@@ -754,7 +790,7 @@
     XFSDEB(XDEBMSG, ("xfs_message_wakeup error: %d seq = %d\n",
 		     message->error, message->sleepers_sequence_num));
     
-    down(&chan->channel_sem);
+    xfs_down(&chan->channel_sem);
     for (; t != sleepq; t = t->next)
 	if (t->message->sequence_num == message->sleepers_sequence_num) {
 	    if (t->message->size < size) {
@@ -774,7 +810,7 @@
 	    t->woken = 1;
 	    break;
 	}
-    up(&chan->channel_sem);
+    xfs_up(&chan->channel_sem);
     
     return 0;
 }
@@ -790,7 +826,7 @@
     XFSDEB(XDEBMSG, ("xfs_message_wakeup_data error: %d seq = %d\n",
 		     message->error, message->sleepers_sequence_num));
     
-    down(&chan->channel_sem);
+    xfs_down(&chan->channel_sem);
     for (; t != sleepq; t = t->next)
 	if (t->message->sequence_num == message->sleepers_sequence_num) {
 	    if (t->message->size < size) {
@@ -810,7 +846,7 @@
 	    t->woken = 1;
 	    break;
 	}
-    up(&chan->channel_sem);
+    xfs_up(&chan->channel_sem);
 
     return 0;
 }
diff -r -u arla-0.35.2/xfs/linux/xfs_syscalls.c arla-0.35.2-mod/xfs/linux/xfs_syscalls.c
--- arla-0.35.2/xfs/linux/xfs_syscalls.c	Tue Oct  3 01:47:54 2000
+++ arla-0.35.2-mod/xfs/linux/xfs_syscalls.c	Mon Mar 12 17:07:51 2001
@@ -461,6 +461,9 @@
     return 0;
 }
 
+void
+print_semaphore(void);
+
 static int
 xfs_debug_print (struct ViceIoctl *vice_ioctl, struct dentry *node)
 {
@@ -492,6 +495,9 @@
 	    } else {
 		print_nodes(0);
 	    }
+	    return 0;
+	case XDEBDEV:
+	    print_semaphore();
 	    return 0;
 	default:
 	    return -EINVAL;
