[Ocfs-tools-commits] khackel commits r42 - in branches/new-dir-format/format: . inc

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Mon May 24 18:11:30 CDT 2004


Author: khackel
Date: 2004-05-24 17:11:27 -0500 (Mon, 24 May 2004)
New Revision: 42

Modified:
   branches/new-dir-format/format/inc/format.h
   branches/new-dir-format/format/system.c
Log:
updates (so far) for new style format in version 2



Modified: branches/new-dir-format/format/inc/format.h
===================================================================
--- branches/new-dir-format/format/inc/format.h	2004-05-24 21:58:59 UTC (rev 41)
+++ branches/new-dir-format/format/inc/format.h	2004-05-24 22:11:27 UTC (rev 42)
@@ -52,14 +52,24 @@
 // TODO: need to add version 2 stuff to headers
 // BEGIN VERSION 2
 enum {
-	OCFS_VOL_BM_SYSFILE = OCFS_CLEANUP_LOG_SYSFILE+1,
+	OCFS_VOL_BM_SYSFILE = 8,
 	OCFS_ORPHAN_DIR_SYSFILE,
-	OCFS_JOURNAL_SYSFILE
+	OCFS_JOURNAL_SYSFILE,
+	OCFS_INODE_SYSFILE,
+	OCFS_INODE_BM_SYSFILE,
+	OCFS_DIRENT_SYSFILE,
+	OCFS_DIRENT_BM_SYSFILE
 };
 #define OCFS_VOL_BITMAP_FILE         (OCFS_VOL_BM_SYSFILE         * OCFS_MAXIMUM_NODES)
 #define OCFS_ORPHAN_DIR              (OCFS_ORPHAN_DIR_SYSFILE     * OCFS_MAXIMUM_NODES)
 #define OCFS_JOURNAL_FILE            (OCFS_JOURNAL_SYSFILE        * OCFS_MAXIMUM_NODES)
+#define OCFS_INODE_FILE              (OCFS_INODE_SYSFILE          * OCFS_MAXIMUM_NODES)
+#define OCFS_INODE_BITMAP            (OCFS_INODE_BM_SYSFILE       * OCFS_MAXIMUM_NODES)
+#define OCFS_DIRENT_FILE             (OCFS_DIRENT_SYSFILE         * OCFS_MAXIMUM_NODES)
+#define OCFS_DIRENT_BITMAP           (OCFS_DIRENT_BM_SYSFILE      * OCFS_MAXIMUM_NODES)
 
+
+
 #define OCFS_JOURNAL_DEFAULT_SIZE       (8 * ONE_MEGA_BYTE)
 #define  OCFS_ORPHAN_DIR_FILENAME          "OrphanDir"
 #define  OCFS_JOURNAL_FILENAME         	   "JournalFile"
@@ -200,7 +210,7 @@
 int ocfs_replacement_journal_create(int file, __u64 journal_off);
 
 /* system.c */
-int ocfs_init_sysfile (int file, ocfs_vol_disk_hdr *volhdr, __u32 file_id, ocfs_file_entry *fe, __u64 data);
+int ocfs_init_sysfile (int file, ocfs_vol_disk_hdr *volhdr, __u32 file_id, ocfs_file_entry *fe);
 int ocfs_create_root_directory (int file, ocfs_vol_disk_hdr *volhdr);
 __u32 ocfs_alloc_from_global_bitmap (__u64 file_size, ocfs_vol_disk_hdr *volhdr);
 int ocfs_update_bm_lock_stats(int file);

Modified: branches/new-dir-format/format/system.c
===================================================================
--- branches/new-dir-format/format/system.c	2004-05-24 21:58:59 UTC (rev 41)
+++ branches/new-dir-format/format/system.c	2004-05-24 22:11:27 UTC (rev 42)
@@ -10,6 +10,7 @@
 
 static int ocfs_create_root_file_entry(int file, ocfs_vol_disk_hdr *volhdr);
 static int ocfs_create_bitmap_file_entry(int file, ocfs_vol_disk_hdr *volhdr);
+__u64 ocfs_create_dot_and_dot_dot(int file, ocfs_vol_disk_hdr *volhdr, __u64 dot, __u64 dotdot);
 
 typedef struct _ocfs_file_entry_v2
 {
@@ -42,15 +43,50 @@
         __u8 fe_reserved1[4];		  // UNUSED
 	union {
 		__u64 fe_private;
-		__u64 child_dirnode;		  // NUMBER RANGE(0,ULONG_LONG_MAX)
+		__u64 child_dirnode;              // NUMBER RANGE(0,ULONG_LONG_MAX)
 		struct _bitinfo {
 			__u32 used_bits;
 			__u32 total_bits;
 		} bitinfo;
-	} u;
-/* sizeof(fe) = 496 bytes */
+	} u;     
+	__u64 alloc_file_off;             // NUMBER RANGE(0,ULONG_LONG_MAX) 
+	__u32 alloc_node;                 // NUMBER RANGE(0,31)
+/* sizeof(fe) = 508 bytes */
 } ocfs_file_entry_v2;
 
+#define OCFS2_ROOT_INODE_NUMBER     3
+/*
+* ocfs directory file types.  Only the low 3 bits are used.  The
+* other bits are reserved for now.
+*/
+#define OCFS_FT_UNKNOWN         0
+#define OCFS_FT_REG_FILE        1
+#define OCFS_FT_DIR             2
+#define OCFS_FT_CHRDEV          3
+#define OCFS_FT_BLKDEV          4
+#define OCFS_FT_FIFO            5
+#define OCFS_FT_SOCK            6
+#define OCFS_FT_SYMLINK         7
+#define OCFS_FT_MAX             8
+
+/*                              
+* OCFS_DIR_PAD defines the directory entries boundaries
+*              
+* NOTE: It must be a multiple of 4
+*/                             
+#define OCFS_DIR_PAD                    4 
+#define OCFS_DIR_ROUND                  (OCFS_DIR_PAD - 1)
+#define OCFS_DIR_REC_LEN(name_len)      (((name_len) + 12 + OCFS_DIR_ROUND) & \
+					 ~OCFS_DIR_ROUND)
+
+struct ocfs2_dir_entry {
+	__u64   inode;                  /* Inode number */
+	__u16   rec_len;                /* Directory entry length */
+	__u8    name_len;               /* Name length */
+	__u8    file_type;
+	char    name[OCFS_MAX_FILENAME_LENGTH];    /* File name */
+};
+
 int ocfs_init_global_alloc_bm (__u32 num_bits, int file, ocfs_vol_disk_hdr *volhdr)
 {
 	int ret = 0;
@@ -123,17 +159,25 @@
 	return startbit;
 }
 
+int ocfs_create_root_directory_v1 (int file, ocfs_vol_disk_hdr * volhdr);
+int ocfs_create_root_directory_v2 (int file, ocfs_vol_disk_hdr * volhdr);
 
 int ocfs_create_root_directory (int file, ocfs_vol_disk_hdr * volhdr)
 {
+       	if (major_version == OCFS_MAJOR_VERSION)
+		return ocfs_create_root_directory_v1 (file, volhdr);
+	else if (major_version == OCFS2_MAJOR_VERSION)
+		return ocfs_create_root_directory_v2 (file, volhdr);
+	return 0;
+}
+
+int ocfs_create_root_directory_v1 (int file, ocfs_vol_disk_hdr * volhdr)
+{
 	int status = 0;
-	__u64 orphan_off = 0ULL, journal_off = 0ULL;
 	__u32 i, j, fileid, bit, root_bit;
-       	__u32 max = (major_version == OCFS2_MAJOR_VERSION) ? 
-		OCFS_JOURNAL_SYSFILE : OCFS_CLEANUP_LOG_SYSFILE;
+       	__u32 max = OCFS_CLEANUP_LOG_SYSFILE;
 	ocfs_dir_node *dir = NULL;
 	ocfs_file_entry *fe = NULL;
-	__u64 data_off;
 
 	fe = MemAlloc(512);
 	if (fe == NULL)
@@ -165,47 +209,72 @@
 		goto bail;
 	fsync(file);
 
-	/* for v2, need to reserve space for orphan dirs: 32 x 128k */
-	/* and space for first 4 journals: 4 x 8mb */
-	if (major_version == OCFS2_MAJOR_VERSION) {
-		bit = ocfs_alloc_from_global_bitmap (32*OCFS_DEFAULT_DIR_NODE_SIZE, volhdr);
-		if (bit == (__u32)-1)
-			goto bail;
-		orphan_off = (bit * volhdr->cluster_size) + volhdr->data_start_off;
-		bit = ocfs_alloc_from_global_bitmap (4*OCFS_JOURNAL_DEFAULT_SIZE, volhdr);
-		if (bit == (__u32)-1)
-			goto bail;
-		journal_off = (bit * volhdr->cluster_size) + volhdr->data_start_off;
+	/* create all appropriate system file types for this ocfs version */
+	for (i = 0; i < OCFS_MAXIMUM_NODES; i++) {
+		for (j = OCFS_VOL_MD_SYSFILE; j <= max; j++) {
+			fileid = (j*OCFS_MAXIMUM_NODES) + i;
+			if (!ocfs_init_sysfile (file, volhdr, fileid, fe))
+				goto bail;
+		}
 	}
 
+	status = 1;
+
+bail:
+	safefree (dir);
+	safefree (fe);
+	return status;
+}
+
+int ocfs_create_root_directory_v2 (int file, ocfs_vol_disk_hdr * volhdr)
+{
+	int status = 0;
+	__u32 i, j, fileid, bit, root_bit;
+       	__u32 max = OCFS_DIRENT_BM_SYSFILE;
+	ocfs_dir_node *dir = NULL;
+	ocfs_file_entry *fe = NULL;
+
+	fe = MemAlloc(512);
+	if (fe == NULL)
+		goto bail;
+
+	dir = MemAlloc(OCFS_DEFAULT_DIR_NODE_SIZE);
+	if (dir == NULL)
+		goto bail;
+
+	/* reserve system file bits in global */
+	bit = ocfs_alloc_from_global_bitmap (ONE_MEGA_BYTE, volhdr);
+	if (bit == (__u32) -1)
+		goto bail;
+
+	volhdr->internal_off = (bit * volhdr->cluster_size) + volhdr->data_start_off;
+
+	/* reserve root dir bits in global */
+	root_bit = ocfs_alloc_from_global_bitmap (OCFS_DEFAULT_DIR_NODE_SIZE, volhdr);
+	if (root_bit == (__u32)-1)
+		goto bail;
+	
+	volhdr->root_off = (root_bit * volhdr->cluster_size) + volhdr->data_start_off;
+	if (!SetSeek(file, volhdr->root_off))
+		goto bail;
+	if (!Write(file, OCFS_DEFAULT_DIR_NODE_SIZE, (void *) dir))
+		goto bail;
+	fsync(file);
+
 	/* create all appropriate system file types for this ocfs version */
 	/* v2 will create orphan, journal, and local alloc + v1 types */
 	for (i = 0; i < OCFS_MAXIMUM_NODES; i++) {
 		for (j = OCFS_VOL_MD_SYSFILE; j <= max; j++) {
 			fileid = (j*OCFS_MAXIMUM_NODES) + i;
-			data_off = 0ULL;
-
-			// only first 4 journals allocated
-			// all others must use tuneocfs
-			if (j == OCFS_JOURNAL_SYSFILE) {
-				if (i < 4)
-					data_off = journal_off;
-			} else if (j == OCFS_ORPHAN_DIR_SYSFILE)
-				data_off = orphan_off;
-
-			if (!ocfs_init_sysfile (file, volhdr, fileid, fe, data_off))
+			if (!ocfs_init_sysfile (file, volhdr, fileid, fe))
 				goto bail;
 		}
-		orphan_off += OCFS_DEFAULT_DIR_NODE_SIZE;
-		journal_off += OCFS_JOURNAL_DEFAULT_SIZE;
 	}
 
-	if (major_version == OCFS2_MAJOR_VERSION) {
-		if (!ocfs_create_root_file_entry(file, volhdr))
-			goto bail;
-		if (!ocfs_create_bitmap_file_entry(file, volhdr))
-			goto bail;
-	}
+	if (!ocfs_create_root_file_entry(file, volhdr))
+		goto bail;
+	if (!ocfs_create_bitmap_file_entry(file, volhdr))
+		goto bail;
 	
 	status = 1;
 
@@ -220,8 +289,15 @@
 static int ocfs_create_root_file_entry(int file, ocfs_vol_disk_hdr *volhdr)
 {
 	int ret = 0;
-	ocfs_file_entry_v2 *fe;
+	ocfs_file_entry_v2 *fe = NULL;
+	__u64 dir_extent;
 
+	dir_extent = ocfs_create_dot_and_dot_dot(file, volhdr, 
+						 OCFS2_ROOT_INODE_NUMBER, 
+						 OCFS2_ROOT_INODE_NUMBER);
+	if (!dir_extent)
+		goto bail;
+
 	fe = MemAlloc(OCFS_SECTOR_SIZE);
 	if (fe == NULL)
 		goto bail;
@@ -237,14 +313,18 @@
 	fe->last_ext_ptr = 0;
         fe->next_del = INVALID_DIR_NODE_INDEX;
 	fe->this_sector = OCFS_ROOT_FILE_ENTRY_OFF;
-	fe->alloc_size = 0ULL;
-	fe->file_size = 0ULL;
-	fe->next_free_ext = 0;
+	fe->alloc_size = volhdr->cluster_size;
+#warning eeeeek.  dont use constant sector size.
+	fe->file_size = 512ULL;
+	fe->next_free_ext = 1;
+	fe->extents[0].disk_off = dir_extent;
+	fe->extents[0].file_off = 0ULL;
+	fe->extents[0].num_bytes = volhdr->cluster_size;
 	fe->uid = volhdr->uid;
 	fe->gid = volhdr->gid;
 	fe->prot_bits = volhdr->prot_bits;
         fe->attribs = OCFS_ATTRIB_DIRECTORY;
-	fe->u.child_dirnode = volhdr->root_off;
+	fe->link_cnt = 2;
 
 	if (!SetSeek(file, OCFS_ROOT_FILE_ENTRY_OFF))
 		goto bail;
@@ -322,14 +402,12 @@
 }
 
 int ocfs_init_sysfile (int file, ocfs_vol_disk_hdr *volhdr, __u32 file_id, 
-			      ocfs_file_entry *fe, __u64 data)
+			      ocfs_file_entry *fe)
 {
 	int status = 0;
 	char *filename;
 	ocfs_local_alloc *alloc;
 	__u64 off;
-	__u32 orphan_bit;
-	ocfs_dir_node *orphan_dir = NULL;
 	__u8 next_free_ext = 0;
 
 	memset (fe, 0, 512);
@@ -365,52 +443,64 @@
 		   (file_id < (OCFS_VOL_BITMAP_FILE + 32))) {
 		// markf likes to be special ;-)
 		alloc = (ocfs_local_alloc *) fe;
-	        strcpy (alloc->signature, OCFS_LOCAL_ALLOC_SIGNATURE);
-	        alloc->this_sector = off;
-	        alloc->node_num = file_id - OCFS_VOL_BITMAP_FILE;
+		strcpy (alloc->signature, OCFS_LOCAL_ALLOC_SIGNATURE);
+		alloc->this_sector = off;
+		alloc->node_num = file_id - OCFS_VOL_BITMAP_FILE;
 		goto do_write;
 	} else if ((file_id >= OCFS_ORPHAN_DIR) &&
 		   (file_id < (OCFS_ORPHAN_DIR + 32))) {
-		// hackery
-		ocfs_file_entry_v2 *fev2 = (ocfs_file_entry_v2 *)fe;
-
+		__u64 dir_extent;
 		sprintf(filename, "%s%d", OCFS_ORPHAN_DIR_FILENAME, file_id);
-	        fev2->attribs = OCFS_ATTRIB_DIRECTORY;
-	        fev2->next_del = INVALID_DIR_NODE_INDEX;
-	        fev2->u.child_dirnode = data;
+		
+		dir_extent = ocfs_create_dot_and_dot_dot(file, volhdr, 
+						 off, OCFS2_ROOT_INODE_NUMBER);
+		if (!dir_extent)
+			return 0;
 
-		orphan_dir = (ocfs_dir_node *) MemAlloc(OCFS_DEFAULT_DIR_NODE_SIZE);
-		if (orphan_dir == NULL)
-			return 0;
-		orphan_bit = (__u32)((data - volhdr->data_start_off) / volhdr->cluster_size);
-		ocfs_init_dirnode(orphan_dir, data, orphan_bit);
-		DISK_LOCK_CURRENT_MASTER (orphan_dir) = file_id - OCFS_ORPHAN_DIR;
-		DISK_LOCK_FILE_LOCK (orphan_dir) = OCFS_DLM_ENABLE_CACHE_LOCK;
-		orphan_dir->dir_node_flags |= DIR_NODE_FLAG_ORPHAN;
-		
-		if (SetSeek(file, data))
-	                if (Write(file, OCFS_DEFAULT_DIR_NODE_SIZE, (void *) orphan_dir)) {
-				status = 1;
-				fsync(file);
-			}
-		safefree(orphan_dir);
-		if (!status)
-			return status;
+		fe->link_cnt = 2;
+		fe->attribs = OCFS_ATTRIB_DIRECTORY;
+		fe->next_del = INVALID_DIR_NODE_INDEX;
+		fe->alloc_size = volhdr->cluster_size;
+		fe->file_size = OCFS_SECTOR_SIZE;
+		fe->extents[0].disk_off = dir_extent;
+		fe->extents[0].file_off = 0ULL;
+		fe->extents[0].num_bytes = volhdr->cluster_size;
+		next_free_ext = 1;
 	} else if ((file_id >= OCFS_JOURNAL_FILE) && 
 		   (file_id < (OCFS_JOURNAL_FILE + 32))) {
 		sprintf(filename, "%s%d", OCFS_JOURNAL_FILENAME, file_id);
-		
+
 		// first 4 will have 8mb, rest will have nothing yet
-		if (data) {
+		if (file_id < OCFS_JOURNAL_FILE + 4) {
+			__u32 bit;
+			__u64 journal_off;
+
+			bit = ocfs_alloc_from_global_bitmap (OCFS_JOURNAL_DEFAULT_SIZE, volhdr);
+			if (bit == (__u32)-1)
+				return 0;
+			journal_off = (bit * volhdr->cluster_size) + volhdr->data_start_off;
+
 			fe->alloc_size = OCFS_JOURNAL_DEFAULT_SIZE;
 			fe->file_size = OCFS_JOURNAL_DEFAULT_SIZE;
-	        	fe->extents[0].disk_off = data;
-	        	fe->extents[0].file_off = 0ULL;
-	        	fe->extents[0].num_bytes = OCFS_JOURNAL_DEFAULT_SIZE;
+			fe->extents[0].disk_off = journal_off;
+			fe->extents[0].file_off = 0ULL;
+			fe->extents[0].num_bytes = OCFS_JOURNAL_DEFAULT_SIZE;
 			next_free_ext = 1;
-			if (!ocfs_replacement_journal_create(file, data))
+			if (!ocfs_replacement_journal_create(file, journal_off))
 				return 0;
 		}
+	} else if ((file_id >= OCFS_INODE_FILE) &&
+		   (file_id < (OCFS_INODE_FILE + 32))) {
+		sprintf (filename, "%s%d", "InodeAllocFile", file_id);
+	} else if ((file_id >= OCFS_INODE_BITMAP) &&
+		   (file_id < (OCFS_INODE_BITMAP + 32))) {
+		sprintf (filename, "%s%d", "InodeBitmapFile", file_id);
+	} else if ((file_id >= OCFS_DIRENT_FILE) &&
+		   (file_id < (OCFS_DIRENT_FILE + 32))) {
+		sprintf (filename, "%s%d", "DirentAllocFile", file_id);
+	} else if ((file_id >= OCFS_DIRENT_BITMAP) &&
+		   (file_id < (OCFS_DIRENT_BITMAP + 32))) {
+		sprintf (filename, "%s%d", "DirentBitmapFile", file_id);
 	} else {
 		fprintf(stderr, "eeeeek! fileid=%d\n", file_id);
 		exit(1);
@@ -433,3 +523,57 @@
 		}
 	return status;
 }
+
+
+__u64 ocfs_create_dot_and_dot_dot(int file, ocfs_vol_disk_hdr *volhdr, __u64 dot, __u64 dotdot)
+{
+	__u32 bit, rec_len;
+	struct ocfs2_dir_entry *dir = NULL;
+	__u32 sect_size = 512;
+#warning CHANGE THIS!  should not have fixed sector size!
+	char *buf = NULL;
+	__u64 ret = 0ULL;
+
+       	bit = ocfs_alloc_from_global_bitmap (volhdr->cluster_size, volhdr);
+	if (bit == (__u32)-1)
+		return 0ULL;
+	ret = (bit * volhdr->cluster_size) + volhdr->data_start_off;
+
+	buf = MemAlloc(sect_size);
+	dir = (struct ocfs2_dir_entry *) buf;
+	dir->rec_len = sect_size;
+
+	/*
+	 * Set up entry for '.'
+	 */
+	dir->inode = dot;
+	dir->name_len = 1;
+	dir->name[0] = '.';
+	dir->file_type = OCFS_FT_DIR;
+	rec_len = dir->rec_len - OCFS_DIR_REC_LEN(1);
+	dir->rec_len = OCFS_DIR_REC_LEN(1);
+
+	/*
+	 * Set up entry for '..'
+	 */
+	dir = (struct ocfs2_dir_entry *) (buf + dir->rec_len);
+	dir->rec_len = rec_len;
+	dir->inode = dotdot;
+	dir->name_len = 2;
+	dir->name[0] = '.';
+	dir->name[1] = '.';
+	dir->file_type = OCFS_FT_DIR;
+
+	if (!SetSeek(file, ret)) {
+		ret = 0ULL;
+		goto bail;
+	}
+	if (!Write(file, sect_size, buf)) {
+		ret = 0ULL;
+		goto bail;
+	}
+	fsync(file);
+bail:
+	safefree(buf);
+	return ret;
+}



More information about the Ocfs-tools-commits mailing list