Re: [patch] Re: recent names_cachep change

From: Tigran Aivazian (tigran@veritas.com)
Date: Thu Jul 27 2000 - 18:21:38 EST


On Thu, 27 Jul 2000, Tigran Aivazian wrote:
[buggy patch that breaks dquota]

Sorry, I already went to bed but (in a dream?) saw a dquot_init_hash()
which was only half-done so I jumped out of bed and quickly fixed it. See
below:

diff -urN -X dontdiff linux/fs/buffer.c vfscache/fs/buffer.c
--- linux/fs/buffer.c Thu Jul 27 07:31:19 2000
+++ vfscache/fs/buffer.c Thu Jul 27 23:09:40 2000
@@ -92,8 +92,6 @@
 };
 static struct bh_free_head free_list[NR_SIZES];
 
-kmem_cache_t *bh_cachep;
-
 static int grow_buffers(int size);
 static void __refile_buffer(struct buffer_head *);
 
@@ -2302,12 +2300,6 @@
         for(i = 0; i < NR_LIST; i++)
                 lru_list[i] = NULL;
 
- bh_cachep = kmem_cache_create("buffer_head",
- sizeof(struct buffer_head),
- 0,
- SLAB_HWCACHE_ALIGN, NULL, NULL);
- if(!bh_cachep)
- panic("Cannot create buffer head SLAB cache\n");
 }
 
 
diff -urN -X dontdiff linux/fs/dcache.c vfscache/fs/dcache.c
--- linux/fs/dcache.c Fri Jul 14 20:52:15 2000
+++ vfscache/fs/dcache.c Thu Jul 27 23:16:20 2000
@@ -1168,7 +1168,7 @@
         return ino;
 }
 
-void __init dcache_init(unsigned long mempages)
+static void __init dcache_init(unsigned long mempages)
 {
         struct list_head *d;
         unsigned long order;
@@ -1225,4 +1225,56 @@
                 d++;
                 i--;
         } while (i);
+}
+
+/* SLAB cache for __getname() consumers */
+kmem_cache_t *names_cachep;
+
+/* SLAB cache for files_struct structures */
+kmem_cache_t *files_cachep;
+
+/* SLAB cache for file structures */
+kmem_cache_t *filp_cachep;
+
+/* SLAB cache for dquot structures */
+kmem_cache_t *dquot_cachep;
+
+/* SLAB cache for buffer_head structures */
+kmem_cache_t *bh_cachep;
+
+void __init vfs_caches_init(unsigned long mempages)
+{
+ bh_cachep = kmem_cache_create("buffer_head",
+ sizeof(struct buffer_head), 0,
+ SLAB_HWCACHE_ALIGN, NULL, NULL);
+ if(!bh_cachep)
+ panic("Cannot create buffer head SLAB cache\n");
+
+ names_cachep = kmem_cache_create("names_cache",
+ PAGE_SIZE, 0,
+ SLAB_HWCACHE_ALIGN, NULL, NULL);
+ if (!names_cachep)
+ panic("Cannot create names SLAB cache");
+
+ files_cachep = kmem_cache_create("files_cache",
+ sizeof(struct files_struct), 0,
+ SLAB_HWCACHE_ALIGN, NULL, NULL);
+ if (!files_cachep)
+ panic("Cannot create files SLAB cache");
+
+ filp_cachep = kmem_cache_create("filp",
+ sizeof(struct file), 0,
+ SLAB_HWCACHE_ALIGN, NULL, NULL);
+ if(!filp_cachep)
+ panic("Cannot create filp SLAB cache");
+
+#if defined (CONFIG_QUOTA)
+ dquot_cachep = kmem_cache_create("dquot",
+ sizeof(struct dquot), sizeof(unsigned long) * 4,
+ SLAB_HWCACHE_ALIGN, NULL, NULL);
+ if (!dquot_cachep)
+ panic("Cannot create dquot SLAB cache");
+#endif
+
+ dcache_init(mempages);
 }
diff -urN -X dontdiff linux/fs/dquot.c vfscache/fs/dquot.c
--- linux/fs/dquot.c Thu Jul 27 07:31:19 2000
+++ vfscache/fs/dquot.c Thu Jul 27 22:55:48 2000
@@ -64,8 +64,6 @@
 static char quotamessage[MAX_QUOTA_MESSAGE];
 static char *quotatypes[] = INITQFNAMES;
 
-static kmem_cache_t *dquot_cachep;
-
 static inline struct quota_mount_options *sb_dqopt(struct super_block *sb)
 {
         return &sb->s_dquot;
@@ -1344,13 +1342,6 @@
 void __init dquot_init_hash(void)
 {
         printk(KERN_NOTICE "VFS: Diskquotas version %s initialized\n", __DQUOT_VERSION__);
-
- dquot_cachep = kmem_cache_create("dquot", sizeof(struct dquot),
- sizeof(unsigned long) * 4,
- SLAB_HWCACHE_ALIGN, NULL, NULL);
-
- if (!dquot_cachep)
- panic("Cannot create dquot SLAB cache\n");
 
         memset(dquot_hash, 0, sizeof(dquot_hash));
         memset((caddr_t)&dqstats, 0, sizeof(dqstats));
diff -urN -X dontdiff linux/fs/file_table.c vfscache/fs/file_table.c
--- linux/fs/file_table.c Thu Jul 27 07:31:19 2000
+++ vfscache/fs/file_table.c Thu Jul 27 23:15:52 2000
@@ -12,9 +12,6 @@
 #include <linux/module.h>
 #include <linux/smp_lock.h>
 
-/* SLAB cache for filp's. */
-static kmem_cache_t *filp_cache;
-
 /* sysctl tunables... */
 struct files_stat_struct files_stat = {0, 0, NR_FILE};
 
@@ -25,20 +22,6 @@
 /* public *and* exported. Not pretty! */
 spinlock_t files_lock = SPIN_LOCK_UNLOCKED;
 
-void __init file_table_init(void)
-{
- filp_cache = kmem_cache_create("filp", sizeof(struct file),
- 0,
- SLAB_HWCACHE_ALIGN, NULL, NULL);
- if(!filp_cache)
- panic("VFS: Cannot alloc filp SLAB cache.");
- /*
- * We could allocate the reserved files here, but really
- * shouldn't need to: the normal boot process will create
- * plenty of free files.
- */
-}
-
 /* Find an unused file structure and return a pointer to it.
  * Returns NULL, if there are no more free file structures or
  * we run out of memory.
@@ -78,7 +61,7 @@
          */
         if (files_stat.nr_files < files_stat.max_files) {
                 file_list_unlock();
- f = kmem_cache_alloc(filp_cache, SLAB_KERNEL);
+ f = kmem_cache_alloc(filp_cachep, SLAB_KERNEL);
                 file_list_lock();
                 if (f) {
                         files_stat.nr_files++;
diff -urN -X dontdiff linux/fs/namei.c vfscache/fs/namei.c
--- linux/fs/namei.c Thu Jul 27 07:31:19 2000
+++ vfscache/fs/namei.c Thu Jul 27 22:41:14 2000
@@ -1954,20 +1954,3 @@
         readlink: page_readlink,
         follow_link: page_follow_link,
 };
-
-/* SLAB cache for name blocks */
-kmem_cache_t *names_cachep;
-
-static int __init namecache_init(void)
-{
- names_cachep = kmem_cache_create("names_cache",
- PAGE_SIZE,
- 0,
- SLAB_HWCACHE_ALIGN,
- NULL, NULL);
- if (!names_cachep)
- panic("Cannot create names cache");
- return 0;
-}
-
-module_init(namecache_init)
diff -urN -X dontdiff linux/include/linux/fs.h vfscache/include/linux/fs.h
--- linux/include/linux/fs.h Thu Jul 27 07:31:21 2000
+++ vfscache/include/linux/fs.h Thu Jul 27 23:11:42 2000
@@ -193,8 +193,6 @@
 
 extern void buffer_init(unsigned long);
 extern void inode_init(unsigned long);
-extern void file_table_init(void);
-extern void dcache_init(unsigned long);
 
 /* bh state bits */
 #define BH_Uptodate 0 /* 1 if the buffer contains valid data */
@@ -881,6 +879,9 @@
 extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
 extern int filp_close(struct file *, fl_owner_t id);
 extern char * getname(const char *);
+
+/* fs/dcache.c */
+extern void vfs_caches_init(unsigned long);
 
 #define __getname() kmem_cache_alloc(names_cachep, SLAB_KERNEL)
 #define putname(name) kmem_cache_free(names_cachep, (void *)(name))
diff -urN -X dontdiff linux/include/linux/slab.h vfscache/include/linux/slab.h
--- linux/include/linux/slab.h Thu Jul 27 07:31:21 2000
+++ vfscache/include/linux/slab.h Thu Jul 27 23:11:44 2000
@@ -69,6 +69,10 @@
 extern kmem_cache_t *vm_area_cachep;
 extern kmem_cache_t *mm_cachep;
 extern kmem_cache_t *names_cachep;
+extern kmem_cache_t *files_cachep;
+extern kmem_cache_t *filp_cachep;
+extern kmem_cache_t *dquot_cachep;
+extern kmem_cache_t *bh_cachep;
 
 #endif /* __KERNEL__ */
 
diff -urN -X dontdiff linux/init/main.c vfscache/init/main.c
--- linux/init/main.c Thu Jul 27 07:31:21 2000
+++ vfscache/init/main.c Fri Jul 28 00:16:48 2000
@@ -92,7 +92,6 @@
 extern void sbus_init(void);
 extern void ppc_init(void);
 extern void sysctl_init(void);
-extern void filescache_init(void);
 extern void signals_init(void);
 extern void bdev_init(void);
 extern int init_pcmcia_ds(void);
@@ -563,8 +562,7 @@
         mempages = num_physpages;
 
         fork_init(mempages);
- filescache_init();
- dcache_init(mempages);
+ vfs_caches_init(mempages);
         vma_init();
         buffer_init(mempages);
         page_cache_init(mempages);
@@ -572,7 +570,6 @@
         signals_init();
         bdev_init();
         inode_init(mempages);
- file_table_init();
 #if defined(CONFIG_SYSVIPC)
         ipc_init();
 #endif
diff -urN -X dontdiff linux/kernel/exit.c vfscache/kernel/exit.c
--- linux/kernel/exit.c Tue Jul 11 19:26:51 2000
+++ vfscache/kernel/exit.c Thu Jul 27 22:46:23 2000
@@ -180,8 +180,6 @@
         }
 }
 
-extern kmem_cache_t *files_cachep;
-
 void put_files_struct(struct files_struct *files)
 {
         if (atomic_dec_and_test(&files->count)) {
diff -urN -X dontdiff linux/kernel/fork.c vfscache/kernel/fork.c
--- linux/kernel/fork.c Thu Jul 27 07:31:21 2000
+++ vfscache/kernel/fork.c Thu Jul 27 22:46:47 2000
@@ -35,9 +35,6 @@
 /* SLAB cache for mm_struct's. */
 kmem_cache_t *mm_cachep;
 
-/* SLAB cache for files structs */
-kmem_cache_t *files_cachep;
-
 struct task_struct *pidhash[PIDHASH_SZ];
 
 /* UID task count cache, to prevent walking entire process list every
@@ -809,15 +806,4 @@
 bad_fork_free:
         free_task_struct(p);
         goto bad_fork;
-}
-
-void __init filescache_init(void)
-{
- files_cachep = kmem_cache_create("files_cache",
- sizeof(struct files_struct),
- 0,
- SLAB_HWCACHE_ALIGN,
- NULL, NULL);
- if (!files_cachep)
- panic("Cannot create files cache");
 }
diff -urN -X dontdiff linux/mm/highmem.c vfscache/mm/highmem.c
--- linux/mm/highmem.c Thu Jul 27 07:31:21 2000
+++ vfscache/mm/highmem.c Thu Jul 27 23:07:44 2000
@@ -240,8 +240,6 @@
  * This will be moved to the block layer in 2.5.
  */
 
-extern kmem_cache_t *bh_cachep;
-
 static inline void copy_from_high_bh (struct buffer_head *to,
                          struct buffer_head *from)
 {

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Jul 31 2000 - 21:00:25 EST