From d0627859bdf3414cbdbc5a00995fc9a7beb1c87a Mon Sep 17 00:00:00 2001 From: Robert Pengelly Date: Fri, 29 Aug 2025 23:24:15 +0100 Subject: [PATCH] Fix bitmap blocks --- common.c | 15 ++++++++++----- common.h | 2 +- inode.h | 4 ++-- mcopy.c | 8 ++++---- mkfs.c | 19 +++++++++++++------ mls.c | 8 ++++---- mmd.c | 8 ++++---- 7 files changed, 38 insertions(+), 26 deletions(-) diff --git a/common.c b/common.c index 48b1ee1..20a7a3e 100644 --- a/common.c +++ b/common.c @@ -278,17 +278,22 @@ int get_bit (FILE *fp, unsigned long block, int bit) { } -void insert_bit (FILE *fp, unsigned long block, int bit) { +void insert_bit (FILE *fp, unsigned long block, int bit, int count) { - int w, s; + int w, s, i; memset (buffer, 0, sizeof (buffer)); get_block (fp, block, buffer); - w = bit / 8; - s = bit % 8; + for (i = bit; i < bit + count; i++) { + + w = i / 8; + s = i % 8; + + buffer[w] |= (1 << s); + + } - buffer[w] |= (1 << s); put_block (fp, block, buffer); } diff --git a/common.h b/common.h index a5d4c62..9d447e9 100644 --- a/common.h +++ b/common.h @@ -40,7 +40,7 @@ void incr_size (FILE *fp, int n, unsigned long count); void incr_link (FILE *fp, int n); int get_bit (FILE *fp, unsigned long block, int bit); -void insert_bit (FILE *fp, unsigned long block, int bit); +void insert_bit (FILE *fp, unsigned long block, int bit, int count); int mode_con (char *p); diff --git a/inode.h b/inode.h index 4ec5c79..bd38652 100644 --- a/inode.h +++ b/inode.h @@ -10,12 +10,12 @@ struct inode { unsigned char i_mode[2]; - unsigned char uid[2]; + unsigned char i_uid[2]; unsigned char i_size[4]; unsigned char i_mod_time[4]; - unsigned char gid; + unsigned char i_gid; unsigned char i_nlinks; unsigned char i_zone[NR_TZONES * 2]; diff --git a/mcopy.c b/mcopy.c index 2b956b5..0fec895 100644 --- a/mcopy.c +++ b/mcopy.c @@ -298,12 +298,12 @@ static int alloc_inode (FILE *fp, int mode, int userid, int groupid) { off = (ino - 1) % INODES_PER_BLOCK; write_to_byte_array (inode[off].i_mode, mode, 2); - write_to_byte_array (inode[off].uid, userid, 2); + write_to_byte_array (inode[off].i_uid, userid, 2); - inode[off].gid = groupid; + inode[off].i_gid = groupid; put_block (fp, block, inode); - insert_bit (fp, INODE_MAP, ino); + insert_bit (fp, INODE_MAP, ino, 1); return ino; } @@ -335,7 +335,7 @@ int alloc_zone (FILE *fp) { put_block (fp, block + i, buf); } - insert_bit (fp, zone_map, zone - zone_off); + insert_bit (fp, zone_map, zone - zone_off, 1); return zone; } diff --git a/mkfs.c b/mkfs.c index 3b52588..8613126 100644 --- a/mkfs.c +++ b/mkfs.c @@ -262,12 +262,12 @@ static int alloc_inode (FILE *fp, int mode, int userid, int groupid) { off = (num - 1) % INODES_PER_BLOCK; write_to_byte_array (inode[off].i_mode, mode, 2); - write_to_byte_array (inode[off].uid, userid, 2); + write_to_byte_array (inode[off].i_uid, userid, 2); - inode[off].gid = groupid; + inode[off].i_gid = groupid; put_block (fp, b, inode); - insert_bit (fp, INODE_MAP, num); + insert_bit (fp, INODE_MAP, num, 1); return num; } @@ -292,7 +292,7 @@ int alloc_zone (FILE *fp) { put_block (fp, b + i, buf); } - insert_bit (fp, zone_map, z - zone_off); + insert_bit (fp, zone_map, z - zone_off, 1); return z; } @@ -341,6 +341,7 @@ static void super (unsigned long zones, unsigned long inodes) { unsigned long inode_blocks, init_blocks; unsigned long s_imap_blocks, s_zmap_blocks, s_first_data_zone; + unsigned long nrzones, init_zones; unsigned long zo; struct super_block *sup; @@ -361,6 +362,9 @@ static void super (unsigned long zones, unsigned long inodes) { inode_offset = s_imap_blocks + s_zmap_blocks + 2; init_blocks = inode_offset + inode_blocks; + init_zones = (init_blocks + (1 << zone_shift) - 1) >> zone_shift; + + nrzones = nzones >> zone_shift; s_first_data_zone = (init_blocks + (1 << zone_shift) - 1) >> zone_shift; write_to_byte_array (sup->s_first_data_zone, s_first_data_zone, 2); @@ -387,11 +391,14 @@ static void super (unsigned long zones, unsigned long inodes) { zone_map = INODE_MAP + s_imap_blocks; - insert_bit (ofp, zone_map, 0); - insert_bit (ofp, INODE_MAP, 0); + insert_bit (ofp, zone_map, 0, 1); + insert_bit (ofp, INODE_MAP, 0, 1); zone_size = 1 << zone_shift; zone_off = s_first_data_zone - 1; + + insert_bit (ofp, zone_map, nrzones - init_zones + 1, 8 * BLOCK_SIZE - (nrzones - init_zones + 1)); + insert_bit (ofp, INODE_MAP, inodes + 1, 8 * BLOCK_SIZE - inodes - 1); } diff --git a/mls.c b/mls.c index 58af299..51aa0ba 100644 --- a/mls.c +++ b/mls.c @@ -513,14 +513,14 @@ static int walk_dir (char *fn, int list, int multi) { size = ((unsigned long) ip2->i_size[0]) | (((unsigned long) ip2->i_size[1]) << 8) | (((unsigned long) ip2->i_size[2]) << 16) | (((unsigned long) ip2->i_size[3]) << 24); printf (" %10lu", size); - uid = ((unsigned long) ip2->uid[0]) | (((unsigned long) ip2->uid[1]) << 8); + uid = ((unsigned long) ip2->i_uid[0]) | (((unsigned long) ip2->i_uid[1]) << 8); printf (" %2ld", uid); mod_time = ((unsigned long) ip2->i_mod_time[0]) | (((unsigned long) ip2->i_mod_time[1]) << 8) | (((unsigned long) ip2->i_mod_time[2]) << 16) | (((unsigned long) ip2->i_mod_time[3]) << 24); strftime (dt, sizeof (dt), "%Y-%m-%d %H:%M:%S", localtime (&mod_time)); /*strftime (dt, sizeof (dt), "%b %d %Y %H:%M:%S", localtime (&mod_time));*/ - printf (" %2d %s %s\n", ip2->gid, dt, dep->d_name); + printf (" %2d %s %s\n", ip2->i_gid, dt, dep->d_name); } @@ -570,14 +570,14 @@ static int walk_dir (char *fn, int list, int multi) { size = ((unsigned long) ip1->i_size[0]) | (((unsigned long) ip1->i_size[1]) << 8) | (((unsigned long) ip1->i_size[2]) << 16) | (((unsigned long) ip1->i_size[3]) << 24); sprintf (buf + 14, " %10lu", size); - uid = ((unsigned long) ip1->uid[0]) | (((unsigned long) ip1->uid[1]) << 8); + uid = ((unsigned long) ip1->i_uid[0]) | (((unsigned long) ip1->i_uid[1]) << 8); sprintf (buf + 26, " %2ld", uid); mod_time = ((unsigned long) ip1->i_mod_time[0]) | (((unsigned long) ip1->i_mod_time[1]) << 8) | (((unsigned long) ip1->i_mod_time[2]) << 16) | (((unsigned long) ip1->i_mod_time[3]) << 24); strftime (dt, sizeof (dt), "%Y-%m-%d %H:%M:%S", localtime (&mod_time)); /*strftime (dt, sizeof (dt), "%b %d %Y %H:%M:%S", localtime (&mod_time));*/ - sprintf (buf + 30, " %2d %s %s", ip1->gid, dt, fn); + sprintf (buf + 30, " %2d %s %s", ip1->i_gid, dt, fn); dynarray_add (&files, &nb_files, buf); return 2; diff --git a/mmd.c b/mmd.c index a349dd6..d3500e0 100644 --- a/mmd.c +++ b/mmd.c @@ -266,12 +266,12 @@ static int alloc_inode (FILE *fp, int mode, int userid, int groupid) { off = (ino - 1) % INODES_PER_BLOCK; write_to_byte_array (inode[off].i_mode, mode, 2); - write_to_byte_array (inode[off].uid, userid, 2); + write_to_byte_array (inode[off].i_uid, userid, 2); - inode[off].gid = groupid; + inode[off].i_gid = groupid; put_block (fp, block, inode); - insert_bit (fp, INODE_MAP, ino); + insert_bit (fp, INODE_MAP, ino, 1); return ino; } @@ -303,7 +303,7 @@ int alloc_zone (FILE *fp) { put_block (fp, block + i, buf); } - insert_bit (fp, zone_map, zone - zone_off); + insert_bit (fp, zone_map, zone - zone_off, 1); return zone; } -- 2.34.1