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