]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Import 1.4.0-rc4 from /afs/grand.central.org/software/openafs/candidate. upstream/1.4.0.rc4
authorRuss Allbery <rra@debian.org>
Wed, 21 Sep 2005 01:02:12 +0000 (01:02 +0000)
committerRuss Allbery <rra@debian.org>
Wed, 21 Sep 2005 01:02:12 +0000 (01:02 +0000)
14 files changed:
configure
configure-libafs
configure-libafs.in
configure.in
src/afs/LINUX/osi_sleep.c
src/afs/afs_daemons.c
src/config/NTMakefile.amd64_w2k
src/config/NTMakefile.i386_nt40
src/config/NTMakefile.i386_w2k
src/rx/LINUX/rx_kmutex.c
src/rx/LINUX/rx_kmutex.h
src/rx/rx.c
src/rx/rx.h
src/rx/rx_packet.c

index 902d8ddf34788536f1332dea13169269cd7ed39d..c1d4cbcbed9769528b8a728911833c05d1060c7a 100644 (file)
--- a/configure
+++ b/configure
@@ -756,7 +756,7 @@ fi
 
 PACKAGE=openafs
 
-VERSION=1.4.0-rc3
+VERSION=1.4.0-rc4
 
 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
   { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
index 090fa2e1be28de8359c987f13ef6d6f32726f3fc..ca8a334f6604988685ef05ea5a3ad8d2dfbf89e8 100644 (file)
@@ -756,7 +756,7 @@ fi
 
 PACKAGE=openafs-libafs
 
-VERSION=1.4.0-rc3
+VERSION=1.4.0-rc4
 
 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
   { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
index 213ced246c1ec3aac0b9de9e4ecc7410a1d7b637..aa89e14431766b05a2c26b3e025fe1a07c5de114 100644 (file)
@@ -1,5 +1,5 @@
 AC_INIT(src/libafs/Makefile.common.in)
-AM_INIT_AUTOMAKE(openafs-libafs,1.4.0-rc3)
+AM_INIT_AUTOMAKE(openafs-libafs,1.4.0-rc4)
 AC_CONFIG_HEADER(src/config/afsconfig.h)
 define(OPENAFS_CONFIGURE_LIBAFS)
 
index 5a3b2b6a33015a7eee98b08aefffccd3412d65ec..128a9f76319545bd82b919367365ba8f09c2c92f 100644 (file)
@@ -1,5 +1,5 @@
 AC_INIT(src/config/stds.h)
-AM_INIT_AUTOMAKE(openafs,1.4.0-rc3)
+AM_INIT_AUTOMAKE(openafs,1.4.0-rc4)
 AC_CONFIG_HEADER(src/config/afsconfig.h)
 
 AC_PROG_CC
index d0418b0693963a4c1365d2383144fd2dfa97508b..0a45da609b038f6d656f3a6d441262bc36285ea2 100644 (file)
@@ -11,7 +11,7 @@
 #include "afs/param.h"
 
 RCSID
-    ("$Header: /cvs/openafs/src/afs/LINUX/osi_sleep.c,v 1.22.2.6 2005/08/10 19:23:19 shadow Exp $");
+    ("$Header: /cvs/openafs/src/afs/LINUX/osi_sleep.c,v 1.22.2.7 2005/09/08 18:53:45 shadow Exp $");
 
 #include "afs/sysincludes.h"   /* Standard vendor system headers */
 #include "afsincludes.h"       /* Afs-based standard headers */
@@ -194,7 +194,13 @@ afs_osi_SleepSig(void *event)
        schedule();
 #ifdef AFS_LINUX26_ENV
 #ifdef CONFIG_PM
-       if (current->flags & PF_FREEZE)
+       if (
+#ifdef PF_FREEZE
+           current->flags & PF_FREEZE
+#else
+           !current->todo
+#endif
+           )
 #ifdef LINUX_REFRIGERATOR_TAKES_PF_FREEZE
            refrigerator(PF_FREEZE);
 #else
index df796b9b4a6ed7836e798776413d09c5d63e5401..bc254246d469643ec533cd688b4e4d0d0d2c5533 100644 (file)
@@ -11,7 +11,7 @@
 #include "afs/param.h"
 
 RCSID
-    ("$Header: /cvs/openafs/src/afs/afs_daemons.c,v 1.28.2.5 2005/04/03 18:18:54 shadow Exp $");
+    ("$Header: /cvs/openafs/src/afs/afs_daemons.c,v 1.28.2.7 2005/09/07 17:43:25 shadow Exp $");
 
 #ifdef AFS_AIX51_ENV
 #define __FULL_PROTO
@@ -309,8 +309,55 @@ afs_CheckRootVolume(void)
                 * count to zero and fs checkv is executed when the current
                 * directory is /afs.
                 */
+#ifdef AFS_LINUX20_ENV
+               {
+                   struct vrequest treq;
+                   struct vattr vattr;
+                   cred_t *credp;
+                   struct dentry *dp;
+                   struct vcache *vcp;
+                   
+                   afs_rootFid.Fid.Volume = volid;
+                   afs_rootFid.Fid.Vnode = 1;
+                   afs_rootFid.Fid.Unique = 1;
+                   
+                   credp = crref();
+                   if (afs_InitReq(&treq, credp))
+                       goto out;
+                   vcp = afs_GetVCache(&afs_rootFid, &treq, NULL, NULL);
+                   if (!vcp)
+                       goto out;
+                   afs_getattr(vcp, &vattr, credp);
+                   afs_fill_inode(AFSTOV(vcp), &vattr);
+                   
+                   dp = d_find_alias(AFSTOV(afs_globalVp));
+                   
+#if defined(AFS_LINUX24_ENV)
+                   spin_lock(&dcache_lock);
+#if defined(AFS_LINUX26_ENV)
+                   spin_lock(&dp->d_lock);
+#endif
+#endif
+                   list_del_init(&dp->d_alias);
+                   list_add(&dp->d_alias, &(AFSTOV(vcp)->i_dentry));
+                   dp->d_inode = AFSTOV(vcp);
+#if defined(AFS_LINUX24_ENV)
+#if defined(AFS_LINUX26_ENV)
+                   spin_unlock(&dp->d_lock);
+#endif
+                   spin_unlock(&dcache_lock);
+#endif
+                   dput(dp);
+                   
+                   AFS_FAST_RELE(afs_globalVp);
+                   afs_globalVp = vcp;
+               out:
+                   crfree(credp);
+               }
+#else
                AFS_FAST_RELE(afs_globalVp);
                afs_globalVp = 0;
+#endif
            }
            afs_rootFid.Fid.Volume = volid;
            afs_rootFid.Fid.Vnode = 1;
index 9185ca6813bc56305ffa124411fb7fdcd0c745d5..78572cb8ed6c7447a5591a53759365fe093c8b8c 100644 (file)
@@ -80,7 +80,7 @@ LIB = $(AFSDEV_LIB)
 #define used in WinNT/2000 installation and program version display
 AFSPRODUCT_VER_MAJOR=1
 AFSPRODUCT_VER_MINOR=4
-AFSPRODUCT_VER_PATCH=0002
+AFSPRODUCT_VER_PATCH=0003
 AFSPRODUCT_VER_BUILD=0
 
 # For MSI installer, each major release should have a different GUID
index 5c54ac8d9829a663c0339d38cbfe90f6425f5152..c9f244b0f5aede96f8a630d7fe142fc711ca9df1 100644 (file)
@@ -80,7 +80,7 @@ LIB = $(AFSDEV_LIB)
 #define used in WinNT/2000 installation and program version display
 AFSPRODUCT_VER_MAJOR=1
 AFSPRODUCT_VER_MINOR=4
-AFSPRODUCT_VER_PATCH=0002
+AFSPRODUCT_VER_PATCH=0003
 AFSPRODUCT_VER_BUILD=0
 
 # For MSI installer, each major release should have a different GUID
index 171711ab03fa8de31c2807aab3cdf4c3b305fc4e..8412b5a6f3d63af5f8f6f6db4f019b7a227f0f81 100644 (file)
@@ -79,7 +79,7 @@ LIB = $(AFSDEV_LIB)
 
 #define used in WinNT/2000 installation and program version display
 AFSPRODUCT_VER_MINOR=4
-AFSPRODUCT_VER_PATCH=0002
+AFSPRODUCT_VER_PATCH=0003
 AFSPRODUCT_VER_BUILD=0
 
 # For MSI installer, each major release should have a different GUID
index e20168ec52f4268997b3373e567a30514dc0f660..04467e0d780c24c120aa45125e66c45850b0ab69 100644 (file)
@@ -17,7 +17,7 @@
 #include "afs/param.h"
 
 RCSID
-    ("$Header: /cvs/openafs/src/rx/LINUX/rx_kmutex.c,v 1.7.2.2 2005/04/25 17:20:00 shadow Exp $");
+    ("$Header: /cvs/openafs/src/rx/LINUX/rx_kmutex.c,v 1.7.2.3 2005/09/14 05:12:46 shadow Exp $");
 
 #include "rx/rx_kcommon.h"
 #include "rx_kmutex.h"
@@ -72,7 +72,7 @@ afs_mutex_exit(afs_kmutex_t * l)
 int
 afs_cv_wait(afs_kcondvar_t * cv, afs_kmutex_t * l, int sigok)
 {
-    int isAFSGlocked = ISAFS_GLOCK();
+    int seq, isAFSGlocked = ISAFS_GLOCK();
     sigset_t saved_set;
 #ifdef DECLARE_WAITQUEUE
     DECLARE_WAITQUEUE(wait, current);
@@ -80,8 +80,10 @@ afs_cv_wait(afs_kcondvar_t * cv, afs_kmutex_t * l, int sigok)
     struct wait_queue wait = { current, NULL };
 #endif
 
-    add_wait_queue(cv, &wait);
+    seq = cv->seq;
+    
     set_current_state(TASK_INTERRUPTIBLE);
+    add_wait_queue(&cv->waitq, &wait);
 
     if (isAFSGlocked)
        AFS_GUNLOCK();
@@ -95,8 +97,13 @@ afs_cv_wait(afs_kcondvar_t * cv, afs_kmutex_t * l, int sigok)
        SIG_UNLOCK(current);
     }
 
-    schedule();
-    remove_wait_queue(cv, &wait);
+    while(seq == cv->seq) {
+       schedule();
+       /* should we refrigerate? */
+    }
+
+    remove_wait_queue(&cv->waitq, &wait);
+    set_current_state(TASK_RUNNING);
 
     if (!sigok) {
        SIG_LOCK(current);
@@ -115,23 +122,30 @@ afs_cv_wait(afs_kcondvar_t * cv, afs_kmutex_t * l, int sigok)
 void
 afs_cv_timedwait(afs_kcondvar_t * cv, afs_kmutex_t * l, int waittime)
 {
-    int isAFSGlocked = ISAFS_GLOCK();
+    int seq, isAFSGlocked = ISAFS_GLOCK();
     long t = waittime * HZ / 1000;
 #ifdef DECLARE_WAITQUEUE
     DECLARE_WAITQUEUE(wait, current);
 #else
     struct wait_queue wait = { current, NULL };
 #endif
+    seq = cv->seq;
 
-    add_wait_queue(cv, &wait);
     set_current_state(TASK_INTERRUPTIBLE);
+    add_wait_queue(&cv->waitq, &wait);
 
     if (isAFSGlocked)
        AFS_GUNLOCK();
     MUTEX_EXIT(l);
 
-    t = schedule_timeout(t);
-    remove_wait_queue(cv, &wait);
+    while(seq == cv->seq) {
+       t = schedule_timeout(t);
+       if (!t)         /* timeout */
+           break;
+    }
+    
+    remove_wait_queue(&cv->waitq, &wait);
+    set_current_state(TASK_RUNNING);
 
     if (isAFSGlocked)
        AFS_GLOCK();
index 8473e19f710e6101ed692f4fe1f8cd2662be7f22..8e08f004f2d1ed8b6d53a00446ab708dff047a00 100644 (file)
@@ -43,11 +43,14 @@ typedef struct afs_kmutex {
 #define set_current_state(X) current->state=X
 #endif
 
+typedef struct afs_kcondvar {
+    int seq;
 #if defined(AFS_LINUX24_ENV)
-typedef wait_queue_head_t afs_kcondvar_t;
+    wait_queue_head_t waitq;
 #else
-typedef struct wait_queue *afs_kcondvar_t;
+    struct wait_queue *waitq;
 #endif
+} afs_kcondvar_t;
 
 static inline int
 MUTEX_ISMINE(afs_kmutex_t * l)
@@ -62,7 +65,7 @@ MUTEX_ISMINE(afs_kmutex_t * l)
 #define MUTEX_EXIT             afs_mutex_exit
 
 #if defined(AFS_LINUX24_ENV)
-#define CV_INIT(cv,b,c,d)      init_waitqueue_head((wait_queue_head_t *)(cv))
+#define CV_INIT(cv,b,c,d)      do { (cv)->seq = 0; init_waitqueue_head(&(cv)->waitq); } while (0)
 #else
 #define CV_INIT(cv,b,c,d)      init_waitqueue((struct wait_queue**)(cv))
 #endif
@@ -71,12 +74,11 @@ MUTEX_ISMINE(afs_kmutex_t * l)
 #define CV_WAIT(cv, m)         afs_cv_wait(cv, m, 0)
 #define CV_TIMEDWAIT           afs_cv_timedwait
 
+#define CV_SIGNAL(cv)          do { ++(cv)->seq; wake_up(&(cv)->waitq); } while (0)
 #if defined(AFS_LINUX24_ENV)
-#define CV_SIGNAL(cv)          wake_up((wait_queue_head_t *)cv)
-#define CV_BROADCAST(cv)       wake_up((wait_queue_head_t *)cv)
+#define CV_BROADCAST(cv)       do { ++(cv)->seq; wake_up_all(&(cv)->waitq); } while (0)
 #else
-#define CV_SIGNAL(cv)          wake_up((struct wait_queue**)cv)
-#define CV_BROADCAST(cv)       wake_up((struct wait_queue**)cv)
+#define CV_BROADCAST(cv)       do { ++(cv)->seq; wake_up(&(cv)->waitq); } while (0)
 #endif
 
 #endif /* RX_KMUTEX_H_ */
index f06d35427da0c390af28f7ea371811ffcd4d54b3..f9aa97511774fcabe4e1994fb9b1fb828a680bfa 100644 (file)
@@ -17,7 +17,7 @@
 #endif
 
 RCSID
-    ("$Header: /cvs/openafs/src/rx/rx.c,v 1.58.2.22 2005/09/02 22:50:59 shadow Exp $");
+    ("$Header: /cvs/openafs/src/rx/rx.c,v 1.58.2.26 2005/09/14 08:53:12 jaltman Exp $");
 
 #ifdef KERNEL
 #include "afs/sysincludes.h"
@@ -1170,11 +1170,17 @@ rx_NewCall(register struct rx_connection *conn)
     MUTEX_ENTER(&call->lock);
     while (call->flags & RX_CALL_TQ_BUSY) {
        call->flags |= RX_CALL_TQ_WAIT;
+       call->tqWaiters++;
 #ifdef RX_ENABLE_LOCKS
+       osirx_AssertMine(&call->lock, "rxi_Start lock4");
        CV_WAIT(&call->cv_tq, &call->lock);
 #else /* RX_ENABLE_LOCKS */
        osi_rxSleep(&call->tq);
 #endif /* RX_ENABLE_LOCKS */
+       call->tqWaiters--;
+       if (call->tqWaiters == 0) {
+           call->flags &= ~RX_CALL_TQ_WAIT;
+       }
     }
     if (call->flags & RX_CALL_TQ_CLEARME) {
        rxi_ClearTransmitQueue(call, 0);
@@ -2602,6 +2608,9 @@ rxi_ReceivePacket(register struct rx_packet *np, osi_socket socket,
            call = rxi_NewCall(conn, channel);
            MUTEX_EXIT(&conn->conn_call_lock);
            *call->callNumber = np->header.callNumber;
+           if (np->header.callNumber == 0) 
+               dpf(("RecPacket call 0 %d %s: %x.%u.%u.%u.%u.%u.%u flags %d, packet %lx resend %d.%0.3d len %d", np->header.serial, rx_packetTypes[np->header.type - 1], conn->peer->host, conn->peer->port, np->header.serial, np->header.epoch, np->header.cid, np->header.callNumber, np->header.seq, np->header.flags, (unsigned long)np, np->retryTime.sec, np->retryTime.usec / 1000, np->length));
+
            call->state = RX_STATE_PRECALL;
            clock_GetTime(&call->queueTime);
            hzero(call->bytesSent);
@@ -2635,11 +2644,16 @@ rxi_ReceivePacket(register struct rx_packet *np, osi_socket socket,
            while ((call->state == RX_STATE_ACTIVE)
                   && (call->flags & RX_CALL_TQ_BUSY)) {
                call->flags |= RX_CALL_TQ_WAIT;
+               call->tqWaiters++;
 #ifdef RX_ENABLE_LOCKS
+               osirx_AssertMine(&call->lock, "rxi_Start lock3");
                CV_WAIT(&call->cv_tq, &call->lock);
 #else /* RX_ENABLE_LOCKS */
                osi_rxSleep(&call->tq);
 #endif /* RX_ENABLE_LOCKS */
+               call->tqWaiters--;
+               if (call->tqWaiters == 0)
+                   call->flags &= ~RX_CALL_TQ_WAIT;
            }
 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
            /* If the new call cannot be taken right now send a busy and set
@@ -2659,6 +2673,9 @@ rxi_ReceivePacket(register struct rx_packet *np, osi_socket socket,
            }
            rxi_ResetCall(call, 0);
            *call->callNumber = np->header.callNumber;
+           if (np->header.callNumber == 0) 
+               dpf(("RecPacket call 0 %d %s: %x.%u.%u.%u.%u.%u.%u flags %d, packet %lx resend %d.%0.3d len %d", np->header.serial, rx_packetTypes[np->header.type - 1], conn->peer->host, conn->peer->port, np->header.serial, np->header.epoch, np->header.cid, np->header.callNumber, np->header.seq, np->header.flags, (unsigned long)np, np->retryTime.sec, np->retryTime.usec / 1000, np->length));
+
            call->state = RX_STATE_PRECALL;
            clock_GetTime(&call->queueTime);
            hzero(call->bytesSent);
@@ -3796,11 +3813,16 @@ rxi_ReceiveAckPacket(register struct rx_call *call, struct rx_packet *np,
        call->flags |= RX_CALL_FAST_RECOVER_WAIT;
        while (call->flags & RX_CALL_TQ_BUSY) {
            call->flags |= RX_CALL_TQ_WAIT;
+           call->tqWaiters++;
 #ifdef RX_ENABLE_LOCKS
+           osirx_AssertMine(&call->lock, "rxi_Start lock2");
            CV_WAIT(&call->cv_tq, &call->lock);
 #else /* RX_ENABLE_LOCKS */
            osi_rxSleep(&call->tq);
 #endif /* RX_ENABLE_LOCKS */
+           call->tqWaiters--;
+           if (call->tqWaiters == 0)
+               call->flags &= ~RX_CALL_TQ_WAIT;
        }
        MUTEX_ENTER(&peer->peer_lock);
 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
@@ -4334,7 +4356,7 @@ rxi_CallError(register struct rx_call *call, afs_int32 error)
     if (call->error)
        error = call->error;
 #ifdef RX_GLOBAL_RXLOCK_KERNEL
-    if (!(call->flags & RX_CALL_TQ_BUSY)) {
+    if (!((call->flags & RX_CALL_TQ_BUSY) || (call->tqWaiters > 0))) {
        rxi_ResetCall(call, 0);
     }
 #else
@@ -4410,7 +4432,7 @@ rxi_ResetCall(register struct rx_call *call, register int newcall)
     flags = call->flags;
     rxi_ClearReceiveQueue(call);
 #ifdef AFS_GLOBAL_RXLOCK_KERNEL
-    if (call->flags & RX_CALL_TQ_BUSY) {
+    if (flags & RX_CALL_TQ_BUSY) {
        call->flags = RX_CALL_TQ_CLEARME | RX_CALL_TQ_BUSY;
        call->flags |= (flags & RX_CALL_TQ_WAIT);
     } else
@@ -4418,7 +4440,18 @@ rxi_ResetCall(register struct rx_call *call, register int newcall)
     {
        rxi_ClearTransmitQueue(call, 0);
        queue_Init(&call->tq);
+       if (call->tqWaiters || (flags & RX_CALL_TQ_WAIT)) {
+           dpf(("rcall %x has %d waiters and flags %d\n", call, call->tqWaiters, call->flags));
+       }
        call->flags = 0;
+       while (call->tqWaiters) {
+#ifdef RX_ENABLE_LOCKS
+           CV_BROADCAST(&call->cv_tq);
+#else /* RX_ENABLE_LOCKS */
+           osi_rxWakeup(&call->tq);
+#endif /* RX_ENABLE_LOCKS */
+           call->tqWaiters--;
+       }
     }
     queue_Init(&call->rq);
     call->error = 0;
@@ -4971,11 +5004,16 @@ rxi_Start(struct rxevent *event, register struct rx_call *call,
        call->flags |= RX_CALL_FAST_RECOVER_WAIT;
        while (call->flags & RX_CALL_TQ_BUSY) {
            call->flags |= RX_CALL_TQ_WAIT;
+           call->tqWaiters++;
 #ifdef RX_ENABLE_LOCKS
+           osirx_AssertMine(&call->lock, "rxi_Start lock1");
            CV_WAIT(&call->cv_tq, &call->lock);
 #else /* RX_ENABLE_LOCKS */
            osi_rxSleep(&call->tq);
 #endif /* RX_ENABLE_LOCKS */
+           call->tqWaiters--;
+           if (call->tqWaiters == 0)
+               call->flags &= ~RX_CALL_TQ_WAIT;
        }
 #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
        call->flags &= ~RX_CALL_FAST_RECOVER_WAIT;
@@ -5131,14 +5169,15 @@ rxi_Start(struct rxevent *event, register struct rx_call *call,
                 */
                if (call->flags & RX_CALL_FAST_RECOVER_WAIT) {
                    call->flags &= ~RX_CALL_TQ_BUSY;
-                   if (call->flags & RX_CALL_TQ_WAIT) {
-                       call->flags &= ~RX_CALL_TQ_WAIT;
+                   if (call->tqWaiters || (call->flags & RX_CALL_TQ_WAIT)) {
+                       dpf(("call %x has %d waiters and flags %d\n", call, call->tqWaiters, call->flags));
+                   }
 #ifdef RX_ENABLE_LOCKS
-                       CV_BROADCAST(&call->cv_tq);
+                   osirx_AssertMine(&call->lock, "rxi_Start start");
+                   CV_BROADCAST(&call->cv_tq);
 #else /* RX_ENABLE_LOCKS */
-                       osi_rxWakeup(&call->tq);
+                   osi_rxWakeup(&call->tq);
 #endif /* RX_ENABLE_LOCKS */
-                   }
                    return;
                }
                if (call->error) {
@@ -5150,14 +5189,15 @@ rxi_Start(struct rxevent *event, register struct rx_call *call,
                    rx_tq_debug.rxi_start_aborted++;
                    MUTEX_EXIT(&rx_stats_mutex);
                    call->flags &= ~RX_CALL_TQ_BUSY;
-                   if (call->flags & RX_CALL_TQ_WAIT) {
-                       call->flags &= ~RX_CALL_TQ_WAIT;
+                   if (call->tqWaiters || (call->flags & RX_CALL_TQ_WAIT)) {
+                       dpf(("call %x has %d waiters and flags %d\n", call, call->tqWaiters, call->flags));
+                   }
 #ifdef RX_ENABLE_LOCKS
-                       CV_BROADCAST(&call->cv_tq);
+                   osirx_AssertMine(&call->lock, "rxi_Start middle");
+                   CV_BROADCAST(&call->cv_tq);
 #else /* RX_ENABLE_LOCKS */
-                       osi_rxWakeup(&call->tq);
+                   osi_rxWakeup(&call->tq);
 #endif /* RX_ENABLE_LOCKS */
-                   }
                    rxi_CallError(call, call->error);
                    return;
                }
@@ -5237,14 +5277,15 @@ rxi_Start(struct rxevent *event, register struct rx_call *call,
             * protected by the global lock.
             */
            call->flags &= ~RX_CALL_TQ_BUSY;
-           if (call->flags & RX_CALL_TQ_WAIT) {
-               call->flags &= ~RX_CALL_TQ_WAIT;
+           if (call->tqWaiters || (call->flags & RX_CALL_TQ_WAIT)) {
+               dpf(("call %x has %d waiters and flags %d\n", call, call->tqWaiters, call->flags));
+           }
 #ifdef RX_ENABLE_LOCKS
-               CV_BROADCAST(&call->cv_tq);
+           osirx_AssertMine(&call->lock, "rxi_Start end");
+           CV_BROADCAST(&call->cv_tq);
 #else /* RX_ENABLE_LOCKS */
-               osi_rxWakeup(&call->tq);
+           osi_rxWakeup(&call->tq);
 #endif /* RX_ENABLE_LOCKS */
-           }
        } else {
            call->flags |= RX_CALL_NEED_START;
        }
index 03c035e32326f9034759eb5e7cb092a6fb8567fa..77ead1a88b60bb284e196c5edc14d5ee2bd30a29 100644 (file)
@@ -540,6 +540,7 @@ struct rx_call {
     struct clock startTime;    /* time call was started */
     afs_hyper_t bytesSent;     /* Number bytes sent */
     afs_hyper_t bytesRcvd;     /* Number bytes received */
+    u_short tqWaiters;
 };
 
 #ifndef KDUMP_RX_LOCK
index afa2e8c1d000bd44e3f7f767caabf17f78f8f54c..44038da26ff3276844c57d388ee4a9e10be79d92 100644 (file)
@@ -15,7 +15,7 @@
 #endif
 
 RCSID
-    ("$Header: /cvs/openafs/src/rx/rx_packet.c,v 1.35.2.15 2005/05/30 03:41:45 jaltman Exp $");
+    ("$Header: /cvs/openafs/src/rx/rx_packet.c,v 1.35.2.16 2005/09/14 03:58:28 shadow Exp $");
 
 #ifdef KERNEL
 #if defined(UKERNEL)
@@ -2500,6 +2500,11 @@ rxi_PrepareSendPacket(register struct rx_call *call,
     p->header.cid = (conn->cid | call->channel);
     p->header.serviceId = conn->serviceId;
     p->header.securityIndex = conn->securityIndex;
+
+    /* No data packets on call 0. Where do these come from? */
+    if (*call->callNumber == 0)
+       *call->callNumber = 1;
+
     p->header.callNumber = *call->callNumber;
     p->header.seq = call->tnext++;
     p->header.epoch = conn->epoch;