[Ocfs2-commits] rev 762 - in trunk/src: . inc
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Fri Mar 5 18:16:15 CST 2004
Author: mfasheh
Date: 2004-03-05 18:16:13 -0600 (Fri, 05 Mar 2004)
New Revision: 762
Modified:
trunk/src/inc/ocfs.h
trunk/src/inc/proto.h
trunk/src/osb.c
trunk/src/sysfile.c
Log:
* On first mount, create an orphaned inodes directory in the system
file area for each node. In the future, if we ever decide to do posix
style deletes, this will be useful.
Modified: trunk/src/inc/ocfs.h
===================================================================
--- trunk/src/inc/ocfs.h 2004-03-06 00:03:53 UTC (rev 761)
+++ trunk/src/inc/ocfs.h 2004-03-06 00:16:13 UTC (rev 762)
@@ -308,6 +308,7 @@
#define OCFS_FILE_EXTENT_BITMAP_FILENAME "ExtentBitMapFile"
#define OCFS_RECOVER_LOG_FILENAME "RecoverLogFile"
#define OCFS_CLEANUP_LOG_FILENAME "CleanUpLogFile"
+#define OCFS_ORPHAN_DIR_FILENAME "OrphanDir"
#define ONE_SECOND (10 * 1000 * 1000) /* 100 nanosec unit */
#define ONE_MILLI_SEC (10 * 1000) /* 100 nanosec unit */
@@ -368,7 +369,7 @@
OCFS_RECOVER_LOG_SYSFILE,
OCFS_CLEANUP_LOG_SYSFILE,
OCFS_VOL_BM_SYSFILE,
- OCFS_VOL_BM,
+ OCFS_ORPHAN_DIR_SYSFILE,
OCFS_NUM_SYSFILES
};
#define OCFS_FILE_VOL_META_DATA (OCFS_VOL_MD_SYSFILE * OCFS_MAXIMUM_NODES)
@@ -381,8 +382,7 @@
#define CLEANUP_FILE_BASE_ID (OCFS_CLEANUP_LOG_SYSFILE * OCFS_MAXIMUM_NODES)
#define JOURNAL_FILE_BASE_ID (CLEANUP_FILE_BASE_ID)
#define OCFS_VOL_BITMAP_FILE (OCFS_VOL_BM_SYSFILE * OCFS_MAXIMUM_NODES)
-/* ocfs_vol_bitmap is unused. */
-#define OCFS_VOL_BITMAP (OCFS_VOL_BM * OCFS_MAXIMUM_NODES)
+#define OCFS_ORPHAN_DIR (OCFS_ORPHAN_DIR_SYSFILE * OCFS_MAXIMUM_NODES)
@@ -494,6 +494,7 @@
// DIRFLAG MASK
#define DIR_NODE_FLAG_ROOT 0x1
+#define DIR_NODE_FLAG_ORPHAN 0x2
/*
** Information on Publish sector of each node
Modified: trunk/src/inc/proto.h
===================================================================
--- trunk/src/inc/proto.h 2004-03-06 00:03:53 UTC (rev 761)
+++ trunk/src/inc/proto.h 2004-03-06 00:16:13 UTC (rev 762)
@@ -228,6 +228,7 @@
int ocfs_read_system_file (ocfs_super * osb, __u32 FileId, struct buffer_head *bhs[], __u64 Length, __u64 Offset);
int ocfs_get_system_file_size (ocfs_super * osb, __u32 FileId, __u64 * Length, __u64 * AllocSize);
__u64 ocfs_file_to_disk_off (ocfs_super * osb, __u32 FileId, __u64 Offset);
+int ocfs_init_orphan_dir(ocfs_super *osb, int node_num, char *filename);
void ocfs_initialize_dir_node (ocfs_super * osb, ocfs_dir_node * dir_node, __u64 bitmap_off, __u64 file_off, __u32 node);
int ocfs_write_dir_node (ocfs_super * osb, struct buffer_head *bhs[], __s32 idx, struct inode *dir_inode, struct inode *file_inode);
Modified: trunk/src/osb.c
===================================================================
--- trunk/src/osb.c 2004-03-06 00:03:53 UTC (rev 761)
+++ trunk/src/osb.c 2004-03-06 00:16:13 UTC (rev 762)
@@ -633,6 +633,17 @@
goto bail;
}
+ /* Init the orphan directories. Do this *after* the root
+ * dirnode as we want the space allocated for the dirnodes to
+ * be later on in the volume. */
+ for(i = 0; i < OCFS_MAXIMUM_NODES; i++) {
+ status = ocfs_init_orphan_dir(osb, i, buf);
+ if (status < 0) {
+ LOG_ERROR_STATUS (status);
+ goto bail;
+ }
+ }
+
bail:
if (hdr_bh)
brelse(hdr_bh);
Modified: trunk/src/sysfile.c
===================================================================
--- trunk/src/sysfile.c 2004-03-06 00:03:53 UTC (rev 761)
+++ trunk/src/sysfile.c 2004-03-06 00:16:13 UTC (rev 762)
@@ -49,7 +49,7 @@
LOG_ENTRY_ARGS ("(file_id = %u)\n", file_id);
- memset (filename, 0, sizeof (OCFS_MAX_FILENAME_LENGTH));
+ memset (filename, 0, OCFS_MAX_FILENAME_LENGTH);
if ((file_id >= OCFS_FILE_DIR_ALLOC) &&
(file_id < (OCFS_FILE_DIR_ALLOC + 32))) {
@@ -124,6 +124,132 @@
return status;
} /* ocfs_init_system_file */
+/* Create the 32 orphaned inode directories. This is only called
+ * during 1st mount. */
+int ocfs_init_orphan_dir(ocfs_super *osb, int node_num, char *filename)
+{
+ int i, status = 0;
+ /* OCFS_ORPHAN_DIR */
+ __u64 offset = 0;
+ ocfs_file_entry *fe = NULL;
+ struct buffer_head *fe_bh = NULL;
+ __u32 file_id;
+ __u64 bitmap_off;
+ __u64 file_off = 0;
+ ocfs_dir_node *new_dir = NULL;
+ struct buffer_head **dirnode_bhs = NULL;
+ int numblks, bufsize;
+ char *sect;
+ unsigned long blk;
+
+ LOG_ENTRY_ARGS ("(node_num = %u)\n", node_num);
+
+ memset(filename, 0, OCFS_MAX_FILENAME_LENGTH);
+
+ /* I prefer to just use node_num, but we should prolly be consistent
+ * with the rest of the system files. */
+ file_id = OCFS_ORPHAN_DIR + node_num;
+ offset = (file_id * osb->sect_size) + osb->vol_layout.root_int_off;
+ sprintf(filename, "%s%d", OCFS_ORPHAN_DIR_FILENAME, node_num);
+
+ /* Alright, allocate and create the dirnode */
+ numblks = OCFS_DEFAULT_DIR_NODE_SIZE >> 9;
+ bufsize = numblks * sizeof(struct buffer_head *);
+ dirnode_bhs = ocfs_malloc(bufsize);
+ if (dirnode_bhs == NULL) {
+ LOG_ERROR_STATUS (status = -ENOMEM);
+ goto leave;
+ }
+ memset(dirnode_bhs, 0, bufsize);
+
+ status = ocfs_alloc_node_block (osb, OCFS_DEFAULT_DIR_NODE_SIZE,
+ &bitmap_off, &file_off, osb->node_num,
+ DISK_ALLOC_DIR_NODE, NULL);
+ if (status < 0) {
+ LOG_ERROR_STATUS (status);
+ goto leave;
+ }
+
+ blk = (unsigned long)(bitmap_off >> 9);
+ for (i = 0; i < OCFS_DEFAULT_DIR_NODE_SECTS; i++) {
+ dirnode_bhs[i] = getblk (OCFS_GET_BLOCKDEV(osb->sb),
+ blk++, osb->sb->s_blocksize);
+
+ sect = OCFS_BH_GET_DATA_WRITE(dirnode_bhs[i]); /* write */
+ memset(sect, 0, osb->sect_size);
+ OCFS_BH_PUT_DATA(dirnode_bhs[i]);
+ }
+
+ new_dir = (ocfs_dir_node *) OCFS_BH_GET_DATA_WRITE(dirnode_bhs[0]);
+ ocfs_initialize_dir_node (osb, new_dir, bitmap_off, file_off,
+ osb->node_num);
+ DISK_LOCK_CURRENT_MASTER (new_dir) = i;
+ DISK_LOCK_FILE_LOCK (new_dir) = OCFS_DLM_ENABLE_CACHE_LOCK;
+ new_dir->dir_node_flags |= DIR_NODE_FLAG_ORPHAN;
+ OCFS_BH_PUT_DATA(dirnode_bhs[0]);
+
+ status = ocfs_write_bhs(osb, dirnode_bhs, OCFS_DEFAULT_DIR_NODE_SECTS,
+ 0, NULL);
+ if (status < 0) {
+ LOG_ERROR_STATUS (status);
+ goto leave;
+ }
+
+ /* Alright, now setup the file entry. */
+ status = ocfs_read_bh(osb, offset, &fe_bh, OCFS_BH_CACHED, NULL);
+ if (status < 0) {
+ LOG_ERROR_STATUS(status);
+ goto leave;
+ }
+ fe = (ocfs_file_entry *) OCFS_BH_GET_DATA_WRITE(fe_bh); /* write */
+
+ memset (fe, 0, sizeof (ocfs_file_entry));
+
+ fe->local_ext = true;
+ fe->granularity = -1;
+ strcpy (fe->signature, OCFS_FILE_ENTRY_SIGNATURE);
+ fe->next_free_ext = 0;
+ memcpy (fe->filename, filename, strlen (filename));
+ (fe->filename)[strlen (filename)] = '\0';
+ SET_VALID_BIT (fe->sync_flags);
+ fe->sync_flags &= ~(OCFS_SYNC_FLAG_CHANGE);
+ fe->this_sector = offset;
+ fe->last_ext_ptr = 0;
+
+ /* do we do this or leave it like all the other sysfiles (0) */
+ fe->attribs = OCFS_ATTRIB_DIRECTORY;
+
+ fe->alloc_size = osb->vol_layout.dir_node_size;
+ fe->extents[0].disk_off = bitmap_off;
+ fe->file_size = osb->vol_layout.dir_node_size;
+ fe->next_del = INVALID_DIR_NODE_INDEX;
+
+ OCFS_BH_PUT_DATA(fe_bh);
+
+ status = ocfs_write_bh(osb, fe_bh, 0, NULL);
+ if (status < 0) {
+ LOG_ERROR_STATUS (status);
+ goto leave;
+ }
+
+leave:
+ if (fe_bh)
+ brelse(fe_bh);
+
+ if (dirnode_bhs) {
+ for(i = 0; i < OCFS_DEFAULT_DIR_NODE_SECTS; i++)
+ if (dirnode_bhs[i])
+ brelse(dirnode_bhs[i]);
+ ocfs_free(dirnode_bhs);
+
+ }
+
+ LOG_EXIT_STATUS(status);
+ return(status);
+
+}
+
+
/*
* ocfs_read_system_file()
*
More information about the Ocfs2-commits
mailing list