1*0b1e987cSChristoph Hellwig /* SPDX-License-Identifier: GPL-2.0-only */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds * Copyright (c) 2000-2001 Christoph Hellwig.
41cce1701SKrzysztof Błaszkowski * Copyright (c) 2016 Krzysztof Blaszkowski
51da177e4SLinus Torvalds */
61da177e4SLinus Torvalds #ifndef _VXFS_SUPER_H_
71da177e4SLinus Torvalds #define _VXFS_SUPER_H_
81da177e4SLinus Torvalds
91da177e4SLinus Torvalds /*
101da177e4SLinus Torvalds * Veritas filesystem driver - superblock structure.
111da177e4SLinus Torvalds *
121da177e4SLinus Torvalds * This file contains the definition of the disk and core
131da177e4SLinus Torvalds * superblocks of the Veritas Filesystem.
141da177e4SLinus Torvalds */
151da177e4SLinus Torvalds #include <linux/types.h>
161da177e4SLinus Torvalds
171da177e4SLinus Torvalds /*
181da177e4SLinus Torvalds * Superblock magic number (vxfs_super->vs_magic).
191da177e4SLinus Torvalds */
201da177e4SLinus Torvalds #define VXFS_SUPER_MAGIC 0xa501FCF5
211da177e4SLinus Torvalds
221da177e4SLinus Torvalds /*
231da177e4SLinus Torvalds * The root inode.
241da177e4SLinus Torvalds */
251da177e4SLinus Torvalds #define VXFS_ROOT_INO 2
261da177e4SLinus Torvalds
271da177e4SLinus Torvalds /*
281da177e4SLinus Torvalds * Num of entries in free extent array
291da177e4SLinus Torvalds */
301da177e4SLinus Torvalds #define VXFS_NEFREE 32
311da177e4SLinus Torvalds
320d83f7fcSKrzysztof Błaszkowski enum vxfs_byte_order {
330d83f7fcSKrzysztof Błaszkowski VXFS_BO_LE,
340d83f7fcSKrzysztof Błaszkowski VXFS_BO_BE,
350d83f7fcSKrzysztof Błaszkowski };
360d83f7fcSKrzysztof Błaszkowski
370d83f7fcSKrzysztof Błaszkowski typedef __u16 __bitwise __fs16;
380d83f7fcSKrzysztof Błaszkowski typedef __u32 __bitwise __fs32;
390d83f7fcSKrzysztof Błaszkowski typedef __u64 __bitwise __fs64;
401da177e4SLinus Torvalds
411da177e4SLinus Torvalds /*
421da177e4SLinus Torvalds * VxFS superblock (disk).
431da177e4SLinus Torvalds */
441da177e4SLinus Torvalds struct vxfs_sb {
451da177e4SLinus Torvalds /*
461da177e4SLinus Torvalds * Readonly fields for the version 1 superblock.
471da177e4SLinus Torvalds *
481da177e4SLinus Torvalds * Lots of this fields are no more used by version 2
491da177e4SLinus Torvalds * and never filesystems.
501da177e4SLinus Torvalds */
510d83f7fcSKrzysztof Błaszkowski __fs32 vs_magic; /* Magic number */
520d83f7fcSKrzysztof Błaszkowski __fs32 vs_version; /* VxFS version */
530d83f7fcSKrzysztof Błaszkowski __fs32 vs_ctime; /* create time - secs */
540d83f7fcSKrzysztof Błaszkowski __fs32 vs_cutime; /* create time - usecs */
550d83f7fcSKrzysztof Błaszkowski __fs32 __unused1; /* unused */
560d83f7fcSKrzysztof Błaszkowski __fs32 __unused2; /* unused */
570d83f7fcSKrzysztof Błaszkowski __fs32 vs_old_logstart; /* obsolete */
580d83f7fcSKrzysztof Błaszkowski __fs32 vs_old_logend; /* obsolete */
590d83f7fcSKrzysztof Błaszkowski __fs32 vs_bsize; /* block size */
600d83f7fcSKrzysztof Błaszkowski __fs32 vs_size; /* number of blocks */
610d83f7fcSKrzysztof Błaszkowski __fs32 vs_dsize; /* number of data blocks */
620d83f7fcSKrzysztof Błaszkowski __fs32 vs_old_ninode; /* obsolete */
630d83f7fcSKrzysztof Błaszkowski __fs32 vs_old_nau; /* obsolete */
640d83f7fcSKrzysztof Błaszkowski __fs32 __unused3; /* unused */
650d83f7fcSKrzysztof Błaszkowski __fs32 vs_old_defiextsize; /* obsolete */
660d83f7fcSKrzysztof Błaszkowski __fs32 vs_old_ilbsize; /* obsolete */
670d83f7fcSKrzysztof Błaszkowski __fs32 vs_immedlen; /* size of immediate data area */
680d83f7fcSKrzysztof Błaszkowski __fs32 vs_ndaddr; /* number of direct extentes */
690d83f7fcSKrzysztof Błaszkowski __fs32 vs_firstau; /* address of first AU */
700d83f7fcSKrzysztof Błaszkowski __fs32 vs_emap; /* offset of extent map in AU */
710d83f7fcSKrzysztof Błaszkowski __fs32 vs_imap; /* offset of inode map in AU */
720d83f7fcSKrzysztof Błaszkowski __fs32 vs_iextop; /* offset of ExtOp. map in AU */
730d83f7fcSKrzysztof Błaszkowski __fs32 vs_istart; /* offset of inode list in AU */
740d83f7fcSKrzysztof Błaszkowski __fs32 vs_bstart; /* offset of fdblock in AU */
750d83f7fcSKrzysztof Błaszkowski __fs32 vs_femap; /* aufirst + emap */
760d83f7fcSKrzysztof Błaszkowski __fs32 vs_fimap; /* aufirst + imap */
770d83f7fcSKrzysztof Błaszkowski __fs32 vs_fiextop; /* aufirst + iextop */
780d83f7fcSKrzysztof Błaszkowski __fs32 vs_fistart; /* aufirst + istart */
790d83f7fcSKrzysztof Błaszkowski __fs32 vs_fbstart; /* aufirst + bstart */
800d83f7fcSKrzysztof Błaszkowski __fs32 vs_nindir; /* number of entries in indir */
810d83f7fcSKrzysztof Błaszkowski __fs32 vs_aulen; /* length of AU in blocks */
820d83f7fcSKrzysztof Błaszkowski __fs32 vs_auimlen; /* length of imap in blocks */
830d83f7fcSKrzysztof Błaszkowski __fs32 vs_auemlen; /* length of emap in blocks */
840d83f7fcSKrzysztof Błaszkowski __fs32 vs_auilen; /* length of ilist in blocks */
850d83f7fcSKrzysztof Błaszkowski __fs32 vs_aupad; /* length of pad in blocks */
860d83f7fcSKrzysztof Błaszkowski __fs32 vs_aublocks; /* data blocks in AU */
870d83f7fcSKrzysztof Błaszkowski __fs32 vs_maxtier; /* log base 2 of aublocks */
880d83f7fcSKrzysztof Błaszkowski __fs32 vs_inopb; /* number of inodes per blk */
890d83f7fcSKrzysztof Błaszkowski __fs32 vs_old_inopau; /* obsolete */
900d83f7fcSKrzysztof Błaszkowski __fs32 vs_old_inopilb; /* obsolete */
910d83f7fcSKrzysztof Błaszkowski __fs32 vs_old_ndiripau; /* obsolete */
920d83f7fcSKrzysztof Błaszkowski __fs32 vs_iaddrlen; /* size of indirect addr ext. */
930d83f7fcSKrzysztof Błaszkowski __fs32 vs_bshift; /* log base 2 of bsize */
940d83f7fcSKrzysztof Błaszkowski __fs32 vs_inoshift; /* log base 2 of inobp */
950d83f7fcSKrzysztof Błaszkowski __fs32 vs_bmask; /* ~( bsize - 1 ) */
960d83f7fcSKrzysztof Błaszkowski __fs32 vs_boffmask; /* bsize - 1 */
970d83f7fcSKrzysztof Błaszkowski __fs32 vs_old_inomask; /* old_inopilb - 1 */
980d83f7fcSKrzysztof Błaszkowski __fs32 vs_checksum; /* checksum of V1 data */
991da177e4SLinus Torvalds
1001da177e4SLinus Torvalds /*
1011da177e4SLinus Torvalds * Version 1, writable
1021da177e4SLinus Torvalds */
1030d83f7fcSKrzysztof Błaszkowski __fs32 vs_free; /* number of free blocks */
1040d83f7fcSKrzysztof Błaszkowski __fs32 vs_ifree; /* number of free inodes */
1050d83f7fcSKrzysztof Błaszkowski __fs32 vs_efree[VXFS_NEFREE]; /* number of free extents by size */
1060d83f7fcSKrzysztof Błaszkowski __fs32 vs_flags; /* flags ?!? */
1070d83f7fcSKrzysztof Błaszkowski __u8 vs_mod; /* filesystem has been changed */
1080d83f7fcSKrzysztof Błaszkowski __u8 vs_clean; /* clean FS */
1090d83f7fcSKrzysztof Błaszkowski __fs16 __unused4; /* unused */
1100d83f7fcSKrzysztof Błaszkowski __fs32 vs_firstlogid; /* mount time log ID */
1110d83f7fcSKrzysztof Błaszkowski __fs32 vs_wtime; /* last time written - sec */
1120d83f7fcSKrzysztof Błaszkowski __fs32 vs_wutime; /* last time written - usec */
1130d83f7fcSKrzysztof Błaszkowski __u8 vs_fname[6]; /* FS name */
1140d83f7fcSKrzysztof Błaszkowski __u8 vs_fpack[6]; /* FS pack name */
1150d83f7fcSKrzysztof Błaszkowski __fs32 vs_logversion; /* log format version */
1160d83f7fcSKrzysztof Błaszkowski __u32 __unused5; /* unused */
1171da177e4SLinus Torvalds
1181da177e4SLinus Torvalds /*
1191da177e4SLinus Torvalds * Version 2, Read-only
1201da177e4SLinus Torvalds */
1210d83f7fcSKrzysztof Błaszkowski __fs32 vs_oltext[2]; /* OLT extent and replica */
1220d83f7fcSKrzysztof Błaszkowski __fs32 vs_oltsize; /* OLT extent size */
1230d83f7fcSKrzysztof Błaszkowski __fs32 vs_iauimlen; /* size of inode map */
1240d83f7fcSKrzysztof Błaszkowski __fs32 vs_iausize; /* size of IAU in blocks */
1250d83f7fcSKrzysztof Błaszkowski __fs32 vs_dinosize; /* size of inode in bytes */
1260d83f7fcSKrzysztof Błaszkowski __fs32 vs_old_dniaddr; /* indir levels per inode */
1270d83f7fcSKrzysztof Błaszkowski __fs32 vs_checksum2; /* checksum of V2 RO */
1281da177e4SLinus Torvalds
1291da177e4SLinus Torvalds /*
1301da177e4SLinus Torvalds * Actually much more...
1311da177e4SLinus Torvalds */
1321da177e4SLinus Torvalds };
1331da177e4SLinus Torvalds
1341da177e4SLinus Torvalds
1351da177e4SLinus Torvalds /*
1361da177e4SLinus Torvalds * In core superblock filesystem private data for VxFS.
1371da177e4SLinus Torvalds */
1381da177e4SLinus Torvalds struct vxfs_sb_info {
139552c0348SCliff Wickman struct vxfs_sb *vsi_raw; /* raw (on disk) superblock */
1401da177e4SLinus Torvalds struct buffer_head *vsi_bp; /* buffer for raw superblock*/
1411da177e4SLinus Torvalds struct inode *vsi_fship; /* fileset header inode */
1421da177e4SLinus Torvalds struct inode *vsi_ilist; /* inode list inode */
143552c0348SCliff Wickman struct inode *vsi_stilist; /* structural inode list inode */
1441da177e4SLinus Torvalds u_long vsi_iext; /* initial inode list */
1451da177e4SLinus Torvalds ino_t vsi_fshino; /* fileset header inode */
1461da177e4SLinus Torvalds daddr_t vsi_oltext; /* OLT extent */
1471da177e4SLinus Torvalds daddr_t vsi_oltsize; /* OLT size */
1480d83f7fcSKrzysztof Błaszkowski enum vxfs_byte_order byte_order;
1491da177e4SLinus Torvalds };
1501da177e4SLinus Torvalds
fs16_to_cpu(struct vxfs_sb_info * sbi,__fs16 a)1510d83f7fcSKrzysztof Błaszkowski static inline u16 fs16_to_cpu(struct vxfs_sb_info *sbi, __fs16 a)
1520d83f7fcSKrzysztof Błaszkowski {
1530d83f7fcSKrzysztof Błaszkowski if (sbi->byte_order == VXFS_BO_BE)
1540d83f7fcSKrzysztof Błaszkowski return be16_to_cpu((__force __be16)a);
1550d83f7fcSKrzysztof Błaszkowski else
1560d83f7fcSKrzysztof Błaszkowski return le16_to_cpu((__force __le16)a);
1570d83f7fcSKrzysztof Błaszkowski }
1580d83f7fcSKrzysztof Błaszkowski
fs32_to_cpu(struct vxfs_sb_info * sbi,__fs32 a)1590d83f7fcSKrzysztof Błaszkowski static inline u32 fs32_to_cpu(struct vxfs_sb_info *sbi, __fs32 a)
1600d83f7fcSKrzysztof Błaszkowski {
1610d83f7fcSKrzysztof Błaszkowski if (sbi->byte_order == VXFS_BO_BE)
1620d83f7fcSKrzysztof Błaszkowski return be32_to_cpu((__force __be32)a);
1630d83f7fcSKrzysztof Błaszkowski else
1640d83f7fcSKrzysztof Błaszkowski return le32_to_cpu((__force __le32)a);
1650d83f7fcSKrzysztof Błaszkowski }
1660d83f7fcSKrzysztof Błaszkowski
fs64_to_cpu(struct vxfs_sb_info * sbi,__fs64 a)1670d83f7fcSKrzysztof Błaszkowski static inline u64 fs64_to_cpu(struct vxfs_sb_info *sbi, __fs64 a)
1680d83f7fcSKrzysztof Błaszkowski {
1690d83f7fcSKrzysztof Błaszkowski if (sbi->byte_order == VXFS_BO_BE)
1700d83f7fcSKrzysztof Błaszkowski return be64_to_cpu((__force __be64)a);
1710d83f7fcSKrzysztof Błaszkowski else
1720d83f7fcSKrzysztof Błaszkowski return le64_to_cpu((__force __le64)a);
1730d83f7fcSKrzysztof Błaszkowski }
1741da177e4SLinus Torvalds
1751da177e4SLinus Torvalds /*
1761da177e4SLinus Torvalds * File modes. File types above 0xf000 are vxfs internal only, they should
1771da177e4SLinus Torvalds * not be passed back to higher levels of the system. vxfs file types must
1781da177e4SLinus Torvalds * never have one of the regular file type bits set.
1791da177e4SLinus Torvalds */
1801da177e4SLinus Torvalds enum vxfs_mode {
1811da177e4SLinus Torvalds VXFS_ISUID = 0x00000800, /* setuid */
1821da177e4SLinus Torvalds VXFS_ISGID = 0x00000400, /* setgid */
1831da177e4SLinus Torvalds VXFS_ISVTX = 0x00000200, /* sticky bit */
1841da177e4SLinus Torvalds VXFS_IREAD = 0x00000100, /* read */
1851da177e4SLinus Torvalds VXFS_IWRITE = 0x00000080, /* write */
1861da177e4SLinus Torvalds VXFS_IEXEC = 0x00000040, /* exec */
1871da177e4SLinus Torvalds
1881da177e4SLinus Torvalds VXFS_IFIFO = 0x00001000, /* Named pipe */
1891da177e4SLinus Torvalds VXFS_IFCHR = 0x00002000, /* Character device */
1901da177e4SLinus Torvalds VXFS_IFDIR = 0x00004000, /* Directory */
1911da177e4SLinus Torvalds VXFS_IFNAM = 0x00005000, /* Xenix device ?? */
1921da177e4SLinus Torvalds VXFS_IFBLK = 0x00006000, /* Block device */
1931da177e4SLinus Torvalds VXFS_IFREG = 0x00008000, /* Regular file */
1941da177e4SLinus Torvalds VXFS_IFCMP = 0x00009000, /* Compressed file ?!? */
1951da177e4SLinus Torvalds VXFS_IFLNK = 0x0000a000, /* Symlink */
1961da177e4SLinus Torvalds VXFS_IFSOC = 0x0000c000, /* Socket */
1971da177e4SLinus Torvalds
1981da177e4SLinus Torvalds /* VxFS internal */
1991da177e4SLinus Torvalds VXFS_IFFSH = 0x10000000, /* Fileset header */
2001da177e4SLinus Torvalds VXFS_IFILT = 0x20000000, /* Inode list */
2011da177e4SLinus Torvalds VXFS_IFIAU = 0x30000000, /* Inode allocation unit */
2021da177e4SLinus Torvalds VXFS_IFCUT = 0x40000000, /* Current usage table */
2031da177e4SLinus Torvalds VXFS_IFATT = 0x50000000, /* Attr. inode */
2041da177e4SLinus Torvalds VXFS_IFLCT = 0x60000000, /* Link count table */
2051da177e4SLinus Torvalds VXFS_IFIAT = 0x70000000, /* Indirect attribute file */
2061da177e4SLinus Torvalds VXFS_IFEMR = 0x80000000, /* Extent map reorg file */
2071da177e4SLinus Torvalds VXFS_IFQUO = 0x90000000, /* BSD quota file */
2081da177e4SLinus Torvalds VXFS_IFPTI = 0xa0000000, /* "Pass through" inode */
2091da177e4SLinus Torvalds VXFS_IFLAB = 0x11000000, /* Device label file */
2101da177e4SLinus Torvalds VXFS_IFOLT = 0x12000000, /* OLT file */
2111da177e4SLinus Torvalds VXFS_IFLOG = 0x13000000, /* Log file */
2121da177e4SLinus Torvalds VXFS_IFEMP = 0x14000000, /* Extent map file */
2131da177e4SLinus Torvalds VXFS_IFEAU = 0x15000000, /* Extent AU file */
2141da177e4SLinus Torvalds VXFS_IFAUS = 0x16000000, /* Extent AU summary file */
2151da177e4SLinus Torvalds VXFS_IFDEV = 0x17000000, /* Device config file */
2161da177e4SLinus Torvalds
2171da177e4SLinus Torvalds };
2181da177e4SLinus Torvalds
2191da177e4SLinus Torvalds #define VXFS_TYPE_MASK 0xfffff000
2201da177e4SLinus Torvalds
2211da177e4SLinus Torvalds #define VXFS_IS_TYPE(ip,type) (((ip)->vii_mode & VXFS_TYPE_MASK) == (type))
2221da177e4SLinus Torvalds #define VXFS_ISFIFO(x) VXFS_IS_TYPE((x),VXFS_IFIFO)
2231da177e4SLinus Torvalds #define VXFS_ISCHR(x) VXFS_IS_TYPE((x),VXFS_IFCHR)
2241da177e4SLinus Torvalds #define VXFS_ISDIR(x) VXFS_IS_TYPE((x),VXFS_IFDIR)
2251da177e4SLinus Torvalds #define VXFS_ISNAM(x) VXFS_IS_TYPE((x),VXFS_IFNAM)
2261da177e4SLinus Torvalds #define VXFS_ISBLK(x) VXFS_IS_TYPE((x),VXFS_IFBLK)
2271da177e4SLinus Torvalds #define VXFS_ISLNK(x) VXFS_IS_TYPE((x),VXFS_IFLNK)
2281da177e4SLinus Torvalds #define VXFS_ISREG(x) VXFS_IS_TYPE((x),VXFS_IFREG)
2291da177e4SLinus Torvalds #define VXFS_ISCMP(x) VXFS_IS_TYPE((x),VXFS_IFCMP)
2301da177e4SLinus Torvalds #define VXFS_ISSOC(x) VXFS_IS_TYPE((x),VXFS_IFSOC)
2311da177e4SLinus Torvalds
2321da177e4SLinus Torvalds #define VXFS_ISFSH(x) VXFS_IS_TYPE((x),VXFS_IFFSH)
2331da177e4SLinus Torvalds #define VXFS_ISILT(x) VXFS_IS_TYPE((x),VXFS_IFILT)
2341da177e4SLinus Torvalds
2351da177e4SLinus Torvalds /*
2361da177e4SLinus Torvalds * Inmode organisation types.
2371da177e4SLinus Torvalds */
2381da177e4SLinus Torvalds enum {
2391da177e4SLinus Torvalds VXFS_ORG_NONE = 0, /* Inode has *no* format ?!? */
2401da177e4SLinus Torvalds VXFS_ORG_EXT4 = 1, /* Ext4 */
2411da177e4SLinus Torvalds VXFS_ORG_IMMED = 2, /* All data stored in inode */
2421da177e4SLinus Torvalds VXFS_ORG_TYPED = 3, /* Typed extents */
2431da177e4SLinus Torvalds };
2441da177e4SLinus Torvalds
2451da177e4SLinus Torvalds #define VXFS_IS_ORG(ip,org) ((ip)->vii_orgtype == (org))
2461da177e4SLinus Torvalds #define VXFS_ISNONE(ip) VXFS_IS_ORG((ip), VXFS_ORG_NONE)
2471da177e4SLinus Torvalds #define VXFS_ISEXT4(ip) VXFS_IS_ORG((ip), VXFS_ORG_EXT4)
2481da177e4SLinus Torvalds #define VXFS_ISIMMED(ip) VXFS_IS_ORG((ip), VXFS_ORG_IMMED)
2491da177e4SLinus Torvalds #define VXFS_ISTYPED(ip) VXFS_IS_ORG((ip), VXFS_ORG_TYPED)
2501da177e4SLinus Torvalds
2511da177e4SLinus Torvalds /*
2521da177e4SLinus Torvalds * Get filesystem private data from VFS superblock.
2531da177e4SLinus Torvalds */
2541da177e4SLinus Torvalds #define VXFS_SBI(sbp) \
2551da177e4SLinus Torvalds ((struct vxfs_sb_info *)(sbp)->s_fs_info)
2561da177e4SLinus Torvalds
2571da177e4SLinus Torvalds #endif /* _VXFS_SUPER_H_ */
258