diff -Nur linux-2.6.10-vs1.9.3.16/fs/fcntl.c linux-2.6.10-vs1.9.3.16-openfd/fs/fcntl.c --- linux-2.6.10-vs1.9.3.16/fs/fcntl.c 2005-01-03 01:53:19.000000000 +0100 +++ linux-2.6.10-vs1.9.3.16-openfd/fs/fcntl.c 2005-01-03 06:12:19.000000000 +0100 @@ -143,7 +143,7 @@ FD_SET(fd, files->open_fds); FD_CLR(fd, files->close_on_exec); spin_unlock(&files->file_lock); - // vx_openfd_inc(fd); + vx_openfd_inc(fd); fd_install(fd, file); } else { spin_unlock(&files->file_lock); @@ -191,7 +191,7 @@ FD_SET(newfd, files->open_fds); FD_CLR(newfd, files->close_on_exec); spin_unlock(&files->file_lock); - // vx_openfd_inc(newfd); + vx_openfd_inc(newfd); if (tofree) filp_close(tofree, files); diff -Nur linux-2.6.10-vs1.9.3.16/fs/open.c linux-2.6.10-vs1.9.3.16-openfd/fs/open.c --- linux-2.6.10-vs1.9.3.16/fs/open.c 2005-01-03 01:53:19.000000000 +0100 +++ linux-2.6.10-vs1.9.3.16-openfd/fs/open.c 2005-01-03 06:13:20.000000000 +0100 @@ -887,7 +887,7 @@ FD_SET(fd, files->open_fds); FD_CLR(fd, files->close_on_exec); files->next_fd = fd + 1; - // vx_openfd_inc(fd); + vx_openfd_inc(fd); #if 1 /* Sanity check */ if (files->fd[fd] != NULL) { @@ -909,7 +909,7 @@ __FD_CLR(fd, files->open_fds); if (fd < files->next_fd) files->next_fd = fd; - // vx_openfd_dec(fd); + vx_openfd_dec(fd); } void fastcall put_unused_fd(unsigned int fd) diff -Nur linux-2.6.10-vs1.9.3.16/include/linux/vserver/limit.h linux-2.6.10-vs1.9.3.16-openfd/include/linux/vserver/limit.h --- linux-2.6.10-vs1.9.3.16/include/linux/vserver/limit.h 2005-01-03 01:53:20.000000000 +0100 +++ linux-2.6.10-vs1.9.3.16-openfd/include/linux/vserver/limit.h 2005-01-03 06:41:59.000000000 +0100 @@ -10,6 +10,8 @@ #define VXD_RLIMIT(r,l) (VXD_CBIT(limit, (l)) && ((r) == (l))) +#define RLIMIT_OPENFD 13 + #define NUM_LIMITS 20 #define VLIMIT_NSOCK 16 diff -Nur linux-2.6.10-vs1.9.3.16/include/linux/vs_limit.h linux-2.6.10-vs1.9.3.16-openfd/include/linux/vs_limit.h --- linux-2.6.10-vs1.9.3.16/include/linux/vs_limit.h 2005-01-03 01:53:20.000000000 +0100 +++ linux-2.6.10-vs1.9.3.16-openfd/include/linux/vs_limit.h 2005-01-03 07:16:23.000000000 +0100 @@ -14,6 +14,7 @@ { if (VXD_RLIMIT(res, RLIMIT_NOFILE) || VXD_RLIMIT(res, RLIMIT_NPROC) || + VXD_RLIMIT(res, RLIMIT_OPENFD) || VXD_RLIMIT(res, VLIMIT_NSOCK)) vxlprintk(1, "vx_acc_cres[%5d,%s,%2d]: %5d%s (%p)", (vxi?vxi->vx_id:-1), vlimit_name[res], res, @@ -46,6 +47,12 @@ #define vx_files_dec(f) \ vx_acc_cres_cond((f)->f_xid,-1, (f), RLIMIT_NOFILE) +#define vx_openfd_inc(f) \ + vx_acc_cres(current->vx_info, 1, (f), RLIMIT_OPENFD) + +#define vx_openfd_dec(f) \ + vx_acc_cres(current->vx_info,-1, (f), RLIMIT_OPENFD) + #define vx_cres_avail(v,n,r) \ __vx_cres_avail((v), (r), (n), __FILE__, __LINE__) @@ -57,6 +64,7 @@ if (VXD_RLIMIT(res, RLIMIT_NOFILE) || VXD_RLIMIT(res, RLIMIT_NPROC) || + VXD_RLIMIT(res, RLIMIT_OPENFD) || VXD_RLIMIT(res, VLIMIT_NSOCK)) vxlprintk(1, "vx_cres_avail[%5d,%s,%2d]: %5ld > %5d + %5d", (vxi?vxi->vx_id:-1), vlimit_name[res], res, @@ -82,6 +90,9 @@ #define vx_files_avail(n) \ vx_cres_avail(current->vx_info, (n), RLIMIT_NOFILE) +#define vx_openfd_avail(n) \ + vx_cres_avail(current->vx_info, (n), RLIMIT_OPENFD) + /* socket limits */ diff -Nur linux-2.6.10-vs1.9.3.16/kernel/exit.c linux-2.6.10-vs1.9.3.16-openfd/kernel/exit.c --- linux-2.6.10-vs1.9.3.16/kernel/exit.c 2005-01-03 01:53:20.000000000 +0100 +++ linux-2.6.10-vs1.9.3.16-openfd/kernel/exit.c 2005-01-03 06:44:28.000000000 +0100 @@ -377,7 +377,7 @@ struct file * file = xchg(&files->fd[i], NULL); if (file) filp_close(file, files); - // vx_openfd_dec(i); + vx_openfd_dec(i); } i++; set >>= 1; diff -Nur linux-2.6.10-vs1.9.3.16/kernel/vserver/context.c linux-2.6.10-vs1.9.3.16-openfd/kernel/vserver/context.c --- linux-2.6.10-vs1.9.3.16/kernel/vserver/context.c 2005-01-03 01:53:20.000000000 +0100 +++ linux-2.6.10-vs1.9.3.16-openfd/kernel/vserver/context.c 2005-01-03 06:45:43.000000000 +0100 @@ -471,8 +471,6 @@ return total; } -#if 0 - static inline int vx_openfd_task(struct task_struct *tsk) { struct files_struct *files = tsk->files; @@ -491,8 +489,6 @@ return total; } -#endif - /* * migrate task to new context * gets vxi, puts old_vxi on change @@ -515,10 +511,10 @@ vxi->vx_id, atomic_read(&vxi->vx_usecnt)); if (!(ret = vx_migrate_user(p, vxi))) { - int nofiles; + int openfd, nofiles; task_lock(p); - // openfd = vx_openfd_task(p); + openfd = vx_openfd_task(p); nofiles = vx_nofiles_task(p); if (old_vxi) { @@ -527,14 +523,14 @@ atomic_dec(&old_vxi->limit.rcur[RLIMIT_NPROC]); /* FIXME: what about the struct files here? */ // atomic_sub(nofiles, &old_vxi->limit.rcur[RLIMIT_NOFILE]); - // atomic_sub(openfd, &old_vxi->limit.rcur[RLIMIT_OPENFD]); + atomic_sub(openfd, &old_vxi->limit.rcur[RLIMIT_OPENFD]); } atomic_inc(&vxi->cvirt.nr_threads); atomic_inc(&vxi->cvirt.nr_running); atomic_inc(&vxi->limit.rcur[RLIMIT_NPROC]); /* FIXME: what about the struct files here? */ // atomic_add(nofiles, &vxi->limit.rcur[RLIMIT_NOFILE]); - // atomic_add(openfd, &vxi->limit.rcur[RLIMIT_OPENFD]); + atomic_add(openfd, &vxi->limit.rcur[RLIMIT_OPENFD]); vxdprintk(VXD_CBIT(xid, 5), "moved task %p into vxi:%p[#%d]", diff -Nur linux-2.6.10-vs1.9.3.16/kernel/vserver/limit.c linux-2.6.10-vs1.9.3.16-openfd/kernel/vserver/limit.c --- linux-2.6.10-vs1.9.3.16/kernel/vserver/limit.c 2005-01-03 01:53:20.000000000 +0100 +++ linux-2.6.10-vs1.9.3.16-openfd/kernel/vserver/limit.c 2005-01-03 06:17:40.000000000 +0100 @@ -26,6 +26,7 @@ [RLIMIT_RSS] = "RSS", [RLIMIT_NPROC] = "NPROC", [RLIMIT_NOFILE] = "NOFILE", + [RLIMIT_OPENFD] = "OPENFD", [RLIMIT_MEMLOCK] = "VML", [RLIMIT_AS] = "VM", [RLIMIT_LOCKS] = "LOCKS", diff -Nur linux-2.6.10-vs1.9.3.16/kernel/vserver/limit_proc.h linux-2.6.10-vs1.9.3.16-openfd/kernel/vserver/limit_proc.h --- linux-2.6.10-vs1.9.3.16/kernel/vserver/limit_proc.h 2005-01-03 01:53:20.000000000 +0100 +++ linux-2.6.10-vs1.9.3.16-openfd/kernel/vserver/limit_proc.h 2005-01-03 07:16:52.000000000 +0100 @@ -33,12 +33,14 @@ "VML" VX_LIMIT_FMT "RSS" VX_LIMIT_FMT "FILES" VX_LIMIT_FMT + "OFD" VX_LIMIT_FMT "SOCK" VX_LIMIT_FMT VX_LIMIT_ARG(RLIMIT_NPROC) VX_LIMIT_ARG(RLIMIT_AS) VX_LIMIT_ARG(RLIMIT_MEMLOCK) VX_LIMIT_ARG(RLIMIT_RSS) VX_LIMIT_ARG(RLIMIT_NOFILE) + VX_LIMIT_ARG(RLIMIT_OPENFD) VX_LIMIT_ARG(VLIMIT_NSOCK) ); }