Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (c) 2000-2001 Christoph Hellwig.
0004  * Copyright (c) 2016 Krzysztof Blaszkowski
0005  */
0006 #ifndef _VXFS_SUPER_H_
0007 #define _VXFS_SUPER_H_
0008 
0009 /*
0010  * Veritas filesystem driver - superblock structure.
0011  *
0012  * This file contains the definition of the disk and core
0013  * superblocks of the Veritas Filesystem.
0014  */
0015 #include <linux/types.h>
0016 
0017 /*
0018  * Superblock magic number (vxfs_super->vs_magic).
0019  */
0020 #define VXFS_SUPER_MAGIC    0xa501FCF5
0021 
0022 /*
0023  * The root inode.
0024  */
0025 #define VXFS_ROOT_INO       2
0026 
0027 /*
0028  * Num of entries in free extent array
0029  */
0030 #define VXFS_NEFREE     32
0031 
0032 enum vxfs_byte_order {
0033     VXFS_BO_LE,
0034     VXFS_BO_BE,
0035 };
0036 
0037 typedef __u16 __bitwise __fs16;
0038 typedef __u32 __bitwise __fs32;
0039 typedef __u64 __bitwise __fs64;
0040 
0041 /*
0042  * VxFS superblock (disk).
0043  */
0044 struct vxfs_sb {
0045     /*
0046      * Readonly fields for the version 1 superblock.
0047      *
0048      * Lots of this fields are no more used by version 2
0049      * and never filesystems.
0050      */
0051     __fs32      vs_magic;       /* Magic number */
0052     __fs32      vs_version;     /* VxFS version */
0053     __fs32      vs_ctime;       /* create time - secs */
0054     __fs32      vs_cutime;      /* create time - usecs */
0055     __fs32      __unused1;      /* unused */
0056     __fs32      __unused2;      /* unused */
0057     __fs32      vs_old_logstart;    /* obsolete */
0058     __fs32      vs_old_logend;      /* obsolete */
0059     __fs32      vs_bsize;       /* block size */
0060     __fs32      vs_size;        /* number of blocks */
0061     __fs32      vs_dsize;       /* number of data blocks */
0062     __fs32      vs_old_ninode;      /* obsolete */
0063     __fs32      vs_old_nau;     /* obsolete */
0064     __fs32      __unused3;      /* unused */
0065     __fs32      vs_old_defiextsize; /* obsolete */
0066     __fs32      vs_old_ilbsize;     /* obsolete */
0067     __fs32      vs_immedlen;        /* size of immediate data area */
0068     __fs32      vs_ndaddr;      /* number of direct extentes */
0069     __fs32      vs_firstau;     /* address of first AU */
0070     __fs32      vs_emap;        /* offset of extent map in AU */
0071     __fs32      vs_imap;        /* offset of inode map in AU */
0072     __fs32      vs_iextop;      /* offset of ExtOp. map in AU */
0073     __fs32      vs_istart;      /* offset of inode list in AU */
0074     __fs32      vs_bstart;      /* offset of fdblock in AU */
0075     __fs32      vs_femap;       /* aufirst + emap */
0076     __fs32      vs_fimap;       /* aufirst + imap */
0077     __fs32      vs_fiextop;     /* aufirst + iextop */
0078     __fs32      vs_fistart;     /* aufirst + istart */
0079     __fs32      vs_fbstart;     /* aufirst + bstart */
0080     __fs32      vs_nindir;      /* number of entries in indir */
0081     __fs32      vs_aulen;       /* length of AU in blocks */
0082     __fs32      vs_auimlen;     /* length of imap in blocks */
0083     __fs32      vs_auemlen;     /* length of emap in blocks */
0084     __fs32      vs_auilen;      /* length of ilist in blocks */
0085     __fs32      vs_aupad;       /* length of pad in blocks */
0086     __fs32      vs_aublocks;        /* data blocks in AU */
0087     __fs32      vs_maxtier;     /* log base 2 of aublocks */
0088     __fs32      vs_inopb;       /* number of inodes per blk */
0089     __fs32      vs_old_inopau;      /* obsolete */
0090     __fs32      vs_old_inopilb;     /* obsolete */
0091     __fs32      vs_old_ndiripau;    /* obsolete */
0092     __fs32      vs_iaddrlen;        /* size of indirect addr ext. */
0093     __fs32      vs_bshift;      /* log base 2 of bsize */
0094     __fs32      vs_inoshift;        /* log base 2 of inobp */
0095     __fs32      vs_bmask;       /* ~( bsize - 1 ) */
0096     __fs32      vs_boffmask;        /* bsize - 1 */
0097     __fs32      vs_old_inomask;     /* old_inopilb - 1 */
0098     __fs32      vs_checksum;        /* checksum of V1 data */
0099     
0100     /*
0101      * Version 1, writable
0102      */
0103     __fs32      vs_free;        /* number of free blocks */
0104     __fs32      vs_ifree;       /* number of free inodes */
0105     __fs32      vs_efree[VXFS_NEFREE];  /* number of free extents by size */
0106     __fs32      vs_flags;       /* flags ?!? */
0107     __u8        vs_mod;         /* filesystem has been changed */
0108     __u8        vs_clean;       /* clean FS */
0109     __fs16      __unused4;      /* unused */
0110     __fs32      vs_firstlogid;      /* mount time log ID */
0111     __fs32      vs_wtime;       /* last time written - sec */
0112     __fs32      vs_wutime;      /* last time written - usec */
0113     __u8        vs_fname[6];        /* FS name */
0114     __u8        vs_fpack[6];        /* FS pack name */
0115     __fs32      vs_logversion;      /* log format version */
0116     __u32       __unused5;      /* unused */
0117     
0118     /*
0119      * Version 2, Read-only
0120      */
0121     __fs32      vs_oltext[2];       /* OLT extent and replica */
0122     __fs32      vs_oltsize;     /* OLT extent size */
0123     __fs32      vs_iauimlen;        /* size of inode map */
0124     __fs32      vs_iausize;     /* size of IAU in blocks */
0125     __fs32      vs_dinosize;        /* size of inode in bytes */
0126     __fs32      vs_old_dniaddr;     /* indir levels per inode */
0127     __fs32      vs_checksum2;       /* checksum of V2 RO */
0128 
0129     /*
0130      * Actually much more...
0131      */
0132 };
0133 
0134 
0135 /*
0136  * In core superblock filesystem private data for VxFS.
0137  */
0138 struct vxfs_sb_info {
0139     struct vxfs_sb      *vsi_raw;   /* raw (on disk) superblock */
0140     struct buffer_head  *vsi_bp;    /* buffer for raw superblock*/
0141     struct inode        *vsi_fship; /* fileset header inode */
0142     struct inode        *vsi_ilist; /* inode list inode */
0143     struct inode        *vsi_stilist;   /* structural inode list inode */
0144     u_long          vsi_iext;   /* initial inode list */
0145     ino_t           vsi_fshino; /* fileset header inode */
0146     daddr_t         vsi_oltext; /* OLT extent */
0147     daddr_t         vsi_oltsize;    /* OLT size */
0148     enum vxfs_byte_order    byte_order;
0149 };
0150 
0151 static inline u16 fs16_to_cpu(struct vxfs_sb_info *sbi, __fs16 a)
0152 {
0153     if (sbi->byte_order == VXFS_BO_BE)
0154         return be16_to_cpu((__force __be16)a);
0155     else
0156         return le16_to_cpu((__force __le16)a);
0157 }
0158 
0159 static inline u32 fs32_to_cpu(struct vxfs_sb_info *sbi, __fs32 a)
0160 {
0161     if (sbi->byte_order == VXFS_BO_BE)
0162         return be32_to_cpu((__force __be32)a);
0163     else
0164         return le32_to_cpu((__force __le32)a);
0165 }
0166 
0167 static inline u64 fs64_to_cpu(struct vxfs_sb_info *sbi, __fs64 a)
0168 {
0169     if (sbi->byte_order == VXFS_BO_BE)
0170         return be64_to_cpu((__force __be64)a);
0171     else
0172         return le64_to_cpu((__force __le64)a);
0173 }
0174 
0175 /*
0176  * File modes.  File types above 0xf000 are vxfs internal only, they should
0177  * not be passed back to higher levels of the system.  vxfs file types must
0178  * never have one of the regular file type bits set.
0179  */
0180 enum vxfs_mode {
0181     VXFS_ISUID = 0x00000800,    /* setuid */
0182     VXFS_ISGID = 0x00000400,    /* setgid */
0183     VXFS_ISVTX = 0x00000200,    /* sticky bit */
0184     VXFS_IREAD = 0x00000100,    /* read */
0185     VXFS_IWRITE = 0x00000080,   /* write */
0186     VXFS_IEXEC = 0x00000040,    /* exec */
0187 
0188     VXFS_IFIFO = 0x00001000,    /* Named pipe */
0189     VXFS_IFCHR = 0x00002000,    /* Character device */
0190     VXFS_IFDIR = 0x00004000,    /* Directory */
0191     VXFS_IFNAM = 0x00005000,    /* Xenix device ?? */
0192     VXFS_IFBLK = 0x00006000,    /* Block device */
0193     VXFS_IFREG = 0x00008000,    /* Regular file */
0194     VXFS_IFCMP = 0x00009000,    /* Compressed file ?!? */
0195     VXFS_IFLNK = 0x0000a000,    /* Symlink */
0196     VXFS_IFSOC = 0x0000c000,    /* Socket */
0197 
0198     /* VxFS internal */
0199     VXFS_IFFSH = 0x10000000,    /* Fileset header */
0200     VXFS_IFILT = 0x20000000,    /* Inode list */
0201     VXFS_IFIAU = 0x30000000,    /* Inode allocation unit */
0202     VXFS_IFCUT = 0x40000000,    /* Current usage table */
0203     VXFS_IFATT = 0x50000000,    /* Attr. inode */
0204     VXFS_IFLCT = 0x60000000,    /* Link count table */
0205     VXFS_IFIAT = 0x70000000,    /* Indirect attribute file */
0206     VXFS_IFEMR = 0x80000000,    /* Extent map reorg file */
0207     VXFS_IFQUO = 0x90000000,    /* BSD quota file */
0208     VXFS_IFPTI = 0xa0000000,    /* "Pass through" inode */
0209     VXFS_IFLAB = 0x11000000,    /* Device label file */
0210     VXFS_IFOLT = 0x12000000,    /* OLT file */
0211     VXFS_IFLOG = 0x13000000,    /* Log file */
0212     VXFS_IFEMP = 0x14000000,    /* Extent map file */
0213     VXFS_IFEAU = 0x15000000,    /* Extent AU file */
0214     VXFS_IFAUS = 0x16000000,    /* Extent AU summary file */
0215     VXFS_IFDEV = 0x17000000,    /* Device config file */
0216 
0217 };
0218 
0219 #define VXFS_TYPE_MASK      0xfffff000
0220 
0221 #define VXFS_IS_TYPE(ip,type)   (((ip)->vii_mode & VXFS_TYPE_MASK) == (type))
0222 #define VXFS_ISFIFO(x)      VXFS_IS_TYPE((x),VXFS_IFIFO)
0223 #define VXFS_ISCHR(x)       VXFS_IS_TYPE((x),VXFS_IFCHR)
0224 #define VXFS_ISDIR(x)       VXFS_IS_TYPE((x),VXFS_IFDIR)
0225 #define VXFS_ISNAM(x)       VXFS_IS_TYPE((x),VXFS_IFNAM)
0226 #define VXFS_ISBLK(x)       VXFS_IS_TYPE((x),VXFS_IFBLK)
0227 #define VXFS_ISLNK(x)       VXFS_IS_TYPE((x),VXFS_IFLNK)
0228 #define VXFS_ISREG(x)       VXFS_IS_TYPE((x),VXFS_IFREG)
0229 #define VXFS_ISCMP(x)       VXFS_IS_TYPE((x),VXFS_IFCMP)
0230 #define VXFS_ISSOC(x)       VXFS_IS_TYPE((x),VXFS_IFSOC)
0231 
0232 #define VXFS_ISFSH(x)       VXFS_IS_TYPE((x),VXFS_IFFSH)
0233 #define VXFS_ISILT(x)       VXFS_IS_TYPE((x),VXFS_IFILT)
0234 
0235 /*
0236  * Inmode organisation types.
0237  */
0238 enum {
0239     VXFS_ORG_NONE   = 0,    /* Inode has *no* format ?!? */
0240     VXFS_ORG_EXT4   = 1,    /* Ext4 */
0241     VXFS_ORG_IMMED  = 2,    /* All data stored in inode */
0242     VXFS_ORG_TYPED  = 3,    /* Typed extents */
0243 };
0244 
0245 #define VXFS_IS_ORG(ip,org) ((ip)->vii_orgtype == (org))
0246 #define VXFS_ISNONE(ip)     VXFS_IS_ORG((ip), VXFS_ORG_NONE)
0247 #define VXFS_ISEXT4(ip)     VXFS_IS_ORG((ip), VXFS_ORG_EXT4)
0248 #define VXFS_ISIMMED(ip)    VXFS_IS_ORG((ip), VXFS_ORG_IMMED)
0249 #define VXFS_ISTYPED(ip)    VXFS_IS_ORG((ip), VXFS_ORG_TYPED)
0250 
0251 /*
0252  * Get filesystem private data from VFS superblock.
0253  */
0254 #define VXFS_SBI(sbp) \
0255     ((struct vxfs_sb_info *)(sbp)->s_fs_info)
0256 
0257 #endif /* _VXFS_SUPER_H_ */