1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2e5420598SMike Frysinger /* 3e5420598SMike Frysinger * linux/include/linux/ufs_fs.h 4e5420598SMike Frysinger * 5e5420598SMike Frysinger * Copyright (C) 1996 6e5420598SMike Frysinger * Adrian Rodriguez (adrian@franklins-tower.rutgers.edu) 7e5420598SMike Frysinger * Laboratory for Computer Science Research Computing Facility 8e5420598SMike Frysinger * Rutgers, The State University of New Jersey 9e5420598SMike Frysinger * 10e5420598SMike Frysinger * Clean swab support by Fare <fare@tunes.org> 11e5420598SMike Frysinger * just hope no one is using NNUUXXI on __?64 structure elements 12e5420598SMike Frysinger * 64-bit clean thanks to Maciej W. Rozycki <macro@ds2.pg.gda.pl> 13e5420598SMike Frysinger * 14e5420598SMike Frysinger * 4.4BSD (FreeBSD) support added on February 1st 1998 by 15e5420598SMike Frysinger * Niels Kristian Bech Jensen <nkbj@image.dk> partially based 16e5420598SMike Frysinger * on code by Martin von Loewis <martin@mira.isdn.cs.tu-berlin.de>. 17e5420598SMike Frysinger * 18e5420598SMike Frysinger * NeXTstep support added on February 5th 1998 by 19e5420598SMike Frysinger * Niels Kristian Bech Jensen <nkbj@image.dk>. 20e5420598SMike Frysinger * 21e5420598SMike Frysinger * Write support by Daniel Pirkl <daniel.pirkl@email.cz> 22e5420598SMike Frysinger * 23e5420598SMike Frysinger * HP/UX hfs filesystem support added by 24e5420598SMike Frysinger * Martin K. Petersen <mkp@mkp.net>, August 1999 25e5420598SMike Frysinger * 26e5420598SMike Frysinger * UFS2 (of FreeBSD 5.x) support added by 27e5420598SMike Frysinger * Niraj Kumar <niraj17@iitbombay.org> , Jan 2004 28e5420598SMike Frysinger * 29e5420598SMike Frysinger */ 30e5420598SMike Frysinger 31e5420598SMike Frysinger #ifndef __LINUX_UFS_FS_H 32e5420598SMike Frysinger #define __LINUX_UFS_FS_H 33e5420598SMike Frysinger 34e5420598SMike Frysinger #include <linux/types.h> 35e5420598SMike Frysinger #include <linux/kernel.h> 36e5420598SMike Frysinger #include <linux/stat.h> 37e5420598SMike Frysinger #include <linux/fs.h> 389e9ad5f4SArtem Bityutskiy #include <linux/workqueue.h> 39e5420598SMike Frysinger 40e5420598SMike Frysinger #include <asm/div64.h> 41e5420598SMike Frysinger typedef __u64 __bitwise __fs64; 42e5420598SMike Frysinger typedef __u32 __bitwise __fs32; 43e5420598SMike Frysinger typedef __u16 __bitwise __fs16; 44e5420598SMike Frysinger 45e5420598SMike Frysinger #define UFS_BBLOCK 0 46e5420598SMike Frysinger #define UFS_BBSIZE 8192 47e5420598SMike Frysinger #define UFS_SBLOCK 8192 48e5420598SMike Frysinger #define UFS_SBSIZE 8192 49e5420598SMike Frysinger 50e5420598SMike Frysinger #define UFS_SECTOR_SIZE 512 51e5420598SMike Frysinger #define UFS_SECTOR_BITS 9 52e5420598SMike Frysinger #define UFS_MAGIC 0x00011954 53d27d7a9aSThomas Stewart #define UFS_MAGIC_BW 0x0f242697 54e5420598SMike Frysinger #define UFS2_MAGIC 0x19540119 55e5420598SMike Frysinger #define UFS_CIGAM 0x54190100 /* byteswapped MAGIC */ 56e5420598SMike Frysinger 57e5420598SMike Frysinger /* Copied from FreeBSD */ 58e5420598SMike Frysinger /* 59e5420598SMike Frysinger * Each disk drive contains some number of filesystems. 60e5420598SMike Frysinger * A filesystem consists of a number of cylinder groups. 61e5420598SMike Frysinger * Each cylinder group has inodes and data. 62e5420598SMike Frysinger * 63e5420598SMike Frysinger * A filesystem is described by its super-block, which in turn 64e5420598SMike Frysinger * describes the cylinder groups. The super-block is critical 65e5420598SMike Frysinger * data and is replicated in each cylinder group to protect against 66e5420598SMike Frysinger * catastrophic loss. This is done at `newfs' time and the critical 67e5420598SMike Frysinger * super-block data does not change, so the copies need not be 68e5420598SMike Frysinger * referenced further unless disaster strikes. 69e5420598SMike Frysinger * 70e5420598SMike Frysinger * For filesystem fs, the offsets of the various blocks of interest 71e5420598SMike Frysinger * are given in the super block as: 72e5420598SMike Frysinger * [fs->fs_sblkno] Super-block 73e5420598SMike Frysinger * [fs->fs_cblkno] Cylinder group block 74e5420598SMike Frysinger * [fs->fs_iblkno] Inode blocks 75e5420598SMike Frysinger * [fs->fs_dblkno] Data blocks 76e5420598SMike Frysinger * The beginning of cylinder group cg in fs, is given by 77e5420598SMike Frysinger * the ``cgbase(fs, cg)'' macro. 78e5420598SMike Frysinger * 79e5420598SMike Frysinger * Depending on the architecture and the media, the superblock may 80e5420598SMike Frysinger * reside in any one of four places. For tiny media where every block 81e5420598SMike Frysinger * counts, it is placed at the very front of the partition. Historically, 82e5420598SMike Frysinger * UFS1 placed it 8K from the front to leave room for the disk label and 83e5420598SMike Frysinger * a small bootstrap. For UFS2 it got moved to 64K from the front to leave 84e5420598SMike Frysinger * room for the disk label and a bigger bootstrap, and for really piggy 85e5420598SMike Frysinger * systems we check at 256K from the front if the first three fail. In 86e5420598SMike Frysinger * all cases the size of the superblock will be SBLOCKSIZE. All values are 87e5420598SMike Frysinger * given in byte-offset form, so they do not imply a sector size. The 88e5420598SMike Frysinger * SBLOCKSEARCH specifies the order in which the locations should be searched. 89e5420598SMike Frysinger */ 90e5420598SMike Frysinger #define SBLOCK_FLOPPY 0 91e5420598SMike Frysinger #define SBLOCK_UFS1 8192 92e5420598SMike Frysinger #define SBLOCK_UFS2 65536 93e5420598SMike Frysinger #define SBLOCK_PIGGY 262144 94e5420598SMike Frysinger #define SBLOCKSIZE 8192 95e5420598SMike Frysinger #define SBLOCKSEARCH \ 96e5420598SMike Frysinger { SBLOCK_UFS2, SBLOCK_UFS1, SBLOCK_FLOPPY, SBLOCK_PIGGY, -1 } 97e5420598SMike Frysinger 98e5420598SMike Frysinger 99e5420598SMike Frysinger /* HP specific MAGIC values */ 100e5420598SMike Frysinger 101e5420598SMike Frysinger #define UFS_MAGIC_LFN 0x00095014 /* fs supports filenames > 14 chars */ 102e5420598SMike Frysinger #define UFS_CIGAM_LFN 0x14500900 /* srahc 41 < semanelif stroppus sf */ 103e5420598SMike Frysinger 104e5420598SMike Frysinger #define UFS_MAGIC_SEC 0x00612195 /* B1 security fs */ 105e5420598SMike Frysinger #define UFS_CIGAM_SEC 0x95216100 106e5420598SMike Frysinger 107e5420598SMike Frysinger #define UFS_MAGIC_FEA 0x00195612 /* fs_featurebits supported */ 108e5420598SMike Frysinger #define UFS_CIGAM_FEA 0x12561900 109e5420598SMike Frysinger 110e5420598SMike Frysinger #define UFS_MAGIC_4GB 0x05231994 /* fs > 4 GB && fs_featurebits */ 111e5420598SMike Frysinger #define UFS_CIGAM_4GB 0x94192305 112e5420598SMike Frysinger 113e5420598SMike Frysinger /* Seems somebody at HP goofed here. B1 and lfs are both 0x2 !?! */ 114e5420598SMike Frysinger #define UFS_FSF_LFN 0x00000001 /* long file names */ 115e5420598SMike Frysinger #define UFS_FSF_B1 0x00000002 /* B1 security */ 116e5420598SMike Frysinger #define UFS_FSF_LFS 0x00000002 /* large files */ 117e5420598SMike Frysinger #define UFS_FSF_LUID 0x00000004 /* large UIDs */ 118e5420598SMike Frysinger 119e5420598SMike Frysinger /* End of HP stuff */ 120e5420598SMike Frysinger 121e5420598SMike Frysinger 122e5420598SMike Frysinger #define UFS_BSIZE 8192 123e5420598SMike Frysinger #define UFS_MINBSIZE 4096 124e5420598SMike Frysinger #define UFS_FSIZE 1024 125e5420598SMike Frysinger #define UFS_MAXFRAG (UFS_BSIZE / UFS_FSIZE) 126e5420598SMike Frysinger 127e5420598SMike Frysinger #define UFS_NDADDR 12 128e5420598SMike Frysinger #define UFS_NINDIR 3 129e5420598SMike Frysinger 130e5420598SMike Frysinger #define UFS_IND_BLOCK (UFS_NDADDR + 0) 131e5420598SMike Frysinger #define UFS_DIND_BLOCK (UFS_NDADDR + 1) 132e5420598SMike Frysinger #define UFS_TIND_BLOCK (UFS_NDADDR + 2) 133e5420598SMike Frysinger 134e5420598SMike Frysinger #define UFS_NDIR_FRAGMENT (UFS_NDADDR << uspi->s_fpbshift) 135e5420598SMike Frysinger #define UFS_IND_FRAGMENT (UFS_IND_BLOCK << uspi->s_fpbshift) 136e5420598SMike Frysinger #define UFS_DIND_FRAGMENT (UFS_DIND_BLOCK << uspi->s_fpbshift) 137e5420598SMike Frysinger #define UFS_TIND_FRAGMENT (UFS_TIND_BLOCK << uspi->s_fpbshift) 138e5420598SMike Frysinger 139e5420598SMike Frysinger #define UFS_ROOTINO 2 140e5420598SMike Frysinger #define UFS_FIRST_INO (UFS_ROOTINO + 1) 141e5420598SMike Frysinger 142e5420598SMike Frysinger #define UFS_USEEFT ((__u16)65535) 143e5420598SMike Frysinger 144b3a0fd4dSAlex Viskovatoff /* fs_clean values */ 145e5420598SMike Frysinger #define UFS_FSOK 0x7c269d38 146e5420598SMike Frysinger #define UFS_FSACTIVE ((__s8)0x00) 147e5420598SMike Frysinger #define UFS_FSCLEAN ((__s8)0x01) 148e5420598SMike Frysinger #define UFS_FSSTABLE ((__s8)0x02) 149e5420598SMike Frysinger #define UFS_FSOSF1 ((__s8)0x03) /* is this correct for DEC OSF/1? */ 150e5420598SMike Frysinger #define UFS_FSBAD ((__s8)0xff) 151e5420598SMike Frysinger 152b3a0fd4dSAlex Viskovatoff /* Solaris-specific fs_clean values */ 153b3a0fd4dSAlex Viskovatoff #define UFS_FSSUSPEND ((__s8)0xfe) /* temporarily suspended */ 154b3a0fd4dSAlex Viskovatoff #define UFS_FSLOG ((__s8)0xfd) /* logging fs */ 155b3a0fd4dSAlex Viskovatoff #define UFS_FSFIX ((__s8)0xfc) /* being repaired while mounted */ 156b3a0fd4dSAlex Viskovatoff 157e5420598SMike Frysinger /* From here to next blank line, s_flags for ufs_sb_info */ 158e5420598SMike Frysinger /* directory entry encoding */ 159e5420598SMike Frysinger #define UFS_DE_MASK 0x00000010 /* mask for the following */ 160e5420598SMike Frysinger #define UFS_DE_OLD 0x00000000 161e5420598SMike Frysinger #define UFS_DE_44BSD 0x00000010 162e5420598SMike Frysinger /* uid encoding */ 163e5420598SMike Frysinger #define UFS_UID_MASK 0x00000060 /* mask for the following */ 164e5420598SMike Frysinger #define UFS_UID_OLD 0x00000000 165e5420598SMike Frysinger #define UFS_UID_44BSD 0x00000020 166e5420598SMike Frysinger #define UFS_UID_EFT 0x00000040 167e5420598SMike Frysinger /* superblock state encoding */ 168e5420598SMike Frysinger #define UFS_ST_MASK 0x00000700 /* mask for the following */ 169e5420598SMike Frysinger #define UFS_ST_OLD 0x00000000 170e5420598SMike Frysinger #define UFS_ST_44BSD 0x00000100 171e5420598SMike Frysinger #define UFS_ST_SUN 0x00000200 /* Solaris */ 172e5420598SMike Frysinger #define UFS_ST_SUNOS 0x00000300 173e5420598SMike Frysinger #define UFS_ST_SUNx86 0x00000400 /* Solaris x86 */ 174e5420598SMike Frysinger /*cylinder group encoding */ 175e5420598SMike Frysinger #define UFS_CG_MASK 0x00003000 /* mask for the following */ 176e5420598SMike Frysinger #define UFS_CG_OLD 0x00000000 177e5420598SMike Frysinger #define UFS_CG_44BSD 0x00002000 178e5420598SMike Frysinger #define UFS_CG_SUN 0x00001000 179e5420598SMike Frysinger /* filesystem type encoding */ 180e5420598SMike Frysinger #define UFS_TYPE_MASK 0x00010000 /* mask for the following */ 181e5420598SMike Frysinger #define UFS_TYPE_UFS1 0x00000000 182e5420598SMike Frysinger #define UFS_TYPE_UFS2 0x00010000 183e5420598SMike Frysinger 184e5420598SMike Frysinger 185e5420598SMike Frysinger /* fs_inodefmt options */ 186e5420598SMike Frysinger #define UFS_42INODEFMT -1 187e5420598SMike Frysinger #define UFS_44INODEFMT 2 188e5420598SMike Frysinger 189e5420598SMike Frysinger /* 190e5420598SMike Frysinger * MINFREE gives the minimum acceptable percentage of file system 191e5420598SMike Frysinger * blocks which may be free. If the freelist drops below this level 192e5420598SMike Frysinger * only the superuser may continue to allocate blocks. This may 193e5420598SMike Frysinger * be set to 0 if no reserve of free blocks is deemed necessary, 194e5420598SMike Frysinger * however throughput drops by fifty percent if the file system 195e5420598SMike Frysinger * is run at between 95% and 100% full; thus the minimum default 196e5420598SMike Frysinger * value of fs_minfree is 5%. However, to get good clustering 197e5420598SMike Frysinger * performance, 10% is a better choice. hence we use 10% as our 198e5420598SMike Frysinger * default value. With 10% free space, fragmentation is not a 199e5420598SMike Frysinger * problem, so we choose to optimize for time. 200e5420598SMike Frysinger */ 201e5420598SMike Frysinger #define UFS_MINFREE 5 202e5420598SMike Frysinger #define UFS_DEFAULTOPT UFS_OPTTIME 203e5420598SMike Frysinger 204e5420598SMike Frysinger /* 205e5420598SMike Frysinger * Turn file system block numbers into disk block addresses. 206e5420598SMike Frysinger * This maps file system blocks to device size blocks. 207e5420598SMike Frysinger */ 208e5420598SMike Frysinger #define ufs_fsbtodb(uspi, b) ((b) << (uspi)->s_fsbtodb) 209e5420598SMike Frysinger #define ufs_dbtofsb(uspi, b) ((b) >> (uspi)->s_fsbtodb) 210e5420598SMike Frysinger 211e5420598SMike Frysinger /* 212e5420598SMike Frysinger * Cylinder group macros to locate things in cylinder groups. 213e5420598SMike Frysinger * They calc file system addresses of cylinder group data structures. 214e5420598SMike Frysinger */ 215e5420598SMike Frysinger #define ufs_cgbase(c) (uspi->s_fpg * (c)) 216e5420598SMike Frysinger #define ufs_cgstart(c) ((uspi)->fs_magic == UFS2_MAGIC ? ufs_cgbase(c) : \ 217e5420598SMike Frysinger (ufs_cgbase(c) + uspi->s_cgoffset * ((c) & ~uspi->s_cgmask))) 218e5420598SMike Frysinger #define ufs_cgsblock(c) (ufs_cgstart(c) + uspi->s_sblkno) /* super blk */ 219e5420598SMike Frysinger #define ufs_cgcmin(c) (ufs_cgstart(c) + uspi->s_cblkno) /* cg block */ 220e5420598SMike Frysinger #define ufs_cgimin(c) (ufs_cgstart(c) + uspi->s_iblkno) /* inode blk */ 221e5420598SMike Frysinger #define ufs_cgdmin(c) (ufs_cgstart(c) + uspi->s_dblkno) /* 1st data */ 222e5420598SMike Frysinger 223e5420598SMike Frysinger /* 224e5420598SMike Frysinger * Macros for handling inode numbers: 225e5420598SMike Frysinger * inode number to file system block offset. 226e5420598SMike Frysinger * inode number to cylinder group number. 227e5420598SMike Frysinger * inode number to file system block address. 228e5420598SMike Frysinger */ 229e5420598SMike Frysinger #define ufs_inotocg(x) ((x) / uspi->s_ipg) 230e5420598SMike Frysinger #define ufs_inotocgoff(x) ((x) % uspi->s_ipg) 231e5420598SMike Frysinger #define ufs_inotofsba(x) (((u64)ufs_cgimin(ufs_inotocg(x))) + ufs_inotocgoff(x) / uspi->s_inopf) 232e5420598SMike Frysinger #define ufs_inotofsbo(x) ((x) % uspi->s_inopf) 233e5420598SMike Frysinger 234e5420598SMike Frysinger /* 235e5420598SMike Frysinger * Compute the cylinder and rotational position of a cyl block addr. 236e5420598SMike Frysinger */ 237e5420598SMike Frysinger #define ufs_cbtocylno(bno) \ 238e5420598SMike Frysinger ((bno) * uspi->s_nspf / uspi->s_spc) 239e5420598SMike Frysinger #define ufs_cbtorpos(bno) \ 240ad25ad97SEvgeniy Dushistov ((UFS_SB(sb)->s_flags & UFS_CG_SUN) ? \ 241ad25ad97SEvgeniy Dushistov (((((bno) * uspi->s_nspf % uspi->s_spc) % \ 242ad25ad97SEvgeniy Dushistov uspi->s_nsect) * \ 243ad25ad97SEvgeniy Dushistov uspi->s_nrpos) / uspi->s_nsect) \ 244ad25ad97SEvgeniy Dushistov : \ 245e5420598SMike Frysinger ((((bno) * uspi->s_nspf % uspi->s_spc / uspi->s_nsect \ 246e5420598SMike Frysinger * uspi->s_trackskew + (bno) * uspi->s_nspf % uspi->s_spc \ 247e5420598SMike Frysinger % uspi->s_nsect * uspi->s_interleave) % uspi->s_nsect \ 248ad25ad97SEvgeniy Dushistov * uspi->s_nrpos) / uspi->s_npsect)) 249e5420598SMike Frysinger 250e5420598SMike Frysinger /* 251e5420598SMike Frysinger * The following macros optimize certain frequently calculated 252e5420598SMike Frysinger * quantities by using shifts and masks in place of divisions 253e5420598SMike Frysinger * modulos and multiplications. 254e5420598SMike Frysinger */ 255e5420598SMike Frysinger #define ufs_blkoff(loc) ((loc) & uspi->s_qbmask) 256e5420598SMike Frysinger #define ufs_fragoff(loc) ((loc) & uspi->s_qfmask) 257e5420598SMike Frysinger #define ufs_lblktosize(blk) ((blk) << uspi->s_bshift) 258e5420598SMike Frysinger #define ufs_lblkno(loc) ((loc) >> uspi->s_bshift) 259e5420598SMike Frysinger #define ufs_numfrags(loc) ((loc) >> uspi->s_fshift) 260e5420598SMike Frysinger #define ufs_blkroundup(size) (((size) + uspi->s_qbmask) & uspi->s_bmask) 261e5420598SMike Frysinger #define ufs_fragroundup(size) (((size) + uspi->s_qfmask) & uspi->s_fmask) 262e5420598SMike Frysinger #define ufs_fragstoblks(frags) ((frags) >> uspi->s_fpbshift) 263e5420598SMike Frysinger #define ufs_blkstofrags(blks) ((blks) << uspi->s_fpbshift) 264e5420598SMike Frysinger #define ufs_fragnum(fsb) ((fsb) & uspi->s_fpbmask) 265e5420598SMike Frysinger #define ufs_blknum(fsb) ((fsb) & ~uspi->s_fpbmask) 266e5420598SMike Frysinger 267e5420598SMike Frysinger #define UFS_MAXNAMLEN 255 268e5420598SMike Frysinger #define UFS_MAXMNTLEN 512 269e5420598SMike Frysinger #define UFS2_MAXMNTLEN 468 270e5420598SMike Frysinger #define UFS2_MAXVOLLEN 32 271e5420598SMike Frysinger #define UFS_MAXCSBUFS 31 272e5420598SMike Frysinger #define UFS_LINK_MAX 32000 273e5420598SMike Frysinger /* 274e5420598SMike Frysinger #define UFS2_NOCSPTRS ((128 / sizeof(void *)) - 4) 275e5420598SMike Frysinger */ 276e5420598SMike Frysinger #define UFS2_NOCSPTRS 28 277e5420598SMike Frysinger 278e5420598SMike Frysinger /* 279e5420598SMike Frysinger * UFS_DIR_PAD defines the directory entries boundaries 280e5420598SMike Frysinger * (must be a multiple of 4) 281e5420598SMike Frysinger */ 282e5420598SMike Frysinger #define UFS_DIR_PAD 4 283e5420598SMike Frysinger #define UFS_DIR_ROUND (UFS_DIR_PAD - 1) 284e5420598SMike Frysinger #define UFS_DIR_REC_LEN(name_len) (((name_len) + 1 + 8 + UFS_DIR_ROUND) & ~UFS_DIR_ROUND) 285e5420598SMike Frysinger 286e5420598SMike Frysinger struct ufs_timeval { 287e5420598SMike Frysinger __fs32 tv_sec; 288e5420598SMike Frysinger __fs32 tv_usec; 289e5420598SMike Frysinger }; 290e5420598SMike Frysinger 291e5420598SMike Frysinger struct ufs_dir_entry { 292e5420598SMike Frysinger __fs32 d_ino; /* inode number of this entry */ 293e5420598SMike Frysinger __fs16 d_reclen; /* length of this entry */ 294e5420598SMike Frysinger union { 295e5420598SMike Frysinger __fs16 d_namlen; /* actual length of d_name */ 296e5420598SMike Frysinger struct { 297e5420598SMike Frysinger __u8 d_type; /* file type */ 298e5420598SMike Frysinger __u8 d_namlen; /* length of string in d_name */ 299e5420598SMike Frysinger } d_44; 300e5420598SMike Frysinger } d_u; 301e5420598SMike Frysinger __u8 d_name[UFS_MAXNAMLEN + 1]; /* file name */ 302e5420598SMike Frysinger }; 303e5420598SMike Frysinger 304e5420598SMike Frysinger struct ufs_csum { 305e5420598SMike Frysinger __fs32 cs_ndir; /* number of directories */ 306e5420598SMike Frysinger __fs32 cs_nbfree; /* number of free blocks */ 307e5420598SMike Frysinger __fs32 cs_nifree; /* number of free inodes */ 308e5420598SMike Frysinger __fs32 cs_nffree; /* number of free frags */ 309e5420598SMike Frysinger }; 310e5420598SMike Frysinger struct ufs2_csum_total { 311e5420598SMike Frysinger __fs64 cs_ndir; /* number of directories */ 312e5420598SMike Frysinger __fs64 cs_nbfree; /* number of free blocks */ 313e5420598SMike Frysinger __fs64 cs_nifree; /* number of free inodes */ 314e5420598SMike Frysinger __fs64 cs_nffree; /* number of free frags */ 315e5420598SMike Frysinger __fs64 cs_numclusters; /* number of free clusters */ 316e5420598SMike Frysinger __fs64 cs_spare[3]; /* future expansion */ 317e5420598SMike Frysinger }; 318e5420598SMike Frysinger 319e5420598SMike Frysinger struct ufs_csum_core { 320e5420598SMike Frysinger __u64 cs_ndir; /* number of directories */ 321e5420598SMike Frysinger __u64 cs_nbfree; /* number of free blocks */ 322e5420598SMike Frysinger __u64 cs_nifree; /* number of free inodes */ 323e5420598SMike Frysinger __u64 cs_nffree; /* number of free frags */ 324e5420598SMike Frysinger __u64 cs_numclusters; /* number of free clusters */ 325e5420598SMike Frysinger }; 326e5420598SMike Frysinger 327e5420598SMike Frysinger /* 328e5420598SMike Frysinger * File system flags 329e5420598SMike Frysinger */ 330e5420598SMike Frysinger #define UFS_UNCLEAN 0x01 /* file system not clean at mount (unused) */ 331e5420598SMike Frysinger #define UFS_DOSOFTDEP 0x02 /* file system using soft dependencies */ 332e5420598SMike Frysinger #define UFS_NEEDSFSCK 0x04 /* needs sync fsck (FreeBSD compat, unused) */ 333e5420598SMike Frysinger #define UFS_INDEXDIRS 0x08 /* kernel supports indexed directories */ 334e5420598SMike Frysinger #define UFS_ACLS 0x10 /* file system has ACLs enabled */ 335e5420598SMike Frysinger #define UFS_MULTILABEL 0x20 /* file system is MAC multi-label */ 336e5420598SMike Frysinger #define UFS_FLAGS_UPDATED 0x80 /* flags have been moved to new location */ 337e5420598SMike Frysinger 338e5420598SMike Frysinger #if 0 339e5420598SMike Frysinger /* 340e5420598SMike Frysinger * This is the actual superblock, as it is laid out on the disk. 341e5420598SMike Frysinger * Do NOT use this structure, because of sizeof(ufs_super_block) > 512 and 342e5420598SMike Frysinger * it may occupy several blocks, use 343e5420598SMike Frysinger * struct ufs_super_block_(first,second,third) instead. 344e5420598SMike Frysinger */ 345e5420598SMike Frysinger struct ufs_super_block { 346e5420598SMike Frysinger union { 347e5420598SMike Frysinger struct { 348e5420598SMike Frysinger __fs32 fs_link; /* UNUSED */ 349e5420598SMike Frysinger } fs_42; 350e5420598SMike Frysinger struct { 351e5420598SMike Frysinger __fs32 fs_state; /* file system state flag */ 352e5420598SMike Frysinger } fs_sun; 353e5420598SMike Frysinger } fs_u0; 354e5420598SMike Frysinger __fs32 fs_rlink; /* UNUSED */ 355e5420598SMike Frysinger __fs32 fs_sblkno; /* addr of super-block in filesys */ 356e5420598SMike Frysinger __fs32 fs_cblkno; /* offset of cyl-block in filesys */ 357e5420598SMike Frysinger __fs32 fs_iblkno; /* offset of inode-blocks in filesys */ 358e5420598SMike Frysinger __fs32 fs_dblkno; /* offset of first data after cg */ 359e5420598SMike Frysinger __fs32 fs_cgoffset; /* cylinder group offset in cylinder */ 360e5420598SMike Frysinger __fs32 fs_cgmask; /* used to calc mod fs_ntrak */ 361e5420598SMike Frysinger __fs32 fs_time; /* last time written -- time_t */ 362e5420598SMike Frysinger __fs32 fs_size; /* number of blocks in fs */ 363e5420598SMike Frysinger __fs32 fs_dsize; /* number of data blocks in fs */ 364e5420598SMike Frysinger __fs32 fs_ncg; /* number of cylinder groups */ 365e5420598SMike Frysinger __fs32 fs_bsize; /* size of basic blocks in fs */ 366e5420598SMike Frysinger __fs32 fs_fsize; /* size of frag blocks in fs */ 367e5420598SMike Frysinger __fs32 fs_frag; /* number of frags in a block in fs */ 368e5420598SMike Frysinger /* these are configuration parameters */ 369e5420598SMike Frysinger __fs32 fs_minfree; /* minimum percentage of free blocks */ 370e5420598SMike Frysinger __fs32 fs_rotdelay; /* num of ms for optimal next block */ 371e5420598SMike Frysinger __fs32 fs_rps; /* disk revolutions per second */ 372e5420598SMike Frysinger /* these fields can be computed from the others */ 373e5420598SMike Frysinger __fs32 fs_bmask; /* ``blkoff'' calc of blk offsets */ 374e5420598SMike Frysinger __fs32 fs_fmask; /* ``fragoff'' calc of frag offsets */ 375e5420598SMike Frysinger __fs32 fs_bshift; /* ``lblkno'' calc of logical blkno */ 376e5420598SMike Frysinger __fs32 fs_fshift; /* ``numfrags'' calc number of frags */ 377e5420598SMike Frysinger /* these are configuration parameters */ 378e5420598SMike Frysinger __fs32 fs_maxcontig; /* max number of contiguous blks */ 379e5420598SMike Frysinger __fs32 fs_maxbpg; /* max number of blks per cyl group */ 380e5420598SMike Frysinger /* these fields can be computed from the others */ 381e5420598SMike Frysinger __fs32 fs_fragshift; /* block to frag shift */ 382e5420598SMike Frysinger __fs32 fs_fsbtodb; /* fsbtodb and dbtofsb shift constant */ 383e5420598SMike Frysinger __fs32 fs_sbsize; /* actual size of super block */ 384e5420598SMike Frysinger __fs32 fs_csmask; /* csum block offset */ 385e5420598SMike Frysinger __fs32 fs_csshift; /* csum block number */ 386e5420598SMike Frysinger __fs32 fs_nindir; /* value of NINDIR */ 387e5420598SMike Frysinger __fs32 fs_inopb; /* value of INOPB */ 388e5420598SMike Frysinger __fs32 fs_nspf; /* value of NSPF */ 389e5420598SMike Frysinger /* yet another configuration parameter */ 390e5420598SMike Frysinger __fs32 fs_optim; /* optimization preference, see below */ 391e5420598SMike Frysinger /* these fields are derived from the hardware */ 392e5420598SMike Frysinger union { 393e5420598SMike Frysinger struct { 394e5420598SMike Frysinger __fs32 fs_npsect; /* # sectors/track including spares */ 395e5420598SMike Frysinger } fs_sun; 396e5420598SMike Frysinger struct { 397e5420598SMike Frysinger __fs32 fs_state; /* file system state time stamp */ 398e5420598SMike Frysinger } fs_sunx86; 399e5420598SMike Frysinger } fs_u1; 400e5420598SMike Frysinger __fs32 fs_interleave; /* hardware sector interleave */ 401e5420598SMike Frysinger __fs32 fs_trackskew; /* sector 0 skew, per track */ 402e5420598SMike Frysinger /* a unique id for this filesystem (currently unused and unmaintained) */ 403e5420598SMike Frysinger /* In 4.3 Tahoe this space is used by fs_headswitch and fs_trkseek */ 404e5420598SMike Frysinger /* Neither of those fields is used in the Tahoe code right now but */ 405e5420598SMike Frysinger /* there could be problems if they are. */ 406e5420598SMike Frysinger __fs32 fs_id[2]; /* file system id */ 407e5420598SMike Frysinger /* sizes determined by number of cylinder groups and their sizes */ 408e5420598SMike Frysinger __fs32 fs_csaddr; /* blk addr of cyl grp summary area */ 409e5420598SMike Frysinger __fs32 fs_cssize; /* size of cyl grp summary area */ 410e5420598SMike Frysinger __fs32 fs_cgsize; /* cylinder group size */ 411e5420598SMike Frysinger /* these fields are derived from the hardware */ 412e5420598SMike Frysinger __fs32 fs_ntrak; /* tracks per cylinder */ 413e5420598SMike Frysinger __fs32 fs_nsect; /* sectors per track */ 414e5420598SMike Frysinger __fs32 fs_spc; /* sectors per cylinder */ 415e5420598SMike Frysinger /* this comes from the disk driver partitioning */ 416e5420598SMike Frysinger __fs32 fs_ncyl; /* cylinders in file system */ 417e5420598SMike Frysinger /* these fields can be computed from the others */ 418e5420598SMike Frysinger __fs32 fs_cpg; /* cylinders per group */ 419e5420598SMike Frysinger __fs32 fs_ipg; /* inodes per cylinder group */ 420e5420598SMike Frysinger __fs32 fs_fpg; /* blocks per group * fs_frag */ 421e5420598SMike Frysinger /* this data must be re-computed after crashes */ 422e5420598SMike Frysinger struct ufs_csum fs_cstotal; /* cylinder summary information */ 423e5420598SMike Frysinger /* these fields are cleared at mount time */ 424e5420598SMike Frysinger __s8 fs_fmod; /* super block modified flag */ 425e5420598SMike Frysinger __s8 fs_clean; /* file system is clean flag */ 426e5420598SMike Frysinger __s8 fs_ronly; /* mounted read-only flag */ 427e5420598SMike Frysinger __s8 fs_flags; 428e5420598SMike Frysinger union { 429e5420598SMike Frysinger struct { 430e5420598SMike Frysinger __s8 fs_fsmnt[UFS_MAXMNTLEN];/* name mounted on */ 431e5420598SMike Frysinger __fs32 fs_cgrotor; /* last cg searched */ 432e5420598SMike Frysinger __fs32 fs_csp[UFS_MAXCSBUFS];/*list of fs_cs info buffers */ 433e5420598SMike Frysinger __fs32 fs_maxcluster; 434e5420598SMike Frysinger __fs32 fs_cpc; /* cyl per cycle in postbl */ 435e5420598SMike Frysinger __fs16 fs_opostbl[16][8]; /* old rotation block list head */ 436e5420598SMike Frysinger } fs_u1; 437e5420598SMike Frysinger struct { 438e5420598SMike Frysinger __s8 fs_fsmnt[UFS2_MAXMNTLEN]; /* name mounted on */ 439e5420598SMike Frysinger __u8 fs_volname[UFS2_MAXVOLLEN]; /* volume name */ 440e5420598SMike Frysinger __fs64 fs_swuid; /* system-wide uid */ 441e5420598SMike Frysinger __fs32 fs_pad; /* due to alignment of fs_swuid */ 442e5420598SMike Frysinger __fs32 fs_cgrotor; /* last cg searched */ 443e5420598SMike Frysinger __fs32 fs_ocsp[UFS2_NOCSPTRS]; /*list of fs_cs info buffers */ 444e5420598SMike Frysinger __fs32 fs_contigdirs;/*# of contiguously allocated dirs */ 445e5420598SMike Frysinger __fs32 fs_csp; /* cg summary info buffer for fs_cs */ 446e5420598SMike Frysinger __fs32 fs_maxcluster; 447e5420598SMike Frysinger __fs32 fs_active;/* used by snapshots to track fs */ 448e5420598SMike Frysinger __fs32 fs_old_cpc; /* cyl per cycle in postbl */ 449e5420598SMike Frysinger __fs32 fs_maxbsize;/*maximum blocking factor permitted */ 450e5420598SMike Frysinger __fs64 fs_sparecon64[17];/*old rotation block list head */ 451e5420598SMike Frysinger __fs64 fs_sblockloc; /* byte offset of standard superblock */ 452e5420598SMike Frysinger struct ufs2_csum_total fs_cstotal;/*cylinder summary information*/ 453e5420598SMike Frysinger struct ufs_timeval fs_time; /* last time written */ 454e5420598SMike Frysinger __fs64 fs_size; /* number of blocks in fs */ 455e5420598SMike Frysinger __fs64 fs_dsize; /* number of data blocks in fs */ 456e5420598SMike Frysinger __fs64 fs_csaddr; /* blk addr of cyl grp summary area */ 457e5420598SMike Frysinger __fs64 fs_pendingblocks;/* blocks in process of being freed */ 458e5420598SMike Frysinger __fs32 fs_pendinginodes;/*inodes in process of being freed */ 459e5420598SMike Frysinger } fs_u2; 460e5420598SMike Frysinger } fs_u11; 461e5420598SMike Frysinger union { 462e5420598SMike Frysinger struct { 463e5420598SMike Frysinger __fs32 fs_sparecon[53];/* reserved for future constants */ 464e5420598SMike Frysinger __fs32 fs_reclaim; 465e5420598SMike Frysinger __fs32 fs_sparecon2[1]; 466e5420598SMike Frysinger __fs32 fs_state; /* file system state time stamp */ 467e5420598SMike Frysinger __fs32 fs_qbmask[2]; /* ~usb_bmask */ 468e5420598SMike Frysinger __fs32 fs_qfmask[2]; /* ~usb_fmask */ 469e5420598SMike Frysinger } fs_sun; 470e5420598SMike Frysinger struct { 471e5420598SMike Frysinger __fs32 fs_sparecon[53];/* reserved for future constants */ 472e5420598SMike Frysinger __fs32 fs_reclaim; 473e5420598SMike Frysinger __fs32 fs_sparecon2[1]; 474e5420598SMike Frysinger __fs32 fs_npsect; /* # sectors/track including spares */ 475e5420598SMike Frysinger __fs32 fs_qbmask[2]; /* ~usb_bmask */ 476e5420598SMike Frysinger __fs32 fs_qfmask[2]; /* ~usb_fmask */ 477e5420598SMike Frysinger } fs_sunx86; 478e5420598SMike Frysinger struct { 479e5420598SMike Frysinger __fs32 fs_sparecon[50];/* reserved for future constants */ 480e5420598SMike Frysinger __fs32 fs_contigsumsize;/* size of cluster summary array */ 481e5420598SMike Frysinger __fs32 fs_maxsymlinklen;/* max length of an internal symlink */ 482e5420598SMike Frysinger __fs32 fs_inodefmt; /* format of on-disk inodes */ 483e5420598SMike Frysinger __fs32 fs_maxfilesize[2]; /* max representable file size */ 484e5420598SMike Frysinger __fs32 fs_qbmask[2]; /* ~usb_bmask */ 485e5420598SMike Frysinger __fs32 fs_qfmask[2]; /* ~usb_fmask */ 486e5420598SMike Frysinger __fs32 fs_state; /* file system state time stamp */ 487e5420598SMike Frysinger } fs_44; 488e5420598SMike Frysinger } fs_u2; 489e5420598SMike Frysinger __fs32 fs_postblformat; /* format of positional layout tables */ 490e5420598SMike Frysinger __fs32 fs_nrpos; /* number of rotational positions */ 491e5420598SMike Frysinger __fs32 fs_postbloff; /* (__s16) rotation block list head */ 492e5420598SMike Frysinger __fs32 fs_rotbloff; /* (__u8) blocks for each rotation */ 493e5420598SMike Frysinger __fs32 fs_magic; /* magic number */ 494e5420598SMike Frysinger __u8 fs_space[1]; /* list of blocks for each rotation */ 495e5420598SMike Frysinger }; 496e5420598SMike Frysinger #endif/*struct ufs_super_block*/ 497e5420598SMike Frysinger 498e5420598SMike Frysinger /* 499e5420598SMike Frysinger * Preference for optimization. 500e5420598SMike Frysinger */ 501e5420598SMike Frysinger #define UFS_OPTTIME 0 /* minimize allocation time */ 502e5420598SMike Frysinger #define UFS_OPTSPACE 1 /* minimize disk fragmentation */ 503e5420598SMike Frysinger 504e5420598SMike Frysinger /* 505e5420598SMike Frysinger * Rotational layout table format types 506e5420598SMike Frysinger */ 507e5420598SMike Frysinger #define UFS_42POSTBLFMT -1 /* 4.2BSD rotational table format */ 508e5420598SMike Frysinger #define UFS_DYNAMICPOSTBLFMT 1 /* dynamic rotational table format */ 509e5420598SMike Frysinger 510e5420598SMike Frysinger /* 511e5420598SMike Frysinger * Convert cylinder group to base address of its global summary info. 512e5420598SMike Frysinger */ 513e5420598SMike Frysinger #define fs_cs(indx) s_csp[(indx)] 514e5420598SMike Frysinger 515e5420598SMike Frysinger /* 516e5420598SMike Frysinger * Cylinder group block for a file system. 517e5420598SMike Frysinger * 518e5420598SMike Frysinger * Writable fields in the cylinder group are protected by the associated 519e5420598SMike Frysinger * super block lock fs->fs_lock. 520e5420598SMike Frysinger */ 521e5420598SMike Frysinger #define CG_MAGIC 0x090255 522e5420598SMike Frysinger #define ufs_cg_chkmagic(sb, ucg) \ 523e5420598SMike Frysinger (fs32_to_cpu((sb), (ucg)->cg_magic) == CG_MAGIC) 524e5420598SMike Frysinger /* 525e5420598SMike Frysinger * Macros for access to old cylinder group array structures 526e5420598SMike Frysinger */ 527e5420598SMike Frysinger #define ufs_ocg_blktot(sb, ucg) fs32_to_cpu((sb), ((struct ufs_old_cylinder_group *)(ucg))->cg_btot) 528e5420598SMike Frysinger #define ufs_ocg_blks(sb, ucg, cylno) fs32_to_cpu((sb), ((struct ufs_old_cylinder_group *)(ucg))->cg_b[cylno]) 529e5420598SMike Frysinger #define ufs_ocg_inosused(sb, ucg) fs32_to_cpu((sb), ((struct ufs_old_cylinder_group *)(ucg))->cg_iused) 530e5420598SMike Frysinger #define ufs_ocg_blksfree(sb, ucg) fs32_to_cpu((sb), ((struct ufs_old_cylinder_group *)(ucg))->cg_free) 531e5420598SMike Frysinger #define ufs_ocg_chkmagic(sb, ucg) \ 532e5420598SMike Frysinger (fs32_to_cpu((sb), ((struct ufs_old_cylinder_group *)(ucg))->cg_magic) == CG_MAGIC) 533e5420598SMike Frysinger 534e5420598SMike Frysinger /* 535e5420598SMike Frysinger * size of this structure is 172 B 536e5420598SMike Frysinger */ 537e5420598SMike Frysinger struct ufs_cylinder_group { 538e5420598SMike Frysinger __fs32 cg_link; /* linked list of cyl groups */ 539e5420598SMike Frysinger __fs32 cg_magic; /* magic number */ 540e5420598SMike Frysinger __fs32 cg_time; /* time last written */ 541e5420598SMike Frysinger __fs32 cg_cgx; /* we are the cgx'th cylinder group */ 542e5420598SMike Frysinger __fs16 cg_ncyl; /* number of cyl's this cg */ 543e5420598SMike Frysinger __fs16 cg_niblk; /* number of inode blocks this cg */ 544e5420598SMike Frysinger __fs32 cg_ndblk; /* number of data blocks this cg */ 545e5420598SMike Frysinger struct ufs_csum cg_cs; /* cylinder summary information */ 546e5420598SMike Frysinger __fs32 cg_rotor; /* position of last used block */ 547e5420598SMike Frysinger __fs32 cg_frotor; /* position of last used frag */ 548e5420598SMike Frysinger __fs32 cg_irotor; /* position of last used inode */ 549e5420598SMike Frysinger __fs32 cg_frsum[UFS_MAXFRAG]; /* counts of available frags */ 550e5420598SMike Frysinger __fs32 cg_btotoff; /* (__u32) block totals per cylinder */ 551e5420598SMike Frysinger __fs32 cg_boff; /* (short) free block positions */ 552e5420598SMike Frysinger __fs32 cg_iusedoff; /* (char) used inode map */ 553e5420598SMike Frysinger __fs32 cg_freeoff; /* (u_char) free block map */ 554e5420598SMike Frysinger __fs32 cg_nextfreeoff; /* (u_char) next available space */ 555e5420598SMike Frysinger union { 556e5420598SMike Frysinger struct { 557e5420598SMike Frysinger __fs32 cg_clustersumoff; /* (u_int32) counts of avail clusters */ 558e5420598SMike Frysinger __fs32 cg_clusteroff; /* (u_int8) free cluster map */ 559e5420598SMike Frysinger __fs32 cg_nclusterblks; /* number of clusters this cg */ 560e5420598SMike Frysinger __fs32 cg_sparecon[13]; /* reserved for future use */ 561e5420598SMike Frysinger } cg_44; 562e5420598SMike Frysinger struct { 563e5420598SMike Frysinger __fs32 cg_clustersumoff;/* (u_int32) counts of avail clusters */ 564e5420598SMike Frysinger __fs32 cg_clusteroff; /* (u_int8) free cluster map */ 565e5420598SMike Frysinger __fs32 cg_nclusterblks;/* number of clusters this cg */ 566e5420598SMike Frysinger __fs32 cg_niblk; /* number of inode blocks this cg */ 567e5420598SMike Frysinger __fs32 cg_initediblk; /* last initialized inode */ 568e5420598SMike Frysinger __fs32 cg_sparecon32[3];/* reserved for future use */ 569e5420598SMike Frysinger __fs64 cg_time; /* time last written */ 570e5420598SMike Frysinger __fs64 cg_sparecon[3]; /* reserved for future use */ 571e5420598SMike Frysinger } cg_u2; 572e5420598SMike Frysinger __fs32 cg_sparecon[16]; /* reserved for future use */ 573e5420598SMike Frysinger } cg_u; 574e5420598SMike Frysinger __u8 cg_space[1]; /* space for cylinder group maps */ 575e5420598SMike Frysinger /* actually longer */ 576e5420598SMike Frysinger }; 577e5420598SMike Frysinger 578e5420598SMike Frysinger /* Historic Cylinder group info */ 579e5420598SMike Frysinger struct ufs_old_cylinder_group { 580e5420598SMike Frysinger __fs32 cg_link; /* linked list of cyl groups */ 581e5420598SMike Frysinger __fs32 cg_rlink; /* for incore cyl groups */ 582e5420598SMike Frysinger __fs32 cg_time; /* time last written */ 583e5420598SMike Frysinger __fs32 cg_cgx; /* we are the cgx'th cylinder group */ 584e5420598SMike Frysinger __fs16 cg_ncyl; /* number of cyl's this cg */ 585e5420598SMike Frysinger __fs16 cg_niblk; /* number of inode blocks this cg */ 586e5420598SMike Frysinger __fs32 cg_ndblk; /* number of data blocks this cg */ 587e5420598SMike Frysinger struct ufs_csum cg_cs; /* cylinder summary information */ 588e5420598SMike Frysinger __fs32 cg_rotor; /* position of last used block */ 589e5420598SMike Frysinger __fs32 cg_frotor; /* position of last used frag */ 590e5420598SMike Frysinger __fs32 cg_irotor; /* position of last used inode */ 591e5420598SMike Frysinger __fs32 cg_frsum[8]; /* counts of available frags */ 592e5420598SMike Frysinger __fs32 cg_btot[32]; /* block totals per cylinder */ 593e5420598SMike Frysinger __fs16 cg_b[32][8]; /* positions of free blocks */ 594e5420598SMike Frysinger __u8 cg_iused[256]; /* used inode map */ 595e5420598SMike Frysinger __fs32 cg_magic; /* magic number */ 596e5420598SMike Frysinger __u8 cg_free[1]; /* free block map */ 597e5420598SMike Frysinger /* actually longer */ 598e5420598SMike Frysinger }; 599e5420598SMike Frysinger 600e5420598SMike Frysinger /* 601e5420598SMike Frysinger * structure of an on-disk inode 602e5420598SMike Frysinger */ 603e5420598SMike Frysinger struct ufs_inode { 604e5420598SMike Frysinger __fs16 ui_mode; /* 0x0 */ 605e5420598SMike Frysinger __fs16 ui_nlink; /* 0x2 */ 606e5420598SMike Frysinger union { 607e5420598SMike Frysinger struct { 608e5420598SMike Frysinger __fs16 ui_suid; /* 0x4 */ 609e5420598SMike Frysinger __fs16 ui_sgid; /* 0x6 */ 610e5420598SMike Frysinger } oldids; 611e5420598SMike Frysinger __fs32 ui_inumber; /* 0x4 lsf: inode number */ 612e5420598SMike Frysinger __fs32 ui_author; /* 0x4 GNU HURD: author */ 613e5420598SMike Frysinger } ui_u1; 614e5420598SMike Frysinger __fs64 ui_size; /* 0x8 */ 615e5420598SMike Frysinger struct ufs_timeval ui_atime; /* 0x10 access */ 616e5420598SMike Frysinger struct ufs_timeval ui_mtime; /* 0x18 modification */ 617e5420598SMike Frysinger struct ufs_timeval ui_ctime; /* 0x20 creation */ 618e5420598SMike Frysinger union { 619e5420598SMike Frysinger struct { 620e5420598SMike Frysinger __fs32 ui_db[UFS_NDADDR];/* 0x28 data blocks */ 621e5420598SMike Frysinger __fs32 ui_ib[UFS_NINDIR];/* 0x58 indirect blocks */ 622e5420598SMike Frysinger } ui_addr; 623e5420598SMike Frysinger __u8 ui_symlink[4*(UFS_NDADDR+UFS_NINDIR)];/* 0x28 fast symlink */ 624e5420598SMike Frysinger } ui_u2; 625e5420598SMike Frysinger __fs32 ui_flags; /* 0x64 immutable, append-only... */ 626e5420598SMike Frysinger __fs32 ui_blocks; /* 0x68 blocks in use */ 627e5420598SMike Frysinger __fs32 ui_gen; /* 0x6c like ext2 i_version, for NFS support */ 628e5420598SMike Frysinger union { 629e5420598SMike Frysinger struct { 630e5420598SMike Frysinger __fs32 ui_shadow; /* 0x70 shadow inode with security data */ 631e5420598SMike Frysinger __fs32 ui_uid; /* 0x74 long EFT version of uid */ 632e5420598SMike Frysinger __fs32 ui_gid; /* 0x78 long EFT version of gid */ 633e5420598SMike Frysinger __fs32 ui_oeftflag; /* 0x7c reserved */ 634e5420598SMike Frysinger } ui_sun; 635e5420598SMike Frysinger struct { 636e5420598SMike Frysinger __fs32 ui_uid; /* 0x70 File owner */ 637e5420598SMike Frysinger __fs32 ui_gid; /* 0x74 File group */ 638e5420598SMike Frysinger __fs32 ui_spare[2]; /* 0x78 reserved */ 639e5420598SMike Frysinger } ui_44; 640e5420598SMike Frysinger struct { 641e5420598SMike Frysinger __fs32 ui_uid; /* 0x70 */ 642e5420598SMike Frysinger __fs32 ui_gid; /* 0x74 */ 643e5420598SMike Frysinger __fs16 ui_modeh; /* 0x78 mode high bits */ 644e5420598SMike Frysinger __fs16 ui_spare; /* 0x7A unused */ 645e5420598SMike Frysinger __fs32 ui_trans; /* 0x7c filesystem translator */ 646e5420598SMike Frysinger } ui_hurd; 647e5420598SMike Frysinger } ui_u3; 648e5420598SMike Frysinger }; 649e5420598SMike Frysinger 650e5420598SMike Frysinger #define UFS_NXADDR 2 /* External addresses in inode. */ 651e5420598SMike Frysinger struct ufs2_inode { 652e5420598SMike Frysinger __fs16 ui_mode; /* 0: IFMT, permissions; see below. */ 653e5420598SMike Frysinger __fs16 ui_nlink; /* 2: File link count. */ 654e5420598SMike Frysinger __fs32 ui_uid; /* 4: File owner. */ 655e5420598SMike Frysinger __fs32 ui_gid; /* 8: File group. */ 656e5420598SMike Frysinger __fs32 ui_blksize; /* 12: Inode blocksize. */ 657e5420598SMike Frysinger __fs64 ui_size; /* 16: File byte count. */ 658e5420598SMike Frysinger __fs64 ui_blocks; /* 24: Bytes actually held. */ 659e5420598SMike Frysinger __fs64 ui_atime; /* 32: Last access time. */ 660e5420598SMike Frysinger __fs64 ui_mtime; /* 40: Last modified time. */ 661e5420598SMike Frysinger __fs64 ui_ctime; /* 48: Last inode change time. */ 662e5420598SMike Frysinger __fs64 ui_birthtime; /* 56: Inode creation time. */ 663e5420598SMike Frysinger __fs32 ui_mtimensec; /* 64: Last modified time. */ 664e5420598SMike Frysinger __fs32 ui_atimensec; /* 68: Last access time. */ 665e5420598SMike Frysinger __fs32 ui_ctimensec; /* 72: Last inode change time. */ 666e5420598SMike Frysinger __fs32 ui_birthnsec; /* 76: Inode creation time. */ 667e5420598SMike Frysinger __fs32 ui_gen; /* 80: Generation number. */ 668e5420598SMike Frysinger __fs32 ui_kernflags; /* 84: Kernel flags. */ 669e5420598SMike Frysinger __fs32 ui_flags; /* 88: Status flags (chflags). */ 670e5420598SMike Frysinger __fs32 ui_extsize; /* 92: External attributes block. */ 671e5420598SMike Frysinger __fs64 ui_extb[UFS_NXADDR];/* 96: External attributes block. */ 672e5420598SMike Frysinger union { 673e5420598SMike Frysinger struct { 674e5420598SMike Frysinger __fs64 ui_db[UFS_NDADDR]; /* 112: Direct disk blocks. */ 675e5420598SMike Frysinger __fs64 ui_ib[UFS_NINDIR];/* 208: Indirect disk blocks.*/ 676e5420598SMike Frysinger } ui_addr; 677e5420598SMike Frysinger __u8 ui_symlink[2*4*(UFS_NDADDR+UFS_NINDIR)];/* 0x28 fast symlink */ 678e5420598SMike Frysinger } ui_u2; 679e5420598SMike Frysinger __fs64 ui_spare[3]; /* 232: Reserved; currently unused */ 680e5420598SMike Frysinger }; 681e5420598SMike Frysinger 682e5420598SMike Frysinger 683e5420598SMike Frysinger /* FreeBSD has these in sys/stat.h */ 684e5420598SMike Frysinger /* ui_flags that can be set by a file owner */ 685e5420598SMike Frysinger #define UFS_UF_SETTABLE 0x0000ffff 686e5420598SMike Frysinger #define UFS_UF_NODUMP 0x00000001 /* do not dump */ 687e5420598SMike Frysinger #define UFS_UF_IMMUTABLE 0x00000002 /* immutable (can't "change") */ 688e5420598SMike Frysinger #define UFS_UF_APPEND 0x00000004 /* append-only */ 689e5420598SMike Frysinger #define UFS_UF_OPAQUE 0x00000008 /* directory is opaque (unionfs) */ 690e5420598SMike Frysinger #define UFS_UF_NOUNLINK 0x00000010 /* can't be removed or renamed */ 691e5420598SMike Frysinger /* ui_flags that only root can set */ 692e5420598SMike Frysinger #define UFS_SF_SETTABLE 0xffff0000 693e5420598SMike Frysinger #define UFS_SF_ARCHIVED 0x00010000 /* archived */ 694e5420598SMike Frysinger #define UFS_SF_IMMUTABLE 0x00020000 /* immutable (can't "change") */ 695e5420598SMike Frysinger #define UFS_SF_APPEND 0x00040000 /* append-only */ 696e5420598SMike Frysinger #define UFS_SF_NOUNLINK 0x00100000 /* can't be removed or renamed */ 697e5420598SMike Frysinger 698e5420598SMike Frysinger /* 699e5420598SMike Frysinger * This structure is used for reading disk structures larger 700e5420598SMike Frysinger * than the size of fragment. 701e5420598SMike Frysinger */ 702e5420598SMike Frysinger struct ufs_buffer_head { 703e5420598SMike Frysinger __u64 fragment; /* first fragment */ 704e5420598SMike Frysinger __u64 count; /* number of fragments */ 705e5420598SMike Frysinger struct buffer_head * bh[UFS_MAXFRAG]; /* buffers */ 706e5420598SMike Frysinger }; 707e5420598SMike Frysinger 708e5420598SMike Frysinger struct ufs_cg_private_info { 709e5420598SMike Frysinger struct ufs_buffer_head c_ubh; 710e5420598SMike Frysinger __u32 c_cgx; /* number of cylidner group */ 711e5420598SMike Frysinger __u16 c_ncyl; /* number of cyl's this cg */ 712e5420598SMike Frysinger __u16 c_niblk; /* number of inode blocks this cg */ 713e5420598SMike Frysinger __u32 c_ndblk; /* number of data blocks this cg */ 714e5420598SMike Frysinger __u32 c_rotor; /* position of last used block */ 715e5420598SMike Frysinger __u32 c_frotor; /* position of last used frag */ 716e5420598SMike Frysinger __u32 c_irotor; /* position of last used inode */ 717e5420598SMike Frysinger __u32 c_btotoff; /* (__u32) block totals per cylinder */ 718e5420598SMike Frysinger __u32 c_boff; /* (short) free block positions */ 719e5420598SMike Frysinger __u32 c_iusedoff; /* (char) used inode map */ 720e5420598SMike Frysinger __u32 c_freeoff; /* (u_char) free block map */ 721e5420598SMike Frysinger __u32 c_nextfreeoff; /* (u_char) next available space */ 722e5420598SMike Frysinger __u32 c_clustersumoff;/* (u_int32) counts of avail clusters */ 723e5420598SMike Frysinger __u32 c_clusteroff; /* (u_int8) free cluster map */ 724e5420598SMike Frysinger __u32 c_nclusterblks; /* number of clusters this cg */ 725e5420598SMike Frysinger }; 726e5420598SMike Frysinger 727e5420598SMike Frysinger 728e5420598SMike Frysinger struct ufs_sb_private_info { 729e5420598SMike Frysinger struct ufs_buffer_head s_ubh; /* buffer containing super block */ 730e5420598SMike Frysinger struct ufs_csum_core cs_total; 731e5420598SMike Frysinger __u32 s_sblkno; /* offset of super-blocks in filesys */ 732e5420598SMike Frysinger __u32 s_cblkno; /* offset of cg-block in filesys */ 733e5420598SMike Frysinger __u32 s_iblkno; /* offset of inode-blocks in filesys */ 734e5420598SMike Frysinger __u32 s_dblkno; /* offset of first data after cg */ 735e5420598SMike Frysinger __u32 s_cgoffset; /* cylinder group offset in cylinder */ 736e5420598SMike Frysinger __u32 s_cgmask; /* used to calc mod fs_ntrak */ 737c596961dSAl Viro __u64 s_size; /* number of blocks (fragments) in fs */ 738c596961dSAl Viro __u64 s_dsize; /* number of data blocks in fs */ 739e5420598SMike Frysinger __u32 s_ncg; /* number of cylinder groups */ 740e5420598SMike Frysinger __u32 s_bsize; /* size of basic blocks */ 741e5420598SMike Frysinger __u32 s_fsize; /* size of fragments */ 742e5420598SMike Frysinger __u32 s_fpb; /* fragments per block */ 743e5420598SMike Frysinger __u32 s_minfree; /* minimum percentage of free blocks */ 744e5420598SMike Frysinger __u32 s_bmask; /* `blkoff'' calc of blk offsets */ 745e5420598SMike Frysinger __u32 s_fmask; /* s_fsize mask */ 746e5420598SMike Frysinger __u32 s_bshift; /* `lblkno'' calc of logical blkno */ 747e5420598SMike Frysinger __u32 s_fshift; /* s_fsize shift */ 748e5420598SMike Frysinger __u32 s_fpbshift; /* fragments per block shift */ 749e5420598SMike Frysinger __u32 s_fsbtodb; /* fsbtodb and dbtofsb shift constant */ 750e5420598SMike Frysinger __u32 s_sbsize; /* actual size of super block */ 751e5420598SMike Frysinger __u32 s_csmask; /* csum block offset */ 752e5420598SMike Frysinger __u32 s_csshift; /* csum block number */ 753e5420598SMike Frysinger __u32 s_nindir; /* value of NINDIR */ 754e5420598SMike Frysinger __u32 s_inopb; /* value of INOPB */ 755e5420598SMike Frysinger __u32 s_nspf; /* value of NSPF */ 756e5420598SMike Frysinger __u32 s_npsect; /* # sectors/track including spares */ 757e5420598SMike Frysinger __u32 s_interleave; /* hardware sector interleave */ 758e5420598SMike Frysinger __u32 s_trackskew; /* sector 0 skew, per track */ 759e5420598SMike Frysinger __u64 s_csaddr; /* blk addr of cyl grp summary area */ 760e5420598SMike Frysinger __u32 s_cssize; /* size of cyl grp summary area */ 761e5420598SMike Frysinger __u32 s_cgsize; /* cylinder group size */ 762e5420598SMike Frysinger __u32 s_ntrak; /* tracks per cylinder */ 763e5420598SMike Frysinger __u32 s_nsect; /* sectors per track */ 764e5420598SMike Frysinger __u32 s_spc; /* sectors per cylinder */ 765e5420598SMike Frysinger __u32 s_ipg; /* inodes per cylinder group */ 766e5420598SMike Frysinger __u32 s_fpg; /* fragments per group */ 767e5420598SMike Frysinger __u32 s_cpc; /* cyl per cycle in postbl */ 768e5420598SMike Frysinger __s32 s_contigsumsize;/* size of cluster summary array, 44bsd */ 769e5420598SMike Frysinger __s64 s_qbmask; /* ~usb_bmask */ 770e5420598SMike Frysinger __s64 s_qfmask; /* ~usb_fmask */ 771e5420598SMike Frysinger __s32 s_postblformat; /* format of positional layout tables */ 772e5420598SMike Frysinger __s32 s_nrpos; /* number of rotational positions */ 773e5420598SMike Frysinger __s32 s_postbloff; /* (__s16) rotation block list head */ 774e5420598SMike Frysinger __s32 s_rotbloff; /* (__u8) blocks for each rotation */ 775e5420598SMike Frysinger 776e5420598SMike Frysinger __u32 s_fpbmask; /* fragments per block mask */ 777e5420598SMike Frysinger __u32 s_apb; /* address per block */ 778e5420598SMike Frysinger __u32 s_2apb; /* address per block^2 */ 779e5420598SMike Frysinger __u32 s_3apb; /* address per block^3 */ 780e5420598SMike Frysinger __u32 s_apbmask; /* address per block mask */ 781e5420598SMike Frysinger __u32 s_apbshift; /* address per block shift */ 782e5420598SMike Frysinger __u32 s_2apbshift; /* address per block shift * 2 */ 783e5420598SMike Frysinger __u32 s_3apbshift; /* address per block shift * 3 */ 784e5420598SMike Frysinger __u32 s_nspfshift; /* number of sector per fragment shift */ 785e5420598SMike Frysinger __u32 s_nspb; /* number of sector per block */ 786e5420598SMike Frysinger __u32 s_inopf; /* inodes per fragment */ 787e5420598SMike Frysinger __u32 s_sbbase; /* offset of NeXTstep superblock */ 788e5420598SMike Frysinger __u32 s_bpf; /* bits per fragment */ 789e5420598SMike Frysinger __u32 s_bpfshift; /* bits per fragment shift*/ 790e5420598SMike Frysinger __u32 s_bpfmask; /* bits per fragment mask */ 791e5420598SMike Frysinger 792e5420598SMike Frysinger __u32 s_maxsymlinklen;/* upper limit on fast symlinks' size */ 793e5420598SMike Frysinger __s32 fs_magic; /* filesystem magic */ 794e5420598SMike Frysinger unsigned int s_dirblksize; 795c596961dSAl Viro __u64 s_root_blocks; 79677e9ce32SAl Viro __u64 s_time_to_space; 79777e9ce32SAl Viro __u64 s_space_to_time; 798e5420598SMike Frysinger }; 799e5420598SMike Frysinger 800e5420598SMike Frysinger /* 801e5420598SMike Frysinger * Sizes of this structures are: 802e5420598SMike Frysinger * ufs_super_block_first 512 803e5420598SMike Frysinger * ufs_super_block_second 512 804e5420598SMike Frysinger * ufs_super_block_third 356 805e5420598SMike Frysinger */ 806e5420598SMike Frysinger struct ufs_super_block_first { 807e5420598SMike Frysinger union { 808e5420598SMike Frysinger struct { 809e5420598SMike Frysinger __fs32 fs_link; /* UNUSED */ 810e5420598SMike Frysinger } fs_42; 811e5420598SMike Frysinger struct { 812e5420598SMike Frysinger __fs32 fs_state; /* file system state flag */ 813e5420598SMike Frysinger } fs_sun; 814e5420598SMike Frysinger } fs_u0; 815e5420598SMike Frysinger __fs32 fs_rlink; 816e5420598SMike Frysinger __fs32 fs_sblkno; 817e5420598SMike Frysinger __fs32 fs_cblkno; 818e5420598SMike Frysinger __fs32 fs_iblkno; 819e5420598SMike Frysinger __fs32 fs_dblkno; 820e5420598SMike Frysinger __fs32 fs_cgoffset; 821e5420598SMike Frysinger __fs32 fs_cgmask; 822e5420598SMike Frysinger __fs32 fs_time; 823e5420598SMike Frysinger __fs32 fs_size; 824e5420598SMike Frysinger __fs32 fs_dsize; 825e5420598SMike Frysinger __fs32 fs_ncg; 826e5420598SMike Frysinger __fs32 fs_bsize; 827e5420598SMike Frysinger __fs32 fs_fsize; 828e5420598SMike Frysinger __fs32 fs_frag; 829e5420598SMike Frysinger __fs32 fs_minfree; 830e5420598SMike Frysinger __fs32 fs_rotdelay; 831e5420598SMike Frysinger __fs32 fs_rps; 832e5420598SMike Frysinger __fs32 fs_bmask; 833e5420598SMike Frysinger __fs32 fs_fmask; 834e5420598SMike Frysinger __fs32 fs_bshift; 835e5420598SMike Frysinger __fs32 fs_fshift; 836e5420598SMike Frysinger __fs32 fs_maxcontig; 837e5420598SMike Frysinger __fs32 fs_maxbpg; 838e5420598SMike Frysinger __fs32 fs_fragshift; 839e5420598SMike Frysinger __fs32 fs_fsbtodb; 840e5420598SMike Frysinger __fs32 fs_sbsize; 841e5420598SMike Frysinger __fs32 fs_csmask; 842e5420598SMike Frysinger __fs32 fs_csshift; 843e5420598SMike Frysinger __fs32 fs_nindir; 844e5420598SMike Frysinger __fs32 fs_inopb; 845e5420598SMike Frysinger __fs32 fs_nspf; 846e5420598SMike Frysinger __fs32 fs_optim; 847e5420598SMike Frysinger union { 848e5420598SMike Frysinger struct { 849e5420598SMike Frysinger __fs32 fs_npsect; 850e5420598SMike Frysinger } fs_sun; 851e5420598SMike Frysinger struct { 852e5420598SMike Frysinger __fs32 fs_state; 853e5420598SMike Frysinger } fs_sunx86; 854e5420598SMike Frysinger } fs_u1; 855e5420598SMike Frysinger __fs32 fs_interleave; 856e5420598SMike Frysinger __fs32 fs_trackskew; 857e5420598SMike Frysinger __fs32 fs_id[2]; 858e5420598SMike Frysinger __fs32 fs_csaddr; 859e5420598SMike Frysinger __fs32 fs_cssize; 860e5420598SMike Frysinger __fs32 fs_cgsize; 861e5420598SMike Frysinger __fs32 fs_ntrak; 862e5420598SMike Frysinger __fs32 fs_nsect; 863e5420598SMike Frysinger __fs32 fs_spc; 864e5420598SMike Frysinger __fs32 fs_ncyl; 865e5420598SMike Frysinger __fs32 fs_cpg; 866e5420598SMike Frysinger __fs32 fs_ipg; 867e5420598SMike Frysinger __fs32 fs_fpg; 868e5420598SMike Frysinger struct ufs_csum fs_cstotal; 869e5420598SMike Frysinger __s8 fs_fmod; 870e5420598SMike Frysinger __s8 fs_clean; 871e5420598SMike Frysinger __s8 fs_ronly; 872e5420598SMike Frysinger __s8 fs_flags; 873e5420598SMike Frysinger __s8 fs_fsmnt[UFS_MAXMNTLEN - 212]; 874e5420598SMike Frysinger 875e5420598SMike Frysinger }; 876e5420598SMike Frysinger 877e5420598SMike Frysinger struct ufs_super_block_second { 878e5420598SMike Frysinger union { 879e5420598SMike Frysinger struct { 880e5420598SMike Frysinger __s8 fs_fsmnt[212]; 881e5420598SMike Frysinger __fs32 fs_cgrotor; 882e5420598SMike Frysinger __fs32 fs_csp[UFS_MAXCSBUFS]; 883e5420598SMike Frysinger __fs32 fs_maxcluster; 884e5420598SMike Frysinger __fs32 fs_cpc; 885e5420598SMike Frysinger __fs16 fs_opostbl[82]; 886e5420598SMike Frysinger } fs_u1; 887e5420598SMike Frysinger struct { 888e5420598SMike Frysinger __s8 fs_fsmnt[UFS2_MAXMNTLEN - UFS_MAXMNTLEN + 212]; 889e5420598SMike Frysinger __u8 fs_volname[UFS2_MAXVOLLEN]; 890e5420598SMike Frysinger __fs64 fs_swuid; 891e5420598SMike Frysinger __fs32 fs_pad; 892e5420598SMike Frysinger __fs32 fs_cgrotor; 893e5420598SMike Frysinger __fs32 fs_ocsp[UFS2_NOCSPTRS]; 894e5420598SMike Frysinger __fs32 fs_contigdirs; 895e5420598SMike Frysinger __fs32 fs_csp; 896e5420598SMike Frysinger __fs32 fs_maxcluster; 897e5420598SMike Frysinger __fs32 fs_active; 898e5420598SMike Frysinger __fs32 fs_old_cpc; 899e5420598SMike Frysinger __fs32 fs_maxbsize; 900e5420598SMike Frysinger __fs64 fs_sparecon64[17]; 901e5420598SMike Frysinger __fs64 fs_sblockloc; 902e5420598SMike Frysinger __fs64 cs_ndir; 903e5420598SMike Frysinger __fs64 cs_nbfree; 904e5420598SMike Frysinger } fs_u2; 905e5420598SMike Frysinger } fs_un; 906e5420598SMike Frysinger }; 907e5420598SMike Frysinger 908e5420598SMike Frysinger struct ufs_super_block_third { 909e5420598SMike Frysinger union { 910e5420598SMike Frysinger struct { 911e5420598SMike Frysinger __fs16 fs_opostbl[46]; 912e5420598SMike Frysinger } fs_u1; 913e5420598SMike Frysinger struct { 914e5420598SMike Frysinger __fs64 cs_nifree; /* number of free inodes */ 915e5420598SMike Frysinger __fs64 cs_nffree; /* number of free frags */ 916e5420598SMike Frysinger __fs64 cs_numclusters; /* number of free clusters */ 917e5420598SMike Frysinger __fs64 cs_spare[3]; /* future expansion */ 918e5420598SMike Frysinger struct ufs_timeval fs_time; /* last time written */ 919e5420598SMike Frysinger __fs64 fs_size; /* number of blocks in fs */ 920e5420598SMike Frysinger __fs64 fs_dsize; /* number of data blocks in fs */ 921e5420598SMike Frysinger __fs64 fs_csaddr; /* blk addr of cyl grp summary area */ 922e5420598SMike Frysinger __fs64 fs_pendingblocks;/* blocks in process of being freed */ 923e5420598SMike Frysinger __fs32 fs_pendinginodes;/*inodes in process of being freed */ 924e5420598SMike Frysinger } __attribute__ ((packed)) fs_u2; 925e5420598SMike Frysinger } fs_un1; 926e5420598SMike Frysinger union { 927e5420598SMike Frysinger struct { 928e5420598SMike Frysinger __fs32 fs_sparecon[53];/* reserved for future constants */ 929e5420598SMike Frysinger __fs32 fs_reclaim; 930e5420598SMike Frysinger __fs32 fs_sparecon2[1]; 931e5420598SMike Frysinger __fs32 fs_state; /* file system state time stamp */ 932e5420598SMike Frysinger __fs32 fs_qbmask[2]; /* ~usb_bmask */ 933e5420598SMike Frysinger __fs32 fs_qfmask[2]; /* ~usb_fmask */ 934e5420598SMike Frysinger } fs_sun; 935e5420598SMike Frysinger struct { 936e5420598SMike Frysinger __fs32 fs_sparecon[53];/* reserved for future constants */ 937e5420598SMike Frysinger __fs32 fs_reclaim; 938e5420598SMike Frysinger __fs32 fs_sparecon2[1]; 939e5420598SMike Frysinger __fs32 fs_npsect; /* # sectors/track including spares */ 940e5420598SMike Frysinger __fs32 fs_qbmask[2]; /* ~usb_bmask */ 941e5420598SMike Frysinger __fs32 fs_qfmask[2]; /* ~usb_fmask */ 942e5420598SMike Frysinger } fs_sunx86; 943e5420598SMike Frysinger struct { 944e5420598SMike Frysinger __fs32 fs_sparecon[50];/* reserved for future constants */ 945e5420598SMike Frysinger __fs32 fs_contigsumsize;/* size of cluster summary array */ 946e5420598SMike Frysinger __fs32 fs_maxsymlinklen;/* max length of an internal symlink */ 947e5420598SMike Frysinger __fs32 fs_inodefmt; /* format of on-disk inodes */ 948e5420598SMike Frysinger __fs32 fs_maxfilesize[2]; /* max representable file size */ 949e5420598SMike Frysinger __fs32 fs_qbmask[2]; /* ~usb_bmask */ 950e5420598SMike Frysinger __fs32 fs_qfmask[2]; /* ~usb_fmask */ 951e5420598SMike Frysinger __fs32 fs_state; /* file system state time stamp */ 952e5420598SMike Frysinger } fs_44; 953e5420598SMike Frysinger } fs_un2; 954e5420598SMike Frysinger __fs32 fs_postblformat; 955e5420598SMike Frysinger __fs32 fs_nrpos; 956e5420598SMike Frysinger __fs32 fs_postbloff; 957e5420598SMike Frysinger __fs32 fs_rotbloff; 958e5420598SMike Frysinger __fs32 fs_magic; 959e5420598SMike Frysinger __u8 fs_space[1]; 960e5420598SMike Frysinger }; 961e5420598SMike Frysinger 962e5420598SMike Frysinger #endif /* __LINUX_UFS_FS_H */ 963