[Ocfs2-commits] mfasheh commits r778 - in trunk/src: . inc
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Tue Mar 16 18:33:59 CST 2004
Author: mfasheh
Date: 2004-03-16 18:33:58 -0600 (Tue, 16 Mar 2004)
New Revision: 778
Modified:
trunk/src/inc/ocfs.h
trunk/src/inode.c
trunk/src/namei.c
trunk/src/super.c
Log:
* include a patch by Rusty Lynch <rusty at linux.co.intel.com>:
Here is a patch that stores the inode private data as you talked about above.
There is a little more complexity because you have to handle the cases where:
* new inodes are created via ocfs_mknod and ocfs_symlink, and we need to
start setting private data before ocfs_populate_inode
* reading the root inode in ocfs_read_inode2 (2.4 kernel) or
ocfs_read_locked_inode (2.6 kernel) where we just directly populate the
inode and do not call ocfs_populate_inode()
There is really no difference between a 2.4 and 2.6 build (other then where
to put the code for reading the root inode.)
Modified: trunk/src/inc/ocfs.h
===================================================================
--- trunk/src/inc/ocfs.h 2004-03-15 21:48:08 UTC (rev 777)
+++ trunk/src/inc/ocfs.h 2004-03-17 00:33:58 UTC (rev 778)
@@ -239,11 +239,9 @@
__u8 deleted; /* this can be a generic flags field later */
} ocfs_inode_private;
-#define CLEAN_SEQ_OFF ((unsigned long)(&((ocfs_inode_private *)0)->i_clean_buffer_seq))
-#define INODE_PRIVATE_OFF ((unsigned long)(&((struct inode *)0)->u.generic_ip))
-#define GET_INODE_CLEAN_SEQ(i) (atomic_t *)(((unsigned long)i) + INODE_PRIVATE_OFF + CLEAN_SEQ_OFF)
+#define GET_INODE_CLEAN_SEQ(i) (atomic_t *)(&(OCFS_GENERIC_IP(i)->i_clean_buffer_seq))
-#define OCFS_GENERIC_IP(i) ((ocfs_inode_private *)(&(i->u.generic_ip)))
+#define OCFS_GENERIC_IP(i) ((ocfs_inode_private *)(i->u.generic_ip))
#define inode_data_is_oin(i) (OCFS_GENERIC_IP(i)->generic_ip != NULL)
@@ -2081,6 +2079,7 @@
ocfs_obj_id obj_id;
ocfs_sem res;
struct list_head osb_next; /* List of all volumes */
+ kmem_cache_t *inode_cache;
kmem_cache_t *oin_cache;
kmem_cache_t *ofile_cache;
kmem_cache_t *fe_cache;
Modified: trunk/src/inode.c
===================================================================
--- trunk/src/inode.c 2004-03-15 21:48:08 UTC (rev 777)
+++ trunk/src/inode.c 2004-03-17 00:33:58 UTC (rev 778)
@@ -251,6 +251,15 @@
BUG();
}
+ if (!inode->u.generic_ip)
+ inode->u.generic_ip = kmem_cache_alloc(OcfsGlobalCtxt.inode_cache,
+ GFP_NOFS);
+ if (!inode->u.generic_ip) {
+ /* How can we recover gracefully? */
+ LOG_ERROR_STR("unable to allocate private data for inode");
+ goto bail;
+ }
+
OCFS_SET_INODE_DEV(sb, inode);
inode->i_mode = mode;
inode->i_uid = fe->uid;
@@ -306,6 +315,7 @@
break;
}
+ bail:
LOG_EXIT ();
return;
} /* ocfs_populate_inode */
@@ -337,6 +347,13 @@
LOG_TRACE_ARGS("osb = %x\n", osb);
if (inode->i_ino == OCFS_ROOT_INODE_NUMBER) {
LOG_TRACE_ARGS("Populating root inode (i_ino = %lu)\n", inode->i_ino);
+ inode->u.generic_ip = kmem_cache_alloc(OcfsGlobalCtxt.inode_cache, GFP_NOFS);
+ if (!inode->u.generic_ip) {
+ /* How can we recover gracefully? */
+ LOG_ERROR_STR("unable to allocate private data for inode");
+ goto bail;
+ }
+
inode->i_mode = S_IFDIR | osb->vol_layout.prot_bits;
inode->i_blksize = 512; /* TODO: fix */
inode->i_blkbits = 9;
@@ -434,6 +451,13 @@
sb = inode->i_sb;
osb = (ocfs_super *) OCFS_GENERIC_SB_P(sb);
if (inode->i_ino == OCFS_ROOT_INODE_NUMBER) {
+ inode->u.generic_ip = kmem_cache_alloc(OcfsGlobalCtxt.inode_cache, GFP_NOFS);
+ if (!inode->u.generic_ip) {
+ /* How can we recover gracefully? */
+ LOG_ERROR_STR("unable to allocate private data for inode");
+ goto bail;
+ }
+
inode->i_mode = S_IFDIR | osb->vol_layout.prot_bits;
inode->i_blksize = (__u32) osb->vol_layout.cluster_size;
inode->i_size = OCFS_DEFAULT_DIR_NODE_SIZE;
@@ -745,24 +769,14 @@
LOG_TRACE_STR ("inode with oin : clear inode");
oin = GET_INODE_OIN(inode);
- if (oin == osb->oin_root_dir) {
- LOG_TRACE_STR("this is the root inode, doing "
- "cleanup now!");
- ocfs_sync_blockdev(inode->i_sb);
- LOG_TRACE_STR ("syncing past root inode");
- LOG_TRACE_STR ("calling dismount");
- ocfs_dismount_volume (inode->i_sb);
- goto bail;
- } else
+ if (oin != osb->oin_root_dir)
BUG();
-
- ocfs_extent_map_destroy (&oin->map);
- ocfs_extent_map_init (&oin->map);
-
- ocfs_release_cached_oin (osb, oin);
- ocfs_release_oin (oin, true);
- oin = NULL;
- LOG_TRACE_STR ("yeah! done with deallocs!");
+
+ LOG_TRACE_STR("this is the root inode, doing cleanup now!");
+ ocfs_sync_blockdev(inode->i_sb);
+ LOG_TRACE_STR ("syncing past root inode");
+ LOG_TRACE_STR ("calling dismount");
+ ocfs_dismount_volume (inode->i_sb);
} else {
if (!ocfs_lookup_sector_node (osb, offset, &lockres)) {
if (lockres) {
@@ -780,6 +794,9 @@
}
}
+ if (inode->u.generic_ip)
+ kmem_cache_free(OcfsGlobalCtxt.inode_cache,
+ inode->u.generic_ip);
bail:
LOG_EXIT ();
return;
Modified: trunk/src/namei.c
===================================================================
--- trunk/src/namei.c 2004-03-15 21:48:08 UTC (rev 777)
+++ trunk/src/namei.c 2004-03-17 00:33:58 UTC (rev 778)
@@ -195,7 +195,13 @@
LOG_ERROR_STR("new_inode failed!");
goto leave;
}
-
+
+ inode->u.generic_ip = kmem_cache_alloc(OcfsGlobalCtxt.inode_cache, GFP_NOFS);
+ if (!inode->u.generic_ip) {
+ LOG_ERROR_STATUS(status = -ENOMEM);
+ goto leave;
+ }
+
/* need the offset of our parent directory to lock it */
if (!ocfs_linux_get_inode_offset (dir, &parent_off, NULL)) {
LOG_ERROR_STATUS (status = -ENOENT);
@@ -1342,6 +1348,13 @@
LOG_ERROR_STR("new_inode failed!");
goto bail;
}
+
+ inode->u.generic_ip = kmem_cache_alloc(OcfsGlobalCtxt.inode_cache, GFP_NOFS);
+ if (!inode->u.generic_ip) {
+ LOG_ERROR_STATUS(status = -ENOMEM);
+ goto bail;
+ }
+
//atomic_set(GET_INODE_CLEAN_SEQ(inode), atomic_read(&osb->clean_buffer_seq));
parentInode = dentry->d_parent->d_inode;
Modified: trunk/src/super.c
===================================================================
--- trunk/src/super.c 2004-03-15 21:48:08 UTC (rev 777)
+++ trunk/src/super.c 2004-03-17 00:33:58 UTC (rev 778)
@@ -782,12 +782,30 @@
}
#endif
+static void ocfs_inode_init_once(void *p, kmem_cache_t *cachep,
+ unsigned long flags)
+{
+ ocfs_inode_private *i = (ocfs_inode_private *) p;
+
+ if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
+ SLAB_CTOR_CONSTRUCTOR) {
+ i->generic_ip = NULL;
+ i->voteoff = 0;
+ i->feoff = 0;
+ atomic_set(&i->i_clean_buffer_seq, 0);
+ }
+}
+
/*
* ocfs_initialize_mem_lists()
*
*/
static int ocfs_initialize_mem_lists (void)
{
+ OcfsGlobalCtxt.inode_cache = kmem_cache_create("ocfs2_inode",
+ sizeof(ocfs_inode_private), 0, SLAB_NO_REAP | SLAB_HWCACHE_ALIGN,
+ ocfs_inode_init_once, NULL);
+
OcfsGlobalCtxt.oin_cache = kmem_cache_create ("ocfs2_oin",
sizeof (ocfs_inode) + OCFS_POINTER_SIZE, 0, SLAB_NO_REAP | SLAB_HWCACHE_ALIGN,
NULL, NULL);
@@ -826,6 +844,7 @@
*/
static void ocfs_free_mem_lists (void)
{
+ kmem_cache_destroy (OcfsGlobalCtxt.inode_cache);
kmem_cache_destroy (OcfsGlobalCtxt.oin_cache);
kmem_cache_destroy (OcfsGlobalCtxt.ofile_cache);
kmem_cache_destroy (OcfsGlobalCtxt.fe_cache);
More information about the Ocfs2-commits
mailing list