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