130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef _UAPI__CRAMFS_H
230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _UAPI__CRAMFS_H
330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include <linux/types.h>
530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include <linux/magic.h>
630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CRAMFS_SIGNATURE	"Compressed ROMFS"
830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
1030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Width of various bitfields in struct cramfs_inode.
1130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Primarily used to generate warnings in mkcramfs.
1230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
1330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CRAMFS_MODE_WIDTH 16
1430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CRAMFS_UID_WIDTH 16
1530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CRAMFS_SIZE_WIDTH 24
1630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CRAMFS_GID_WIDTH 8
1730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CRAMFS_NAMELEN_WIDTH 6
1830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CRAMFS_OFFSET_WIDTH 26
1930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
2030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
2130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Since inode.namelen is a unsigned 6-bit number, the maximum cramfs
2230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * path length is 63 << 2 = 252.
2330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
2430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CRAMFS_MAXPATHLEN (((1 << CRAMFS_NAMELEN_WIDTH) - 1) << 2)
2530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
2630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
2730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Reasonably terse representation of the inode data.
2830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
2930692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct cramfs_inode {
3030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u32 mode:CRAMFS_MODE_WIDTH, uid:CRAMFS_UID_WIDTH;
3130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	/* SIZE for device files is i_rdev */
3230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u32 size:CRAMFS_SIZE_WIDTH, gid:CRAMFS_GID_WIDTH;
3330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	/* NAMELEN is the length of the file name, divided by 4 and
3430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng           rounded up.  (cramfs doesn't support hard links.) */
3530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	/* OFFSET: For symlinks and non-empty regular files, this
3630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	   contains the offset (divided by 4) of the file data in
3730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	   compressed form (starting with an array of block pointers;
3830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	   see README).  For non-empty directories it is the offset
3930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	   (divided by 4) of the inode of the first file in that
4030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	   directory.  For anything else, offset is zero. */
4130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u32 namelen:CRAMFS_NAMELEN_WIDTH, offset:CRAMFS_OFFSET_WIDTH;
4230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
4330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
4430692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct cramfs_info {
4530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u32 crc;
4630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u32 edition;
4730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u32 blocks;
4830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u32 files;
4930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
5030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
5130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
5230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Superblock information at the beginning of the FS.
5330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
5430692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct cramfs_super {
5530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u32 magic;			/* 0x28cd3d45 - random number */
5630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u32 size;			/* length in bytes */
5730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u32 flags;			/* feature flags */
5830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u32 future;			/* reserved for future use */
5930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8 signature[16];		/* "Compressed ROMFS" */
6030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	struct cramfs_info fsid;	/* unique filesystem info */
6130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u8 name[16];			/* user-defined name */
6230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	struct cramfs_inode root;	/* root inode data */
6330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
6430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
6530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
6630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Feature flags
6730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
6830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 0x00000000 - 0x000000ff: features that work for all past kernels
6930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * 0x00000100 - 0xffffffff: features that don't work for past kernels
7030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
7130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CRAMFS_FLAG_FSID_VERSION_2	0x00000001	/* fsid version #2 */
7230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CRAMFS_FLAG_SORTED_DIRS		0x00000002	/* sorted dirs */
7330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CRAMFS_FLAG_HOLES		0x00000100	/* support for holes */
7430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CRAMFS_FLAG_WRONG_SIGNATURE	0x00000200	/* reserved */
7530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CRAMFS_FLAG_SHIFTED_ROOT_OFFSET	0x00000400	/* shifted root fs */
7630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
7730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
7830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Valid values in super.flags.  Currently we refuse to mount
7930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * if (flags & ~CRAMFS_SUPPORTED_FLAGS).  Maybe that should be
8030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * changed to test super.future instead.
8130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
8230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define CRAMFS_SUPPORTED_FLAGS	( 0x000000ff \
8330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				| CRAMFS_FLAG_HOLES \
8430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				| CRAMFS_FLAG_WRONG_SIGNATURE \
8530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				| CRAMFS_FLAG_SHIFTED_ROOT_OFFSET )
8630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
8730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
8830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif /* _UAPI__CRAMFS_H */
89