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 "smfs_internal.h"
16 static int smfs_readpage(struct file *file,
19 struct inode *inode = page->mapping->host;
20 struct inode *cache_inode;
21 struct page *cache_page = NULL;
26 cache_inode = I2CI(inode);
31 cache_page = grab_cache_page(cache_inode->i_mapping, page->index);
34 GOTO(exit_release, rc = -ENOMEM);
36 if ((rc = cache_inode->i_mapping->a_ops->readpage(file, cache_page)))
37 GOTO(exit_release, 0);
39 wait_on_page(cache_page);
41 if (!Page_Uptodate(cache_page))
42 GOTO(exit_release, rc = -EIO);
44 memcpy(kmap(page), kmap(cache_page), PAGE_CACHE_SIZE);
46 flush_dcache_page(page);
49 page_cache_release(cache_page);
53 SetPageUptodate(page);
60 page_cache_release(cache_page);
65 static int smfs_writepage(struct page *page)
68 struct inode *inode = page->mapping->host;
69 struct inode *cache_inode;
74 cache_inode = I2CI(inode);
79 if (cache_inode->i_mapping->a_ops->writepage)
80 rc = cache_inode->i_mapping->a_ops->writepage(page);
85 struct address_space_operations smfs_file_aops = {
86 readpage: smfs_readpage,
87 writepage: smfs_writepage,
90 /* instantiate a file handle to the cache file */
91 void smfs_prepare_cachefile(struct inode *inode,
93 struct inode *cache_inode,
94 struct file *cache_file,
95 struct dentry *cache_dentry)
98 cache_file->f_pos = file->f_pos;
99 cache_file->f_mode = file->f_mode;
100 cache_file->f_flags = file->f_flags;
101 cache_file->f_count = file->f_count;
102 cache_file->f_owner = file->f_owner;
103 cache_file->f_error = file->f_error;
104 cache_file->f_op = inode->i_fop;
105 cache_file->f_dentry = cache_dentry;
106 cache_file->f_dentry->d_inode = cache_inode;
107 cache_file->f_vfsmnt = file->f_vfsmnt;
108 cache_file->private_data = file->private_data;
109 cache_file->f_it = file->f_it;
110 cache_file->f_reada = file->f_reada;
111 cache_file->f_ramax = file->f_ramax;
112 cache_file->f_raend = file->f_raend;
113 cache_file->f_ralen = file->f_ralen;
114 cache_file->f_rawin = file->f_rawin;
117 /* update file structs*/
118 void smfs_update_file(struct file *file,
119 struct file *cache_file)
122 file->f_pos = cache_file->f_pos;
123 file->f_mode = cache_file->f_mode;
124 file->f_flags = cache_file->f_flags;
125 file->f_count = cache_file->f_count;
126 file->f_owner = cache_file->f_owner;
127 file->f_reada = cache_file->f_reada;
128 file->f_ramax = cache_file->f_ramax;
129 file->f_raend = cache_file->f_raend;
130 file->f_ralen = cache_file->f_ralen;
131 file->f_rawin = cache_file->f_rawin;
135 static ssize_t smfs_write (struct file *filp, const char *buf,
136 size_t count, loff_t *ppos)
138 struct inode *cache_inode;
139 struct dentry *dentry = filp->f_dentry;
140 struct inode *inode = dentry->d_inode;
141 struct file open_file;
142 struct dentry open_dentry;
147 cache_inode = I2CI(inode);
152 smfs_prepare_cachefile(inode, filp, cache_inode,
153 &open_file, &open_dentry);
155 if (cache_inode->i_fop->write)
156 rc = cache_inode->i_fop->write(&open_file, buf, count, &open_file.f_pos);
158 *ppos = open_file.f_pos;
159 duplicate_inode(cache_inode, inode);
160 smfs_update_file(filp, &open_file);
164 int smfs_ioctl(struct inode * inode, struct file * filp,
165 unsigned int cmd, unsigned long arg)
167 struct inode *cache_inode;
168 struct dentry *dentry = filp->f_dentry;
169 struct file open_file;
170 struct dentry open_dentry;
175 cache_inode = I2CI(dentry->d_inode);
179 smfs_prepare_cachefile(inode, filp, cache_inode,
180 &open_file, &open_dentry);
182 if (cache_inode->i_fop->ioctl)
183 rc = cache_inode->i_fop->ioctl(cache_inode, &open_file, cmd, arg);
185 duplicate_inode(cache_inode, inode);
186 smfs_update_file(filp, &open_file);
190 static ssize_t smfs_read (struct file *filp, char *buf,
191 size_t count, loff_t *ppos)
193 struct inode *cache_inode;
194 struct dentry *dentry = filp->f_dentry;
195 struct inode *inode = dentry->d_inode;
196 struct file open_file;
197 struct dentry open_dentry;
202 cache_inode = I2CI(dentry->d_inode);
206 smfs_prepare_cachefile(inode, filp, cache_inode,
207 &open_file, &open_dentry);
209 if (cache_inode->i_fop->read)
210 rc = cache_inode->i_fop->read(&open_file, buf, count, &open_file.f_pos);
212 *ppos = open_file.f_pos;
213 duplicate_inode(cache_inode, inode);
214 smfs_update_file(filp, &open_file);
218 static loff_t smfs_llseek(struct file *file,
222 struct inode *cache_inode;
223 struct dentry *dentry = file->f_dentry;
224 struct file open_file;
225 struct dentry open_dentry;
230 cache_inode = I2CI(dentry->d_inode);
234 smfs_prepare_cachefile(dentry->d_inode, file, cache_inode,
235 &open_file, &open_dentry);
237 if (cache_inode->i_fop->llseek)
238 rc = cache_inode->i_fop->llseek(&open_file, offset, origin);
240 duplicate_inode(cache_inode, dentry->d_inode);
241 smfs_update_file(file, &open_file);
246 static int smfs_mmap(struct file * file, struct vm_area_struct * vma)
248 struct address_space *mapping = file->f_dentry->d_inode->i_mapping;
249 struct inode *inode = mapping->host;
250 struct inode *cache_inode = NULL;
251 struct file open_file;
252 struct dentry open_dentry;
255 cache_inode = I2CI(inode);
259 smfs_prepare_cachefile(inode, file, cache_inode,
260 &open_file, &open_dentry);
262 if (cache_inode->i_fop->mmap)
263 rc = cache_inode->i_fop->mmap(&open_file, vma);
265 duplicate_inode(cache_inode, inode);
266 smfs_update_file(file, &open_file);
271 static int smfs_open(struct inode * inode, struct file * filp)
273 struct inode *cache_inode = NULL;
274 struct file open_file;
275 struct dentry open_dentry;
278 cache_inode = I2CI(inode);
282 smfs_prepare_cachefile(inode, filp, cache_inode,
283 &open_file, &open_dentry);
285 if (cache_inode->i_fop->open)
286 rc = cache_inode->i_fop->open(cache_inode, &open_file);
288 duplicate_inode(cache_inode, inode);
289 smfs_update_file(filp, &open_file);
294 static int smfs_release(struct inode * inode, struct file * filp)
296 struct inode *cache_inode = NULL;
297 struct file open_file;
298 struct dentry open_dentry;
301 cache_inode = I2CI(inode);
305 smfs_prepare_cachefile(inode, filp, cache_inode,
306 &open_file, &open_dentry);
308 if (cache_inode->i_fop->release)
309 rc = cache_inode->i_fop->release(cache_inode, &open_file);
311 duplicate_inode(cache_inode, inode);
312 smfs_update_file(filp, &open_file);
316 int smfs_fsync(struct file * file,
317 struct dentry *dentry,
320 struct inode *inode = dentry->d_inode;
321 struct inode *cache_inode;
322 struct file open_file;
323 struct dentry open_dentry;
326 cache_inode = I2CI(inode);
330 smfs_prepare_cachefile(inode, file, cache_inode,
331 &open_file, &open_dentry);
333 if (cache_inode->i_fop->fsync)
334 rc = cache_inode->i_fop->fsync(&open_file, &open_dentry, datasync);
336 duplicate_inode(cache_inode, inode);
337 smfs_update_file(file, &open_file);
342 struct file_operations smfs_file_fops = {
349 release: smfs_release,
353 static void smfs_prepare_cache_dentry(struct dentry *dentry, struct inode *inode)
355 atomic_set(&dentry->d_count, 1);
356 dentry->d_vfs_flags = 0;
358 dentry->d_inode = inode;
360 dentry->d_fsdata = NULL;
361 dentry->d_mounted = 0;
362 INIT_LIST_HEAD(&dentry->d_hash);
363 INIT_LIST_HEAD(&dentry->d_lru);
364 INIT_LIST_HEAD(&dentry->d_subdirs);
365 INIT_LIST_HEAD(&dentry->d_alias);
368 static void smfs_truncate(struct inode * inode)
370 struct inode *cache_inode;
372 cache_inode = I2CI(inode);
377 if (cache_inode->i_op->truncate)
378 cache_inode->i_op->truncate(cache_inode);
380 duplicate_inode(inode, cache_inode);
385 int smfs_setattr(struct dentry *dentry, struct iattr *attr)
387 struct inode *cache_inode;
388 struct dentry open_dentry;
392 cache_inode = I2CI(dentry->d_inode);
396 smfs_prepare_cache_dentry(&open_dentry, cache_inode);
398 if (cache_inode->i_op->setattr)
399 rc = cache_inode->i_op->setattr(&open_dentry, attr);
404 int smfs_setxattr(struct dentry *dentry, const char *name,
405 const void *value, size_t size, int flags)
407 struct inode *cache_inode;
408 struct dentry open_dentry;
411 cache_inode = I2CI(dentry->d_inode);
416 smfs_prepare_cache_dentry(&open_dentry, cache_inode);
418 if (cache_inode->i_op->setattr)
419 rc = cache_inode->i_op->setxattr(&open_dentry, name, value, size, flags);
424 int smfs_getxattr(struct dentry *dentry, const char *name,
425 void *buffer, size_t size)
427 struct inode *cache_inode;
428 struct dentry open_dentry;
431 cache_inode = I2CI(dentry->d_inode);
436 smfs_prepare_cache_dentry(&open_dentry, cache_inode);
438 if (cache_inode->i_op->setattr)
439 rc = cache_inode->i_op->getxattr(&open_dentry, name, buffer, size);
444 ssize_t smfs_listxattr(struct dentry *dentry, char *buffer, size_t size)
446 struct inode *cache_inode;
447 struct dentry open_dentry;
450 cache_inode = I2CI(dentry->d_inode);
455 smfs_prepare_cache_dentry(&open_dentry, cache_inode);
457 if (cache_inode->i_op->listxattr)
458 rc = cache_inode->i_op->listxattr(&open_dentry, buffer, size);
463 int smfs_removexattr(struct dentry *dentry, const char *name)
465 struct inode *cache_inode;
466 struct dentry open_dentry;
469 cache_inode = I2CI(dentry->d_inode);
474 smfs_prepare_cache_dentry(&open_dentry, cache_inode);
476 if (cache_inode->i_op->removexattr)
477 rc = cache_inode->i_op->removexattr(&open_dentry, name);
482 struct inode_operations smfs_file_iops = {
483 truncate: smfs_truncate, /* BKL held */
484 setattr: smfs_setattr, /* BKL held */
485 setxattr: smfs_setxattr, /* BKL held */
486 getxattr: smfs_getxattr, /* BKL held */
487 listxattr: smfs_listxattr, /* BKL held */
488 removexattr: smfs_removexattr, /* BKL held */