Whamcloud - gitweb
update smfs, add some files dir.c cache.c inode.c still many problems, will fix them...
[fs/lustre-release.git] / lustre / smfs / cache.c
diff --git a/lustre/smfs/cache.c b/lustre/smfs/cache.c
new file mode 100644 (file)
index 0000000..5008615
--- /dev/null
@@ -0,0 +1,216 @@
+/*  
+ *  snapfs/cache.c
+ */
+
+#define DEBUG_SUBSYSTEM S_SM
+
+#include <linux/kmod.h>
+#include <linux/init.h>
+#include <linux/fs.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <portals/list.h>
+#include "smfs_internal.h" 
+struct sm_ops smfs_operations;
+extern struct inode_operations smfs_file_iops;
+extern struct file_operations  smfs_file_fops;
+extern struct address_space_operations smfs_file_aops;
+extern struct inode_operations smfs_sym_iops; 
+extern struct file_operations smfs_sym_fops;
+
+inline struct super_operations *cache_sops(struct sm_ops *smfs_ops)
+{
+       return &smfs_ops->sm_sb_ops;
+}
+
+inline struct inode_operations *cache_diops(struct sm_ops *smfs_ops)
+{
+       return &smfs_ops->sm_dir_iops;
+}
+
+inline struct inode_operations *cache_fiops(struct sm_ops *smfs_ops)
+{
+       return &smfs_ops->sm_file_iops;
+}
+
+inline struct inode_operations *cache_siops(struct sm_ops *smfs_ops)
+{
+       return &smfs_ops->sm_sym_iops;
+}
+
+inline struct file_operations *cache_dfops(struct sm_ops *smfs_ops) 
+{
+       return &smfs_ops->sm_dir_fops;
+}
+
+inline struct file_operations *cache_ffops(struct sm_ops *smfs_ops)
+{
+       return &smfs_ops->sm_file_fops;
+}
+
+inline struct address_space_operations *cache_faops(struct sm_ops *smfs_ops) 
+{
+       return &smfs_ops->sm_file_aops;
+}
+
+inline struct file_operations *cache_sfops(struct sm_ops *smfs_ops)
+{
+       return &smfs_ops->sm_sym_fops;
+}
+
+inline struct dentry_operations *cache_dops(struct sm_ops *smfs_ops)
+{
+       return &smfs_ops->sm_dentry_ops;
+}
+
+void init_smfs_cache()
+{
+       memset(&smfs_operations, 0, sizeof(struct sm_ops)); 
+}
+void cleanup_smfs_cache()
+{
+
+}
+
+static void setup_sm_symlink_ops(struct inode *cache_inode, 
+                                struct  inode *inode,
+                                struct inode_operations *cache_sym_iops,
+                                struct file_operations *cache_sym_fops)
+{
+       return;
+}
+
+static void setup_sm_file_ops(struct inode *cache_inode, 
+                      struct inode *inode,
+                      struct inode_operations *cache_iops,
+                      struct file_operations *cache_fops,
+                      struct address_space_operations *cache_aops)
+{
+       
+       struct smfs_super_info *smb;
+       struct inode_operations *iops;
+       struct file_operations *fops;
+        struct address_space_operations *aops;
+
+       smb = S2SMI(inode->i_sb); 
+       
+       if (smb->ops_check & FILE_OPS_CHECK) 
+               return; 
+       smb->ops_check |= FILE_OPS_CHECK;
+
+       iops = cache_fiops(&smfs_operations);
+       fops = cache_ffops(&smfs_operations);
+       aops = cache_faops(&smfs_operations);
+
+       memset(iops , 0 , sizeof (struct inode_operations));    
+       memset(fops , 0 , sizeof (struct file_operations));     
+       memset(aops , 0 , sizeof (struct address_space_operations));    
+       
+       if (cache_inode->i_op) {
+               if (cache_inode->i_op->create) 
+                       iops->create = cache_iops->create;
+               if (cache_inode->i_op->create_it) 
+                       iops->create_it = cache_iops->create_it;
+               if (cache_inode->i_op->lookup)
+                       iops->lookup = cache_iops->lookup;
+               if (cache_inode->i_op->lookup_raw)
+                       iops->lookup_raw = cache_iops->lookup_raw;
+               if (cache_inode->i_op->lookup_it)
+                       iops->lookup_it = cache_iops->lookup_it;
+               if (cache_inode->i_op->link)
+                       iops->link = cache_iops->link;
+               if (cache_inode->i_op->link_raw)
+                       iops->link_raw = cache_iops->link_raw;
+               if (cache_inode->i_op->unlink)
+                       iops->unlink = cache_iops->unlink;
+               if (cache_inode->i_op->unlink_raw)
+                       iops->unlink_raw = cache_iops->unlink_raw;
+               if (cache_inode->i_op->symlink)
+                       iops->symlink = cache_iops->symlink;
+               if (cache_inode->i_op->symlink_raw)
+                       iops->symlink_raw = cache_iops->symlink_raw;
+               if (cache_inode->i_op->mkdir)
+                       iops->mkdir = cache_iops->mkdir;
+               if (cache_inode->i_op->mkdir_raw)
+                       iops->mkdir_raw = cache_iops->mkdir_raw;
+               if (cache_inode->i_op->rmdir)
+                       iops->rmdir = cache_iops->rmdir;
+               if (cache_inode->i_op->rmdir_raw)
+                       iops->rmdir_raw = cache_iops->rmdir_raw;
+               if (cache_inode->i_op->mknod)
+                       iops->mknod = cache_iops->mknod;
+               if (cache_inode->i_op->mknod_raw)
+                       iops->mknod_raw = cache_iops->mknod_raw;
+               if (cache_inode->i_op->rename)
+                       iops->rename = cache_iops->rename;
+               if (cache_inode->i_op->rename_raw)
+                       iops->rename_raw = cache_iops->rename_raw;
+               if (cache_inode->i_op->readlink)
+                       iops->readlink = cache_iops->readlink;
+               if (cache_inode->i_op->follow_link)
+                       iops->follow_link = cache_iops->follow_link;
+               if (cache_inode->i_op->truncate)
+                       iops->truncate = cache_iops->truncate;
+               if (cache_inode->i_op->permission)
+                       iops->permission = cache_iops->permission;
+               if (cache_inode->i_op->revalidate)
+                       iops->revalidate = cache_iops->revalidate;
+               if (cache_inode->i_op->revalidate_it)
+                       iops->revalidate_it = cache_iops->revalidate_it;
+               if (cache_inode->i_op->setattr)
+                       iops->setattr = cache_iops->setattr;
+               if (cache_inode->i_op->setattr_raw)
+                       iops->setattr_raw = cache_iops->setattr_raw;
+               if (cache_inode->i_op->getattr)
+                       iops->getattr = cache_iops->getattr;
+               if (cache_inode->i_op->setxattr)
+                       iops->setxattr = cache_iops->setxattr;
+               if (cache_inode->i_op->getxattr)
+                       iops->getxattr = cache_iops->getxattr;
+               if (cache_inode->i_op->listxattr)
+                       iops->setxattr = cache_iops->setxattr;
+               if (cache_inode->i_op->removexattr)
+                       iops->removexattr = cache_iops->removexattr;
+       }
+       if (cache_inode->i_fop) {
+       
+       }       
+       if (cache_inode->i_mapping && cache_inode->i_mapping->a_ops) {
+       
+       }
+       return;
+}
+void sm_setup_inode_ops(struct inode *cache_inode, struct inode *inode)
+{
+        /* XXX now set the correct snap_{file,dir,sym}_iops */
+        if (S_ISDIR(inode->i_mode)) {
+                inode->i_op = cache_diops(&smfs_operations);
+                inode->i_fop = cache_dfops(&smfs_operations);
+        } else if (S_ISREG(inode->i_mode)) {
+                if (!cache_fiops(&smfs_operations) ) {
+                       setup_sm_file_ops(cache_inode, inode,
+                                              &smfs_file_iops,
+                                              &smfs_file_fops,
+                                              &smfs_file_aops);
+                }
+                CDEBUG(D_INODE, "inode %lu, i_op at %p\n",
+                       inode->i_ino, inode->i_op);
+                inode->i_fop = cache_ffops(&smfs_operations);
+                inode->i_op = cache_fiops(&smfs_operations);
+                if (inode->i_mapping)
+                        inode->i_mapping->a_ops = cache_faops(&smfs_operations);
+                                                                                                                                                                                                     
+        }
+        else if (S_ISLNK(inode->i_mode)) {
+                if (!cache_siops(&smfs_operations)) {
+                        setup_sm_symlink_ops(cache_inode, inode,
+                                &smfs_sym_iops, &smfs_sym_fops);
+                }
+                inode->i_op = cache_siops(&smfs_operations);
+                inode->i_fop = cache_sfops(&smfs_operations);
+                CDEBUG(D_INODE, "inode %lu, i_op at %p\n",
+                       inode->i_ino, inode->i_op);
+        }
+}
+