diff --git a/disk-utils/fsck.minix.c b/disk-utils/fsck.minix.c index 139ab7a..7d1a737 100644 --- a/disk-utils/fsck.minix.c +++ b/disk-utils/fsck.minix.c @@ -497,9 +497,11 @@ write_super_block(void) { else Super.s_state &= ~MINIX_ERROR_FS; - if (MINIX_BLOCK_SIZE != lseek(IN, MINIX_BLOCK_SIZE, SEEK_SET)) + if (MINIX_SUPERBLOCK_OFFSET != lseek(IN, MINIX_SUPERBLOCK_OFFSET, + SEEK_SET)) die(_("seek failed in write_super_block")); - if (MINIX_BLOCK_SIZE != write(IN, super_block_buffer, MINIX_BLOCK_SIZE)) + if (MINIX_SUPERBLOCK_SIZE != write(IN, super_block_buffer, + MINIX_SUPERBLOCK_SIZE)) die(_("unable to write super-block")); return; } @@ -543,33 +545,41 @@ get_dirsize(void) { /* use defaults */ } +int MINIX_BLOCK_SIZE = 0; + static void read_superblock(void) { - if (MINIX_BLOCK_SIZE != lseek(IN, MINIX_BLOCK_SIZE, SEEK_SET)) + if (MINIX_SUPERBLOCK_OFFSET != lseek(IN, MINIX_SUPERBLOCK_OFFSET, + SEEK_SET)) die(_("seek failed")); - super_block_buffer = calloc(1, MINIX_BLOCK_SIZE); + super_block_buffer = calloc(1, MINIX_SUPERBLOCK_SIZE); if (!super_block_buffer) die(_("unable to alloc buffer for superblock")); - if (MINIX_BLOCK_SIZE != read(IN, super_block_buffer, MINIX_BLOCK_SIZE)) + if (MINIX_SUPERBLOCK_SIZE + != read(IN, super_block_buffer, MINIX_SUPERBLOCK_SIZE)) die(_("unable to read super block")); if (MAGIC == MINIX_SUPER_MAGIC) { namelen = 14; dirsize = 16; fs_version = 1; + MINIX_BLOCK_SIZE = MINIX12_BLOCK_SIZE; } else if (MAGIC == MINIX_SUPER_MAGIC2) { namelen = 30; dirsize = 32; fs_version = 1; + MINIX_BLOCK_SIZE = MINIX12_BLOCK_SIZE; } else if (MAGIC == MINIX2_SUPER_MAGIC) { namelen = 14; dirsize = 16; fs_version = 2; + MINIX_BLOCK_SIZE = MINIX12_BLOCK_SIZE; } else if (MAGIC == MINIX2_SUPER_MAGIC2) { namelen = 30; dirsize = 32; fs_version = 2; + MINIX_BLOCK_SIZE = MINIX12_BLOCK_SIZE; } else die(_("bad magic number in super-block")); if (get_zone_size() != 0 || MINIX_BLOCK_SIZE != 1024) @@ -812,7 +822,7 @@ add_zone2(unsigned int *znr, int *corrected) { static void add_zone_ind(unsigned short *znr, int *corrected) { - static char blk[MINIX_BLOCK_SIZE]; + static char blk[MAX_MINIX_BLOCK_SIZE]; int i, chg_blk = 0; int block; @@ -828,7 +838,7 @@ add_zone_ind(unsigned short *znr, int *corrected) { static void add_zone_ind2(unsigned int *znr, int *corrected) { - static char blk[MINIX_BLOCK_SIZE]; + static char blk[MAX_MINIX_BLOCK_SIZE]; int i, chg_blk = 0; int block; @@ -844,7 +854,7 @@ add_zone_ind2(unsigned int *znr, int *corrected) { static void add_zone_dind(unsigned short *znr, int *corrected) { - static char blk[MINIX_BLOCK_SIZE]; + static char blk[MAX_MINIX_BLOCK_SIZE]; int i, blk_chg = 0; int block; @@ -860,7 +870,7 @@ add_zone_dind(unsigned short *znr, int *corrected) { static void add_zone_dind2(unsigned int *znr, int *corrected) { - static char blk[MINIX_BLOCK_SIZE]; + static char blk[MAX_MINIX_BLOCK_SIZE]; int i, blk_chg = 0; int block; @@ -876,7 +886,7 @@ add_zone_dind2(unsigned int *znr, int *corrected) { static void add_zone_tind2(unsigned int *znr, int *corrected) { - static char blk[MINIX_BLOCK_SIZE]; + static char blk[MAX_MINIX_BLOCK_SIZE]; int i, blk_chg = 0; int block; @@ -929,7 +939,7 @@ check_zones2(unsigned int i) { static void check_file(struct minix_inode *dir, unsigned int offset) { - static char blk[MINIX_BLOCK_SIZE]; + static char blk[MAX_MINIX_BLOCK_SIZE]; struct minix_inode *inode; unsigned int ino; char *name; @@ -997,7 +1007,7 @@ check_file(struct minix_inode *dir, unsigned int offset) { static void check_file2(struct minix2_inode *dir, unsigned int offset) { - static char blk[MINIX_BLOCK_SIZE]; + static char blk[MAX_MINIX_BLOCK_SIZE]; struct minix2_inode *inode; unsigned long ino; char *name; diff --git a/disk-utils/minix_programs.h b/disk-utils/minix_programs.h index 4af1a34..8fced46 100644 --- a/disk-utils/minix_programs.h +++ b/disk-utils/minix_programs.h @@ -8,6 +8,7 @@ */ extern int fs_version; extern char *super_block_buffer; +extern int MINIX_BLOCK_SIZE; #define Super (*(struct minix_super_block *) super_block_buffer) #define Super3 (*(struct minix3_super_block *) super_block_buffer) diff --git a/disk-utils/mkfs.minix.c b/disk-utils/mkfs.minix.c index 051cd5f..fd68fc9 100644 --- a/disk-utils/mkfs.minix.c +++ b/disk-utils/mkfs.minix.c @@ -123,7 +123,7 @@ static size_t namelen = 30; static size_t dirsize = 32; static int magic = MINIX_SUPER_MAGIC2; -static char root_block[MINIX_BLOCK_SIZE]; +static char root_block[MAX_MINIX_BLOCK_SIZE]; static char boot_block_buffer[512]; @@ -146,7 +146,7 @@ static char *zone_map; static void __attribute__((__noreturn__)) usage(void) { - errx(MKFS_EX_USAGE, _("Usage: %s [-c | -l filename] [-nXX] [-iXX] /dev/name [blocks]"), + errx(MKFS_EX_USAGE, _("Usage: %s [-c | -l filename] [-nXX] [-BXX] [-iXX] /dev/name [blocks]"), program_name); } @@ -189,6 +189,13 @@ static void write_tables(void) { unsigned long imaps = get_nimaps(); unsigned long zmaps = get_nzmaps(); unsigned long buffsz = get_inode_buffer_size(); + unsigned pad; + char padbuffer[2 * MINIX_BLOCK_SIZE]; + + memset (padbuffer, 0, 2 * MINIX_BLOCK_SIZE); + + pad = 2 * MINIX_BLOCK_SIZE - (MINIX_SUPERBLOCK_OFFSET + + MINIX_SUPERBLOCK_SIZE); /* Mark the super block valid. */ super_set_state(); @@ -198,12 +205,16 @@ static void write_tables(void) { " in write_tables"), device_name); if (write_all(DEV, boot_block_buffer, 512)) err(MKFS_EX_ERROR, _("%s: unable to clear boot sector"), device_name); - if (MINIX_BLOCK_SIZE != lseek(DEV, MINIX_BLOCK_SIZE, SEEK_SET)) + if (MINIX_SUPERBLOCK_OFFSET != lseek(DEV, MINIX_SUPERBLOCK_OFFSET, + SEEK_SET)) err(MKFS_EX_ERROR, _("%s: seek failed in write_tables"), device_name); - if (write_all(DEV, super_block_buffer, MINIX_BLOCK_SIZE)) + if (write_all(DEV, super_block_buffer, MINIX_SUPERBLOCK_SIZE)) err(MKFS_EX_ERROR, _("%s: unable to write super-block"), device_name); + if (write_all(DEV, padbuffer, pad)) + err(MKFS_EX_ERROR, _("%s: unable to write super-block"), device_name); + if (write_all(DEV, inode_map, imaps * MINIX_BLOCK_SIZE)) err(MKFS_EX_ERROR, _("%s: unable to write inode map"), device_name); @@ -588,7 +600,7 @@ static void alarm_intr(int alnum __attribute__ ((__unused__))) { static void check_blocks(void) { int try,got; - static char buffer[MINIX_BLOCK_SIZE * TEST_BUFFER_BLOCKS]; + static char buffer[MAX_MINIX_BLOCK_SIZE * TEST_BUFFER_BLOCKS]; unsigned long zones = get_nzones(); unsigned long first_zone = get_first_zone(); @@ -646,6 +658,8 @@ static void get_list_blocks(char *filename) { printf(_("one bad block\n")); } +int MINIX_BLOCK_SIZE = 0; + int main(int argc, char ** argv) { int i; char * tmp; @@ -653,6 +667,8 @@ int main(int argc, char ** argv) { char * listfile = NULL; char * p; + MINIX_BLOCK_SIZE = MINIX12_BLOCK_SIZE; + if (argc && *argv) program_name = *argv; if ((p = strrchr(program_name, '/')) != NULL) @@ -675,8 +691,13 @@ int main(int argc, char ** argv) { errx(MKFS_EX_ERROR, _("%s: bad inode size"), device_name); opterr = 0; - while ((i = getopt(argc, argv, "ci:l:n:v123")) != -1) + while ((i = getopt(argc, argv, "ci:l:n:v123B:")) != -1) switch (i) { + case 'B': + MINIX_BLOCK_SIZE = strtoul(optarg,&tmp,0); + if (*tmp) + usage(); + break; case 'c': check=1; break; case 'i': @@ -727,6 +748,13 @@ int main(int argc, char ** argv) { } } + if (fs_version != 3 && MINIX_BLOCK_SIZE != MINIX12_BLOCK_SIZE) + usage(); + + if (MINIX_BLOCK_SIZE % 512 || MINIX_BLOCK_SIZE < 1024 + || MINIX_BLOCK_SIZE >= 65536) + usage(); + if (!device_name) { usage(); } diff --git a/include/minix.h b/include/minix.h index 57be239..059c050 100644 --- a/include/minix.h +++ b/include/minix.h @@ -60,12 +60,13 @@ struct minix3_super_block { */ #define MINIX_MAXPARTITIONS 4 -#define MINIX_BLOCK_SIZE_BITS 10 -#define MINIX_BLOCK_SIZE (1 << MINIX_BLOCK_SIZE_BITS) - #define MINIX_NAME_MAX 255 /* # chars in a file name */ #define MINIX_MAX_INODES 65535 +#define MAX_MINIX_BLOCK_SIZE 65536 +#define MINIX12_BLOCK_SIZE 1024 +#define MINIX_SUPERBLOCK_OFFSET 1024 +#define MINIX_SUPERBLOCK_SIZE 512 #define MINIX_INODES_PER_BLOCK ((MINIX_BLOCK_SIZE)/(sizeof (struct minix_inode))) #define MINIX2_INODES_PER_BLOCK ((MINIX_BLOCK_SIZE)/(sizeof (struct minix2_inode))) diff --git a/libblkid/src/superblocks/minix.c b/libblkid/src/superblocks/minix.c index 54e7139..7bf9089 100644 --- a/libblkid/src/superblocks/minix.c +++ b/libblkid/src/superblocks/minix.c @@ -45,9 +45,9 @@ static int probe_minix(blkid_probe pr, const struct blkid_idmag *mag) zones = version == 2 ? sb->s_zones : sb->s_nzones; /* sanity checks to be sure that the FS is really minix */ - if (sb->s_imap_blocks * MINIX_BLOCK_SIZE * 8 < sb->s_ninodes + 1) + if (sb->s_imap_blocks * MINIX12_BLOCK_SIZE * 8 < sb->s_ninodes + 1) return -1; - if (sb->s_zmap_blocks * MINIX_BLOCK_SIZE * 8 < zones - sb->s_firstdatazone + 1) + if (sb->s_zmap_blocks * MINIX12_BLOCK_SIZE * 8 < zones - sb->s_firstdatazone + 1) return -1; } else if (version == 3) {