cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sysv.h (7758B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _SYSV_H
      3#define _SYSV_H
      4
      5#include <linux/buffer_head.h>
      6
      7typedef __u16 __bitwise __fs16;
      8typedef __u32 __bitwise __fs32;
      9
     10#include <linux/sysv_fs.h>
     11
     12/*
     13 * SystemV/V7/Coherent super-block data in memory
     14 *
     15 * The SystemV/V7/Coherent superblock contains dynamic data (it gets modified
     16 * while the system is running). This is in contrast to the Minix and Berkeley
     17 * filesystems (where the superblock is never modified). This affects the
     18 * sync() operation: we must keep the superblock in a disk buffer and use this
     19 * one as our "working copy".
     20 */
     21
     22struct sysv_sb_info {
     23	struct super_block *s_sb;	/* VFS superblock */
     24	int	       s_type;		/* file system type: FSTYPE_{XENIX|SYSV|COH} */
     25	char	       s_bytesex;	/* bytesex (le/be/pdp) */
     26	unsigned int   s_inodes_per_block;	/* number of inodes per block */
     27	unsigned int   s_inodes_per_block_1;	/* inodes_per_block - 1 */
     28	unsigned int   s_inodes_per_block_bits;	/* log2(inodes_per_block) */
     29	unsigned int   s_ind_per_block;		/* number of indirections per block */
     30	unsigned int   s_ind_per_block_bits;	/* log2(ind_per_block) */
     31	unsigned int   s_ind_per_block_2;	/* ind_per_block ^ 2 */
     32	unsigned int   s_toobig_block;		/* 10 + ipb + ipb^2 + ipb^3 */
     33	unsigned int   s_block_base;	/* physical block number of block 0 */
     34	unsigned short s_fic_size;	/* free inode cache size, NICINOD */
     35	unsigned short s_flc_size;	/* free block list chunk size, NICFREE */
     36	/* The superblock is kept in one or two disk buffers: */
     37	struct buffer_head *s_bh1;
     38	struct buffer_head *s_bh2;
     39	/* These are pointers into the disk buffer, to compensate for
     40	   different superblock layout. */
     41	char *         s_sbd1;		/* entire superblock data, for part 1 */
     42	char *         s_sbd2;		/* entire superblock data, for part 2 */
     43	__fs16         *s_sb_fic_count;	/* pointer to s_sbd->s_ninode */
     44        sysv_ino_t     *s_sb_fic_inodes; /* pointer to s_sbd->s_inode */
     45	__fs16         *s_sb_total_free_inodes; /* pointer to s_sbd->s_tinode */
     46	__fs16         *s_bcache_count;	/* pointer to s_sbd->s_nfree */
     47	sysv_zone_t    *s_bcache;	/* pointer to s_sbd->s_free */
     48	__fs32         *s_free_blocks;	/* pointer to s_sbd->s_tfree */
     49	__fs32         *s_sb_time;	/* pointer to s_sbd->s_time */
     50	__fs32         *s_sb_state;	/* pointer to s_sbd->s_state, only FSTYPE_SYSV */
     51	/* We keep those superblock entities that don't change here;
     52	   this saves us an indirection and perhaps a conversion. */
     53	u32            s_firstinodezone; /* index of first inode zone */
     54	u32            s_firstdatazone;	/* same as s_sbd->s_isize */
     55	u32            s_ninodes;	/* total number of inodes */
     56	u32            s_ndatazones;	/* total number of data zones */
     57	u32            s_nzones;	/* same as s_sbd->s_fsize */
     58	u16	       s_namelen;       /* max length of dir entry */
     59	int	       s_forced_ro;
     60	struct mutex s_lock;
     61};
     62
     63/*
     64 * SystemV/V7/Coherent FS inode data in memory
     65 */
     66struct sysv_inode_info {
     67	__fs32		i_data[13];
     68	u32		i_dir_start_lookup;
     69	struct inode	vfs_inode;
     70};
     71
     72
     73static inline struct sysv_inode_info *SYSV_I(struct inode *inode)
     74{
     75	return container_of(inode, struct sysv_inode_info, vfs_inode);
     76}
     77
     78static inline struct sysv_sb_info *SYSV_SB(struct super_block *sb)
     79{
     80	return sb->s_fs_info;
     81}
     82
     83
     84/* identify the FS in memory */
     85enum {
     86	FSTYPE_NONE = 0,
     87	FSTYPE_XENIX,
     88	FSTYPE_SYSV4,
     89	FSTYPE_SYSV2,
     90	FSTYPE_COH,
     91	FSTYPE_V7,
     92	FSTYPE_AFS,
     93	FSTYPE_END,
     94};
     95
     96#define SYSV_MAGIC_BASE		0x012FF7B3
     97
     98#define XENIX_SUPER_MAGIC	(SYSV_MAGIC_BASE+FSTYPE_XENIX)
     99#define SYSV4_SUPER_MAGIC	(SYSV_MAGIC_BASE+FSTYPE_SYSV4)
    100#define SYSV2_SUPER_MAGIC	(SYSV_MAGIC_BASE+FSTYPE_SYSV2)
    101#define COH_SUPER_MAGIC		(SYSV_MAGIC_BASE+FSTYPE_COH)
    102
    103
    104/* Admissible values for i_nlink: 0.._LINK_MAX */
    105enum {
    106	XENIX_LINK_MAX	=	126,	/* ?? */
    107	SYSV_LINK_MAX	=	126,	/* 127? 251? */
    108	V7_LINK_MAX     =	126,	/* ?? */
    109	COH_LINK_MAX	=	10000,
    110};
    111
    112
    113static inline void dirty_sb(struct super_block *sb)
    114{
    115	struct sysv_sb_info *sbi = SYSV_SB(sb);
    116
    117	mark_buffer_dirty(sbi->s_bh1);
    118	if (sbi->s_bh1 != sbi->s_bh2)
    119		mark_buffer_dirty(sbi->s_bh2);
    120}
    121
    122
    123/* ialloc.c */
    124extern struct sysv_inode *sysv_raw_inode(struct super_block *, unsigned,
    125			struct buffer_head **);
    126extern struct inode * sysv_new_inode(const struct inode *, umode_t);
    127extern void sysv_free_inode(struct inode *);
    128extern unsigned long sysv_count_free_inodes(struct super_block *);
    129
    130/* balloc.c */
    131extern sysv_zone_t sysv_new_block(struct super_block *);
    132extern void sysv_free_block(struct super_block *, sysv_zone_t);
    133extern unsigned long sysv_count_free_blocks(struct super_block *);
    134
    135/* itree.c */
    136extern void sysv_truncate(struct inode *);
    137extern int sysv_prepare_chunk(struct page *page, loff_t pos, unsigned len);
    138
    139/* inode.c */
    140extern struct inode *sysv_iget(struct super_block *, unsigned int);
    141extern int sysv_write_inode(struct inode *, struct writeback_control *wbc);
    142extern int sysv_sync_inode(struct inode *);
    143extern void sysv_set_inode(struct inode *, dev_t);
    144extern int sysv_getattr(struct user_namespace *, const struct path *,
    145			struct kstat *, u32, unsigned int);
    146extern int sysv_init_icache(void);
    147extern void sysv_destroy_icache(void);
    148
    149
    150/* dir.c */
    151extern struct sysv_dir_entry *sysv_find_entry(struct dentry *, struct page **);
    152extern int sysv_add_link(struct dentry *, struct inode *);
    153extern int sysv_delete_entry(struct sysv_dir_entry *, struct page *);
    154extern int sysv_make_empty(struct inode *, struct inode *);
    155extern int sysv_empty_dir(struct inode *);
    156extern void sysv_set_link(struct sysv_dir_entry *, struct page *,
    157			struct inode *);
    158extern struct sysv_dir_entry *sysv_dotdot(struct inode *, struct page **);
    159extern ino_t sysv_inode_by_name(struct dentry *);
    160
    161
    162extern const struct inode_operations sysv_file_inode_operations;
    163extern const struct inode_operations sysv_dir_inode_operations;
    164extern const struct file_operations sysv_file_operations;
    165extern const struct file_operations sysv_dir_operations;
    166extern const struct address_space_operations sysv_aops;
    167extern const struct super_operations sysv_sops;
    168
    169
    170enum {
    171	BYTESEX_LE,
    172	BYTESEX_PDP,
    173	BYTESEX_BE,
    174};
    175
    176static inline u32 PDP_swab(u32 x)
    177{
    178#ifdef __LITTLE_ENDIAN
    179	return ((x & 0xffff) << 16) | ((x & 0xffff0000) >> 16);
    180#else
    181#ifdef __BIG_ENDIAN
    182	return ((x & 0xff00ff) << 8) | ((x & 0xff00ff00) >> 8);
    183#else
    184#error BYTESEX
    185#endif
    186#endif
    187}
    188
    189static inline __u32 fs32_to_cpu(struct sysv_sb_info *sbi, __fs32 n)
    190{
    191	if (sbi->s_bytesex == BYTESEX_PDP)
    192		return PDP_swab((__force __u32)n);
    193	else if (sbi->s_bytesex == BYTESEX_LE)
    194		return le32_to_cpu((__force __le32)n);
    195	else
    196		return be32_to_cpu((__force __be32)n);
    197}
    198
    199static inline __fs32 cpu_to_fs32(struct sysv_sb_info *sbi, __u32 n)
    200{
    201	if (sbi->s_bytesex == BYTESEX_PDP)
    202		return (__force __fs32)PDP_swab(n);
    203	else if (sbi->s_bytesex == BYTESEX_LE)
    204		return (__force __fs32)cpu_to_le32(n);
    205	else
    206		return (__force __fs32)cpu_to_be32(n);
    207}
    208
    209static inline __fs32 fs32_add(struct sysv_sb_info *sbi, __fs32 *n, int d)
    210{
    211	if (sbi->s_bytesex == BYTESEX_PDP)
    212		*(__u32*)n = PDP_swab(PDP_swab(*(__u32*)n)+d);
    213	else if (sbi->s_bytesex == BYTESEX_LE)
    214		le32_add_cpu((__le32 *)n, d);
    215	else
    216		be32_add_cpu((__be32 *)n, d);
    217	return *n;
    218}
    219
    220static inline __u16 fs16_to_cpu(struct sysv_sb_info *sbi, __fs16 n)
    221{
    222	if (sbi->s_bytesex != BYTESEX_BE)
    223		return le16_to_cpu((__force __le16)n);
    224	else
    225		return be16_to_cpu((__force __be16)n);
    226}
    227
    228static inline __fs16 cpu_to_fs16(struct sysv_sb_info *sbi, __u16 n)
    229{
    230	if (sbi->s_bytesex != BYTESEX_BE)
    231		return (__force __fs16)cpu_to_le16(n);
    232	else
    233		return (__force __fs16)cpu_to_be16(n);
    234}
    235
    236static inline __fs16 fs16_add(struct sysv_sb_info *sbi, __fs16 *n, int d)
    237{
    238	if (sbi->s_bytesex != BYTESEX_BE)
    239		le16_add_cpu((__le16 *)n, d);
    240	else
    241		be16_add_cpu((__be16 *)n, d);
    242	return *n;
    243}
    244
    245#endif /* _SYSV_H */