aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-01-03 00:43:19 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-01-03 00:43:19 +0000
commitaa95959cb81b72d37ce1f20606f97e064bbd2bfe (patch)
treecdc5e820c8363c08e6950d2ebae5dae904b4d2ee
parent6dd392a2520ee226d8f8535c449454f4ed5a08a5 (diff)
downloadbusybox-w32-aa95959cb81b72d37ce1f20606f97e064bbd2bfe.tar.gz
busybox-w32-aa95959cb81b72d37ce1f20606f97e064bbd2bfe.tar.bz2
busybox-w32-aa95959cb81b72d37ce1f20606f97e064bbd2bfe.zip
factor out minix structures/constants into minix.h
fsck_minix: optimizations
-rw-r--r--util-linux/fsck_minix.c322
-rw-r--r--util-linux/mkfs_minix.c75
2 files changed, 133 insertions, 264 deletions
diff --git a/util-linux/fsck_minix.c b/util-linux/fsck_minix.c
index 44bcd332f..ebfd645f2 100644
--- a/util-linux/fsck_minix.c
+++ b/util-linux/fsck_minix.c
@@ -90,146 +90,83 @@
90#include "busybox.h" 90#include "busybox.h"
91#include <mntent.h> 91#include <mntent.h>
92 92
93/* 93#include "minix.h"
94 * This is the original minix inode layout on disk.
95 * Note the 8-bit gid and atime and ctime.
96 */
97struct minix_inode {
98 uint16_t i_mode;
99 uint16_t i_uid;
100 uint32_t i_size;
101 uint32_t i_time;
102 uint8_t i_gid;
103 uint8_t i_nlinks;
104 uint16_t i_zone[9];
105};
106 94
107/* 95#ifndef BLKGETSIZE
108 * The new minix inode has all the time entries, as well as 96#define BLKGETSIZE _IO(0x12,96) /* return device size */
109 * long block numbers and a third indirect block (7+1+1+1 97#endif
110 * instead of 7+1+1). Also, some previously 8-bit values are
111 * now 16-bit. The inode is now 64 bytes instead of 32.
112 */
113struct minix2_inode {
114 uint16_t i_mode;
115 uint16_t i_nlinks;
116 uint16_t i_uid;
117 uint16_t i_gid;
118 uint32_t i_size;
119 uint32_t i_atime;
120 uint32_t i_mtime;
121 uint32_t i_ctime;
122 uint32_t i_zone[10];
123};
124 98
125/* Believe it or not, but mount.h has this one */ 99#ifdef UNUSED
126#undef BLOCK_SIZE
127enum { 100enum {
128 BLOCK_SIZE = 1024, 101 MINIX1_LINK_MAX = 250,
129
130 MINIX_ROOT_INO = 1,
131 MINIX_LINK_MAX = 250,
132 MINIX2_LINK_MAX = 65530, 102 MINIX2_LINK_MAX = 65530,
133
134 MINIX_I_MAP_SLOTS = 8, 103 MINIX_I_MAP_SLOTS = 8,
135 MINIX_Z_MAP_SLOTS = 64, 104 MINIX_Z_MAP_SLOTS = 64,
136 MINIX_SUPER_MAGIC = 0x137F, /* original minix fs */ 105 MINIX_V1 = 0x0001, /* original minix fs */
137 MINIX_SUPER_MAGIC2 = 0x138F, /* minix fs, 30 char names */ 106 MINIX_V2 = 0x0002, /* minix V2 fs */
138 MINIX2_SUPER_MAGIC = 0x2468, /* minix V2 fs */ 107 NAME_MAX = 255, /* # chars in a file name */
139 MINIX2_SUPER_MAGIC2 = 0x2478, /* minix V2 fs, 30 char names */
140 MINIX_VALID_FS = 0x0001, /* Clean fs. */
141 MINIX_ERROR_FS = 0x0002, /* fs has errors. */
142
143 MINIX_INODES_PER_BLOCK = ((BLOCK_SIZE)/(sizeof (struct minix_inode))),
144 MINIX2_INODES_PER_BLOCK = ((BLOCK_SIZE)/(sizeof (struct minix2_inode))),
145
146 MINIX_V1 = 0x0001, /* original minix fs */
147 MINIX_V2 = 0x0002 /* minix V2 fs */
148};
149
150#define INODE_VERSION(inode) inode->i_sb->u.minix_sb.s_version
151
152/*
153 * minix super-block data on disk
154 */
155struct minix_super_block {
156 uint16_t s_ninodes;
157 uint16_t s_nzones;
158 uint16_t s_imap_blocks;
159 uint16_t s_zmap_blocks;
160 uint16_t s_firstdatazone;
161 uint16_t s_log_zone_size;
162 uint32_t s_max_size;
163 uint16_t s_magic;
164 uint16_t s_state;
165 uint32_t s_zones;
166};
167
168struct minix_dir_entry {
169 uint16_t inode;
170 char name[0];
171}; 108};
172
173
174#define NAME_MAX 255 /* # chars in a file name */
175
176#define MINIX_INODES_PER_BLOCK ((BLOCK_SIZE)/(sizeof (struct minix_inode)))
177
178#ifndef BLKGETSIZE
179#define BLKGETSIZE _IO(0x12,96) /* return device size */
180#endif 109#endif
181 110
182enum { ROOT_INO = 1 }; 111#if ENABLE_FEATURE_MINIX2
183 112static smallint version2;
184#define UPPER(size,n) ((size+((n)-1))/(n))
185#define INODE_SIZE (sizeof(struct minix_inode))
186#ifdef CONFIG_FEATURE_MINIX2
187#define INODE_SIZE2 (sizeof(struct minix2_inode))
188#define INODE_BLOCKS UPPER(INODES, (version2 ? MINIX2_INODES_PER_BLOCK \
189 : MINIX_INODES_PER_BLOCK))
190#else 113#else
191#define INODE_BLOCKS UPPER(INODES, (MINIX_INODES_PER_BLOCK)) 114enum { version2 = 0 };
192#endif 115#endif
193#define INODE_BUFFER_SIZE (INODE_BLOCKS * BLOCK_SIZE)
194
195#define BITS_PER_BLOCK (BLOCK_SIZE<<3)
196 116
197#define PROGRAM_VERSION "1.2 - 11/11/96" 117#define PROGRAM_VERSION "1.2 - 11/11/96"
198static char *device_name;
199static int IN;
200static smallint repair, automatic, verbose, list, show, warn_mode, force; 118static smallint repair, automatic, verbose, list, show, warn_mode, force;
201static int directory, regular, blockdev, chardev, links, symlinks, total; 119static smallint changed; /* is filesystem modified? */
120static smallint errors_uncorrected; /* flag if some error was not corrected */
202 121
203static struct termios termios;
204static smallint termios_set; 122static smallint termios_set;
123static struct termios termios;
124
125static char *device_name;
126static int IN;
127static int directory, regular, blockdev, chardev, links, symlinks, total;
205 128
206static smallint changed; /* flags if the filesystem has been changed */
207static smallint errors_uncorrected; /* flag if some error was not corrected */
208//also smallint? 129//also smallint?
209static int dirsize = 16; 130static int dirsize = 16;
210static int namelen = 14; 131static int namelen = 14;
211 132
212static char *inode_buffer; 133static char *inode_buffer;
213#define Inode (((struct minix_inode *) inode_buffer)-1)
214#define Inode2 (((struct minix2_inode *) inode_buffer)-1)
215//xzalloc? 134//xzalloc?
216static char super_block_buffer[BLOCK_SIZE]; 135static char super_block_buffer[BLOCK_SIZE];
217 136
137#define Inode1 (((struct minix1_inode *) inode_buffer)-1)
138#define Inode2 (((struct minix2_inode *) inode_buffer)-1)
139
218#define Super (*(struct minix_super_block *)super_block_buffer) 140#define Super (*(struct minix_super_block *)super_block_buffer)
219#define INODES ((unsigned long)Super.s_ninodes) 141
220#ifdef CONFIG_FEATURE_MINIX2 142#if ENABLE_FEATURE_MINIX2
221static smallint version2; 143# define ZONES ((unsigned)(version2 ? Super.s_zones : Super.s_nzones))
222#define ZONES ((unsigned long)(version2 ? Super.s_zones : Super.s_nzones))
223#else 144#else
224#define ZONES ((unsigned long)(Super.s_nzones)) 145# define ZONES ((unsigned)(Super.s_nzones))
146#endif
147#define INODES ((unsigned)Super.s_ninodes)
148#define IMAPS ((unsigned)Super.s_imap_blocks)
149#define ZMAPS ((unsigned)Super.s_zmap_blocks)
150#define FIRSTZONE ((unsigned)Super.s_firstdatazone)
151#define ZONESIZE ((unsigned)Super.s_log_zone_size)
152#define MAXSIZE ((unsigned)Super.s_max_size)
153#define MAGIC (Super.s_magic)
154
155/* gcc likes this more (code is smaller) than macro variant */
156static ATTRIBUTE_ALWAYS_INLINE unsigned div_roundup(unsigned size, unsigned n)
157{
158 return (size + n-1) / n;
159}
160
161#if ENABLE_FEATURE_MINIX2
162#define INODE_BLOCKS div_roundup(INODES, (version2 ? MINIX2_INODES_PER_BLOCK \
163 : MINIX1_INODES_PER_BLOCK))
164#else
165#define INODE_BLOCKS div_roundup(INODES, MINIX1_INODES_PER_BLOCK)
225#endif 166#endif
226#define IMAPS ((unsigned long)Super.s_imap_blocks) 167
227#define ZMAPS ((unsigned long)Super.s_zmap_blocks) 168#define INODE_BUFFER_SIZE (INODE_BLOCKS * BLOCK_SIZE)
228#define FIRSTZONE ((unsigned long)Super.s_firstdatazone) 169#define NORM_FIRSTZONE (2 + IMAPS + ZMAPS + INODE_BLOCKS)
229#define ZONESIZE ((unsigned long)Super.s_log_zone_size)
230#define MAXSIZE ((unsigned long)Super.s_max_size)
231#define MAGIC (Super.s_magic)
232#define NORM_FIRSTZONE (2+IMAPS+ZMAPS+INODE_BLOCKS)
233 170
234static char *inode_map; 171static char *inode_map;
235static char *zone_map; 172static char *zone_map;
@@ -237,15 +174,11 @@ static char *zone_map;
237static unsigned char *inode_count; 174static unsigned char *inode_count;
238static unsigned char *zone_count; 175static unsigned char *zone_count;
239 176
240static void recursive_check(unsigned int ino);
241#ifdef CONFIG_FEATURE_MINIX2
242static void recursive_check2(unsigned int ino);
243#endif
244
245static int bit(char *a, unsigned int i) 177static int bit(char *a, unsigned int i)
246{ 178{
247 return (a[i >> 3] & (1<<(i & 7))) != 0; 179 return (a[i >> 3] & (1<<(i & 7))) != 0;
248} 180}
181
249#define inode_in_use(x) (bit(inode_map,(x))) 182#define inode_in_use(x) (bit(inode_map,(x)))
250#define zone_in_use(x) (bit(zone_map,(x)-FIRSTZONE+1)) 183#define zone_in_use(x) (bit(zone_map,(x)-FIRSTZONE+1))
251 184
@@ -255,6 +188,12 @@ static int bit(char *a, unsigned int i)
255#define mark_zone(x) (setbit(zone_map,(x)-FIRSTZONE+1),changed=1) 188#define mark_zone(x) (setbit(zone_map,(x)-FIRSTZONE+1),changed=1)
256#define unmark_zone(x) (clrbit(zone_map,(x)-FIRSTZONE+1),changed=1) 189#define unmark_zone(x) (clrbit(zone_map,(x)-FIRSTZONE+1),changed=1)
257 190
191
192static void recursive_check(unsigned int ino);
193#if ENABLE_FEATURE_MINIX2
194static void recursive_check2(unsigned int ino);
195#endif
196
258static void leave(int) ATTRIBUTE_NORETURN; 197static void leave(int) ATTRIBUTE_NORETURN;
259static void leave(int status) 198static void leave(int status)
260{ 199{
@@ -285,7 +224,7 @@ static void alloc_current_name(void)
285 name_component[0] = &current_name[0]; 224 name_component[0] = &current_name[0];
286} 225}
287 226
288#ifdef CONFIG_FEATURE_CLEAN_UP 227#if ENABLE_FEATURE_CLEAN_UP
289/* execute this atexit() to deallocate name_list[] */ 228/* execute this atexit() to deallocate name_list[] */
290/* piptigger was here */ 229/* piptigger was here */
291static void free_current_name(void) 230static void free_current_name(void)
@@ -488,7 +427,7 @@ static void write_block(unsigned int nr, char *addr)
488 * It sets 'changed' if the inode has needed changing, and re-writes 427 * It sets 'changed' if the inode has needed changing, and re-writes
489 * any indirect blocks with errors. 428 * any indirect blocks with errors.
490 */ 429 */
491static int map_block(struct minix_inode *inode, unsigned int blknr) 430static int map_block(struct minix1_inode *inode, unsigned int blknr)
492{ 431{
493 uint16_t ind[BLOCK_SIZE >> 1]; 432 uint16_t ind[BLOCK_SIZE >> 1];
494 uint16_t dind[BLOCK_SIZE >> 1]; 433 uint16_t dind[BLOCK_SIZE >> 1];
@@ -523,7 +462,7 @@ static int map_block(struct minix_inode *inode, unsigned int blknr)
523 return result; 462 return result;
524} 463}
525 464
526#ifdef CONFIG_FEATURE_MINIX2 465#if ENABLE_FEATURE_MINIX2
527static int map_block2(struct minix2_inode *inode, unsigned int blknr) 466static int map_block2(struct minix2_inode *inode, unsigned int blknr)
528{ 467{
529 uint32_t ind[BLOCK_SIZE >> 2]; 468 uint32_t ind[BLOCK_SIZE >> 2];
@@ -618,12 +557,12 @@ static void get_dirsize(void)
618 char blk[BLOCK_SIZE]; 557 char blk[BLOCK_SIZE];
619 int size; 558 int size;
620 559
621#ifdef CONFIG_FEATURE_MINIX2 560#if ENABLE_FEATURE_MINIX2
622 if (version2) 561 if (version2)
623 block = Inode2[ROOT_INO].i_zone[0]; 562 block = Inode2[MINIX_ROOT_INO].i_zone[0];
624 else 563 else
625#endif 564#endif
626 block = Inode[ROOT_INO].i_zone[0]; 565 block = Inode1[MINIX_ROOT_INO].i_zone[0];
627 read_block(block, blk); 566 read_block(block, blk);
628 for (size = 16; size < BLOCK_SIZE; size <<= 1) { 567 for (size = 16; size < BLOCK_SIZE; size <<= 1) {
629 if (strcmp(blk + size + 2, "..") == 0) { 568 if (strcmp(blk + size + 2, "..") == 0) {
@@ -646,11 +585,11 @@ static void read_superblock(void)
646 dirsize = 16; 585 dirsize = 16;
647 version2 = 0; 586 version2 = 0;
648 */ 587 */
649 if (MAGIC == MINIX_SUPER_MAGIC) { 588 if (MAGIC == MINIX1_SUPER_MAGIC) {
650 } else if (MAGIC == MINIX_SUPER_MAGIC2) { 589 } else if (MAGIC == MINIX1_SUPER_MAGIC2) {
651 namelen = 30; 590 namelen = 30;
652 dirsize = 32; 591 dirsize = 32;
653#ifdef CONFIG_FEATURE_MINIX2 592#if ENABLE_FEATURE_MINIX2
654 } else if (MAGIC == MINIX2_SUPER_MAGIC) { 593 } else if (MAGIC == MINIX2_SUPER_MAGIC) {
655 version2 = 1; 594 version2 = 1;
656 } else if (MAGIC == MINIX2_SUPER_MAGIC2) { 595 } else if (MAGIC == MINIX2_SUPER_MAGIC2) {
@@ -687,13 +626,13 @@ static void read_tables(void)
687 } 626 }
688 get_dirsize(); 627 get_dirsize();
689 if (show) { 628 if (show) {
690 printf("%ld inodes\n" 629 printf("%u inodes\n"
691 "%ld blocks\n" 630 "%u blocks\n"
692 "Firstdatazone=%ld (%ld)\n" 631 "Firstdatazone=%u (%u)\n"
693 "Zonesize=%d\n" 632 "Zonesize=%u\n"
694 "Maxsize=%ld\n" 633 "Maxsize=%u\n"
695 "Filesystem state=%d\n" 634 "Filesystem state=%u\n"
696 "namelen=%d\n\n", 635 "namelen=%u\n\n",
697 INODES, 636 INODES,
698 ZONES, 637 ZONES,
699 FIRSTZONE, NORM_FIRSTZONE, 638 FIRSTZONE, NORM_FIRSTZONE,
@@ -704,17 +643,17 @@ static void read_tables(void)
704 } 643 }
705} 644}
706 645
707static struct minix_inode *get_inode(unsigned int nr) 646static struct minix1_inode *get_inode(unsigned int nr)
708{ 647{
709 struct minix_inode *inode; 648 struct minix1_inode *inode;
710 649
711 if (!nr || nr > INODES) 650 if (!nr || nr > INODES)
712 return NULL; 651 return NULL;
713 total++; 652 total++;
714 inode = Inode + nr; 653 inode = Inode1 + nr;
715 if (!inode_count[nr]) { 654 if (!inode_count[nr]) {
716 if (!inode_in_use(nr)) { 655 if (!inode_in_use(nr)) {
717 printf("Inode %d is marked as 'unused', but it is used " 656 printf("Inode1 %d is marked as 'unused', but it is used "
718 "for file '%s'\n", nr, current_name); 657 "for file '%s'\n", nr, current_name);
719 if (repair) { 658 if (repair) {
720 if (ask("Mark as 'in use'", 1)) 659 if (ask("Mark as 'in use'", 1))
@@ -749,7 +688,7 @@ static struct minix_inode *get_inode(unsigned int nr)
749 return inode; 688 return inode;
750} 689}
751 690
752#ifdef CONFIG_FEATURE_MINIX2 691#if ENABLE_FEATURE_MINIX2
753static struct minix2_inode *get_inode2(unsigned int nr) 692static struct minix2_inode *get_inode2(unsigned int nr)
754{ 693{
755 struct minix2_inode *inode; 694 struct minix2_inode *inode;
@@ -760,7 +699,7 @@ static struct minix2_inode *get_inode2(unsigned int nr)
760 inode = Inode2 + nr; 699 inode = Inode2 + nr;
761 if (!inode_count[nr]) { 700 if (!inode_count[nr]) {
762 if (!inode_in_use(nr)) { 701 if (!inode_in_use(nr)) {
763 printf("Inode %d is marked as 'unused', but it is used " 702 printf("Inode1 %d is marked as 'unused', but it is used "
764 "for file '%s'\n", nr, current_name); 703 "for file '%s'\n", nr, current_name);
765 if (repair) { 704 if (repair) {
766 if (ask("Mark as 'in use'", 1)) 705 if (ask("Mark as 'in use'", 1))
@@ -797,20 +736,22 @@ static struct minix2_inode *get_inode2(unsigned int nr)
797 736
798static void check_root(void) 737static void check_root(void)
799{ 738{
800 struct minix_inode *inode = Inode + ROOT_INO; 739 struct minix1_inode *inode = Inode1 + MINIX_ROOT_INO;
801 740
802 if (!inode || !S_ISDIR(inode->i_mode)) 741 if (!inode || !S_ISDIR(inode->i_mode))
803 die("root inode isn't a directory"); 742 die("root inode isn't a directory");
804} 743}
805 744
806#ifdef CONFIG_FEATURE_MINIX2 745#if ENABLE_FEATURE_MINIX2
807static void check_root2(void) 746static void check_root2(void)
808{ 747{
809 struct minix2_inode *inode = Inode2 + ROOT_INO; 748 struct minix2_inode *inode = Inode2 + MINIX_ROOT_INO;
810 749
811 if (!inode || !S_ISDIR(inode->i_mode)) 750 if (!inode || !S_ISDIR(inode->i_mode))
812 die("root inode isn't a directory"); 751 die("root inode isn't a directory");
813} 752}
753#else
754void check_root2(void);
814#endif 755#endif
815 756
816static int add_zone(uint16_t *znr, smallint *corrected) 757static int add_zone(uint16_t *znr, smallint *corrected)
@@ -843,7 +784,7 @@ static int add_zone(uint16_t *znr, smallint *corrected)
843 return block; 784 return block;
844} 785}
845 786
846#ifdef CONFIG_FEATURE_MINIX2 787#if ENABLE_FEATURE_MINIX2
847static int add_zone2(uint32_t *znr, smallint *corrected) 788static int add_zone2(uint32_t *znr, smallint *corrected)
848{ 789{
849 int result; 790 int result;
@@ -892,7 +833,7 @@ static void add_zone_ind(uint16_t *znr, smallint *corrected)
892 write_block(block, blk); 833 write_block(block, blk);
893} 834}
894 835
895#ifdef CONFIG_FEATURE_MINIX2 836#if ENABLE_FEATURE_MINIX2
896static void add_zone_ind2(uint32_t *znr, smallint *corrected) 837static void add_zone_ind2(uint32_t *znr, smallint *corrected)
897{ 838{
898 static char blk[BLOCK_SIZE]; 839 static char blk[BLOCK_SIZE];
@@ -928,7 +869,7 @@ static void add_zone_dind(uint16_t *znr, smallint *corrected)
928 write_block(block, blk); 869 write_block(block, blk);
929} 870}
930 871
931#ifdef CONFIG_FEATURE_MINIX2 872#if ENABLE_FEATURE_MINIX2
932static void add_zone_dind2(uint32_t *znr, smallint *corrected) 873static void add_zone_dind2(uint32_t *znr, smallint *corrected)
933{ 874{
934 static char blk[BLOCK_SIZE]; 875 static char blk[BLOCK_SIZE];
@@ -966,13 +907,13 @@ static void add_zone_tind2(uint32_t *znr, smallint *corrected)
966 907
967static void check_zones(unsigned int i) 908static void check_zones(unsigned int i)
968{ 909{
969 struct minix_inode *inode; 910 struct minix1_inode *inode;
970 911
971 if (!i || i > INODES) 912 if (!i || i > INODES)
972 return; 913 return;
973 if (inode_count[i] > 1) /* have we counted this file already? */ 914 if (inode_count[i] > 1) /* have we counted this file already? */
974 return; 915 return;
975 inode = Inode + i; 916 inode = Inode1 + i;
976 if (!S_ISDIR(inode->i_mode) && !S_ISREG(inode->i_mode) && 917 if (!S_ISDIR(inode->i_mode) && !S_ISREG(inode->i_mode) &&
977 !S_ISLNK(inode->i_mode)) return; 918 !S_ISLNK(inode->i_mode)) return;
978 for (i = 0; i < 7; i++) 919 for (i = 0; i < 7; i++)
@@ -981,7 +922,7 @@ static void check_zones(unsigned int i)
981 add_zone_dind(8 + inode->i_zone, &changed); 922 add_zone_dind(8 + inode->i_zone, &changed);
982} 923}
983 924
984#ifdef CONFIG_FEATURE_MINIX2 925#if ENABLE_FEATURE_MINIX2
985static void check_zones2(unsigned int i) 926static void check_zones2(unsigned int i)
986{ 927{
987 struct minix2_inode *inode; 928 struct minix2_inode *inode;
@@ -1002,10 +943,10 @@ static void check_zones2(unsigned int i)
1002} 943}
1003#endif 944#endif
1004 945
1005static void check_file(struct minix_inode *dir, unsigned int offset) 946static void check_file(struct minix1_inode *dir, unsigned int offset)
1006{ 947{
1007 static char blk[BLOCK_SIZE]; 948 static char blk[BLOCK_SIZE];
1008 struct minix_inode *inode; 949 struct minix1_inode *inode;
1009 int ino; 950 int ino;
1010 char *name; 951 char *name;
1011 int block; 952 int block;
@@ -1052,7 +993,7 @@ static void check_file(struct minix_inode *dir, unsigned int offset)
1052 pop_filename(); 993 pop_filename();
1053} 994}
1054 995
1055#ifdef CONFIG_FEATURE_MINIX2 996#if ENABLE_FEATURE_MINIX2
1056static void check_file2(struct minix2_inode *dir, unsigned int offset) 997static void check_file2(struct minix2_inode *dir, unsigned int offset)
1057{ 998{
1058 static char blk[BLOCK_SIZE]; 999 static char blk[BLOCK_SIZE];
@@ -1106,10 +1047,10 @@ static void check_file2(struct minix2_inode *dir, unsigned int offset)
1106 1047
1107static void recursive_check(unsigned int ino) 1048static void recursive_check(unsigned int ino)
1108{ 1049{
1109 struct minix_inode *dir; 1050 struct minix1_inode *dir;
1110 unsigned int offset; 1051 unsigned int offset;
1111 1052
1112 dir = Inode + ino; 1053 dir = Inode1 + ino;
1113 if (!S_ISDIR(dir->i_mode)) 1054 if (!S_ISDIR(dir->i_mode))
1114 die("internal error"); 1055 die("internal error");
1115 if (dir->i_size < 2 * dirsize) { 1056 if (dir->i_size < 2 * dirsize) {
@@ -1120,7 +1061,7 @@ static void recursive_check(unsigned int ino)
1120 check_file(dir, offset); 1061 check_file(dir, offset);
1121} 1062}
1122 1063
1123#ifdef CONFIG_FEATURE_MINIX2 1064#if ENABLE_FEATURE_MINIX2
1124static void recursive_check2(unsigned int ino) 1065static void recursive_check2(unsigned int ino)
1125{ 1066{
1126 struct minix2_inode *dir; 1067 struct minix2_inode *dir;
@@ -1152,10 +1093,10 @@ static void check_counts(void)
1152 int i; 1093 int i;
1153 1094
1154 for (i = 1; i <= INODES; i++) { 1095 for (i = 1; i <= INODES; i++) {
1155 if (warn_mode && Inode[i].i_mode && !inode_in_use(i)) { 1096 if (warn_mode && Inode1[i].i_mode && !inode_in_use(i)) {
1156 printf("Inode %d has non-zero mode. ", i); 1097 printf("Inode1 %d has non-zero mode. ", i);
1157 if (ask("Clear", 1)) { 1098 if (ask("Clear", 1)) {
1158 Inode[i].i_mode = 0; 1099 Inode1[i].i_mode = 0;
1159 changed = 1; 1100 changed = 1;
1160 } 1101 }
1161 } 1102 }
@@ -1168,15 +1109,15 @@ static void check_counts(void)
1168 continue; 1109 continue;
1169 } 1110 }
1170 if (!inode_in_use(i)) { 1111 if (!inode_in_use(i)) {
1171 printf("Inode %d is used, but marked as 'unused' in the bitmap. ", i); 1112 printf("Inode1 %d is used, but marked as 'unused' in the bitmap. ", i);
1172 if (ask("Set", 1)) 1113 if (ask("Set", 1))
1173 mark_inode(i); 1114 mark_inode(i);
1174 } 1115 }
1175 if (Inode[i].i_nlinks != inode_count[i]) { 1116 if (Inode1[i].i_nlinks != inode_count[i]) {
1176 printf("Inode %d (mode=%07o), i_nlinks=%d, counted=%d. ", 1117 printf("Inode1 %d (mode=%07o), i_nlinks=%d, counted=%d. ",
1177 i, Inode[i].i_mode, Inode[i].i_nlinks, inode_count[i]); 1118 i, Inode1[i].i_mode, Inode1[i].i_nlinks, inode_count[i]);
1178 if (ask("Set i_nlinks to count", 1)) { 1119 if (ask("Set i_nlinks to count", 1)) {
1179 Inode[i].i_nlinks = inode_count[i]; 1120 Inode1[i].i_nlinks = inode_count[i];
1180 changed = 1; 1121 changed = 1;
1181 } 1122 }
1182 } 1123 }
@@ -1197,14 +1138,14 @@ static void check_counts(void)
1197 } 1138 }
1198} 1139}
1199 1140
1200#ifdef CONFIG_FEATURE_MINIX2 1141#if ENABLE_FEATURE_MINIX2
1201static void check_counts2(void) 1142static void check_counts2(void)
1202{ 1143{
1203 int i; 1144 int i;
1204 1145
1205 for (i = 1; i <= INODES; i++) { 1146 for (i = 1; i <= INODES; i++) {
1206 if (warn_mode && Inode2[i].i_mode && !inode_in_use(i)) { 1147 if (warn_mode && Inode2[i].i_mode && !inode_in_use(i)) {
1207 printf("Inode %d has non-zero mode. ", i); 1148 printf("Inode1 %d has non-zero mode. ", i);
1208 if (ask("Clear", 1)) { 1149 if (ask("Clear", 1)) {
1209 Inode2[i].i_mode = 0; 1150 Inode2[i].i_mode = 0;
1210 changed = 1; 1151 changed = 1;
@@ -1219,7 +1160,7 @@ static void check_counts2(void)
1219 continue; 1160 continue;
1220 } 1161 }
1221 if (!inode_in_use(i)) { 1162 if (!inode_in_use(i)) {
1222 printf("Inode %d is used, but marked as 'unused' in the bitmap. ", i); 1163 printf("Inode1 %d is used, but marked as 'unused' in the bitmap. ", i);
1223 if (ask("Set", 1)) 1164 if (ask("Set", 1))
1224 mark_inode(i); 1165 mark_inode(i);
1225 } 1166 }
@@ -1254,20 +1195,22 @@ static void check(void)
1254{ 1195{
1255 memset(inode_count, 0, (INODES + 1) * sizeof(*inode_count)); 1196 memset(inode_count, 0, (INODES + 1) * sizeof(*inode_count));
1256 memset(zone_count, 0, ZONES * sizeof(*zone_count)); 1197 memset(zone_count, 0, ZONES * sizeof(*zone_count));
1257 check_zones(ROOT_INO); 1198 check_zones(MINIX_ROOT_INO);
1258 recursive_check(ROOT_INO); 1199 recursive_check(MINIX_ROOT_INO);
1259 check_counts(); 1200 check_counts();
1260} 1201}
1261 1202
1262#ifdef CONFIG_FEATURE_MINIX2 1203#if ENABLE_FEATURE_MINIX2
1263static void check2(void) 1204static void check2(void)
1264{ 1205{
1265 memset(inode_count, 0, (INODES + 1) * sizeof(*inode_count)); 1206 memset(inode_count, 0, (INODES + 1) * sizeof(*inode_count));
1266 memset(zone_count, 0, ZONES * sizeof(*zone_count)); 1207 memset(zone_count, 0, ZONES * sizeof(*zone_count));
1267 check_zones2(ROOT_INO); 1208 check_zones2(MINIX_ROOT_INO);
1268 recursive_check2(ROOT_INO); 1209 recursive_check2(MINIX_ROOT_INO);
1269 check_counts2(); 1210 check_counts2();
1270} 1211}
1212#else
1213void check2(void);
1271#endif 1214#endif
1272 1215
1273int fsck_minix_main(int argc, char **argv) 1216int fsck_minix_main(int argc, char **argv)
@@ -1275,18 +1218,18 @@ int fsck_minix_main(int argc, char **argv)
1275 struct termios tmp; 1218 struct termios tmp;
1276 int retcode = 0; 1219 int retcode = 0;
1277 1220
1278 xfunc_exitcode = 8; 1221 xfunc_error_retval = 8;
1279 1222
1280 alloc_current_name(); 1223 alloc_current_name();
1281#ifdef CONFIG_FEATURE_CLEAN_UP 1224#if ENABLE_FEATURE_CLEAN_UP
1282 /* Don't bother to free memory. Exit does 1225 /* Don't bother to free memory. Exit does
1283 * that automagically, so we can save a few bytes */ 1226 * that automagically, so we can save a few bytes */
1284 atexit(free_current_name); 1227 atexit(free_current_name);
1285#endif 1228#endif
1286 1229
1287 if (INODE_SIZE * MINIX_INODES_PER_BLOCK != BLOCK_SIZE) 1230 if (INODE_SIZE1 * MINIX1_INODES_PER_BLOCK != BLOCK_SIZE)
1288 die("bad inode size"); 1231 die("bad inode size");
1289#ifdef CONFIG_FEATURE_MINIX2 1232#if ENABLE_FEATURE_MINIX2
1290 if (INODE_SIZE2 * MINIX2_INODES_PER_BLOCK != BLOCK_SIZE) 1233 if (INODE_SIZE2 * MINIX2_INODES_PER_BLOCK != BLOCK_SIZE)
1291 die("bad v2 inode size"); 1234 die("bad v2 inode size");
1292#endif 1235#endif
@@ -1336,10 +1279,8 @@ int fsck_minix_main(int argc, char **argv)
1336 if (!isatty(0) || !isatty(1)) 1279 if (!isatty(0) || !isatty(1))
1337 die("need terminal for interactive repairs"); 1280 die("need terminal for interactive repairs");
1338 } 1281 }
1339 IN = open(device_name, repair ? O_RDWR : O_RDONLY); 1282 IN = xopen(device_name, repair ? O_RDWR : O_RDONLY);
1340 if (IN < 0) { 1283
1341 bb_error_msg_and_die("cannot open device '%s'", device_name);
1342 }
1343 /*sync(); paranoia? */ 1284 /*sync(); paranoia? */
1344 read_superblock(); 1285 read_superblock();
1345 1286
@@ -1372,36 +1313,35 @@ int fsck_minix_main(int argc, char **argv)
1372 tcsetattr(0, TCSANOW, &tmp); 1313 tcsetattr(0, TCSANOW, &tmp);
1373 termios_set = 1; 1314 termios_set = 1;
1374 } 1315 }
1375#ifdef CONFIG_FEATURE_MINIX2 1316
1376 if (version2) { 1317 if (version2) {
1377 check_root2(); 1318 check_root2();
1378 check2(); 1319 check2();
1379 } else 1320 } else {
1380#endif
1381 {
1382 check_root(); 1321 check_root();
1383 check(); 1322 check();
1384 } 1323 }
1324
1385 if (verbose) { 1325 if (verbose) {
1386 int i, free_cnt; 1326 int i, free_cnt;
1387 1327
1388 for (i = 1, free_cnt = 0; i <= INODES; i++) 1328 for (i = 1, free_cnt = 0; i <= INODES; i++)
1389 if (!inode_in_use(i)) 1329 if (!inode_in_use(i))
1390 free_cnt++; 1330 free_cnt++;
1391 printf("\n%6ld inodes used (%ld%%)\n", (INODES - free_cnt), 1331 printf("\n%6u inodes used (%u%%)\n", (INODES - free_cnt),
1392 100 * (INODES - free_cnt) / INODES); 1332 100 * (INODES - free_cnt) / INODES);
1393 for (i = FIRSTZONE, free_cnt = 0; i < ZONES; i++) 1333 for (i = FIRSTZONE, free_cnt = 0; i < ZONES; i++)
1394 if (!zone_in_use(i)) 1334 if (!zone_in_use(i))
1395 free_cnt++; 1335 free_cnt++;
1396 printf("%6ld zones used (%ld%%)\n\n" 1336 printf("%6u zones used (%u%%)\n\n"
1397 "%6d regular files\n" 1337 "%6u regular files\n"
1398 "%6d directories\n" 1338 "%6u directories\n"
1399 "%6d character device files\n" 1339 "%6u character device files\n"
1400 "%6d block device files\n" 1340 "%6u block device files\n"
1401 "%6d links\n" 1341 "%6u links\n"
1402 "%6d symbolic links\n" 1342 "%6u symbolic links\n"
1403 "------\n" 1343 "------\n"
1404 "%6d files\n", 1344 "%6u files\n",
1405 (ZONES - free_cnt), 100 * (ZONES - free_cnt) / ZONES, 1345 (ZONES - free_cnt), 100 * (ZONES - free_cnt) / ZONES,
1406 regular, directory, chardev, blockdev, 1346 regular, directory, chardev, blockdev,
1407 links - 2 * directory + 1, symlinks, 1347 links - 2 * directory + 1, symlinks,
diff --git a/util-linux/mkfs_minix.c b/util-linux/mkfs_minix.c
index 89874b6b8..e66ef7e17 100644
--- a/util-linux/mkfs_minix.c
+++ b/util-linux/mkfs_minix.c
@@ -65,6 +65,8 @@
65#include "busybox.h" 65#include "busybox.h"
66#include <mntent.h> 66#include <mntent.h>
67 67
68#include "minix.h"
69
68#define DEBUG 0 70#define DEBUG 0
69 71
70/* If debugging, store the very same times/uids/gids for image consistency */ 72/* If debugging, store the very same times/uids/gids for image consistency */
@@ -78,81 +80,8 @@
78# define GETGID getgid() 80# define GETGID getgid()
79#endif 81#endif
80 82
81/*
82 * This is the original minix inode layout on disk.
83 * Note the 8-bit gid and atime and ctime.
84 */
85struct minix1_inode {
86 uint16_t i_mode;
87 uint16_t i_uid;
88 uint32_t i_size;
89 uint32_t i_time;
90 uint8_t i_gid;
91 uint8_t i_nlinks;
92 uint16_t i_zone[9];
93};
94
95/*
96 * The new minix inode has all the time entries, as well as
97 * long block numbers and a third indirect block (7+1+1+1
98 * instead of 7+1+1). Also, some previously 8-bit values are
99 * now 16-bit. The inode is now 64 bytes instead of 32.
100 */
101struct minix2_inode {
102 uint16_t i_mode;
103 uint16_t i_nlinks;
104 uint16_t i_uid;
105 uint16_t i_gid;
106 uint32_t i_size;
107 uint32_t i_atime;
108 uint32_t i_mtime;
109 uint32_t i_ctime;
110 uint32_t i_zone[10];
111};
112
113/*
114 * minix super-block data on disk
115 */
116struct minix_super_block {
117 uint16_t s_ninodes;
118 uint16_t s_nzones;
119 uint16_t s_imap_blocks;
120 uint16_t s_zmap_blocks;
121 uint16_t s_firstdatazone;
122 uint16_t s_log_zone_size;
123 uint32_t s_max_size;
124 uint16_t s_magic;
125 uint16_t s_state;
126 uint32_t s_zones;
127};
128
129struct minix_dir_entry {
130 uint16_t inode;
131 char name[0];
132};
133
134/* Believe it or not, but mount.h has this one */
135#undef BLOCK_SIZE
136enum { 83enum {
137 BLOCK_SIZE = 1024,
138 BITS_PER_BLOCK = BLOCK_SIZE << 3,
139
140 MINIX_ROOT_INO = 1,
141 MINIX_BAD_INO = 2,
142 MAX_GOOD_BLOCKS = 512, 84 MAX_GOOD_BLOCKS = 512,
143
144 MINIX1_SUPER_MAGIC = 0x137F, /* original minix fs */
145 MINIX1_SUPER_MAGIC2 = 0x138F, /* minix fs, 30 char names */
146 MINIX2_SUPER_MAGIC = 0x2468, /* minix V2 fs */
147 MINIX2_SUPER_MAGIC2 = 0x2478, /* minix V2 fs, 30 char names */
148 MINIX_VALID_FS = 0x0001, /* clean fs */
149 MINIX_ERROR_FS = 0x0002, /* fs has errors */
150
151 INODE_SIZE1 = sizeof(struct minix1_inode),
152 INODE_SIZE2 = sizeof(struct minix2_inode),
153 MINIX1_INODES_PER_BLOCK = BLOCK_SIZE / sizeof(struct minix1_inode),
154 MINIX2_INODES_PER_BLOCK = BLOCK_SIZE / sizeof(struct minix2_inode),
155
156 TEST_BUFFER_BLOCKS = 16, 85 TEST_BUFFER_BLOCKS = 16,
157}; 86};
158 87