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;