Commit d27d7a9a authored by Thomas Stewart's avatar Thomas Stewart Committed by Linus Torvalds

ufs: permit mounting of BorderWare filesystems

I recently had to recover some files from an old broken machine that was
running BorderWare Document Gateway.  It's basically a drop in web server
for sharing files.  From the look of the init process and using strings on
of a few files it seems to be based on FreeBSD 3.3.

The process turned out to be more difficult than I imagined, but to cut a
long story short BorderWare in their wisdom use a nonstandard magic number
in their UFS (ufstype=44bsd) file systems.  Thus Linux refuses to mount
the file systems in order to recover the data.  After a bit of hunting I
was able to make a quick fix to fs/ufs/super.c in order to detect the new
magic number.

I assume that this number is the same for all installations.  It's quite
easy to find out from ufs_fs.h.  The superblock sits 8k into the block
device and the magic number its 1372 bytes into the superblock struct.

# dd if=/dev/sda5 skip=$(( 8192 + 1372 )) bs=1 count=4 2> /dev/null | hd
00000000  97 26 24 0f                                       |.&$.|
#
Signed-off-by: default avatarThomas Stewart <thomas@stewarts.org.uk>
Cc: Evgeniy Dushistov <dushistov@mail.ru>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent b8d6b0d6
...@@ -918,6 +918,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -918,6 +918,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
sbi->s_bytesex = BYTESEX_LE; sbi->s_bytesex = BYTESEX_LE;
switch ((uspi->fs_magic = fs32_to_cpu(sb, usb3->fs_magic))) { switch ((uspi->fs_magic = fs32_to_cpu(sb, usb3->fs_magic))) {
case UFS_MAGIC: case UFS_MAGIC:
case UFS_MAGIC_BW:
case UFS2_MAGIC: case UFS2_MAGIC:
case UFS_MAGIC_LFN: case UFS_MAGIC_LFN:
case UFS_MAGIC_FEA: case UFS_MAGIC_FEA:
...@@ -927,6 +928,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -927,6 +928,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
sbi->s_bytesex = BYTESEX_BE; sbi->s_bytesex = BYTESEX_BE;
switch ((uspi->fs_magic = fs32_to_cpu(sb, usb3->fs_magic))) { switch ((uspi->fs_magic = fs32_to_cpu(sb, usb3->fs_magic))) {
case UFS_MAGIC: case UFS_MAGIC:
case UFS_MAGIC_BW:
case UFS2_MAGIC: case UFS2_MAGIC:
case UFS_MAGIC_LFN: case UFS_MAGIC_LFN:
case UFS_MAGIC_FEA: case UFS_MAGIC_FEA:
......
...@@ -48,6 +48,7 @@ typedef __u16 __bitwise __fs16; ...@@ -48,6 +48,7 @@ typedef __u16 __bitwise __fs16;
#define UFS_SECTOR_SIZE 512 #define UFS_SECTOR_SIZE 512
#define UFS_SECTOR_BITS 9 #define UFS_SECTOR_BITS 9
#define UFS_MAGIC 0x00011954 #define UFS_MAGIC 0x00011954
#define UFS_MAGIC_BW 0x0f242697
#define UFS2_MAGIC 0x19540119 #define UFS2_MAGIC 0x19540119
#define UFS_CIGAM 0x54190100 /* byteswapped MAGIC */ #define UFS_CIGAM 0x54190100 /* byteswapped MAGIC */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment