From: "Vladimir 'φ-coder/phcoder' Serbinenko" <phcoder@gmail.com>
To: linux-kernel@vger.kernel.org
Subject: [PATCH] allow to create a minix3fs with a blocksize != 1K
Date: Wed, 09 May 2012 23:51:38 +0200 [thread overview]
Message-ID: <4FAAE6EA.3080308@gmail.com> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 122 bytes --]
Have used it to test minixfs support with various block sizes.
--
Regards
Vladimir 'φ-coder/phcoder' Serbinenko
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: minix-block.diff --]
[-- Type: text/x-diff; name="minix-block.diff", Size: 9608 bytes --]
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) {
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 294 bytes --]
next reply other threads:[~2012-05-09 21:51 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-09 21:51 Vladimir 'φ-coder/phcoder' Serbinenko [this message]
2012-05-09 21:56 ` [PATCH] allow to create a minix3fs with a blocksize != 1K Vladimir 'φ-coder/phcoder' Serbinenko
2012-05-15 9:05 ` Karel Zak
2012-06-10 19:58 ` Davidlohr Bueso
2012-06-10 20:21 ` Vladimir 'φ-coder/phcoder' Serbinenko
2012-06-11 11:45 ` Davidlohr Bueso
2012-05-09 21:57 ` richard -rw- weinberger
2012-05-09 22:04 ` Vladimir 'φ-coder/phcoder' Serbinenko
2012-05-09 22:08 ` richard -rw- weinberger
2012-05-09 22:20 ` Vladimir 'φ-coder/phcoder' Serbinenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4FAAE6EA.3080308@gmail.com \
--to=phcoder@gmail.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.