Hello again!
I have written a better patch for Minix filesystem support.
It adds correct support for Minixfs version 1 with 30-character filenames.
Please discard my previous hack.
Changelog:
* stage2/fsys_minix.c: Correct support for modified minixfs
version 1 (filenames up to 30 characters)
Pavel Roskin
Index: stage2/fsys_minix.c
===================================================================
RCS file: /gd/gnu/anoncvsroot/grub/stage2/fsys_minix.c,v
retrieving revision 1.1
diff -u -u -r1.1 fsys_minix.c
--- fsys_minix.c 1999/08/26 09:42:57 1.1
+++ fsys_minix.c 1999/08/28 15:58:01
@@ -20,7 +20,7 @@
/* Restrictions:
This is MINIX V1 only (yet)
Disk creation is like:
- mkfs.minix -c -n14 DEVICE
+ mkfs.minix -c DEVICE
*/
#ifdef FSYS_MINIX
@@ -31,7 +31,7 @@
/* #define DEBUG_MINIX */
/* indirect blocks */
-static int mapblock1, mapblock2;
+static int mapblock1, mapblock2, namelen;
/* sizes are always in bytes, BLOCK values are always in DEV_BSIZE (sectors) */
#define DEV_BSIZE 512
@@ -80,8 +80,6 @@
here we have */
#define INODE_VERSION(inode) (SUPERBLOCK->s_version)
-#define MINIX_NAME_LEN 14 /* XXX depend on version */
-
/*
* This is the original minix inode layout on disk.
* Note the 8-bit gid and atime and ctime.
@@ -162,19 +160,30 @@
int
minix_mount (void)
{
- int retval = 1;
-
- if ((((current_drive & 0x80 || current_slice != 0))
- && (current_slice != PC_SLICE_TYPE_MINIX)
- && ! IS_PC_SLICE_TYPE_BSD_WITH_FS (current_slice, FS_OTHER))
- || part_length < (SBLOCK +
- (sizeof (struct minix_super_block) / DEV_BSIZE))
- || ! devread (SBLOCK, 0, sizeof (struct minix_super_block),
- (char *) SUPERBLOCK)
- || SUPERBLOCK->s_magic != MINIX_SUPER_MAGIC)
- retval = 0;
+ if (((current_drive & 0x80 || current_slice != 0))
+ && (current_slice != PC_SLICE_TYPE_MINIX)
+ && !IS_PC_SLICE_TYPE_BSD_WITH_FS (current_slice, FS_OTHER))
+ return 0; /* The partition is not of MINIX type */
+
+ if (part_length < (SBLOCK +
+ (sizeof (struct minix_super_block) / DEV_BSIZE)))
+ return 0; /* The partition is too short */
+
+ if (!devread (SBLOCK, 0, sizeof (struct minix_super_block),
+ (char *) SUPERBLOCK))
+ return 0; /* Cannot read superblock */
- return retval;
+ switch (SUPERBLOCK->s_magic)
+ {
+ case MINIX_SUPER_MAGIC:
+ namelen = 14;
+ return 1;
+ case MINIX_SUPER_MAGIC2:
+ namelen = 30;
+ return 1;
+ default:
+ return 0; /* Unsupported type */
+ }
}
/* Takes a file system block number and reads it into BUFFER. */
@@ -482,9 +491,10 @@
off = loc & (BLOCK_SIZE - 1);
dp = (struct minix_dir_entry *) (DATABLOCK2 + off);
/* advance loc prematurely to next on-disk directory entry */
- loc += sizeof (dp->inode) + 14; /* XXX */
+ loc += sizeof (dp->inode) + namelen;
- /* NOTE: minix filenames are NULL terminated if < 14 else exact */
+ /* NOTE: minix filenames are NULL terminated if < namelen
+ else exact */
#ifdef DEBUG_MINIX
printf ("directory entry ino=%d\n", dp->inode);
@@ -494,9 +504,9 @@
if (dp->inode)
{
- int saved_c = dp->name[MINIX_NAME_LEN+1];
+ int saved_c = dp->name[namelen+1];
- dp->name[MINIX_NAME_LEN+1] = 0;
+ dp->name[namelen+1] = 0;
str_chk = substring (dirname, dp->name);
# ifndef STAGE1_5
@@ -509,7 +519,7 @@
}
# endif
- dp->name[MINIX_NAME_LEN+1] = saved_c;
+ dp->name[namelen+1] = saved_c;
}
}