1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Name : qnx6_fs.h 4*4882a593Smuzhiyun * Author : Kai Bankett 5*4882a593Smuzhiyun * Function : qnx6 global filesystem definitions 6*4882a593Smuzhiyun * History : 17-01-2012 created 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun #ifndef _LINUX_QNX6_FS_H 9*4882a593Smuzhiyun #define _LINUX_QNX6_FS_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/types.h> 12*4882a593Smuzhiyun #include <linux/magic.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define QNX6_ROOT_INO 1 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* for di_status */ 17*4882a593Smuzhiyun #define QNX6_FILE_DIRECTORY 0x01 18*4882a593Smuzhiyun #define QNX6_FILE_DELETED 0x02 19*4882a593Smuzhiyun #define QNX6_FILE_NORMAL 0x03 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define QNX6_SUPERBLOCK_SIZE 0x200 /* superblock always is 512 bytes */ 22*4882a593Smuzhiyun #define QNX6_SUPERBLOCK_AREA 0x1000 /* area reserved for superblock */ 23*4882a593Smuzhiyun #define QNX6_BOOTBLOCK_SIZE 0x2000 /* heading bootblock area */ 24*4882a593Smuzhiyun #define QNX6_DIR_ENTRY_SIZE 0x20 /* dir entry size of 32 bytes */ 25*4882a593Smuzhiyun #define QNX6_INODE_SIZE 0x80 /* each inode is 128 bytes */ 26*4882a593Smuzhiyun #define QNX6_INODE_SIZE_BITS 7 /* inode entry size shift */ 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define QNX6_NO_DIRECT_POINTERS 16 /* 16 blockptrs in sbl/inode */ 29*4882a593Smuzhiyun #define QNX6_PTR_MAX_LEVELS 5 /* maximum indirect levels */ 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* for filenames */ 32*4882a593Smuzhiyun #define QNX6_SHORT_NAME_MAX 27 33*4882a593Smuzhiyun #define QNX6_LONG_NAME_MAX 510 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /* list of mount options */ 36*4882a593Smuzhiyun #define QNX6_MOUNT_MMI_FS 0x010000 /* mount as Audi MMI 3G fs */ 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /* 39*4882a593Smuzhiyun * This is the original qnx6 inode layout on disk. 40*4882a593Smuzhiyun * Each inode is 128 byte long. 41*4882a593Smuzhiyun */ 42*4882a593Smuzhiyun struct qnx6_inode_entry { 43*4882a593Smuzhiyun __fs64 di_size; 44*4882a593Smuzhiyun __fs32 di_uid; 45*4882a593Smuzhiyun __fs32 di_gid; 46*4882a593Smuzhiyun __fs32 di_ftime; 47*4882a593Smuzhiyun __fs32 di_mtime; 48*4882a593Smuzhiyun __fs32 di_atime; 49*4882a593Smuzhiyun __fs32 di_ctime; 50*4882a593Smuzhiyun __fs16 di_mode; 51*4882a593Smuzhiyun __fs16 di_ext_mode; 52*4882a593Smuzhiyun __fs32 di_block_ptr[QNX6_NO_DIRECT_POINTERS]; 53*4882a593Smuzhiyun __u8 di_filelevels; 54*4882a593Smuzhiyun __u8 di_status; 55*4882a593Smuzhiyun __u8 di_unknown2[2]; 56*4882a593Smuzhiyun __fs32 di_zero2[6]; 57*4882a593Smuzhiyun }; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* 60*4882a593Smuzhiyun * Each directory entry is maximum 32 bytes long. 61*4882a593Smuzhiyun * If more characters or special characters required it is stored 62*4882a593Smuzhiyun * in the longfilenames structure. 63*4882a593Smuzhiyun */ 64*4882a593Smuzhiyun struct qnx6_dir_entry { 65*4882a593Smuzhiyun __fs32 de_inode; 66*4882a593Smuzhiyun __u8 de_size; 67*4882a593Smuzhiyun char de_fname[QNX6_SHORT_NAME_MAX]; 68*4882a593Smuzhiyun }; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* 71*4882a593Smuzhiyun * Longfilename direntries have a different structure 72*4882a593Smuzhiyun */ 73*4882a593Smuzhiyun struct qnx6_long_dir_entry { 74*4882a593Smuzhiyun __fs32 de_inode; 75*4882a593Smuzhiyun __u8 de_size; 76*4882a593Smuzhiyun __u8 de_unknown[3]; 77*4882a593Smuzhiyun __fs32 de_long_inode; 78*4882a593Smuzhiyun __fs32 de_checksum; 79*4882a593Smuzhiyun }; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun struct qnx6_long_filename { 82*4882a593Smuzhiyun __fs16 lf_size; 83*4882a593Smuzhiyun __u8 lf_fname[QNX6_LONG_NAME_MAX]; 84*4882a593Smuzhiyun }; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun struct qnx6_root_node { 87*4882a593Smuzhiyun __fs64 size; 88*4882a593Smuzhiyun __fs32 ptr[QNX6_NO_DIRECT_POINTERS]; 89*4882a593Smuzhiyun __u8 levels; 90*4882a593Smuzhiyun __u8 mode; 91*4882a593Smuzhiyun __u8 spare[6]; 92*4882a593Smuzhiyun }; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun struct qnx6_super_block { 95*4882a593Smuzhiyun __fs32 sb_magic; 96*4882a593Smuzhiyun __fs32 sb_checksum; 97*4882a593Smuzhiyun __fs64 sb_serial; 98*4882a593Smuzhiyun __fs32 sb_ctime; /* time the fs was created */ 99*4882a593Smuzhiyun __fs32 sb_atime; /* last access time */ 100*4882a593Smuzhiyun __fs32 sb_flags; 101*4882a593Smuzhiyun __fs16 sb_version1; /* filesystem version information */ 102*4882a593Smuzhiyun __fs16 sb_version2; /* filesystem version information */ 103*4882a593Smuzhiyun __u8 sb_volumeid[16]; 104*4882a593Smuzhiyun __fs32 sb_blocksize; 105*4882a593Smuzhiyun __fs32 sb_num_inodes; 106*4882a593Smuzhiyun __fs32 sb_free_inodes; 107*4882a593Smuzhiyun __fs32 sb_num_blocks; 108*4882a593Smuzhiyun __fs32 sb_free_blocks; 109*4882a593Smuzhiyun __fs32 sb_allocgroup; 110*4882a593Smuzhiyun struct qnx6_root_node Inode; 111*4882a593Smuzhiyun struct qnx6_root_node Bitmap; 112*4882a593Smuzhiyun struct qnx6_root_node Longfile; 113*4882a593Smuzhiyun struct qnx6_root_node Unknown; 114*4882a593Smuzhiyun }; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun /* Audi MMI 3G superblock layout is different to plain qnx6 */ 117*4882a593Smuzhiyun struct qnx6_mmi_super_block { 118*4882a593Smuzhiyun __fs32 sb_magic; 119*4882a593Smuzhiyun __fs32 sb_checksum; 120*4882a593Smuzhiyun __fs64 sb_serial; 121*4882a593Smuzhiyun __u8 sb_spare0[12]; 122*4882a593Smuzhiyun __u8 sb_id[12]; 123*4882a593Smuzhiyun __fs32 sb_blocksize; 124*4882a593Smuzhiyun __fs32 sb_num_inodes; 125*4882a593Smuzhiyun __fs32 sb_free_inodes; 126*4882a593Smuzhiyun __fs32 sb_num_blocks; 127*4882a593Smuzhiyun __fs32 sb_free_blocks; 128*4882a593Smuzhiyun __u8 sb_spare1[4]; 129*4882a593Smuzhiyun struct qnx6_root_node Inode; 130*4882a593Smuzhiyun struct qnx6_root_node Bitmap; 131*4882a593Smuzhiyun struct qnx6_root_node Longfile; 132*4882a593Smuzhiyun struct qnx6_root_node Unknown; 133*4882a593Smuzhiyun }; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun #endif 136