Skip to content
Snippets Groups Projects
Commit d669177c authored by Wang Di's avatar Wang Di
Browse files

add some methods in file.c

parent 11347915
No related branches found
No related tags found
No related merge requests found
......@@ -13,12 +13,133 @@
#include <linux/pagemap.h>
#include "smfs_internal.h"
static int smfs_readpage(struct file *file,
struct page *page)
{
struct inode *inode = page->mapping->host;
struct inode *cache_inode;
int rc;
ENTRY;
cache_inode = I2CI(inode);
if (!cache_inode)
RETURN(-ENOENT);
if (cache_inode->i_mapping->a_ops->readpage)
rc = cache_inode->i_mapping->a_ops->readpage(file, page);
RETURN(rc);
}
static int smfs_writepage(struct page *page)
{
struct inode *inode = page->mapping->host;
struct inode *cache_inode;
int rc;
ENTRY;
cache_inode = I2CI(inode);
if (!cache_inode)
RETURN(-ENOENT);
if (cache_inode->i_mapping->a_ops->writepage)
rc = cache_inode->i_mapping->a_ops->writepage(page);
RETURN(rc);
}
struct address_space_operations smfs_file_aops = {
readpage: smfs_readpage,
writepage: smfs_writepage,
};
static ssize_t smfs_write (struct file *filp, const char *buf,
size_t count, loff_t *ppos)
{
struct inode *cache_inode;
struct dentry *dentry = filp->f_dentry;
int rc;
ENTRY;
cache_inode = I2CI(dentry->d_inode);
if (!cache_inode)
RETURN(-ENOENT);
if (cache_inode->i_fop->write)
cache_inode->i_fop->write(filp, buf, count, ppos);
RETURN(rc);
}
static ssize_t smfs_read (struct file *filp, char *buf,
size_t count, loff_t *ppos)
{
struct inode *cache_inode;
struct dentry *dentry = filp->f_dentry;
ssize_t rc;
ENTRY;
cache_inode = I2CI(dentry->d_inode);
if (!cache_inode)
RETURN(-ENOENT);
if (cache_inode->i_fop->read)
rc = cache_inode->i_fop->read(filp, buf, count, ppos);
RETURN(rc);
}
struct file_operations smfs_file_fops = {
read: smfs_read,
write: smfs_write,
};
static void smfs_truncate(struct inode * inode)
{
struct inode *cache_inode;
cache_inode = I2CI(inode);
if (!cache_inode)
return;
if (cache_inode->i_op->truncate)
cache_inode->i_op->truncate(cache_inode);
duplicate(inode, cache_inode);
return;
}
static int smfs_setattr(struct dentry *dentry, struct iattr *attr)
{
struct inode *cache_inode;
int rc = 0;
cache_inode = I2CI(dentry->d_inode);
if (!cache_inode)
RETURN(-ENOENT);
if (cache_inode->i_op->setattr)
rc = cache_inode->i_op->setattr(dentry, attr);
RETURN(rc);
}
struct inode_operations smfs_file_iops = {
truncate: smfs_truncate, /* BKL held */
setattr: smfs_setattr, /* BKL held */
};
......@@ -14,7 +14,7 @@
#include <linux/string.h>
#include "smfs_internal.h"
static void duplicate_inode(struct inode *cache_inode, struct inode *inode)
void duplicate_inode(struct inode *cache_inode, struct inode *inode)
{
inode->i_mode = cache_inode->i_mode;
......
......@@ -66,4 +66,9 @@ extern int sm_debug_level;
extern int sm_inodes;
extern long sm_kmemory;
extern int sm_stack;
#endif /* __LINUX_SNAPFS_H */
/*dir.c*/
extern struct inode_operations smfs_dir_iops;
extern struct file_operations smfs_dir_fops;
/*inode.c*/
extern void duplicate_inode(struct inode *cache_inode, struct inode *inode);
#endif /* __LINUX_SMFS_H */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment