Patch from Rich Lane for OpenAFS to work with OpenVZ. http://bugzilla.openvz.org/show_bug.cgi?id=166 diff -ur openafs.orig/src/afs/LINUX/osi_groups.c openafs/src/afs/LINUX/osi_groups.c --- openafs.orig/src/afs/LINUX/osi_groups.c 2007-03-17 22:05:55.000000000 -0400 +++ openafs/src/afs/LINUX/osi_groups.c 2007-12-15 11:23:38.000000000 -0500 @@ -618,7 +618,7 @@ { struct task_struct *p; - p = find_task_by_pid(1); + p = find_task_by_pid_all(1); if (p && p->user->session_keyring) __key_type_keyring = p->user->session_keyring->type; diff -ur openafs.orig/src/rx/LINUX/rx_knet.c openafs/src/rx/LINUX/rx_knet.c --- openafs.orig/src/rx/LINUX/rx_knet.c 2006-09-22 07:20:35.000000000 -0400 +++ openafs/src/rx/LINUX/rx_knet.c 2007-12-15 11:23:38.000000000 -0500 @@ -101,6 +101,7 @@ KERNEL_SPACE_DECL; struct msghdr msg; int code; + struct ve_struct *ve; msg.msg_iovlen = iovcnt; msg.msg_iov = iovec; @@ -110,9 +111,11 @@ msg.msg_controllen = 0; msg.msg_flags = 0; + ve = set_exec_env(get_ve0()); TO_USER_SPACE(); code = sock_sendmsg(sop, &msg, size); TO_KERNEL_SPACE(); + (void)set_exec_env(ve); return (code < 0) ? code : 0; } @@ -147,6 +150,7 @@ int code; struct iovec tmpvec[RX_MAXWVECS + 2]; struct socket *sop = (struct socket *)so; + struct ve_struct *ve; if (iovcnt > RX_MAXWVECS + 2) { osi_Panic("Too many (%d) iovecs passed to osi_NetReceive\n", iovcnt); @@ -159,9 +163,11 @@ msg.msg_controllen = 0; msg.msg_flags = 0; + ve = set_exec_env(get_ve0()); TO_USER_SPACE(); code = sock_recvmsg(sop, &msg, *lengthp, 0); TO_KERNEL_SPACE(); + (void)set_exec_env(ve); if (code < 0) { #ifdef AFS_LINUX26_ENV @@ -213,7 +219,7 @@ else rcu_read_lock(); #endif - listener = find_task_by_pid(rxk_ListenerPid); + listener = find_task_by_pid_all(rxk_ListenerPid); if (&tasklist_lock) read_unlock(&tasklist_lock); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) diff -ur openafs.orig/src/rx/rx_lwp.c openafs/src/rx/rx_lwp.c --- openafs.orig/src/rx/rx_lwp.c 2004-12-07 01:10:06.000000000 -0500 +++ openafs/src/rx/rx_lwp.c 2007-12-15 11:23:38.000000000 -0500 @@ -426,7 +426,12 @@ int rxi_Recvmsg(int socket, struct msghdr *msg_p, int flags) { - return recvmsg((int)socket, msg_p, flags); + struct ve_struct *ve; + int ret; + ve = set_exec_env(get_ve0()); + ret = recvmsg((int)socket, msg_p, flags); + (void)set_exec_env(ve); + return ret; } /* @@ -436,6 +441,8 @@ int rxi_Sendmsg(osi_socket socket, struct msghdr *msg_p, int flags) { + struct ve_struct *ve; + ve = set_exec_env(get_ve0()); fd_set *sfds = (fd_set *) 0; while (sendmsg(socket, msg_p, flags) == -1) { int err; @@ -445,6 +452,7 @@ if (!(sfds = IOMGR_AllocFDSet())) { (osi_Msg "rx failed to alloc fd_set: "); perror("rx_sendmsg"); + (void)set_exec_env(ve); return 3; } FD_SET(socket, sfds); @@ -463,14 +471,19 @@ { (osi_Msg "rx failed to send packet: "); perror("rx_sendmsg"); + (void)set_exec_env(ve); return 3; } while ((err = select(socket + 1, 0, sfds, 0, 0)) != 1) { if (err >= 0 || errno != EINTR) + { + (void)set_exec_env(ve); osi_Panic("rxi_sendmsg: select error %d.%d", err, errno); + } } } if (sfds) IOMGR_FreeFDSet(sfds); + (void)set_exec_env(ve); return 0; } diff -ur openafs.orig/src/rx/rx_pthread.c openafs/src/rx/rx_pthread.c --- openafs.orig/src/rx/rx_pthread.c 2006-07-02 21:16:36.000000000 -0400 +++ openafs/src/rx/rx_pthread.c 2007-12-15 11:23:38.000000000 -0500 @@ -399,8 +399,11 @@ int rxi_Recvmsg(int socket, struct msghdr *msg_p, int flags) { + struct ve_struct *ve; int ret; + ve = set_exec_env(get_ve0()); ret = recvmsg(socket, msg_p, flags); + (void)set_exec_env(ve); return ret; } @@ -410,8 +413,11 @@ int rxi_Sendmsg(osi_socket socket, struct msghdr *msg_p, int flags) { + struct ve_struct *ve; int ret; + ve = set_exec_env(get_ve0()); ret = sendmsg(socket, msg_p, flags); + (void)set_exec_env(ve); #ifdef AFS_LINUX22_ENV /* linux unfortunately returns ECONNREFUSED if the target port * is no longer in use */