[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