From d669177c43982f0ca08c8930b96dc676542590f6 Mon Sep 17 00:00:00 2001 From: wangdi <wangdi> Date: Thu, 5 Feb 2004 18:25:41 +0000 Subject: [PATCH] add some methods in file.c --- lustre/smfs/file.c | 123 +++++++++++++++++++++++++++++++++++- lustre/smfs/inode.c | 2 +- lustre/smfs/smfs_internal.h | 7 +- 3 files changed, 129 insertions(+), 3 deletions(-) diff --git a/lustre/smfs/file.c b/lustre/smfs/file.c index 751f13aeb4..fec85afb47 100644 --- a/lustre/smfs/file.c +++ b/lustre/smfs/file.c @@ -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 */ }; diff --git a/lustre/smfs/inode.c b/lustre/smfs/inode.c index 4057f94189..f9f3b738ec 100644 --- a/lustre/smfs/inode.c +++ b/lustre/smfs/inode.c @@ -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; diff --git a/lustre/smfs/smfs_internal.h b/lustre/smfs/smfs_internal.h index ad58e8eeec..1e09a61446 100644 --- a/lustre/smfs/smfs_internal.h +++ b/lustre/smfs/smfs_internal.h @@ -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 */ -- GitLab