diff -NurpP --minimal linux-2.6.16.11-vs2.1.1-rc18.8.1/fs/dcache.c linux-2.6.16.11-vs2.1.1-rc18.9.1/fs/dcache.c --- linux-2.6.16.11-vs2.1.1-rc18.8.1/fs/dcache.c 2006-05-01 00:53:05 +0200 +++ linux-2.6.16.11-vs2.1.1-rc18.9.1/fs/dcache.c 2006-05-02 02:11:32 +0200 @@ -33,6 +33,7 @@ #include #include #include +#include /* #define DCACHE_DEBUG 1 */ @@ -162,6 +163,8 @@ repeat: return; } + vx_dentry_dec(dentry); + /* * AV: ->d_delete() is _NOT_ allowed to block now. */ @@ -272,6 +275,7 @@ static inline struct dentry * __dget_loc if (!list_empty(&dentry->d_lru)) { dentry_stat.nr_unused--; list_del_init(&dentry->d_lru); + vx_dentry_inc(dentry); } return dentry; @@ -716,6 +720,9 @@ struct dentry *d_alloc(struct dentry * p struct dentry *dentry; char *dname; + if (!vx_dentry_avail(1)) + return NULL; + dentry = kmem_cache_alloc(dentry_cache, GFP_KERNEL); if (!dentry) return NULL; @@ -764,6 +771,7 @@ struct dentry *d_alloc(struct dentry * p if (parent) list_add(&dentry->d_u.d_child, &parent->d_subdirs); dentry_stat.nr_dentry++; + vx_dentry_inc(dentry); spin_unlock(&dcache_lock); return dentry; @@ -1091,6 +1099,7 @@ struct dentry * __d_lookup(struct dentry if (!d_unhashed(dentry)) { atomic_inc(&dentry->d_count); + vx_dentry_inc(dentry); found = dentry; } spin_unlock(&dentry->d_lock); diff -NurpP --minimal linux-2.6.16.11-vs2.1.1-rc18.8.1/include/linux/vs_limit.h linux-2.6.16.11-vs2.1.1-rc18.9.1/include/linux/vs_limit.h --- linux-2.6.16.11-vs2.1.1-rc18.8.1/include/linux/vs_limit.h 2006-04-26 19:07:00 +0200 +++ linux-2.6.16.11-vs2.1.1-rc18.9.1/include/linux/vs_limit.h 2006-05-02 02:10:17 +0200 @@ -50,6 +50,7 @@ #define vx_openfd_dec(f) \ vx_acc_cres(current->vx_info,-1, (void *)(long)(f), VLIMIT_OPENFD) + #define vx_cres_avail(v,n,r) \ __vx_cres_avail(v, r, n, __FILE__, __LINE__) @@ -67,6 +68,22 @@ vx_cres_avail(current->vx_info, n, VLIMIT_OPENFD) +/* dentry limits */ + +#define vx_dentry_inc(d) do { \ + if (atomic_read(&d->d_count) == 1) \ + vx_acc_cres(current->vx_info, 1, d, VLIMIT_DENTRY); \ + } while (0) + +#define vx_dentry_dec(d) do { \ + if (atomic_read(&d->d_count) == 0) \ + vx_acc_cres(current->vx_info,-1, d, VLIMIT_DENTRY); \ + } while (0) + +#define vx_dentry_avail(n) \ + vx_cres_avail(current->vx_info, n, VLIMIT_DENTRY) + + /* socket limits */ #define vx_sock_inc(s) \ diff -NurpP --minimal linux-2.6.16.11-vs2.1.1-rc18.8.1/include/linux/vserver/limit.h linux-2.6.16.11-vs2.1.1-rc18.9.1/include/linux/vserver/limit.h --- linux-2.6.16.11-vs2.1.1-rc18.8.1/include/linux/vserver/limit.h 2006-04-26 19:07:00 +0200 +++ linux-2.6.16.11-vs2.1.1-rc18.9.1/include/linux/vserver/limit.h 2006-05-02 02:06:16 +0200 @@ -8,6 +8,7 @@ #define VLIMIT_SHMEM 19 #define VLIMIT_SEMARY 20 #define VLIMIT_NSEMS 21 +#define VLIMIT_DENTRY 22 #ifdef __KERNEL__ diff -NurpP --minimal linux-2.6.16.11-vs2.1.1-rc18.8.1/kernel/vserver/limit.c linux-2.6.16.11-vs2.1.1-rc18.9.1/kernel/vserver/limit.c --- linux-2.6.16.11-vs2.1.1-rc18.8.1/kernel/vserver/limit.c 2006-04-29 02:58:07 +0200 +++ linux-2.6.16.11-vs2.1.1-rc18.9.1/kernel/vserver/limit.c 2006-05-02 02:12:38 +0200 @@ -35,6 +35,7 @@ const char *vlimit_name[NUM_LIMITS] = { [VLIMIT_OPENFD] = "OPENFD", [VLIMIT_ANON] = "ANON", [VLIMIT_SHMEM] = "SHMEM", + [VLIMIT_DENTRY] = "DENTRY", }; EXPORT_SYMBOL_GPL(vlimit_name); @@ -57,6 +58,7 @@ static int is_valid_rlimit(int id) case VLIMIT_OPENFD: case VLIMIT_ANON: case VLIMIT_SHMEM: + case VLIMIT_DENTRY: valid = 1; break; } @@ -206,6 +208,7 @@ int vc_get_rlimit_mask(uint32_t id, void (1 << RLIMIT_LOCKS) | (1 << RLIMIT_AS) | (1 << VLIMIT_ANON) | + (1 << VLIMIT_DENTRY) | 0 }; diff -NurpP --minimal linux-2.6.16.11-vs2.1.1-rc18.8.1/kernel/vserver/limit_proc.h linux-2.6.16.11-vs2.1.1-rc18.9.1/kernel/vserver/limit_proc.h --- linux-2.6.16.11-vs2.1.1-rc18.8.1/kernel/vserver/limit_proc.h 2006-04-26 19:07:00 +0200 +++ linux-2.6.16.11-vs2.1.1-rc18.9.1/kernel/vserver/limit_proc.h 2006-05-02 02:06:16 +0200 @@ -48,6 +48,7 @@ static inline int vx_info_proc_limit(str "SHM" VX_LIMIT_FMT "SEMA" VX_LIMIT_FMT "SEMS" VX_LIMIT_FMT + "DENT" VX_LIMIT_FMT VX_LIMIT_ARG(RLIMIT_NPROC) VX_LIMIT_ARG(RLIMIT_AS) VX_LIMIT_ARG(RLIMIT_MEMLOCK) @@ -61,6 +62,7 @@ static inline int vx_info_proc_limit(str VX_LIMIT_ARG(VLIMIT_SHMEM) VX_LIMIT_ARG(VLIMIT_SEMARY) VX_LIMIT_ARG(VLIMIT_NSEMS) + VX_LIMIT_ARG(VLIMIT_DENTRY) ); }