mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* PATCH 2.5.2.9: ext2 unbork fs.h (part 6/7)
@ 2002-01-07 13:21 Jeff Garzik
  0 siblings, 0 replies; only message in thread
From: Jeff Garzik @ 2002-01-07 13:21 UTC (permalink / raw)
  To: torvalds, viro, phillips; +Cc: linux-kernel, linux-fsdevel, ext2-devel

patch6 desc: add sb->s_op->{alloc,destroy}_inode to VFS API



diff -Naur -X /g/g/lib/dontdiff linux-fs5/fs/Makefile linux-fs6/fs/Makefile
--- linux-fs5/fs/Makefile	Fri Nov 30 01:39:02 2001
+++ linux-fs6/fs/Makefile	Mon Jan  7 08:43:30 2002
@@ -7,7 +7,7 @@
 
 O_TARGET := fs.o
 
-export-objs :=	filesystems.o open.o dcache.o buffer.o bio.o
+export-objs :=	filesystems.o open.o dcache.o buffer.o bio.o inode.o
 mod-subdirs :=	nls
 
 obj-y :=	open.o read_write.o devices.o file_table.o buffer.o \
diff -Naur -X /g/g/lib/dontdiff linux-fs5/fs/inode.c linux-fs6/fs/inode.c
--- linux-fs5/fs/inode.c	Sun Jan  6 23:29:19 2002
+++ linux-fs6/fs/inode.c	Mon Jan  7 12:37:41 2002
@@ -5,6 +5,7 @@
  */
 
 #include <linux/config.h>
+#include <linux/module.h>
 #include <linux/fs.h>
 #include <linux/string.h>
 #include <linux/mm.h>
@@ -75,12 +76,25 @@
 
 static kmem_cache_t * inode_cachep;
 
-#define alloc_inode() \
-	 ((struct inode *) kmem_cache_alloc(inode_cachep, SLAB_KERNEL))
+static struct inode *alloc_inode (struct super_block *sb)
+{
+	if (sb && sb->s_op && sb->s_op->alloc_inode)
+		return sb->s_op->alloc_inode(sb);
+
+	return kmem_cache_alloc(inode_cachep, SLAB_NOFS);
+}
+
 static void destroy_inode(struct inode *inode) 
 {
 	if (inode_has_buffers(inode))
 		BUG();
+
+	if (inode && inode->i_sb && inode->i_sb->s_op &&
+	    inode->i_sb->s_op->destroy_inode) {
+		inode->i_sb->s_op->destroy_inode(inode);
+		return;
+	}
+
 	kmem_cache_free(inode_cachep, (inode));
 }
 
@@ -90,7 +104,7 @@
  * once, because the fields are idempotent across use
  * of the inode, so let the slab aware of that.
  */
-static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags)
+void inode_init_once(void * foo, kmem_cache_t * cachep, unsigned long flags)
 {
 	struct inode * inode = (struct inode *) foo;
 
@@ -112,6 +126,7 @@
 		spin_lock_init(&inode->i_data.i_shared_lock);
 	}
 }
+EXPORT_SYMBOL(inode_init_once);
 
 /*
  * Put the inode on the super block's dirty list.
@@ -780,7 +795,12 @@
 	static struct address_space_operations empty_aops;
 	static struct inode_operations empty_iops;
 	static struct file_operations empty_fops;
-	memset(&inode->u, 0, sizeof(inode->u));
+
+	/* special case, 'u' may have been cleared/reset elsewhere */
+	if (!inode->i_sb || !inode->i_sb->s_op ||
+	    !inode->i_sb->s_op->alloc_inode)
+		memset(&inode->u, 0, sizeof(inode->u));
+
 	inode->i_sock = 0;
 	inode->i_op = &empty_iops;
 	inode->i_fop = &empty_fops;
@@ -812,22 +832,22 @@
  * lists.
  */
  
-struct inode * get_empty_inode(void)
+struct inode * get_empty_inode(struct super_block *sb)
 {
 	static unsigned long last_ino;
 	struct inode * inode;
 
 	spin_lock_prefetch(&inode_lock);
 	
-	inode = alloc_inode();
+	inode = alloc_inode(sb);
 	if (inode)
 	{
 		spin_lock(&inode_lock);
 		inodes_stat.nr_inodes++;
 		list_add(&inode->i_list, &inode_in_use);
-		inode->i_sb = NULL;
-		inode->i_dev = NODEV;
-		inode->i_blkbits = 0;
+		inode->i_sb = sb;
+                inode->i_dev = sb ? sb->s_dev : NODEV;
+                inode->i_blkbits = sb ? sb->s_blocksize_bits : 0;
 		inode->i_ino = ++last_ino;
 		inode->i_flags = 0;
 		atomic_set(&inode->i_count, 1);
@@ -848,7 +868,7 @@
 {
 	struct inode * inode;
 
-	inode = alloc_inode();
+	inode = alloc_inode(sb);
 	if (inode) {
 		struct inode * old;
 
@@ -1178,7 +1198,7 @@
 
 	/* inode slab cache */
 	inode_cachep = kmem_cache_create("inode_cache", sizeof(struct inode),
-					 0, SLAB_HWCACHE_ALIGN, init_once,
+					 0, SLAB_HWCACHE_ALIGN, inode_init_once,
 					 NULL);
 	if (!inode_cachep)
 		panic("cannot create inode slab cache");
diff -Naur -X /g/g/lib/dontdiff linux-fs5/include/linux/fs.h linux-fs6/include/linux/fs.h
--- linux-fs5/include/linux/fs.h	Mon Jan  7 07:50:01 2002
+++ linux-fs6/include/linux/fs.h	Mon Jan  7 07:50:14 2002
@@ -885,6 +885,8 @@
 	int (*remount_fs) (struct super_block *, int *, char *);
 	void (*clear_inode) (struct inode *);
 	void (*umount_begin) (struct super_block *);
+	struct inode * (*alloc_inode) (struct super_block *);
+	void (*destroy_inode) (struct inode *);
 
 	/* Following are for knfsd to interact with "interesting" filesystems
 	 * Currently just reiserfs, but possibly FAT and others later
@@ -1345,17 +1347,11 @@
 }
 
 extern void clear_inode(struct inode *);
-extern struct inode * get_empty_inode(void);
+extern struct inode * get_empty_inode(struct super_block *);
 
 static inline struct inode * new_inode(struct super_block *sb)
 {
-	struct inode *inode = get_empty_inode();
-	if (inode) {
-		inode->i_sb = sb;
-		inode->i_dev = sb->s_dev;
-		inode->i_blkbits = sb->s_blocksize_bits;
-	}
-	return inode;
+	return get_empty_inode(sb);
 }
 extern void remove_suid(struct inode *inode);
 
diff -Naur -X /g/g/lib/dontdiff linux-fs5/net/socket.c linux-fs6/net/socket.c
--- linux-fs5/net/socket.c	Wed Oct 17 21:38:28 2001
+++ linux-fs6/net/socket.c	Mon Jan  7 07:47:31 2002
@@ -440,7 +440,7 @@
 	struct inode * inode;
 	struct socket * sock;
 
-	inode = get_empty_inode();
+	inode = get_empty_inode(NULL);
 	if (!inode)
 		return NULL;
 

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2002-01-07 13:32 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-01-07 13:21 PATCH 2.5.2.9: ext2 unbork fs.h (part 6/7) Jeff Garzik

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®