diff --git a/build.vc10/daemon.vcxproj b/build.vc10/daemon.vcxproj
index 8d17e8c..a3385e3 100644
--- a/build.vc10/daemon.vcxproj
+++ b/build.vc10/daemon.vcxproj
@@ -119,7 +119,7 @@
/Wall /wd4100 /wd4127 /wd4255 /wd4574 /wd4619 /wd4668 /wd4710 /wd4711 /wd4820 %(AdditionalOptions)
Disabled
..\sys;..\xdr;..\dll;..\libtirpc\tirpc;%(AdditionalIncludeDirectories)
- WIN32_LEAN_AND_MEAN;STANDALONE_NFSD;%(PreprocessorDefinitions)
+ WIN32_LEAN_AND_MEAN;STANDALONE_NFSD;NO_CB_4_KRB5P;%(PreprocessorDefinitions)
true
diff --git a/build.vc10/libtirpc.vcxproj b/build.vc10/libtirpc.vcxproj
index 070d42c..6d53ec9 100644
--- a/build.vc10/libtirpc.vcxproj
+++ b/build.vc10/libtirpc.vcxproj
@@ -115,7 +115,7 @@
Disabled
..\libtirpc\tirpc;%(AdditionalIncludeDirectories)
- INET6;FD_SETSIZE=128;PORTMAP;%(PreprocessorDefinitions)
+ INET6;FD_SETSIZE=128;PORTMAP;NO_CB_4_KRB5P;%(PreprocessorDefinitions)
true
EnableFastChecks
MultiThreadedDebugDLL
diff --git a/daemon/nfs41_rpc.c b/daemon/nfs41_rpc.c
index 1f39890..ec205b5 100644
--- a/daemon/nfs41_rpc.c
+++ b/daemon/nfs41_rpc.c
@@ -129,6 +129,10 @@ int nfs41_rpc_clnt_create(
status = GetLastError();
goto out;
}
+#ifdef NO_CB_4_KRB5P
+ if (sec_flavor == RPCSEC_AUTHGSS_KRB5P)
+ needcb = 0;
+#endif
rpc->needcb = needcb;
rpc->cond = CreateEvent(NULL, TRUE, FALSE, "rpc_recovery_cond");
if (rpc->cond == NULL) {
diff --git a/daemon/nfs41_session.c b/daemon/nfs41_session.c
index 3e31589..e12307a 100644
--- a/daemon/nfs41_session.c
+++ b/daemon/nfs41_session.c
@@ -279,8 +279,13 @@ int nfs41_session_create(
}
AcquireSRWLockShared(&client->exid_lock);
+#ifdef NO_CB_4_KRB5P
+ if ((client->roles & (EXCHGID4_FLAG_USE_PNFS_MDS |
+ EXCHGID4_FLAG_USE_NON_PNFS)) && client->rpc->needcb)
+#else
if (client->roles & (EXCHGID4_FLAG_USE_PNFS_MDS |
EXCHGID4_FLAG_USE_NON_PNFS))
+#endif
session->flags |= CREATE_SESSION4_FLAG_CONN_BACK_CHAN;
ReleaseSRWLockShared(&client->exid_lock);
diff --git a/libtirpc/src/clnt_vc.c b/libtirpc/src/clnt_vc.c
index 5849a41..488be66 100644
--- a/libtirpc/src/clnt_vc.c
+++ b/libtirpc/src/clnt_vc.c
@@ -549,19 +549,26 @@ call_again:
return(ct->ct_error.re_status);
}
- release_fd_lock(ct->ct_fd, mask);
+#ifdef NO_CB_4_KRB5P
+ if (cl->cb_thread != INVALID_HANDLE_VALUE)
+ release_fd_lock(ct->ct_fd, mask);
+#endif
/*
* Keep receiving until we get a valid transaction id
*/
while (TRUE) {
- mutex_lock(&clnt_fd_lock);
- while ((vc_fd_locks[WINSOCK_HANDLE_HASH(ct->ct_fd)] &&
- vc_fd_locks[WINSOCK_HANDLE_HASH(ct->ct_fd)] != GetCurrentThreadId()) ||
- (ct->reply_msg.rm_xid && ct->reply_msg.rm_xid != x_id))
- cond_wait(&vc_cv[WINSOCK_HANDLE_HASH(ct->ct_fd)], &clnt_fd_lock);
- vc_fd_locks[WINSOCK_HANDLE_HASH(ct->ct_fd)] = GetCurrentThreadId();
- mutex_unlock(&clnt_fd_lock);
+#ifdef NO_CB_4_KRB5P
+ if (cl->cb_thread != INVALID_HANDLE_VALUE) {
+ mutex_lock(&clnt_fd_lock);
+ while ((vc_fd_locks[WINSOCK_HANDLE_HASH(ct->ct_fd)] &&
+ vc_fd_locks[WINSOCK_HANDLE_HASH(ct->ct_fd)] != GetCurrentThreadId()) ||
+ (ct->reply_msg.rm_xid && ct->reply_msg.rm_xid != x_id))
+ cond_wait(&vc_cv[WINSOCK_HANDLE_HASH(ct->ct_fd)], &clnt_fd_lock);
+ vc_fd_locks[WINSOCK_HANDLE_HASH(ct->ct_fd)] = GetCurrentThreadId();
+ mutex_unlock(&clnt_fd_lock);
+ }
+#endif
xdrs->x_op = XDR_DECODE;
ct->reply_msg.acpted_rply.ar_verf = _null_auth;