struct journal_params {
    __u32 jp_journal_1st_block;       /* where does journal start from on its
                                       * device */
    __u32 jp_journal_dev;             /* journal device st_rdev */
    __u32 jp_journal_size;            /* size of the journal */
    __u32 jp_journal_trans_max;       /* max number of blocks in a transaction. */
    __u32 jp_journal_magic;           /* random value made on fs creation (this
                                       * was sb_journal_block_count) */
    __u32 jp_journal_max_batch;       /* max number of blocks to batch into a
                                       * trans */
    __u32 jp_journal_max_commit_age;  /* in seconds, how old can an async
                                       * commit be */
    __u32 jp_journal_max_trans_age;   /* in seconds, how old can a transaction
                                       * be */
};

/* this is the super from 3.5.X, where X >= 10 */
struct reiserfs_super_block_v1
{
    __u32 s_block_count;           /* blocks count         */
    __u32 s_free_blocks;           /* free blocks count    */
    __u32 s_root_block;            /* root block number    */
    struct journal_params s_journal;
    __u16 s_blocksize;             /* block size */
    __u16 s_oid_maxsize;           /* max size of object id array, see
                                    * get_objectid() commentary  */
    __u16 s_oid_cursize;           /* current size of object id array */
    __u16 s_umount_state;          /* this is set to 1 when filesystem was
                                    * umounted, to 2 - when not */
    char s_magic[10];              /* reiserfs magic string indicates that
                                    * file system is reiserfs:
                                    * "ReIsErFs" or "ReIsEr2Fs" or "ReIsEr3Fs" */
    __u16 s_fs_state;              /* it is set to used by fsck to mark which
                                    * phase of rebuilding is done */
    __u32 s_hash_function_code;    /* indicate, what hash function is being use
                                    * to sort names in a directory*/
    __u16 s_tree_height;           /* height of disk tree */
    __u16 s_bmap_nr;               /* amount of bitmap blocks needed to address
                                    * each block of file system */
    __u16 s_version;               /* this field is only reliable on filesystem
                                    * with non-standard journal */
    __u16 s_reserved_for_journal;  /* size in blocks of journal area on main
                                    * device, we need to keep after
                                    * making fs with non-standard journal */
} __attribute__ ((__packed__));

/* this is the on disk super block */
struct reiserfs_super_block
{
    struct reiserfs_super_block_v1 s_v1;
    __u32 s_inode_generation;
    __u32 s_flags;                  /* Right now used only by inode-attributes, if enabled */
    unsigned char s_uuid[16];       /* filesystem unique identifier */
    unsigned char s_label[16];      /* filesystem volume label */
    char s_unused[88] ;             /* zero filled by mkreiserfs and
                                     * reiserfs_convert_objectid_map_v1()
                                     * so any additions must be updated
                                     * there as well. */
}  __attribute__ ((__packed__));

#define REISERFS_SUPER_MAGIC_STRING "ReIsErFs"
#define REISER2FS_SUPER_MAGIC_STRING "ReIsEr2Fs"
#define REISER2FS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs"

#define SB_V1_DISK_SUPER_BLOCK(s) (&((s)->s_v1))
#define REISERFS_BLOCKSIZE(s) \
        __le32_to_cpu((SB_V1_DISK_SUPER_BLOCK(s)->s_blocksize))
#define REISERFS_BLOCK_COUNT(s) \
        __le32_to_cpu((SB_V1_DISK_SUPER_BLOCK(s)->s_block_count))
#define REISERFS_MAGIC(s) \
        (SB_V1_DISK_SUPER_BLOCK(s)->s_magic)
