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