5 #define DEBUG_SUBSYSTEM S_SM
7 #include <linux/module.h>
8 #include <linux/kernel.h>
9 #include <linux/string.h>
10 #include <linux/slab.h>
11 #include <linux/stat.h>
12 #include <linux/unistd.h>
13 #include <linux/pagemap.h>
14 #include <linux/lustre_idl.h>
15 #include "smfs_internal.h"
17 /* instantiate a file handle to the cache file */
18 void smfs_prepare_cachefile(struct inode *inode,
20 struct inode *cache_inode,
21 struct file *cache_file,
22 struct dentry *cache_dentry)
25 cache_file->f_pos = file->f_pos;
26 cache_file->f_mode = file->f_mode;
27 cache_file->f_flags = file->f_flags;
28 cache_file->f_count = file->f_count;
29 cache_file->f_owner = file->f_owner;
30 cache_file->f_error = file->f_error;
31 cache_file->f_op = inode->i_fop;
32 cache_file->f_dentry = cache_dentry;
33 cache_file->f_dentry->d_inode = cache_inode;
34 cache_file->f_vfsmnt = file->f_vfsmnt;
35 cache_file->private_data = file->private_data;
36 cache_file->f_it = file->f_it;
37 cache_file->f_reada = file->f_reada;
38 cache_file->f_ramax = file->f_ramax;
39 cache_file->f_raend = file->f_raend;
40 cache_file->f_ralen = file->f_ralen;
41 cache_file->f_rawin = file->f_rawin;
44 /* update file structs*/
45 void smfs_update_file(struct file *file,
46 struct file *cache_file)
49 file->f_pos = cache_file->f_pos;
50 file->f_mode = cache_file->f_mode;
51 file->f_flags = cache_file->f_flags;
52 file->f_count = cache_file->f_count;
53 file->f_owner = cache_file->f_owner;
54 file->f_reada = cache_file->f_reada;
55 file->f_ramax = cache_file->f_ramax;
56 file->f_raend = cache_file->f_raend;
57 file->f_ralen = cache_file->f_ralen;
58 file->f_rawin = cache_file->f_rawin;
62 static ssize_t smfs_write (struct file *filp, const char *buf,
63 size_t count, loff_t *ppos)
65 struct inode *cache_inode;
66 struct dentry *dentry = filp->f_dentry;
67 struct inode *inode = dentry->d_inode;
68 struct file open_file;
69 struct dentry open_dentry;
76 cache_inode = I2CI(inode);
81 if (ppos != &(filp->f_pos)) {
82 cache_ppos = &tmp_ppos;
84 cache_ppos = &open_file.f_pos;
88 smfs_prepare_cachefile(inode, filp, cache_inode,
89 &open_file, &open_dentry);
90 pre_smfs_inode(inode, cache_inode);
92 if (cache_inode->i_fop->write)
93 rc = cache_inode->i_fop->write(&open_file, buf, count, cache_ppos);
96 post_smfs_inode(inode, cache_inode);
97 smfs_update_file(filp, &open_file);
102 int smfs_ioctl(struct inode * inode, struct file * filp,
103 unsigned int cmd, unsigned long arg)
105 struct inode *cache_inode;
106 struct dentry *dentry = filp->f_dentry;
107 struct file open_file;
108 struct dentry open_dentry;
113 cache_inode = I2CI(dentry->d_inode);
117 smfs_prepare_cachefile(inode, filp, cache_inode,
118 &open_file, &open_dentry);
120 if (cache_inode->i_fop->ioctl)
121 rc = cache_inode->i_fop->ioctl(cache_inode, &open_file, cmd, arg);
123 post_smfs_inode(inode, cache_inode);
124 smfs_update_file(filp, &open_file);
128 static ssize_t smfs_read (struct file *filp, char *buf,
129 size_t count, loff_t *ppos)
131 struct inode *cache_inode;
132 struct dentry *dentry = filp->f_dentry;
133 struct inode *inode = dentry->d_inode;
134 struct file open_file;
135 struct dentry open_dentry;
142 cache_inode = I2CI(dentry->d_inode);
146 if (ppos != &(filp->f_pos)) {
147 cache_ppos = &tmp_ppos;
149 cache_ppos = &open_file.f_pos;
154 smfs_prepare_cachefile(inode, filp, cache_inode,
155 &open_file, &open_dentry);
158 pre_smfs_inode(inode, cache_inode);
159 if (cache_inode->i_fop->read)
160 rc = cache_inode->i_fop->read(&open_file, buf, count, cache_ppos);
163 post_smfs_inode(inode, cache_inode);
164 smfs_update_file(filp, &open_file);
168 static loff_t smfs_llseek(struct file *file,
172 struct inode *cache_inode;
173 struct dentry *dentry = file->f_dentry;
174 struct file open_file;
175 struct dentry open_dentry;
180 cache_inode = I2CI(dentry->d_inode);
184 smfs_prepare_cachefile(dentry->d_inode, file, cache_inode,
185 &open_file, &open_dentry);
187 pre_smfs_inode(dentry->d_inode, cache_inode);
188 if (cache_inode->i_fop->llseek)
189 rc = cache_inode->i_fop->llseek(&open_file, offset, origin);
191 post_smfs_inode(dentry->d_inode, cache_inode);
192 smfs_update_file(file, &open_file);
197 static int smfs_mmap(struct file * file, struct vm_area_struct * vma)
199 struct inode *inode = file->f_dentry->d_inode;
200 struct inode *cache_inode = NULL;
201 struct file open_file;
202 struct dentry open_dentry;
205 cache_inode = I2CI(inode);
209 smfs_prepare_cachefile(inode, file, cache_inode,
210 &open_file, &open_dentry);
212 if (cache_inode->i_mapping == &cache_inode->i_data)
213 inode->i_mapping = cache_inode->i_mapping;
215 pre_smfs_inode(inode, cache_inode);
216 if (cache_inode->i_fop->mmap)
217 rc = cache_inode->i_fop->mmap(&open_file, vma);
219 post_smfs_inode(inode, cache_inode);
220 smfs_update_file(file, &open_file);
225 static int smfs_open(struct inode * inode, struct file * filp)
227 struct inode *cache_inode = NULL;
228 struct file open_file;
229 struct dentry open_dentry;
232 cache_inode = I2CI(inode);
236 smfs_prepare_cachefile(inode, filp, cache_inode,
237 &open_file, &open_dentry);
239 pre_smfs_inode(inode, cache_inode);
240 if (cache_inode->i_fop->open)
241 rc = cache_inode->i_fop->open(cache_inode, &open_file);
243 post_smfs_inode(inode, cache_inode);
244 smfs_update_file(filp, &open_file);
249 static int smfs_release(struct inode * inode, struct file * filp)
251 struct inode *cache_inode = NULL;
252 struct file open_file;
253 struct dentry open_dentry;
256 cache_inode = I2CI(inode);
260 smfs_prepare_cachefile(inode, filp, cache_inode,
261 &open_file, &open_dentry);
263 pre_smfs_inode(inode, cache_inode);
264 if (cache_inode->i_fop->release)
265 rc = cache_inode->i_fop->release(cache_inode, &open_file);
267 post_smfs_inode(inode, cache_inode);
268 smfs_update_file(filp, &open_file);
272 int smfs_fsync(struct file * file,
273 struct dentry *dentry,
276 struct inode *inode = dentry->d_inode;
277 struct inode *cache_inode;
278 struct file open_file;
279 struct dentry open_dentry;
282 cache_inode = I2CI(inode);
286 smfs_prepare_cachefile(inode, file, cache_inode,
287 &open_file, &open_dentry);
289 pre_smfs_inode(inode, cache_inode);
290 if (cache_inode->i_fop->fsync)
291 rc = cache_inode->i_fop->fsync(&open_file, &open_dentry, datasync);
293 post_smfs_inode(inode, cache_inode);
294 smfs_update_file(file, &open_file);
299 struct file_operations smfs_file_fops = {
306 release: smfs_release,
310 static void smfs_prepare_cache_dentry(struct dentry *dentry, struct inode *inode)
312 atomic_set(&dentry->d_count, 1);
313 dentry->d_vfs_flags = 0;
315 dentry->d_inode = inode;
317 dentry->d_fsdata = NULL;
318 dentry->d_mounted = 0;
319 INIT_LIST_HEAD(&dentry->d_hash);
320 INIT_LIST_HEAD(&dentry->d_lru);
321 INIT_LIST_HEAD(&dentry->d_subdirs);
322 INIT_LIST_HEAD(&dentry->d_alias);
325 static void smfs_truncate(struct inode * inode)
327 struct inode *cache_inode;
329 cache_inode = I2CI(inode);
334 if (cache_inode->i_op->truncate)
335 cache_inode->i_op->truncate(cache_inode);
337 post_smfs_inode(inode, cache_inode);
342 int smfs_setattr(struct dentry *dentry, struct iattr *attr)
344 struct inode *cache_inode;
345 struct dentry open_dentry;
349 cache_inode = I2CI(dentry->d_inode);
353 smfs_prepare_cache_dentry(&open_dentry, cache_inode);
355 pre_smfs_inode(dentry->d_inode, cache_inode);
356 if (cache_inode->i_op->setattr)
357 rc = cache_inode->i_op->setattr(&open_dentry, attr);
359 post_smfs_inode(dentry->d_inode, cache_inode);
364 int smfs_setxattr(struct dentry *dentry, const char *name,
365 const void *value, size_t size, int flags)
367 struct inode *cache_inode;
368 struct dentry open_dentry;
371 cache_inode = I2CI(dentry->d_inode);
376 pre_smfs_inode(dentry->d_inode, cache_inode);
377 smfs_prepare_cache_dentry(&open_dentry, cache_inode);
379 if (cache_inode->i_op->setattr)
380 rc = cache_inode->i_op->setxattr(&open_dentry, name, value, size, flags);
382 post_smfs_inode(dentry->d_inode, cache_inode);
386 int smfs_getxattr(struct dentry *dentry, const char *name,
387 void *buffer, size_t size)
389 struct inode *cache_inode;
390 struct dentry open_dentry;
393 cache_inode = I2CI(dentry->d_inode);
398 smfs_prepare_cache_dentry(&open_dentry, cache_inode);
399 pre_smfs_inode(dentry->d_inode, cache_inode);
401 if (cache_inode->i_op->setattr)
402 rc = cache_inode->i_op->getxattr(&open_dentry, name, buffer, size);
404 post_smfs_inode(dentry->d_inode, cache_inode);
408 ssize_t smfs_listxattr(struct dentry *dentry, char *buffer, size_t size)
410 struct inode *cache_inode;
411 struct dentry open_dentry;
414 cache_inode = I2CI(dentry->d_inode);
419 smfs_prepare_cache_dentry(&open_dentry, cache_inode);
420 pre_smfs_inode(dentry->d_inode, cache_inode);
422 if (cache_inode->i_op->listxattr)
423 rc = cache_inode->i_op->listxattr(&open_dentry, buffer, size);
425 post_smfs_inode(dentry->d_inode, cache_inode);
429 int smfs_removexattr(struct dentry *dentry, const char *name)
431 struct inode *cache_inode;
432 struct dentry open_dentry;
435 cache_inode = I2CI(dentry->d_inode);
440 smfs_prepare_cache_dentry(&open_dentry, cache_inode);
441 pre_smfs_inode(dentry->d_inode, cache_inode);
443 if (cache_inode->i_op->removexattr)
444 rc = cache_inode->i_op->removexattr(&open_dentry, name);
446 post_smfs_inode(dentry->d_inode, cache_inode);
450 struct inode_operations smfs_file_iops = {
451 truncate: smfs_truncate, /* BKL held */
452 setattr: smfs_setattr, /* BKL held */
453 setxattr: smfs_setxattr, /* BKL held */
454 getxattr: smfs_getxattr, /* BKL held */
455 listxattr: smfs_listxattr, /* BKL held */
456 removexattr: smfs_removexattr, /* BKL held */