From 720fc26d33352407715cb286a4edc23d15906d5f Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sun, 4 Feb 2007 19:14:58 -0500 Subject: Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count index blocks). --- lib/lib.c | 5 +++-- lib/lib.h | 5 ++--- toys/e2fs.h | 4 +--- toys/mke2fs.c | 34 +++++++++++++++++++++++++++++++++- toys/toylist.h | 2 ++ 5 files changed, 41 insertions(+), 9 deletions(-) diff --git a/lib/lib.c b/lib/lib.c index a2f1708b..f1d1ce1f 100644 --- a/lib/lib.c +++ b/lib/lib.c @@ -534,7 +534,7 @@ struct dirtree *read_dirtree_node(char *path) // Given a directory (in a writeable PATH_MAX buffer), recursively read in a // directory tree. -struct dirtree *read_dirtree(char *path) +struct dirtree *read_dirtree(char *path, struct dirtree *parent) { struct dirtree *dt = NULL, **ddt = &dt; DIR *dir; @@ -554,7 +554,8 @@ struct dirtree *read_dirtree(char *path) snprintf(path+len, sizeof(toybuf)-len, "/%s", entry->d_name); *ddt = read_dirtree_node(path); - if (entry->d_type == DT_DIR) (*ddt)->child = read_dirtree(path); + (*ddt)->parent = parent; + if (entry->d_type == DT_DIR) (*ddt)->child = read_dirtree(path, *ddt); ddt = &((*ddt)->next); path[len]=0; } diff --git a/lib/lib.h b/lib/lib.h index d3c937ca..07cc9cd8 100644 --- a/lib/lib.h +++ b/lib/lib.h @@ -22,8 +22,7 @@ struct arg_list { }; struct dirtree { - struct dirtree *next; - struct dirtree *child; + struct dirtree *next, *child, *parent; struct stat st; char name[]; }; @@ -68,7 +67,7 @@ char *utoa(unsigned n); char *itoa(int n); off_t fdlength(int fd); struct dirtree *read_dirtree_node(char *path); -struct dirtree *read_dirtree(char *path); +struct dirtree *read_dirtree(char *path, struct dirtree *parent); // getmountlist.c struct mtab_list { diff --git a/toys/e2fs.h b/toys/e2fs.h index bcffa3c6..5a2cb64d 100644 --- a/toys/e2fs.h +++ b/toys/e2fs.h @@ -80,7 +80,7 @@ struct ext2_dentry { uint16_t rec_len; // Directory entry length uint8_t name_len; // Name length uint8_t file_type; - char name[255]; // File name + char name[0]; // File name }; struct ext2_inode { @@ -109,8 +109,6 @@ struct ext2_inode { uint32_t reserved2; }; - - #define EXT2_FEATURE_COMPAT_DIR_PREALLOC 0x0001 #define EXT2_FEATURE_COMPAT_IMAGIC_INODES 0x0002 #define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004 diff --git a/toys/mke2fs.c b/toys/mke2fs.c index bf019567..bade3d22 100644 --- a/toys/mke2fs.c +++ b/toys/mke2fs.c @@ -30,6 +30,26 @@ #define INODES_RESERVED 10 +// Calculate data blocks plus index blocks needed to hold a file. +uint32_t blocks_used(uint64_t size) +{ + uint32_t dblocks = (uint32_t)((size+(TT.blocksize-1))/TT.blocksize); + uint32_t idx=TT.blocksize/4, iblocks=0, diblocks=0, tiblocks=0; + + // Account for direct, singly, doubly, and triply indiret index blocks + + if (dblocks > 12) { + iblocks = ((dblocks-13)/idx)+1; + if (iblocks > 1) { + diblocks = ((iblocks-2)/idx)+1; + if (diblocks > 1) + tiblocks = ((diblocks-2)/idx)+1; + } + } + + return dblocks + iblocks + diblocks + tiblocks; +} + // According to http://www.opengroup.org/onlinepubs/9629399/apdxa.htm // we should generate a uuid structure by reading a clock with 100 nanosecond // precision, normalizing it to the start of the gregorian calendar in 1582, @@ -187,7 +207,19 @@ int mke2fs_main(void) temp = O_RDWR|O_CREAT; } else temp = O_RDWR; - // TODO: collect gene2fs list/lost+found, calculate requirements. + // Collect gene2fs list or lost+found, calculate requirements. + + if (TT.gendir) { + strncpy(toybuf, TT.gendir, sizeof(toybuf)); + TT.dt = read_dirtree(toybuf, NULL); + } else { + TT.dt = xzalloc(sizeof(struct dirtree)+11); + strcpy(TT.dt->name, "lost+found"); + TT.dt->st.st_mode = S_IFDIR|0755; + TT.dt->st.st_ctime = TT.dt->st.st_mtime = time(NULL); + } + + // Calculate st_nlink for each node in tree. // TODO: Check if filesystem is mounted here diff --git a/toys/toylist.h b/toys/toylist.h index 715b5613..87aaba84 100644 --- a/toys/toylist.h +++ b/toys/toylist.h @@ -23,10 +23,12 @@ struct mke2fs_data { long bytes_per_inode; long inodes; long reserved_percent; + char *gendir; unsigned blocks, groups; int fsfd, noseek; struct ext2_superblock sb; + struct dirtree *dt; }; // "E:jJ:L:m:O:" -- cgit v1.2.3