-
Notifications
You must be signed in to change notification settings - Fork 0
/
trfs.h
256 lines (219 loc) · 6.61 KB
/
trfs.h
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
/*
* Copyright (c) 1998-2015 Erez Zadok
* Copyright (c) 2009 Shrikar Archak
* Copyright (c) 2003-2015 Stony Brook University
* Copyright (c) 2003-2015 The Research Foundation of SUNY
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
/*
* CSE-506 : Operating Systems HW2
* Author : Meng-Chieh Yang
* ID : 110452591
* Date : 11/1/16
*
* trfs.h
* - add a super_magic number
* - add new fields of sb_info
* - extern new functions: trfs_record
* - modify trfs_set_lower_super
*/
#ifndef _TRFS_H_
#define _TRFS_H_
#include <linux/dcache.h>
#include <linux/file.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/mount.h>
#include <linux/namei.h>
#include <linux/seq_file.h>
#include <linux/statfs.h>
#include <linux/fs_stack.h>
#include <linux/magic.h>
#include <linux/uaccess.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/xattr.h>
#include <linux/exportfs.h>
#include <linux/spinlock.h>
#include "record.h"
#include "trctl.h"
/* the file system name */
#define TRFS_NAME "trfs"
/* trfs root inode number */
#define TRFS_ROOT_INO 1
/* trfs file systems superblock magic */
#define TRFS_SUPER_MAGIC 0xf15f
/* useful for tracking code reachability */
#define UDBG printk(KERN_DEFAULT "DBG:%s:%s:%d\n", __FILE__, __func__, __LINE__)
/* operations vectors defined in specific files */
extern const struct file_operations trfs_main_fops;
extern const struct file_operations trfs_dir_fops;
extern const struct inode_operations trfs_main_iops;
extern const struct inode_operations trfs_dir_iops;
extern const struct inode_operations trfs_symlink_iops;
extern const struct super_operations trfs_sops;
extern const struct dentry_operations trfs_dops;
extern const struct address_space_operations trfs_aops, trfs_dummy_aops;
extern const struct vm_operations_struct trfs_vm_ops;
extern const struct export_operations trfs_export_ops;
extern spinlock_t sl;
extern int trfs_init_inode_cache(void);
extern void trfs_destroy_inode_cache(void);
extern int trfs_init_dentry_cache(void);
extern void trfs_destroy_dentry_cache(void);
extern int new_dentry_private_data(struct dentry *dentry);
extern void free_dentry_private_data(struct dentry *dentry);
extern struct dentry *trfs_lookup(struct inode *dir, struct dentry *dentry,
unsigned int flags);
extern struct inode *trfs_iget(struct super_block *sb,
struct inode *lower_inode);
extern int trfs_interpose(struct dentry *dentry, struct super_block *sb,
struct path *lower_path);
/* new stuff */
extern int trfs_record(struct super_block *sb, char* pathname, unsigned char op_type,
int rval);
/* file private data */
struct trfs_file_info {
struct file *lower_file;
const struct vm_operations_struct *lower_vm_ops;
};
/* trfs inode data in memory */
struct trfs_inode_info {
struct inode *lower_inode;
struct inode vfs_inode;
};
/* trfs dentry data in memory */
struct trfs_dentry_info {
spinlock_t lock; /* protects lower_path */
struct path lower_path;
};
/* trfs super-block data in memory */
/* added some new fields*/
struct trfs_sb_info {
struct super_block *lower_sb;
char *op_name;
unsigned int cur_id;
unsigned int bitmap;
};
/* lower device name and option */
/* new stuff */
struct trfs_dev_w_opt{
const char *lower_path_name;
char *out_file;
};
/* kthread stuff */
/*
* inode to private data
*
* Since we use containers and the struct inode is _inside_ the
* trfs_inode_info structure, TRFS_I will always (given a non-NULL
* inode pointer), return a valid non-NULL pointer.
*/
static inline struct trfs_inode_info *TRFS_I(const struct inode *inode)
{
return container_of(inode, struct trfs_inode_info, vfs_inode);
}
/* dentry to private data */
#define TRFS_D(dent) ((struct trfs_dentry_info *)(dent)->d_fsdata)
/* superblock to private data */
#define TRFS_SB(super) ((struct trfs_sb_info *)(super)->s_fs_info)
/* file to private Data */
#define TRFS_F(file) ((struct trfs_file_info *)((file)->private_data))
/* file to lower file */
static inline struct file *trfs_lower_file(const struct file *f)
{
return TRFS_F(f)->lower_file;
}
static inline void trfs_set_lower_file(struct file *f, struct file *val)
{
TRFS_F(f)->lower_file = val;
}
/* inode to lower inode. */
static inline struct inode *trfs_lower_inode(const struct inode *i)
{
return TRFS_I(i)->lower_inode;
}
static inline void trfs_set_lower_inode(struct inode *i, struct inode *val)
{
TRFS_I(i)->lower_inode = val;
}
/* superblock to lower superblock */
static inline struct super_block *trfs_lower_super(
const struct super_block *sb)
{
return TRFS_SB(sb)->lower_sb;
}
static inline void trfs_set_lower_super(struct super_block *sb,
struct super_block *val, char* out_file,
unsigned int record_id, unsigned int bitmap)
{
TRFS_SB(sb)->lower_sb = val;
TRFS_SB(sb)->cur_id = record_id;
TRFS_SB(sb)->op_name = out_file;
TRFS_SB(sb)->bitmap = bitmap;
}
/* path based (dentry/mnt) macros */
static inline void pathcpy(struct path *dst, const struct path *src)
{
dst->dentry = src->dentry;
dst->mnt = src->mnt;
}
/* Returns struct path. Caller must path_put it. */
static inline void trfs_get_lower_path(const struct dentry *dent,
struct path *lower_path)
{
spin_lock(&TRFS_D(dent)->lock);
pathcpy(lower_path, &TRFS_D(dent)->lower_path);
path_get(lower_path);
spin_unlock(&TRFS_D(dent)->lock);
return;
}
static inline void trfs_put_lower_path(const struct dentry *dent,
struct path *lower_path)
{
path_put(lower_path);
return;
}
static inline void trfs_set_lower_path(const struct dentry *dent,
struct path *lower_path)
{
spin_lock(&TRFS_D(dent)->lock);
pathcpy(&TRFS_D(dent)->lower_path, lower_path);
spin_unlock(&TRFS_D(dent)->lock);
return;
}
static inline void trfs_reset_lower_path(const struct dentry *dent)
{
spin_lock(&TRFS_D(dent)->lock);
TRFS_D(dent)->lower_path.dentry = NULL;
TRFS_D(dent)->lower_path.mnt = NULL;
spin_unlock(&TRFS_D(dent)->lock);
return;
}
static inline void trfs_put_reset_lower_path(const struct dentry *dent)
{
struct path lower_path;
spin_lock(&TRFS_D(dent)->lock);
pathcpy(&lower_path, &TRFS_D(dent)->lower_path);
TRFS_D(dent)->lower_path.dentry = NULL;
TRFS_D(dent)->lower_path.mnt = NULL;
spin_unlock(&TRFS_D(dent)->lock);
path_put(&lower_path);
return;
}
/* locking helpers */
static inline struct dentry *lock_parent(struct dentry *dentry)
{
struct dentry *dir = dget_parent(dentry);
inode_lock_nested(d_inode(dir), I_MUTEX_PARENT);
return dir;
}
static inline void unlock_dir(struct dentry *dir)
{
inode_unlock(d_inode(dir));
dput(dir);
}
#endif /* not _TRFS_H_ */