From: Russ Allbery Date: Wed, 21 Sep 2005 01:08:18 +0000 (+0000) Subject: Merge with upstream 1.4.0-rc4. X-Git-Tag: debian/1.4rc4-1~1 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=3bb95feb49bbc60c33fcf040f769a436ecb58821;p=packages%2Fo%2Fopenafs.git Merge with upstream 1.4.0-rc4. --- diff --git a/configure b/configure index 5928c7d59..533fd563b 100755 --- a/configure +++ b/configure @@ -757,7 +757,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; } diff --git a/configure-libafs b/configure-libafs index b394c2a84..e0aa12d81 100755 --- a/configure-libafs +++ b/configure-libafs @@ -757,7 +757,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; } diff --git a/configure-libafs.in b/configure-libafs.in index 213ced246..aa89e1443 100644 --- a/configure-libafs.in +++ b/configure-libafs.in @@ -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) diff --git a/configure.in b/configure.in index 5a3b2b6a3..128a9f763 100644 --- a/configure.in +++ b/configure.in @@ -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 diff --git a/debian/changelog b/debian/changelog index 844595949..8d2e51675 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,9 @@ -openafs (1.4rc3-1) unstable; urgency=low +openafs (1.4rc4-1) unstable; urgency=low * New upstream version. + - Correctly handle root.afs becoming replicated after the client + starts. This should resolve the problems with AFS eventually + failing on the first system using a new cell. (Closes: #88906) * When kill_all_afs is enabled in /etc/openafs/afs.conf, only kill AFS processes if the runlevel is 0 or 6. You really only want this when the system is shutting down. (Closes: #325347) diff --git a/debian/rules b/debian/rules index 5c5e6ed35..0948c3744 100755 --- a/debian/rules +++ b/debian/rules @@ -49,7 +49,7 @@ DOC_PACKAGES = libpam-openafs-kaserver openafs-dbserver openafs-fileserver \ # These variable is used only by get-orig-source, which will normally only be # run by maintainers. -VERSION = 1.4.0-rc3 +VERSION = 1.4.0-rc4 UPSTREAM = /afs/grand.central.org/software/openafs/candidate/$(VERSION) # Download the upstream source and do the repackaging that we have to do for diff --git a/src/afs/LINUX/osi_sleep.c b/src/afs/LINUX/osi_sleep.c index d0418b069..0a45da609 100644 --- a/src/afs/LINUX/osi_sleep.c +++ b/src/afs/LINUX/osi_sleep.c @@ -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 diff --git a/src/afs/afs_daemons.c b/src/afs/afs_daemons.c index df796b9b4..bc254246d 100644 --- a/src/afs/afs_daemons.c +++ b/src/afs/afs_daemons.c @@ -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; diff --git a/src/config/NTMakefile.amd64_w2k b/src/config/NTMakefile.amd64_w2k index 9185ca681..78572cb8e 100644 --- a/src/config/NTMakefile.amd64_w2k +++ b/src/config/NTMakefile.amd64_w2k @@ -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 diff --git a/src/config/NTMakefile.i386_nt40 b/src/config/NTMakefile.i386_nt40 index 5c54ac8d9..c9f244b0f 100644 --- a/src/config/NTMakefile.i386_nt40 +++ b/src/config/NTMakefile.i386_nt40 @@ -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 diff --git a/src/config/NTMakefile.i386_w2k b/src/config/NTMakefile.i386_w2k index 171711ab0..8412b5a6f 100644 --- a/src/config/NTMakefile.i386_w2k +++ b/src/config/NTMakefile.i386_w2k @@ -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 diff --git a/src/rx/LINUX/rx_kmutex.c b/src/rx/LINUX/rx_kmutex.c index e20168ec5..04467e0d7 100644 --- a/src/rx/LINUX/rx_kmutex.c +++ b/src/rx/LINUX/rx_kmutex.c @@ -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(); diff --git a/src/rx/LINUX/rx_kmutex.h b/src/rx/LINUX/rx_kmutex.h index 8473e19f7..8e08f004f 100644 --- a/src/rx/LINUX/rx_kmutex.h +++ b/src/rx/LINUX/rx_kmutex.h @@ -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_ */ diff --git a/src/rx/rx.c b/src/rx/rx.c index f06d35427..f9aa97511 100644 --- a/src/rx/rx.c +++ b/src/rx/rx.c @@ -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; } diff --git a/src/rx/rx.h b/src/rx/rx.h index 03c035e32..77ead1a88 100644 --- a/src/rx/rx.h +++ b/src/rx/rx.h @@ -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 diff --git a/src/rx/rx_packet.c b/src/rx/rx_packet.c index afa2e8c1d..44038da26 100644 --- a/src/rx/rx_packet.c +++ b/src/rx/rx_packet.c @@ -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;