[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