[Ocfs2-tools-commits] manish commits r232 - trunk/mkfs.ocfs2
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Mon Sep 13 17:18:37 CDT 2004
Author: manish
Date: 2004-09-13 17:18:35 -0500 (Mon, 13 Sep 2004)
New Revision: 232
Removed:
trunk/mkfs.ocfs2/mkfs2.c
Modified:
trunk/mkfs.ocfs2/Makefile
trunk/mkfs.ocfs2/mkfs.c
Log:
Remove old mkfs
Modified: trunk/mkfs.ocfs2/Makefile
===================================================================
--- trunk/mkfs.ocfs2/Makefile 2004-09-13 21:33:12 UTC (rev 231)
+++ trunk/mkfs.ocfs2/Makefile 2004-09-13 22:18:35 UTC (rev 232)
@@ -11,7 +11,7 @@
CFLAGS = $(OPTS) -fno-strict-aliasing $(WARNINGS)
-SBIN_PROGRAMS = mkfs.ocfs2 mkfs.ocfs2.kurt
+SBIN_PROGRAMS = mkfs.ocfs2
LIBOCFS2_CFLAGS = -I$(TOPDIR)/libocfs2/include
LIBOCFS2_LIBS = -L$(TOPDIR)/libocfs2 -locfs2
@@ -41,14 +41,11 @@
MANS = mkfs.ocfs2.8
-DIST_FILES = $(VERSION_FILES) $(VERSION_SRC) mkfs2.c mkfs.ocfs2.8.in
+DIST_FILES = $(VERSION_FILES) $(VERSION_SRC) mkfs.ocfs2.8.in
mkfs.ocfs2: mkfs.o
$(LINK) $(LIBOCFS2_LIBS) $(COM_ERR_LIBS)
-mkfs.ocfs2.kurt: mkfs2.o
- $(LINK) $(LIBOCFS2_LIBS) $(COM_ERR_LIBS)
-
readdir: readdir.o
$(LINK)
Modified: trunk/mkfs.ocfs2/mkfs.c
===================================================================
--- trunk/mkfs.ocfs2/mkfs.c 2004-09-13 21:33:12 UTC (rev 231)
+++ trunk/mkfs.ocfs2/mkfs.c 2004-09-13 22:18:35 UTC (rev 232)
@@ -37,6 +37,7 @@
#include <errno.h>
#include <malloc.h>
#include <time.h>
+#include <libgen.h>
#include <netinet/in.h>
#include <asm/bitops.h>
@@ -203,7 +204,7 @@
};
-static State *get_state (int argc, char **argv);
+static State *get_state(int argc, char **argv);
static int get_number(char *arg, uint64_t *res);
static void usage(const char *progname);
static void version(const char *progname);
@@ -480,7 +481,7 @@
static State *
get_state(int argc, char **argv)
{
- char *progname = "mkfs.ocfs2";
+ char *progname;
unsigned int blocksize = 0;
unsigned int cluster_size = 0;
char *vol_label = NULL;
@@ -494,7 +495,7 @@
int ret;
uint64_t val;
- static struct option long_state[] = {
+ static struct option long_options[] = {
{ "blocksize", 1, 0, 'b' },
{ "clustersize", 1, 0, 'c' },
{ "label", 1, 0, 'L' },
@@ -505,14 +506,13 @@
{ 0, 0, 0, 0}
};
- if (argc && *argv) {
- char *cp;
- cp = strrchr(argv[0], '/');
- progname = cp ? cp + 1 : argv[0];
- }
+ if (argc && *argv)
+ progname = basename(argv[0]);
+ else
+ progname = strdup("mkfs.ocfs2");
while (1) {
- c = getopt_long(argc, argv, "b:c:L:n:vqV", long_state, NULL);
+ c = getopt_long(argc, argv, "b:c:L:n:vqV", long_options, NULL);
if (c == -1)
break;
@@ -627,7 +627,7 @@
s = malloc(sizeof(State));
memset(s, 0, sizeof(State));
- s->progname = strdup(progname);
+ s->progname = progname;
s->verbose = verbose;
s->quiet = quiet;
Deleted: trunk/mkfs.ocfs2/mkfs2.c
===================================================================
--- trunk/mkfs.ocfs2/mkfs2.c 2004-09-13 21:33:12 UTC (rev 231)
+++ trunk/mkfs.ocfs2/mkfs2.c 2004-09-13 22:18:35 UTC (rev 232)
@@ -1,1230 +0,0 @@
-/*
- *
- * this is a temporary version of mkfs.ocfs2 to get us through for now
- *
- */
-
-
-#define _LARGEFILE64_SOURCE
-#define __USE_ISOC99
-
-
-#include <errno.h>
-#include <stdio.h>
-#include <asm/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#include <asm/bitops.h>
-#include <sys/mman.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <sys/ioctl.h>
-#include <linux/fs.h>
-#define _GNU_SOURCE
-#include <getopt.h>
-#include "ocfs2_fs.h"
-#include "ocfs2_disk_dlm.h"
-#include "ocfs1_fs_compat.h"
-
-typedef unsigned short kdev_t;
-
-#include "kernel-list.h"
-
-#include <signal.h>
-#include <libgen.h>
-
-#include <netinet/in.h>
-#include "kernel-jbd.h"
-
-
-extern char *optarg;
-extern int optind, opterr, optopt;
-extern void * memalign (size_t __alignment, size_t __size);
-
-#warning eeeek need to implement these
-#define cpu_to_le16(x) (x)
-#define cpu_to_le32(x) (x)
-#define cpu_to_le64(x) (x)
-#define le16_to_cpu(x) (x)
-#define le32_to_cpu(x) (x)
-#define le64_to_cpu(x) (x)
-
-
-#ifndef MAX
-#define MAX(a, b) (((a) > (b)) ? (a) : (b))
-#endif
-
-#define BITCOUNT(x) (((BX_(x)+(BX_(x)>>4)) & 0x0F0F0F0F) % 255)
-#define BX_(x) ((x) - (((x)>>1)&0x77777777) \
- - (((x)>>2)&0x33333333) \
- - (((x)>>3)&0x11111111))
-
-#define MKFS_FATAL(fmt, arg...) ({ fprintf(stderr, "ERROR at %s, %d: " fmt ". EXITING!!!\n", \
- __FILE__, __LINE__, ##arg); \
- exit(1); \
- })
-#define MKFS_FATAL_STR(str) MKFS_FATAL(str, "")
-#define MKFS_WARN(fmt, arg...) fprintf(stderr, "WARNING at %s, %d: " fmt ".\n", \
- __FILE__, __LINE__, ##arg)
-#define MKFS_WARN_STR(str) MKFS_WARN(str, "")
-
-
-
-#define MIN_RESERVED_TAIL_BLOCKS 8
-
-#define LEADING_SPACE_BLOCKS 2 // we will put special strings in the v1 header blocks
-#define SLOP_BLOCKS 0
-#define FILE_ENTRY_BLOCKS 8
-#define SUPERBLOCK_BLOCKS 1
-#define PUBLISH_BLOCKS(i,min) (i<min ? min : i) // at least min
-#define VOTE_BLOCKS(i,min) (i<min ? min : i) // at least min
-#define AUTOCONF_BLOCKS(i,min) ((2+4) + (i<min ? min : i)) // at least 32, plus the other 6
-#define NUM_LOCAL_SYSTEM_FILES 6
-
-#define MAGIC_SUPERBLOCK_BLOCK_NUMBER 2
-
-#define OCFS2_OS_LINUX 0
-#define OCFS2_OS_HURD 1
-#define OCFS2_OS_MASIX 2
-#define OCFS2_OS_FREEBSD 3
-#define OCFS2_OS_LITES 4
-
-#define OCFS2_DFL_MAX_MNT_COUNT 20 /* Allow 20 mounts */
-#define OCFS2_DFL_CHECKINTERVAL 0 /* Don't use interval check */
-
-enum {
- sfi_journal,
- sfi_bitmap,
- sfi_local_alloc,
- sfi_dlm,
- sfi_other
-};
-
-typedef struct _system_file_info {
- char *name;
- int type;
- int global;
- int dir;
-
-} system_file_info;
-
-system_file_info system_files[] = {
- { "bad_blocks", sfi_other, 1, 0 },
- { "global_inode_alloc", sfi_other, 1, 0 },
- { "global_inode_alloc_bitmap", sfi_bitmap, 1, 0 },
- { "dlm", sfi_dlm, 1, 0 },
- { "global_bitmap", sfi_bitmap, 1, 0 },
- { "orphan_dir", sfi_other, 1, 1 },
- { "extent_alloc:%04d", sfi_other, 0, 0 },
- { "extent_alloc_bitmap:%04d", sfi_bitmap, 0, 0 },
- { "inode_alloc:%04d", sfi_other, 0, 0 },
- { "inode_alloc_bitmap:%04d", sfi_bitmap, 0, 0 },
- { "journal:%04d", sfi_journal, 0, 0 },
- { "local_alloc:%04d", sfi_local_alloc, 0, 0 },
-};
-
-struct bitinfo {
- __u32 used_bits;
- __u32 total_bits;
-};
-
-typedef struct _system_file_disk_record
-{
- __u64 fe_off;
- __u64 extent_off;
- __u64 extent_len;
- __u64 file_size;
- struct bitinfo bi;
- int flags;
- int links;
- int dir;
-} system_file_disk_record;
-
-
-typedef struct _alloc_bm
-{
- void *buf;
- __u32 valid_bits;
- __u32 unit;
- __u32 unit_bits;
- char *name;
- __u64 fe_disk_off;
- system_file_disk_record *bm_record;
- system_file_disk_record *alloc_record;
-} alloc_bm;
-
-typedef struct _funky_dir
-{
- __u64 disk_off;
- __u64 disk_len;
- void *buf;
- int buf_len;
- int last_off;
- __u64 fe_disk_off;
- int link_count;
- system_file_disk_record *record;
-} funky_dir;
-
-alloc_bm * initialize_bitmap (__u32 bits, __u32 unit_bits, char *name,
- system_file_disk_record *bm_rec,
- system_file_disk_record *alloc_rec);
-void destroy_bitmap (alloc_bm *bm);
-int find_clear_bits (alloc_bm * bitmap, __u32 numBits, __u32 offset);
-int count_bits (alloc_bm * bitmap);
-int alloc_bytes_from_bitmap (__u64 bytes, alloc_bm *bm, __u64 *start, __u64 *num);
-int alloc_from_bitmap (__u64 numbits, alloc_bm *bm, __u64 *start, __u64 *num);
-__u64 alloc_inode (int numblocks);
-funky_dir * alloc_directory(void);
-void add_entry_to_directory(funky_dir *dir, char *name, __u64 ino, __u8 type);
-void adjust_volume_size(void);
-void map_device(void);
-void sync_device(void);
-void unmap_device(void);
-void init_format_time(void);
-void format_superblock(system_file_disk_record *rec, system_file_disk_record *root_rec, system_file_disk_record *sys_rec);
-void format_file(system_file_disk_record *rec);
-void write_bitmap_data(alloc_bm *bm);
-void write_directory_data(funky_dir *dir);
-void format_leading_space(__u64 start);
-void init_device(void);
-void init_globals(void);
-void usage(void);
-void process_args(int argc, char **argv);
-void generate_uuid(void);
-static inline __u32 blocks_needed(void);
-static inline __u32 system_dir_blocks_needed(void);
-void replacement_journal_create(__u64 journal_off);
-void adjust_autoconfig_publish_vote(system_file_disk_record *autoconfig_rec,
- system_file_disk_record *publish_rec,
- system_file_disk_record *vote_rec);
-void write_autoconfig_header(system_file_disk_record *rec);
-void init_record(system_file_disk_record *rec, int type, int dir);
-void version(char *progname);
-
-
-
-system_file_disk_record *record[NUM_SYSTEM_INODES];
-// these 4 do not live in the record[] array
-system_file_disk_record global_alloc_rec; // represents whole volume, not written to disk
-system_file_disk_record superblock_rec;
-system_file_disk_record root_dir_rec;
-system_file_disk_record system_dir_rec;
-
-
-__u32 pagesize_bits=0;
-__u32 blocksize_bits=0;
-__u32 cluster_size_bits=0;
-__u32 blocksize=0;
-__u32 cluster_size=0;
-__u64 volume_size_in_bytes=0;
-__u32 volume_size_in_clusters=0;
-__u64 volume_size_in_blocks=0;
-__u64 reserved_tail_size=0;
-__u32 compat_flags = 0;
-int initial_nodes=0;
-int fd=-1;
-void *mapping;
-char *dev_name = NULL;
-char *vol_label = NULL;
-char *uuid = NULL;
-gid_t default_gid = 0;
-mode_t default_mode = 0;
-uid_t default_uid = 0;
-alloc_bm *global_bm=NULL;
-alloc_bm *system_bm=NULL;
-char *progname = NULL;
-time_t format_time;
-
-
-
-alloc_bm * initialize_bitmap (__u32 bits, __u32 unit_bits, char *name,
- system_file_disk_record *bm_rec,
- system_file_disk_record *alloc_rec)
-{
- alloc_bm *bitmap;
- __u64 bitmap_len = bm_rec->extent_len;
-
- bitmap = malloc(sizeof(alloc_bm));
- if (bitmap == NULL)
- MKFS_FATAL("could not allocate memory for %s\n", name);
- memset(bitmap, 0, sizeof(alloc_bm));
-
- bitmap->buf = memalign(blocksize, bitmap_len);
- memset(bitmap->buf, 0, bitmap_len);
-
- bitmap->valid_bits = bits;
- bitmap->unit_bits = unit_bits;
- bitmap->unit = 1 << unit_bits;
- bitmap->name = strdup(name);
-
- bm_rec->file_size = bitmap_len;
- bm_rec->fe_off = 0ULL; // set later
- bm_rec->bi.used_bits = 0;
- bm_rec->bi.total_bits = bits;
-
- alloc_rec->file_size = bits << unit_bits;
- alloc_rec->fe_off = 0ULL; // set later
-
- bitmap->bm_record = bm_rec;
- bitmap->alloc_record = alloc_rec;
-
- return bitmap;
-}
-
-void destroy_bitmap (alloc_bm *bm)
-{
- free(bm->buf);
- free(bm);
-}
-
-
-int find_clear_bits (alloc_bm * bitmap, __u32 numBits, __u32 offset)
-{
- __u32 next_zero, off, count, size, first_zero = -1;
- void *buffer;
-
- buffer = bitmap->buf;
- size = bitmap->valid_bits;
- count = 0;
- off = offset;
-
- while ((size - off + count >= numBits) &&
- (next_zero = find_next_zero_bit (buffer, size, off)) != size) {
- if (next_zero >= bitmap->valid_bits)
- break;
-
- if (next_zero != off) {
- first_zero = next_zero;
- off = next_zero + 1;
- count = 0;
- } else {
- off++;
- if (count == 0)
- first_zero = next_zero;
- }
-
- count++;
-
- if (count == numBits)
- goto bail;
- }
- first_zero = -1;
-
- bail:
- if (first_zero != (__u32)-1 && first_zero > bitmap->valid_bits) {
- fprintf(stderr, "um... first_zero>bitmap->valid_bits (%d > %d)",
- first_zero, bitmap->valid_bits);
- first_zero = -1;
- }
- return first_zero;
-}
-
-int count_bits (alloc_bm * bitmap)
-{
- __u32 size, count = 0, off = 0;
- unsigned char tmp;
- __u8 *buffer;
-
- buffer = bitmap->buf;
-
- size = (bitmap->valid_bits >> 3);
-
- while (off < size) {
- memcpy (&tmp, buffer, 1);
- count += BITCOUNT (tmp);
- off++;
- buffer++;
- }
- return count;
-}
-
-
-/* returns bytes to avoid any confusion */
-int alloc_bytes_from_bitmap (__u64 bytes, alloc_bm *bm, __u64 *start, __u64 *num)
-{
- __u32 startbit = 0, numbits = 0;
- char *p;
-
- numbits = (bytes + bm->unit - 1) >> bm->unit_bits;
- startbit = find_clear_bits (bm, numbits, 0);
- if (startbit == (__u32)-1)
- MKFS_FATAL("could not allocate %llu bits from %s bitmap\n",
- numbits, bm->name);
- *start = ((__u64)startbit) << bm->unit_bits;
- *num = ((__u64)numbits) << bm->unit_bits;
- bm->bm_record->bi.used_bits += numbits;
- p = mapping + *start;
- memset(p, 0, *num);
- while (numbits--)
- set_bit (startbit++, bm->buf);
- return 0;
-}
-
-/* returns bytes to avoid any confusion */
-int alloc_from_bitmap (__u64 numbits, alloc_bm *bm, __u64 *start, __u64 *num)
-{
- __u32 startbit = 0;
- char *p;
-
- startbit = find_clear_bits (bm, numbits, 0);
- if (startbit == (__u32)-1)
- MKFS_FATAL("could not allocate %llu bits from %s bitmap\n",
- numbits, bm->name);
- *start = ((__u64)startbit) << bm->unit_bits;
- *num = ((__u64)numbits) << bm->unit_bits;
- bm->bm_record->bi.used_bits += numbits;
- p = mapping + *start;
- memset(p, 0, *num);
- while (numbits--)
- set_bit (startbit++, bm->buf);
- return 0;
-}
-
-__u64 alloc_inode (int numblocks)
-{
- __u64 ret, num;
- alloc_from_bitmap (numblocks, system_bm, &ret, &num);
- return ret;
-}
-
-funky_dir * alloc_directory(void)
-{
- funky_dir *dir;
-
- dir = malloc(sizeof(funky_dir));
- if (!dir)
- MKFS_FATAL_STR("could not allocate memory for directory");
- memset(dir, 0, sizeof(funky_dir));
- return dir;
-}
-
-void add_entry_to_directory(funky_dir *dir, char *name, __u64 byte_off, __u8 type)
-{
- struct ocfs2_dir_entry *de, *de1;
- int new_rec_len;
- void *newbuf, *p;
- int newsize, reclen, reallen;
-
- new_rec_len = OCFS2_DIR_REC_LEN(strlen(name));
-
- if (dir->buf) {
- de = (struct ocfs2_dir_entry *)(dir->buf + dir->last_off);
- reclen = le16_to_cpu(de->rec_len);
- reallen = OCFS2_DIR_REC_LEN(de->name_len);
-
- /* find an area with large enough reclen */
- if ((le64_to_cpu(de->inode) == 0 && reclen >= new_rec_len) ||
- (reclen >= reallen + new_rec_len)) {
- if (le64_to_cpu(de->inode)) {
- // move ahead just past the last entry
- de1 = (struct ocfs2_dir_entry *) ((char *) de + reallen);
- // set the next entry's rec_len to the rest of the block
- de1->rec_len = cpu_to_le16(le16_to_cpu(de->rec_len) - reallen);
- // shorten the last entry
- de->rec_len = cpu_to_le16(reallen);
- de = de1;
- }
- goto got_it;
- }
- /* no space, add more */
- newsize = dir->record->file_size + blocksize; // add one block
- } else
- newsize = blocksize; // add one block
-
- newbuf = memalign(blocksize, newsize);
- if (newbuf == NULL)
- MKFS_FATAL_STR("failed to grow directory");
-
- if (dir->buf) {
- memcpy(newbuf, dir->buf, dir->record->file_size);
- free(dir->buf);
- p = newbuf + dir->record->file_size;
- memset(p, 0, blocksize);
- } else {
- p = newbuf;
- memset(newbuf, 0, newsize);
- }
-
- dir->buf = newbuf;
- dir->record->file_size = newsize;
-
- de = (struct ocfs2_dir_entry *)p;
- de->inode = 0;
- de->rec_len = cpu_to_le16(blocksize);
-
-got_it:
- de->name_len = strlen(name);
- de->inode = cpu_to_le64(byte_off >> blocksize_bits);
- de->file_type = type;
- strcpy(de->name, name);
- dir->last_off = ((char *)de - (char *)dir->buf);
- if (type == OCFS2_FT_DIR)
- dir->record->links++;
-}
-
-
-
-#define SYSTEM_FILE_NAME_MAX 40
-
-static inline __u32 blocks_needed(void)
-{
- __u32 num;
-
- /*
- * leading space ???
- * superblock
- * global bm fe
- * system bm fe
- * system alloc fe
- * root inode fe
- * system inode fe
- * autoconf fe
- * publish fe
- * vote fe
- * autoconf sectors
- * publish sectors
- * vote sectors
- * (extent_alloc, extent_alloc_bitmap, inode_alloc,
- * inode_alloc_bitmap, journal) x initial_nodes
- * slop ;-)
- */
- num = LEADING_SPACE_BLOCKS;
- num += SUPERBLOCK_BLOCKS;
- num += FILE_ENTRY_BLOCKS;
- num += AUTOCONF_BLOCKS(initial_nodes, 32);
- num += PUBLISH_BLOCKS(initial_nodes, 32);
- num += VOTE_BLOCKS(initial_nodes, 32);
- num += (initial_nodes * NUM_LOCAL_SYSTEM_FILES);
- num += SLOP_BLOCKS;
- return num;
-}
-
-static inline __u32 system_dir_blocks_needed(void)
-{
- int bytes_needed = 0;
- int each = OCFS2_DIR_REC_LEN(SYSTEM_FILE_NAME_MAX);
- int entries_per_block = blocksize / each;
-
- /* blocks_needed() is way more than the number of filenames... */
- bytes_needed = (blocks_needed() + entries_per_block - 1 / entries_per_block) << blocksize_bits;
- return (bytes_needed + cluster_size - 1) >> cluster_size_bits;
-}
-
-void adjust_volume_size()
-{
- __u32 max;
- __u64 vsize = volume_size_in_bytes -
- (MIN_RESERVED_TAIL_BLOCKS << blocksize_bits);
-
- max = MAX(pagesize_bits, blocksize_bits);
- max = MAX(max, cluster_size_bits);
- vsize >>= max;
- vsize <<= max;
- volume_size_in_blocks = vsize >> blocksize_bits;
- volume_size_in_clusters = vsize >> cluster_size_bits;
- reserved_tail_size = volume_size_in_bytes - vsize;
- volume_size_in_bytes = vsize;
-}
-
-static inline size_t mmap_len(void);
-
-/* total guess */
-static inline size_t mmap_len(void)
-{
- size_t ret;
-
- ret = initial_nodes * OCFS2_DEFAULT_JOURNAL_SIZE;
- ret += (40 * ONE_MEGA_BYTE);
- return ret;
-}
-
-void map_device()
-{
- mapping = mmap(NULL, mmap_len(), PROT_READ | PROT_WRITE, MAP_NORESERVE | MAP_SHARED, fd, 0);
- if (mapping==MAP_FAILED)
- MKFS_FATAL("could not mmap the device: %s", strerror(errno));
-}
-void sync_device()
-{
- if (msync(mapping, mmap_len(), MS_SYNC))
- MKFS_FATAL_STR("could not sync the device");
-}
-
-void unmap_device()
-{
- if (munmap(mapping, mmap_len()))
- MKFS_FATAL_STR("could not munmap the device");
-}
-
-
-void init_format_time()
-{
- format_time = time(NULL);
-}
-
-
-
-void format_superblock(system_file_disk_record *rec, system_file_disk_record *root_rec, system_file_disk_record *sys_rec)
-{
- ocfs2_dinode *di;
- __u64 super_off = rec->fe_off;
-
- di = mapping + super_off;
- memset(di, 0, blocksize);
-
- /* many of these fields will be unused for now, but at least
- * let's init them to some sane values */
-
- strcpy (di->i_signature, OCFS2_SUPER_BLOCK_SIGNATURE);
- di->i_suballoc_node = cpu_to_le16((__u16)-1);
- di->i_suballoc_blkno = cpu_to_le64(super_off >> blocksize_bits);
-
- di->i_atime = 0; // unused
- di->i_ctime = cpu_to_le64(format_time); // use this as s_wtime (write time)
- di->i_mtime = cpu_to_le64(format_time); // use this as s_mtime (mount time)
- di->i_blkno = cpu_to_le64(super_off >> blocksize_bits);
- di->i_flags = cpu_to_le32(OCFS2_VALID_FL | OCFS2_SYSTEM_FL | OCFS2_SUPER_BLOCK_FL);
- di->id2.i_super.s_major_rev_level = cpu_to_le16(OCFS2_MAJOR_REV_LEVEL);
- di->id2.i_super.s_minor_rev_level = cpu_to_le16(OCFS2_MINOR_REV_LEVEL);
- di->id2.i_super.s_root_blkno = cpu_to_le64(root_rec->fe_off >> blocksize_bits);
- di->id2.i_super.s_system_dir_blkno = cpu_to_le64(sys_rec->fe_off >> blocksize_bits);
- di->id2.i_super.s_mnt_count = 0;
- di->id2.i_super.s_max_mnt_count = cpu_to_le16(OCFS2_DFL_MAX_MNT_COUNT);
- di->id2.i_super.s_state = 0;
- di->id2.i_super.s_errors = 0;
- di->id2.i_super.s_lastcheck = cpu_to_le64(format_time);
- di->id2.i_super.s_checkinterval = cpu_to_le32(OCFS2_DFL_CHECKINTERVAL);
- di->id2.i_super.s_creator_os = cpu_to_le32(OCFS2_OS_LINUX);
- di->id2.i_super.s_blocksize_bits = cpu_to_le32(blocksize_bits);
- di->id2.i_super.s_clustersize_bits = cpu_to_le32(cluster_size_bits);
- di->id2.i_super.s_max_nodes = cpu_to_le32(initial_nodes);
- if (strlen(vol_label) > 63)
- MKFS_FATAL_STR("volume label > 63 bytes long");
- strcpy(di->id2.i_super.s_label, vol_label);
- memcpy(di->id2.i_super.s_uuid, uuid, 16);
-}
-
-
-void format_file(system_file_disk_record *rec)
-{
- ocfs2_dinode *di;
- int mode;
- __u32 clusters;
-
- if (default_mode)
- mode = default_mode | (rec->dir ? S_IFDIR : S_IFREG);
- else
- mode = rec->dir ? 0755 | S_IFDIR: 0644 | S_IFREG;
-
- clusters = (rec->extent_len + cluster_size - 1) >> cluster_size_bits;
-
- di = mapping + rec->fe_off;
- memset(di, 0, blocksize);
- strcpy (di->i_signature, OCFS2_INODE_SIGNATURE);
- di->i_generation = 0;
- di->i_suballoc_node = cpu_to_le16(-1);
- di->i_suballoc_blkno = cpu_to_le64(rec->fe_off >> blocksize_bits);
- di->i_blkno = cpu_to_le64(rec->fe_off >> blocksize_bits);
- di->i_uid = cpu_to_le32(default_uid);
- di->i_gid = cpu_to_le32(default_gid);
- di->i_size = cpu_to_le64(rec->file_size);
- di->i_mode = cpu_to_le16(mode);
- di->i_links_count = cpu_to_le16(rec->links);
- di->i_flags = cpu_to_le32(rec->flags);
- di->i_atime = di->i_ctime = di->i_mtime = cpu_to_le64(format_time);
- di->i_dtime = 0;
- di->i_clusters = cpu_to_le32(clusters);
- if (rec->flags & OCFS2_LOCAL_ALLOC_FL) {
- di->id2.i_lab.la_size =
- cpu_to_le16(ocfs2_local_alloc_size(blocksize));
- return;
- }
-
- if (rec->flags & OCFS2_BITMAP_FL) {
- di->id1.bitmap1.i_used = cpu_to_le32(rec->bi.used_bits);
- di->id1.bitmap1.i_total = cpu_to_le32(rec->bi.total_bits);
- }
-
- di->id2.i_list.l_count = cpu_to_le16(ocfs2_extent_recs_per_inode(blocksize));
- di->id2.i_list.l_next_free_rec = cpu_to_le16(0);
- di->id2.i_list.l_tree_depth = cpu_to_le16(0);
-
- if (rec->extent_len) {
- di->id2.i_list.l_next_free_rec = cpu_to_le16(1);
- di->id2.i_list.l_recs[0].e_cpos = 0;
- di->id2.i_list.l_recs[0].e_clusters = cpu_to_le32(clusters);
- di->id2.i_list.l_recs[0].e_blkno = cpu_to_le64(rec->extent_off >> blocksize_bits);
- }
-}
-
-void write_bitmap_data(alloc_bm *bm)
-{
- system_file_disk_record *rec = bm->bm_record;
- memset(mapping + rec->extent_off, 0, rec->extent_len);
- memcpy(mapping + rec->extent_off, bm->buf, rec->file_size);
-}
-
-void write_directory_data(funky_dir *dir)
-{
- system_file_disk_record *rec = dir->record;
- memset(mapping + rec->extent_off, 0, rec->extent_len);
- memcpy(mapping + rec->extent_off, dir->buf, rec->file_size);
-}
-
-void format_leading_space(__u64 start)
-{
- int num_blocks = 2; // 2 blocks were allocated
- ocfs1_vol_disk_hdr *hdr;
- ocfs1_vol_label *lbl;
- char *p;
-
- p = mapping + start;
- memset(p, 2, num_blocks << blocksize_bits);
-
- hdr = (ocfs1_vol_disk_hdr *)p;
- strcpy(hdr->signature, "this is an ocfs2 volume");
- strcpy(hdr->mount_point, "this is an ocfs2 volume");
-
- p += 512;
- lbl = (ocfs1_vol_label *)p;
- strcpy(lbl->label, "this is an ocfs2 volume");
- strcpy(lbl->cluster_name, "this is an ocfs2 volume");
-}
-
-void replacement_journal_create(__u64 journal_off)
-{
- journal_superblock_t *sb;
- char *p;
-
- p = mapping + journal_off;
- /* zero out all 8mb and stamp this little sb header on it */
- sb = (journal_superblock_t *) p;
- memset(sb, 0, OCFS2_DEFAULT_JOURNAL_SIZE);
-
- sb->s_header.h_magic = htonl(JFS_MAGIC_NUMBER);
- sb->s_header.h_blocktype = htonl(JFS_SUPERBLOCK_V2);
- sb->s_blocksize = htonl(blocksize);
- sb->s_maxlen = htonl(OCFS2_DEFAULT_JOURNAL_SIZE >> blocksize_bits);
- if (blocksize == 512)
- sb->s_first = htonl(2);
- else
- sb->s_first = htonl(1);
- sb->s_start = htonl(1);
- sb->s_sequence = htonl(1);
- sb->s_errno = htonl(0);
-}
-
-void init_device(void)
-{
- fd = open(dev_name, O_RDWR);
- if (fd == -1)
- MKFS_FATAL("could not open device %d for read/write", dev_name);
-}
-
-
-#define ONE_GB_SHIFT 30
-
-int initial_nodes_for_volume(__u64 size);
-
-/* this is just silly guesswork if the user does not
- * provide a number for initial_nodes */
-int initial_nodes_for_volume(__u64 size)
-{
- int shift = ONE_GB_SHIFT;
- int ret, i;
-
- /*
- * <1gb -> 2 nodes
- * <8gb -> 4 nodes
- * <64gb -> 8 nodes
- * <512gb -> 16 nodes
- * 512+gb -> 32 nodes
- */
-
- for (i=0, shift = ONE_GB_SHIFT; i<4; i++, shift += 3) {
- size >>= shift;
- if (!size)
- break;
- }
- switch (i)
- {
- case 0:
- ret = 2;
- break;
- case 1:
- ret = 4;
- break;
- case 2:
- ret = 8;
- break;
- case 3:
- ret = 16;
- break;
- default:
- ret = 32;
- break;
- }
- return ret;
-}
-
-void init_globals(void)
-{
- size_t pagesize;
- int i;
- __u32 tmp;
- unsigned long long tmp2;
-
- pagesize = getpagesize();
- pagesize_bits = 0;
- for (i=32; i>=0; i--) {
- if (pagesize == (1U << i))
- pagesize_bits = i;
- }
- if (!pagesize_bits)
- MKFS_FATAL("could not get pagesize_bits for pagesize %d", pagesize);
-
- if (blocksize) {
- printf("blocksize was set manually: %lu\n", blocksize);
- } else {
- if (ioctl(fd, BLKSSZGET, &tmp) == -1)
- MKFS_FATAL_STR("could not get sector size for device");
- blocksize = tmp;
- }
- blocksize_bits = 0;
- for (i=32; i>=0; i--) {
- if ((1U << i) == blocksize)
- blocksize_bits = i;
- }
- if (!blocksize_bits)
- MKFS_FATAL("could not get blocksize_bits for blocksize %lu", blocksize);
-
- cluster_size_bits = 0;
- for (i=32; i>=0; i--) {
- if ((1U << i) == cluster_size)
- cluster_size_bits = i;
- }
- if (!cluster_size_bits)
- MKFS_FATAL("could not get cluster_size_bits for cluster_size %lu", cluster_size);
-
- /* these will be readjusted later */
- tmp2 = lseek64(fd, 0, SEEK_END);
- if (volume_size_in_bytes) {
- printf("volume size was set manually: %llu, real size: %llu\n",
- volume_size_in_bytes, tmp2);
- } else {
- volume_size_in_bytes = tmp2;
- }
- volume_size_in_clusters = volume_size_in_bytes >> cluster_size_bits;
- volume_size_in_blocks = (volume_size_in_clusters << cluster_size_bits) >> blocksize_bits;
- reserved_tail_size = 0;
-
- if (initial_nodes) {
- if (initial_nodes < 2 || initial_nodes > OCFS2_MAX_NODES)
- MKFS_FATAL("initial_nodes given (%lu) out of range", initial_nodes);
- printf("initial_nodes was set manually: %lu\n", initial_nodes);
- } else {
- initial_nodes = initial_nodes_for_volume(volume_size_in_bytes);
- printf("using %lu for initial_nodes\n", initial_nodes);
- }
-}
-
-void generate_uuid(void)
-{
- int randfd = 0;
- int readlen = 0;
- int len = 0;
-
- if ((randfd = open("/dev/urandom", O_RDONLY)) == -1)
- MKFS_FATAL("error opening /dev/urandom: %s", strerror(errno));
-
- uuid = malloc(MAX_VOL_ID_LENGTH);
- if (!uuid)
- MKFS_FATAL_STR("could not allocate memory");
-
- while (readlen < MAX_VOL_ID_LENGTH)
- {
- if ((len = read(randfd, uuid + readlen, MAX_VOL_ID_LENGTH - readlen)) == -1)
- MKFS_FATAL("error reading from /dev/urandom: %s", strerror(errno));
- readlen += len;
- }
-
- close(randfd);
-}
-
-
-void usage(void)
-{
- // "b:c:v:C:n:g:u:m:d:l:U:"
- fprintf(stderr, "usage: mkfs2 [--blocksize=bytes] [--mode=##] [--uuid=id]\n");
- fprintf(stderr, " [--volumesize=bytes] [--compatflags=##]\n");
- fprintf(stderr, " [--nodes=##] [--gid=##] [--uid=##]\n");
- fprintf(stderr, " --clustersize=bytes --device=/dev/name\n");
- fprintf(stderr, " --label=\"volume label\"\n");
- fprintf(stderr, "\n");
- exit(1);
-}
-
-void process_args(int argc, char **argv)
-{
- int c;
-
- while (1) {
- static struct option long_options[] = {
- {"blocksize", 1, 0, 'b'},
- {"clustersize", 1, 0, 'c'},
- {"volumesize", 1, 0, 'v'},
- {"compatflags", 0, 0, 'C'},
- {"nodes", 1, 0, 'n'},
- {"gid", 1, 0, 'g'},
- {"uid", 1, 0, 'u'},
- {"mode", 1, 0, 'm'},
- {"device", 1, 0, 'd'},
- {"label", 1, 0, 'l'},
- {"uuid", 1, 0, 'U'},
- {0, 0, 0, 0}
- };
- c = getopt_long (argc, argv, "b:c:v:c:n:g:u:m:d:l:U:", long_options, NULL);
- if (c == -1)
- break;
-
- switch (c) {
- case 'b':
- blocksize = strtoul(optarg, NULL, 10);
- break;
- case 'c':
- cluster_size = strtoul(optarg, NULL, 10);
- break;
- case 'v':
- volume_size_in_bytes = strtoull(optarg, NULL, 10);
- break;
- case 'C':
- compat_flags = strtoul(optarg, NULL, 10);
- break;
- case 'n':
- initial_nodes = strtoul(optarg, NULL, 10);
- break;
- case 'g':
- default_gid = strtoul(optarg, NULL, 10);
- break;
- case 'u':
- default_uid = strtoul(optarg, NULL, 10);
- break;
- case 'm':
- default_mode = strtoul(optarg, NULL, 0);
- break;
- case 'd':
- dev_name = strdup(optarg);
- break;
- case 'l':
- vol_label = strdup(optarg);
- break;
- case 'U':
- uuid = strdup(optarg);
- break;
- case '?':
- default:
- usage();
- break;
- }
- }
-
- if (optind < argc) {
- if (dev_name)
- free(dev_name);
- dev_name = strdup(argv[optind]);
- }
- if (!vol_label) {
- MKFS_WARN_STR("you must give a volume label");
- usage();
- }
- if (!dev_name) {
- MKFS_WARN_STR("you must give a volume label");
- usage();
- }
- if (!cluster_size) {
- MKFS_WARN_STR("you must give a cluster size");
- usage();
- }
-}
-
-void adjust_autoconfig_publish_vote(system_file_disk_record *autoconfig_rec,
- system_file_disk_record *publish_rec,
- system_file_disk_record *vote_rec)
-{
- /* whole block was allocated to autoconfig, now divvy it up */
- __u64 apv_data = autoconfig_rec->extent_off;
- __u64 apv_data_len = autoconfig_rec->extent_len;
- __u64 vblocks, ablocks = AUTOCONF_BLOCKS(initial_nodes, 1),
- pblocks = PUBLISH_BLOCKS(initial_nodes, 1);
-
- /* autoconf and publish get just enough, vote gets all the rest. */
- /* this way we can easily tune up to 32 nodes without having to */
- /* move these, and still keep them contiguous all the time. */
- vblocks = ((apv_data_len >> blocksize_bits) - ablocks - pblocks);
-
- autoconfig_rec->extent_off = apv_data;
- autoconfig_rec->file_size =
- autoconfig_rec->extent_len = ablocks << blocksize_bits;
-
- publish_rec->extent_off = autoconfig_rec->extent_off + autoconfig_rec->extent_len;
- publish_rec->file_size =
- publish_rec->extent_len = pblocks << blocksize_bits;
-
- vote_rec->extent_off = publish_rec->extent_off + publish_rec->extent_len;
- vote_rec->file_size =
- vote_rec->extent_len = vblocks << blocksize_bits;
-}
-
-void write_autoconfig_header(system_file_disk_record *rec)
-{
- ocfs_node_config_hdr *hdr;
-
- // first sector of the whole dlm block is a header
- hdr = (mapping + rec->extent_off);
- memset(hdr, 0, blocksize);
- strcpy(hdr->signature, OCFS2_NODE_CONFIG_HDR_SIGN);
- hdr->version = OCFS2_NODE_CONFIG_VER;
- hdr->num_nodes = 0;
- hdr->disk_lock.dl_master = -1;
- hdr->last_node = 0;
-}
-void init_record(system_file_disk_record *rec, int type, int dir)
-{
- memset(rec, 0, sizeof(system_file_disk_record));
- rec->flags = OCFS2_VALID_FL | OCFS2_SYSTEM_FL;
- rec->dir = dir;
- if (dir)
- rec->links = 0;
- else
- rec->links = 1;
- rec->bi.used_bits = rec->bi.total_bits = 0;
- rec->flags = (OCFS2_VALID_FL | OCFS2_SYSTEM_FL);
-
- switch (type) {
- case sfi_journal:
- rec->flags |= OCFS2_JOURNAL_FL;
- break;
- case sfi_bitmap:
- rec->flags |= OCFS2_BITMAP_FL;
- break;
- case sfi_local_alloc:
- rec->flags |= OCFS2_LOCAL_ALLOC_FL;
- break;
- case sfi_dlm:
- rec->flags |= OCFS2_DLM_FL;
- break;
- case sfi_other:
- break;
- }
-}
-
-
-int main(int argc, char **argv)
-{
- __u64 allocated;
- __u32 need;
- char fname[SYSTEM_FILE_NAME_MAX];
- int i, j, num;
- __u64 leading_space;
- funky_dir *orphan_dir;
- funky_dir *root_dir;
- funky_dir *system_dir;
- system_file_disk_record *tmprec, *tmprec2;
-
- progname = strdup(argv[0]);
- process_args(argc, argv);
- init_format_time();
- init_device();
- init_globals();
- adjust_volume_size();
- map_device();
- generate_uuid();
-
- /*
- * ALLOCATE STUFF
- */
-
- // dummy record representing the whole volume
- init_record(&global_alloc_rec, sfi_other, 0);
- global_alloc_rec.extent_off = 0;
- global_alloc_rec.extent_len = volume_size_in_bytes;
-
- init_record(&superblock_rec, sfi_other, 0);
- init_record(&root_dir_rec, sfi_other, 1);
- init_record(&system_dir_rec, sfi_other, 1);
-
- for (i=0; i<NUM_SYSTEM_INODES; i++) {
- num = (system_files[i].global ? 1 : initial_nodes);
- record[i] = malloc(sizeof(system_file_disk_record) * num);
- if (record[i] == NULL)
- MKFS_FATAL_STR("could not allocate memory for system file disk records");
- for (j=0; j < num; j++)
- init_record(&record[i][j], system_files[i].type, system_files[i].dir);
- }
-
- root_dir = alloc_directory();
- system_dir = alloc_directory();
- orphan_dir = alloc_directory();
-
- /*
- * INITIALIZE BITMAPS
- */
-
- /* create an alloc_bm for the global bitmap and align bytes up to next whole cluster.
- extent_off is not yet known, since it must be allocated from itself. */
- need = (volume_size_in_clusters+7) >> 3;
- need = ((need + cluster_size - 1) >> cluster_size_bits) << cluster_size_bits;
- tmprec = &(record[GLOBAL_BITMAP_SYSTEM_INODE][0]);
- tmprec->extent_off = 0; // need to fill this in later
- tmprec->extent_len = need;
-
- global_bm = initialize_bitmap (volume_size_in_clusters, cluster_size_bits,
- "global bitmap", tmprec, &global_alloc_rec);
-
- /* assign some space from global_bm to system_bm for data and bitmap blocks */
- tmprec = &(record[GLOBAL_INODE_ALLOC_SYSTEM_INODE][0]);
- tmprec2 = &(record[GLOBAL_INODE_ALLOC_BITMAP_SYSTEM_INODE][0]);
- need = blocks_needed();
- alloc_bytes_from_bitmap (need << blocksize_bits, global_bm,
- &(tmprec->extent_off), &(tmprec->extent_len));
-
- need = ((((need+7) >> 3) + cluster_size - 1) >> cluster_size_bits) << cluster_size_bits;
- alloc_bytes_from_bitmap (need, global_bm, &(tmprec2->extent_off),
- &(tmprec2->extent_len));
-
- /* create an alloc_bm for the system inode bitmap */
- system_bm = initialize_bitmap(tmprec->extent_len >> blocksize_bits, blocksize_bits,
- "system inode bitmap", tmprec2, tmprec);
-
-
- /*
- * ALLOCATE INODES AND DIRECTORIES
- */
-
- /* leading space */
- leading_space = alloc_inode(LEADING_SPACE_BLOCKS);
- if (leading_space != 0ULL)
- MKFS_FATAL("leading space blocks start at byte %llu, must start at 0\n", leading_space);
-
-
- /* superblock */
- superblock_rec.fe_off = alloc_inode(SUPERBLOCK_BLOCKS);
- if (superblock_rec.fe_off != (__u64)MAGIC_SUPERBLOCK_BLOCK_NUMBER << blocksize_bits)
- MKFS_FATAL("superblock starts at byte %llu, must start at %llu\n",
- superblock_rec.fe_off, MAGIC_SUPERBLOCK_BLOCK_NUMBER << blocksize_bits);
-
-
- /* root directory */
- alloc_from_bitmap (1, global_bm, &root_dir_rec.extent_off, &root_dir_rec.extent_len);
- root_dir_rec.fe_off = alloc_inode(1);
- root_dir->record = &root_dir_rec;
- add_entry_to_directory(root_dir, ".", root_dir_rec.fe_off, OCFS2_FT_DIR);
- add_entry_to_directory(root_dir, "..", root_dir_rec.fe_off, OCFS2_FT_DIR);
-
-
- /* system directory */
- need = system_dir_blocks_needed();
- alloc_from_bitmap (need, global_bm, &system_dir_rec.extent_off, &system_dir_rec.extent_len);
- system_dir_rec.fe_off = alloc_inode(1);
- system_dir->record = &system_dir_rec;
- add_entry_to_directory(system_dir, ".", system_dir_rec.extent_off, OCFS2_FT_DIR);
- add_entry_to_directory(system_dir, "..", system_dir_rec.extent_off, OCFS2_FT_DIR);
- /* alloc and add all local system file inodes to system directory */
- for (i=0; i<NUM_SYSTEM_INODES; i++) {
- num = (system_files[i].global) ? 1 : initial_nodes;
- for (j=0; j < num; j++) {
- record[i][j].fe_off = alloc_inode(1);
- sprintf(fname, system_files[i].name, j);
- add_entry_to_directory(system_dir, fname, record[i][j].fe_off,
- system_files[i].dir ? OCFS2_FT_DIR : OCFS2_FT_REG_FILE);
- }
- }
-
- /* dlm area data */
- tmprec = &(record[DLM_SYSTEM_INODE][0]);
- need = (AUTOCONF_BLOCKS(initial_nodes, 32) +
- PUBLISH_BLOCKS(initial_nodes, 32) +
- VOTE_BLOCKS(initial_nodes, 32));
- alloc_from_bitmap(need, global_bm, &tmprec->extent_off, &tmprec->extent_len);
- tmprec->file_size = need << blocksize_bits;
-
-
- /* orphan dir */
- tmprec = &record[ORPHAN_DIR_SYSTEM_INODE][0];
- orphan_dir->record = tmprec;
- alloc_from_bitmap (1, global_bm, &tmprec->extent_off, &tmprec->extent_len);
- add_entry_to_directory(orphan_dir, ".", tmprec->extent_off, OCFS2_FT_DIR);
- add_entry_to_directory(orphan_dir, "..", tmprec->extent_off, OCFS2_FT_DIR);
-
-
- /* finally, allocate (extent_off) the space for the global bitmap from itself */
- tmprec = global_bm->bm_record;
- alloc_bytes_from_bitmap (tmprec->extent_len, global_bm,
- &(tmprec->extent_off), &allocated);
-
-
- /*
- * FORMAT BLOCKS
- */
- format_leading_space(leading_space);
- format_superblock(&superblock_rec, &root_dir_rec, &system_dir_rec);
-
- format_file(&root_dir_rec);
- format_file(&system_dir_rec);
-
- for (i=0; i<NUM_SYSTEM_INODES; i++) {
- num = (system_files[i].global ? 1 : initial_nodes);
- for (j=0; j<num; j++) {
- tmprec = &(record[i][j]);
- if (system_files[i].type == sfi_journal) {
- alloc_bytes_from_bitmap(OCFS2_DEFAULT_JOURNAL_SIZE, global_bm,
- &(tmprec->extent_off), &(tmprec->extent_len));
- replacement_journal_create(tmprec->extent_off);
- tmprec->file_size = tmprec->extent_len;
- }
- format_file(tmprec);
- }
- }
-
- /*
- * WRITE BITMAPS
- */
- write_bitmap_data(global_bm);
- write_bitmap_data(system_bm);
-
- /*
- * WRITE DIRECTORIES
- */
- write_directory_data(root_dir);
- write_directory_data(system_dir);
- write_directory_data(orphan_dir);
-
- write_autoconfig_header(&record[DLM_SYSTEM_INODE][0]);
- /*
- * SYNC TO DISK
- */
- sync_device();
- unmap_device();
- close(fd);
-
- return 0;
-}
-
-
-#define OCFS2_BUILD_VERSION "x"
-#define OCFS2_BUILD_DATE "y"
-#define OCFS2_BUILD_MD5 "z"
-
-void version(char *progname)
-{
- printf("%s %s %s (build %s)\n", progname,
- OCFS2_BUILD_VERSION,
- OCFS2_BUILD_DATE,
- OCFS2_BUILD_MD5);
- return;
-} /* version */
-
-
More information about the Ocfs2-tools-commits
mailing list