--- /dev/null
+--- utils/fstype.c.old 2005-09-13 14:50:59.000000000 -0400
++++ utils/fstype.c 2005-09-13 17:42:33.000000000 -0400
+@@ -7,7 +7,7 @@
+ * FSSIZE - filesystem size (if known)
+ *
+ * We currently detect (in order):
+- * gzip, cramfs, romfs, xfs, minix, ext3, ext2, reiserfs
++ * gzip, cramfs, romfs, xfs, minix, ext3, ext2, reiserfs, jfs
+ *
+ * MINIX, ext3 and Reiserfs bits are currently untested.
+ */
+@@ -29,6 +29,12 @@
+ #include "xfs_sb.h"
+
+ /*
++ * Slightly cleaned up version of jfs_superblock to
++ * avoid pulling in other kernel header files.
++ */
++#include "jfs_superblock.h"
++
++/*
+ * reiserfs_fs.h is too sick to include directly.
+ * Use a cleaned up version.
+ */
+@@ -174,6 +180,19 @@
+ return 0;
+ }
+
++static int jfs_image(const unsigned char *buf, unsigned long *blocks)
++{
++ const struct jfs_superblock *sb =
++ (const struct jfs_superblock *)buf;
++
++ if (! strncmp(sb->s_magic,JFS_MAGIC, 4)) {
++ /* 512 is the VFS Block size */
++ *blocks = __le32_to_cpu(sb->s_size) * 512;;
++ return 1;
++ }
++ return 0;
++}
++
+ struct imagetype {
+ off_t block;
+ const char name[12];
+@@ -189,7 +208,8 @@
+ { 1, "ext3", ext3_image },
+ { 1, "ext2", ext2_image },
+ { 8, "reiserfs", reiserfs_image },
+- { 64, "reiserfs", reiserfs_image }
++ { 64, "reiserfs", reiserfs_image },
++ { 32, "jfs", jfs_image }
+ };
+
+ int main(int argc, char *argv[])
+--- /dev/null 2005-09-13 04:36:56.252809544 -0400
++++ utils/jfs_superblock.h 2005-09-13 15:08:00.000000000 -0400
+@@ -0,0 +1,114 @@
++/*
++ * Copyright (C) International Business Machines Corp., 2000-2003
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
++ * the GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ */
++#ifndef _H_JFS_SUPERBLOCK
++#define _H_JFS_SUPERBLOCK
++
++struct timestruc_t {
++ __le32 tv_sec;
++ __le32 tv_nsec;
++};
++
++/*
++ * make the magic number something a human could read
++ */
++#define JFS_MAGIC "JFS1" /* Magic word */
++
++#define JFS_VERSION 2 /* Version number: Version 2 */
++
++#define LV_NAME_SIZE 11 /* MUST BE 11 for OS/2 boot sector */
++
++/*
++ * aggregate superblock
++ *
++ * The name superblock is too close to super_block, so the name has been
++ * changed to jfs_superblock. The utilities are still using the old name.
++ */
++struct jfs_superblock {
++ char s_magic[4]; /* 4: magic number */
++ __le32 s_version; /* 4: version number */
++
++ __le64 s_size; /* 8: aggregate size in hardware/LVM blocks;
++ * VFS: number of blocks
++ */
++ __le32 s_bsize; /* 4: aggregate block size in bytes;
++ * VFS: fragment size
++ */
++ __le16 s_l2bsize; /* 2: log2 of s_bsize */
++ __le16 s_l2bfactor; /* 2: log2(s_bsize/hardware block size) */
++ __le32 s_pbsize; /* 4: hardware/LVM block size in bytes */
++ __le16 s_l2pbsize; /* 2: log2 of s_pbsize */
++ __le16 pad; /* 2: padding necessary for alignment */
++
++ __le32 s_agsize; /* 4: allocation group size in aggr. blocks */
++
++ __le32 s_flag; /* 4: aggregate attributes:
++ * see jfs_filsys.h
++ */
++ __le32 s_state; /* 4: mount/unmount/recovery state:
++ * see jfs_filsys.h
++ */
++ __le32 s_compress; /* 4: > 0 if data compression */
++
++ __le64 s_ait2; /* 8: first extent of secondary
++ * aggregate inode table
++ */
++
++ __le64 s_aim2; /* 8: first extent of secondary
++ * aggregate inode map
++ */
++ __le32 s_logdev; /* 4: device address of log */
++ __le32 s_logserial; /* 4: log serial number at aggregate mount */
++ __le64 s_logpxd; /* 8: inline log extent */
++
++ __le64 s_fsckpxd; /* 8: inline fsck work space extent */
++
++ struct timestruc_t s_time; /* 8: time last updated */
++
++ __le32 s_fsckloglen; /* 4: Number of filesystem blocks reserved for
++ * the fsck service log.
++ * N.B. These blocks are divided among the
++ * versions kept. This is not a per
++ * version size.
++ * N.B. These blocks are included in the
++ * length field of s_fsckpxd.
++ */
++ char s_fscklog; /* 1: which fsck service log is most recent
++ * 0 => no service log data yet
++ * 1 => the first one
++ * 2 => the 2nd one
++ */
++ char s_fpack[11]; /* 11: file system volume name
++ * N.B. This must be 11 bytes to
++ * conform with the OS/2 BootSector
++ * requirements
++ * Only used when s_version is 1
++ */
++
++ /* extendfs() parameter under s_state & FM_EXTENDFS */
++ __le64 s_xsize; /* 8: extendfs s_size */
++ __le64 s_xfsckpxd; /* 8: extendfs fsckpxd */
++ __le64 s_xlogpxd; /* 8: extendfs logpxd */
++ /* - 128 byte boundary - */
++
++ char s_uuid[16]; /* 16: 128-bit uuid for volume */
++ char s_label[16]; /* 16: volume label */
++ char s_loguuid[16]; /* 16: 128-bit uuid for log device */
++
++};
++
++#endif /*_H_JFS_SUPERBLOCK */