Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/fs/efs/efs.h
15109 views
1
/*
2
* Copyright (c) 1999 Al Smith
3
*
4
* Portions derived from work (c) 1995,1996 Christian Vogelgsang.
5
* Portions derived from IRIX header files (c) 1988 Silicon Graphics
6
*/
7
#ifndef _EFS_EFS_H_
8
#define _EFS_EFS_H_
9
10
#include <linux/fs.h>
11
#include <asm/uaccess.h>
12
13
#define EFS_VERSION "1.0a"
14
15
static const char cprt[] = "EFS: "EFS_VERSION" - (c) 1999 Al Smith <[email protected]>";
16
17
18
/* 1 block is 512 bytes */
19
#define EFS_BLOCKSIZE_BITS 9
20
#define EFS_BLOCKSIZE (1 << EFS_BLOCKSIZE_BITS)
21
22
typedef int32_t efs_block_t;
23
typedef uint32_t efs_ino_t;
24
25
#define EFS_DIRECTEXTENTS 12
26
27
/*
28
* layout of an extent, in memory and on disk. 8 bytes exactly.
29
*/
30
typedef union extent_u {
31
unsigned char raw[8];
32
struct extent_s {
33
unsigned int ex_magic:8; /* magic # (zero) */
34
unsigned int ex_bn:24; /* basic block */
35
unsigned int ex_length:8; /* numblocks in this extent */
36
unsigned int ex_offset:24; /* logical offset into file */
37
} cooked;
38
} efs_extent;
39
40
typedef struct edevs {
41
__be16 odev;
42
__be32 ndev;
43
} efs_devs;
44
45
/*
46
* extent based filesystem inode as it appears on disk. The efs inode
47
* is exactly 128 bytes long.
48
*/
49
struct efs_dinode {
50
__be16 di_mode; /* mode and type of file */
51
__be16 di_nlink; /* number of links to file */
52
__be16 di_uid; /* owner's user id */
53
__be16 di_gid; /* owner's group id */
54
__be32 di_size; /* number of bytes in file */
55
__be32 di_atime; /* time last accessed */
56
__be32 di_mtime; /* time last modified */
57
__be32 di_ctime; /* time created */
58
__be32 di_gen; /* generation number */
59
__be16 di_numextents; /* # of extents */
60
u_char di_version; /* version of inode */
61
u_char di_spare; /* spare - used by AFS */
62
union di_addr {
63
efs_extent di_extents[EFS_DIRECTEXTENTS];
64
efs_devs di_dev; /* device for IFCHR/IFBLK */
65
} di_u;
66
};
67
68
/* efs inode storage in memory */
69
struct efs_inode_info {
70
int numextents;
71
int lastextent;
72
73
efs_extent extents[EFS_DIRECTEXTENTS];
74
struct inode vfs_inode;
75
};
76
77
#include <linux/efs_fs_sb.h>
78
79
#define EFS_DIRBSIZE_BITS EFS_BLOCKSIZE_BITS
80
#define EFS_DIRBSIZE (1 << EFS_DIRBSIZE_BITS)
81
82
struct efs_dentry {
83
__be32 inode;
84
unsigned char namelen;
85
char name[3];
86
};
87
88
#define EFS_DENTSIZE (sizeof(struct efs_dentry) - 3 + 1)
89
#define EFS_MAXNAMELEN ((1 << (sizeof(char) * 8)) - 1)
90
91
#define EFS_DIRBLK_HEADERSIZE 4
92
#define EFS_DIRBLK_MAGIC 0xbeef /* moo */
93
94
struct efs_dir {
95
__be16 magic;
96
unsigned char firstused;
97
unsigned char slots;
98
99
unsigned char space[EFS_DIRBSIZE - EFS_DIRBLK_HEADERSIZE];
100
};
101
102
#define EFS_MAXENTS \
103
((EFS_DIRBSIZE - EFS_DIRBLK_HEADERSIZE) / \
104
(EFS_DENTSIZE + sizeof(char)))
105
106
#define EFS_SLOTAT(dir, slot) EFS_REALOFF((dir)->space[slot])
107
108
#define EFS_REALOFF(offset) ((offset << 1))
109
110
111
static inline struct efs_inode_info *INODE_INFO(struct inode *inode)
112
{
113
return container_of(inode, struct efs_inode_info, vfs_inode);
114
}
115
116
static inline struct efs_sb_info *SUPER_INFO(struct super_block *sb)
117
{
118
return sb->s_fs_info;
119
}
120
121
struct statfs;
122
struct fid;
123
124
extern const struct inode_operations efs_dir_inode_operations;
125
extern const struct file_operations efs_dir_operations;
126
extern const struct address_space_operations efs_symlink_aops;
127
128
extern struct inode *efs_iget(struct super_block *, unsigned long);
129
extern efs_block_t efs_map_block(struct inode *, efs_block_t);
130
extern int efs_get_block(struct inode *, sector_t, struct buffer_head *, int);
131
132
extern struct dentry *efs_lookup(struct inode *, struct dentry *, struct nameidata *);
133
extern struct dentry *efs_fh_to_dentry(struct super_block *sb, struct fid *fid,
134
int fh_len, int fh_type);
135
extern struct dentry *efs_fh_to_parent(struct super_block *sb, struct fid *fid,
136
int fh_len, int fh_type);
137
extern struct dentry *efs_get_parent(struct dentry *);
138
extern int efs_bmap(struct inode *, int);
139
140
#endif /* _EFS_EFS_H_ */
141
142