diff options
author | Thomas Stewart <thomas@stewarts.org.uk> | 2010-05-26 17:42:33 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-27 12:12:43 -0400 |
commit | d27d7a9a7838587fcdcc6f2b042f5610eb4984a1 (patch) | |
tree | 1f54d3904a7a80cb483074478aaa36e72f60cd6b /fs/ufs | |
parent | b8d6b0d6b6882a53e4586a07e1292223d55299d1 (diff) |
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: Thomas Stewart <thomas@stewarts.org.uk>
Cc: Evgeniy Dushistov <dushistov@mail.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/ufs')
-rw-r--r-- | fs/ufs/super.c | 2 | ||||
-rw-r--r-- | fs/ufs/ufs_fs.h | 1 |
2 files changed, 3 insertions, 0 deletions
diff --git a/fs/ufs/super.c b/fs/ufs/super.c index 14743d935a93..ad9bc1ebd3a6 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c | |||
@@ -918,6 +918,7 @@ again: | |||
918 | sbi->s_bytesex = BYTESEX_LE; | 918 | sbi->s_bytesex = BYTESEX_LE; |
919 | switch ((uspi->fs_magic = fs32_to_cpu(sb, usb3->fs_magic))) { | 919 | switch ((uspi->fs_magic = fs32_to_cpu(sb, usb3->fs_magic))) { |
920 | case UFS_MAGIC: | 920 | case UFS_MAGIC: |
921 | case UFS_MAGIC_BW: | ||
921 | case UFS2_MAGIC: | 922 | case UFS2_MAGIC: |
922 | case UFS_MAGIC_LFN: | 923 | case UFS_MAGIC_LFN: |
923 | case UFS_MAGIC_FEA: | 924 | case UFS_MAGIC_FEA: |
@@ -927,6 +928,7 @@ again: | |||
927 | sbi->s_bytesex = BYTESEX_BE; | 928 | sbi->s_bytesex = BYTESEX_BE; |
928 | switch ((uspi->fs_magic = fs32_to_cpu(sb, usb3->fs_magic))) { | 929 | switch ((uspi->fs_magic = fs32_to_cpu(sb, usb3->fs_magic))) { |
929 | case UFS_MAGIC: | 930 | case UFS_MAGIC: |
931 | case UFS_MAGIC_BW: | ||
930 | case UFS2_MAGIC: | 932 | case UFS2_MAGIC: |
931 | case UFS_MAGIC_LFN: | 933 | case UFS_MAGIC_LFN: |
932 | case UFS_MAGIC_FEA: | 934 | case UFS_MAGIC_FEA: |
diff --git a/fs/ufs/ufs_fs.h b/fs/ufs/ufs_fs.h index 6943ec677c0b..8aba544f9fad 100644 --- a/fs/ufs/ufs_fs.h +++ b/fs/ufs/ufs_fs.h | |||
@@ -48,6 +48,7 @@ typedef __u16 __bitwise __fs16; | |||
48 | #define UFS_SECTOR_SIZE 512 | 48 | #define UFS_SECTOR_SIZE 512 |
49 | #define UFS_SECTOR_BITS 9 | 49 | #define UFS_SECTOR_BITS 9 |
50 | #define UFS_MAGIC 0x00011954 | 50 | #define UFS_MAGIC 0x00011954 |
51 | #define UFS_MAGIC_BW 0x0f242697 | ||
51 | #define UFS2_MAGIC 0x19540119 | 52 | #define UFS2_MAGIC 0x19540119 |
52 | #define UFS_CIGAM 0x54190100 /* byteswapped MAGIC */ | 53 | #define UFS_CIGAM 0x54190100 /* byteswapped MAGIC */ |
53 | 54 | ||