📄 ufs_fs.h
字号:
/* * linux/include/linux/ufs_fs.h * * Copyright (C) 1996 * Adrian Rodriguez (adrian@franklins-tower.rutgers.edu) * Laboratory for Computer Science Research Computing Facility * Rutgers, The State University of New Jersey * * Clean swab support by Fare <fare@tunes.org> * just hope no one is using NNUUXXI on __?64 structure elements * 64-bit clean thanks to Maciej W. Rozycki <macro@ds2.pg.gda.pl> * * 4.4BSD (FreeBSD) support added on February 1st 1998 by * Niels Kristian Bech Jensen <nkbj@image.dk> partially based * on code by Martin von Loewis <martin@mira.isdn.cs.tu-berlin.de>. * * NeXTstep support added on February 5th 1998 by * Niels Kristian Bech Jensen <nkbj@image.dk>. * * Write support by Daniel Pirkl <daniel.pirkl@email.cz> * * HP/UX hfs filesystem support added by * Martin K. Petersen <mkp@mkp.net>, August 1999 * * UFS2 (of FreeBSD 5.x) support added by * Niraj Kumar <niraj17@iitbombay.org> , Jan 2004 * */#ifndef __LINUX_UFS_FS_H#define __LINUX_UFS_FS_H#include <linux/types.h>#include <linux/kernel.h>#include <linux/stat.h>#include <linux/fs.h>#include <asm/div64.h>typedef __u64 __bitwise __fs64;typedef __u32 __bitwise __fs32;typedef __u16 __bitwise __fs16;#define UFS_BBLOCK 0#define UFS_BBSIZE 8192#define UFS_SBLOCK 8192#define UFS_SBSIZE 8192#define UFS_SECTOR_SIZE 512#define UFS_SECTOR_BITS 9#define UFS_MAGIC 0x00011954#define UFS2_MAGIC 0x19540119#define UFS_CIGAM 0x54190100 /* byteswapped MAGIC *//* Copied from FreeBSD *//* * Each disk drive contains some number of filesystems. * A filesystem consists of a number of cylinder groups. * Each cylinder group has inodes and data. * * A filesystem is described by its super-block, which in turn * describes the cylinder groups. The super-block is critical * data and is replicated in each cylinder group to protect against * catastrophic loss. This is done at `newfs' time and the critical * super-block data does not change, so the copies need not be * referenced further unless disaster strikes. * * For filesystem fs, the offsets of the various blocks of interest * are given in the super block as: * [fs->fs_sblkno] Super-block * [fs->fs_cblkno] Cylinder group block * [fs->fs_iblkno] Inode blocks * [fs->fs_dblkno] Data blocks * The beginning of cylinder group cg in fs, is given by * the ``cgbase(fs, cg)'' macro. * * Depending on the architecture and the media, the superblock may * reside in any one of four places. For tiny media where every block * counts, it is placed at the very front of the partition. Historically, * UFS1 placed it 8K from the front to leave room for the disk label and * a small bootstrap. For UFS2 it got moved to 64K from the front to leave * room for the disk label and a bigger bootstrap, and for really piggy * systems we check at 256K from the front if the first three fail. In * all cases the size of the superblock will be SBLOCKSIZE. All values are * given in byte-offset form, so they do not imply a sector size. The * SBLOCKSEARCH specifies the order in which the locations should be searched. */#define SBLOCK_FLOPPY 0#define SBLOCK_UFS1 8192#define SBLOCK_UFS2 65536#define SBLOCK_PIGGY 262144#define SBLOCKSIZE 8192#define SBLOCKSEARCH \ { SBLOCK_UFS2, SBLOCK_UFS1, SBLOCK_FLOPPY, SBLOCK_PIGGY, -1 }/* HP specific MAGIC values */#define UFS_MAGIC_LFN 0x00095014 /* fs supports filenames > 14 chars */#define UFS_CIGAM_LFN 0x14500900 /* srahc 41 < semanelif stroppus sf */#define UFS_MAGIC_SEC 0x00612195 /* B1 security fs */#define UFS_CIGAM_SEC 0x95216100#define UFS_MAGIC_FEA 0x00195612 /* fs_featurebits supported */#define UFS_CIGAM_FEA 0x12561900#define UFS_MAGIC_4GB 0x05231994 /* fs > 4 GB && fs_featurebits */#define UFS_CIGAM_4GB 0x94192305/* Seems somebody at HP goofed here. B1 and lfs are both 0x2 !?! */#define UFS_FSF_LFN 0x00000001 /* long file names */#define UFS_FSF_B1 0x00000002 /* B1 security */#define UFS_FSF_LFS 0x00000002 /* large files */#define UFS_FSF_LUID 0x00000004 /* large UIDs *//* End of HP stuff */#define UFS_BSIZE 8192#define UFS_MINBSIZE 4096#define UFS_FSIZE 1024#define UFS_MAXFRAG (UFS_BSIZE / UFS_FSIZE)#define UFS_NDADDR 12#define UFS_NINDIR 3#define UFS_IND_BLOCK (UFS_NDADDR + 0)#define UFS_DIND_BLOCK (UFS_NDADDR + 1)#define UFS_TIND_BLOCK (UFS_NDADDR + 2)#define UFS_NDIR_FRAGMENT (UFS_NDADDR << uspi->s_fpbshift)#define UFS_IND_FRAGMENT (UFS_IND_BLOCK << uspi->s_fpbshift)#define UFS_DIND_FRAGMENT (UFS_DIND_BLOCK << uspi->s_fpbshift)#define UFS_TIND_FRAGMENT (UFS_TIND_BLOCK << uspi->s_fpbshift)#define UFS_ROOTINO 2#define UFS_FIRST_INO (UFS_ROOTINO + 1)#define UFS_USEEFT ((__u16)65535)#define UFS_FSOK 0x7c269d38#define UFS_FSACTIVE ((__s8)0x00)#define UFS_FSCLEAN ((__s8)0x01)#define UFS_FSSTABLE ((__s8)0x02)#define UFS_FSOSF1 ((__s8)0x03) /* is this correct for DEC OSF/1? */#define UFS_FSBAD ((__s8)0xff)/* From here to next blank line, s_flags for ufs_sb_info *//* directory entry encoding */#define UFS_DE_MASK 0x00000010 /* mask for the following */#define UFS_DE_OLD 0x00000000#define UFS_DE_44BSD 0x00000010/* uid encoding */#define UFS_UID_MASK 0x00000060 /* mask for the following */#define UFS_UID_OLD 0x00000000#define UFS_UID_44BSD 0x00000020#define UFS_UID_EFT 0x00000040/* superblock state encoding */#define UFS_ST_MASK 0x00000700 /* mask for the following */#define UFS_ST_OLD 0x00000000#define UFS_ST_44BSD 0x00000100#define UFS_ST_SUN 0x00000200 /* Solaris */#define UFS_ST_SUNOS 0x00000300#define UFS_ST_SUNx86 0x00000400 /* Solaris x86 *//*cylinder group encoding */#define UFS_CG_MASK 0x00003000 /* mask for the following */#define UFS_CG_OLD 0x00000000#define UFS_CG_44BSD 0x00002000#define UFS_CG_SUN 0x00001000/* filesystem type encoding */#define UFS_TYPE_MASK 0x00010000 /* mask for the following */#define UFS_TYPE_UFS1 0x00000000#define UFS_TYPE_UFS2 0x00010000/* fs_inodefmt options */#define UFS_42INODEFMT -1#define UFS_44INODEFMT 2/* * MINFREE gives the minimum acceptable percentage of file system * blocks which may be free. If the freelist drops below this level * only the superuser may continue to allocate blocks. This may * be set to 0 if no reserve of free blocks is deemed necessary, * however throughput drops by fifty percent if the file system * is run at between 95% and 100% full; thus the minimum default * value of fs_minfree is 5%. However, to get good clustering * performance, 10% is a better choice. hence we use 10% as our * default value. With 10% free space, fragmentation is not a * problem, so we choose to optimize for time. */#define UFS_MINFREE 5#define UFS_DEFAULTOPT UFS_OPTTIME/* * Turn file system block numbers into disk block addresses. * This maps file system blocks to device size blocks. */#define ufs_fsbtodb(uspi, b) ((b) << (uspi)->s_fsbtodb)#define ufs_dbtofsb(uspi, b) ((b) >> (uspi)->s_fsbtodb)/* * Cylinder group macros to locate things in cylinder groups. * They calc file system addresses of cylinder group data structures. */#define ufs_cgbase(c) (uspi->s_fpg * (c))#define ufs_cgstart(c) ((uspi)->fs_magic == UFS2_MAGIC ? ufs_cgbase(c) : \ (ufs_cgbase(c) + uspi->s_cgoffset * ((c) & ~uspi->s_cgmask)))#define ufs_cgsblock(c) (ufs_cgstart(c) + uspi->s_sblkno) /* super blk */#define ufs_cgcmin(c) (ufs_cgstart(c) + uspi->s_cblkno) /* cg block */#define ufs_cgimin(c) (ufs_cgstart(c) + uspi->s_iblkno) /* inode blk */#define ufs_cgdmin(c) (ufs_cgstart(c) + uspi->s_dblkno) /* 1st data *//* * Macros for handling inode numbers: * inode number to file system block offset. * inode number to cylinder group number. * inode number to file system block address. */#define ufs_inotocg(x) ((x) / uspi->s_ipg)#define ufs_inotocgoff(x) ((x) % uspi->s_ipg)#define ufs_inotofsba(x) (((u64)ufs_cgimin(ufs_inotocg(x))) + ufs_inotocgoff(x) / uspi->s_inopf)#define ufs_inotofsbo(x) ((x) % uspi->s_inopf)/* * Compute the cylinder and rotational position of a cyl block addr. */#define ufs_cbtocylno(bno) \ ((bno) * uspi->s_nspf / uspi->s_spc)#define ufs_cbtorpos(bno) \ ((((bno) * uspi->s_nspf % uspi->s_spc / uspi->s_nsect \ * uspi->s_trackskew + (bno) * uspi->s_nspf % uspi->s_spc \ % uspi->s_nsect * uspi->s_interleave) % uspi->s_nsect \ * uspi->s_nrpos) / uspi->s_npsect)/* * The following macros optimize certain frequently calculated * quantities by using shifts and masks in place of divisions * modulos and multiplications. */#define ufs_blkoff(loc) ((loc) & uspi->s_qbmask)#define ufs_fragoff(loc) ((loc) & uspi->s_qfmask)#define ufs_lblktosize(blk) ((blk) << uspi->s_bshift)#define ufs_lblkno(loc) ((loc) >> uspi->s_bshift)#define ufs_numfrags(loc) ((loc) >> uspi->s_fshift)#define ufs_blkroundup(size) (((size) + uspi->s_qbmask) & uspi->s_bmask)#define ufs_fragroundup(size) (((size) + uspi->s_qfmask) & uspi->s_fmask)#define ufs_fragstoblks(frags) ((frags) >> uspi->s_fpbshift)#define ufs_blkstofrags(blks) ((blks) << uspi->s_fpbshift)#define ufs_fragnum(fsb) ((fsb) & uspi->s_fpbmask)#define ufs_blknum(fsb) ((fsb) & ~uspi->s_fpbmask)#define UFS_MAXNAMLEN 255#define UFS_MAXMNTLEN 512#define UFS2_MAXMNTLEN 468#define UFS2_MAXVOLLEN 32#define UFS_MAXCSBUFS 31#define UFS_LINK_MAX 32000/*#define UFS2_NOCSPTRS ((128 / sizeof(void *)) - 4)*/#define UFS2_NOCSPTRS 28/* * UFS_DIR_PAD defines the directory entries boundaries * (must be a multiple of 4) */#define UFS_DIR_PAD 4#define UFS_DIR_ROUND (UFS_DIR_PAD - 1)#define UFS_DIR_REC_LEN(name_len) (((name_len) + 1 + 8 + UFS_DIR_ROUND) & ~UFS_DIR_ROUND)struct ufs_timeval { __fs32 tv_sec; __fs32 tv_usec;};struct ufs_dir_entry { __fs32 d_ino; /* inode number of this entry */ __fs16 d_reclen; /* length of this entry */ union { __fs16 d_namlen; /* actual length of d_name */ struct { __u8 d_type; /* file type */ __u8 d_namlen; /* length of string in d_name */ } d_44; } d_u; __u8 d_name[UFS_MAXNAMLEN + 1]; /* file name */};struct ufs_csum { __fs32 cs_ndir; /* number of directories */ __fs32 cs_nbfree; /* number of free blocks */ __fs32 cs_nifree; /* number of free inodes */ __fs32 cs_nffree; /* number of free frags */};struct ufs2_csum_total { __fs64 cs_ndir; /* number of directories */ __fs64 cs_nbfree; /* number of free blocks */ __fs64 cs_nifree; /* number of free inodes */ __fs64 cs_nffree; /* number of free frags */ __fs64 cs_numclusters; /* number of free clusters */ __fs64 cs_spare[3]; /* future expansion */};struct ufs_csum_core { __u64 cs_ndir; /* number of directories */ __u64 cs_nbfree; /* number of free blocks */ __u64 cs_nifree; /* number of free inodes */ __u64 cs_nffree; /* number of free frags */ __u64 cs_numclusters; /* number of free clusters */};/* * File system flags */#define UFS_UNCLEAN 0x01 /* file system not clean at mount (unused) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -