Fix bitmap blocks
authorRobert Pengelly <robertapengelly@hotmail.com>
Fri, 29 Aug 2025 22:24:15 +0000 (23:24 +0100)
committerRobert Pengelly <robertapengelly@hotmail.com>
Fri, 29 Aug 2025 22:24:15 +0000 (23:24 +0100)
common.c
common.h
inode.h
mcopy.c
mkfs.c
mls.c
mmd.c

index 48b1ee142aa39f97818cc494aefbc8bdaf65f8a4..20a7a3e7d7d4f5289b62d68ed40c53612c16e85b 100644 (file)
--- 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);
 
 }
index a5d4c62568568eb23f9234530ad76c51c5170f96..9d447e96755f04aa20e7b8f3643fc71591072434 100644 (file)
--- 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 4ec5c79e253da61b4836fbf5df172d076fdc2d2c..bd38652e4037e164973b9fe4fd703526cc2865a7 100644 (file)
--- a/inode.h
+++ b/inode.h
 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 2b956b506ed284f524867758850e0e5f7b24962c..0fec895fda200230a7ccf11ee4894963a1e1908f 100644 (file)
--- 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 3b525882e3e21cf2426afc55e2a817bba6955ec1..8613126033d8a8203f9c2137f3be6bf6b84f3ea1 100644 (file)
--- 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 58af2992a09dd2f3ea802a5aa1be40269a981752..51aa0badc44d61b06888ff93e7ec4b2f7d633b0a 100644 (file)
--- 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 a349dd674c3babbf4d1a2ef9324bae0721eae9e4..d3500e09071826125335eab0d468b6baf1247e23 100644 (file)
--- 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;
         
         }