Whamcloud - gitweb
update snapfs 1. setup inode_ops and init filter_data of indirect inode after create...
authorwangdi <wangdi>
Mon, 12 Jan 2004 16:58:41 +0000 (16:58 +0000)
committerwangdi <wangdi>
Mon, 12 Jan 2004 16:58:41 +0000 (16:58 +0000)
lustre/snapfs/clonefs.c
lustre/snapfs/inode.c
lustre/snapfs/snap.c
lustre/snapfs/snapfs_internal.h

index 66d3862..ed378f2 100644 (file)
@@ -106,6 +106,7 @@ static void clonefs_read_inode(struct inode *inode)
                inode->i_op = &clonefs_file_inode_ops;
                if (inode->i_mapping)
                        inode->i_mapping->a_ops = &clonefs_file_address_ops;
+               inode->i_fop = &clonefs_file_file_ops;
        } else if (S_ISDIR(inode->i_mode)) {
                inode->i_op = &clonefs_dir_inode_ops;
                inode->i_fop = &clonefs_dir_file_ops;
@@ -189,8 +190,8 @@ static void d_unalloc(struct dentry *dentry)
  */
 struct dentry *clonefs_lookup(struct inode *dir,  struct dentry *dentry)
 {
-       struct inode            *cache_dir;
-       struct dentry           *cache_dentry;
+       struct inode            *cache_dir = NULL;
+       struct dentry           *cache_dentry = NULL, *tmp = NULL;
        struct inode            *cache_inode;
        struct dentry           *result;
        struct inode            *inode;
@@ -199,15 +200,22 @@ struct dentry *clonefs_lookup(struct inode *dir,  struct dentry *dentry)
        ENTRY;
 
        cache_dir = clonefs_get_inode(dir); 
+       if (!cache_dir) 
+               RETURN(ERR_PTR(-ENOENT));
+               
+       tmp = dget(list_entry(cache_dir->i_dentry.next, struct dentry, d_alias));
 
-       cache_dentry = d_alloc(dentry->d_parent, &dentry->d_name);
+       cache_dentry = d_alloc(tmp->d_parent, &dentry->d_name);
+       
        if (!cache_dentry) {
                 iput(cache_dir);
+               dput(tmp);
                RETURN(ERR_PTR(-ENOENT));
        }
 
         /* Lock cache directory inode. */
        down(&cache_dir->i_sem);
+       dput(tmp);
         /*
          * Call underlying fs lookup function to set the 'd_inode' pointer
          * to the corresponding directory inode.
@@ -307,7 +315,7 @@ static int clonefs_readdir(struct file *file, void *dirent,
        struct inode *cache_inode;
         struct file open_file;
        struct dentry open_dentry;
-       struct inode *inode=file->f_dentry->d_inode;
+       struct inode *inode = file->f_dentry->d_inode;
 
        ENTRY;
 
index 2c07000..25619a8 100644 (file)
@@ -71,11 +71,44 @@ void init_filter_data(struct inode *inode,
        i -> generation = snapops->get_generation(inode);
        i -> flags      = flag;
 }
+
+void set_filter_ops(struct snap_cache *cache, struct inode *inode)
+{
+       /* XXX now set the correct snap_{file,dir,sym}_iops */
+       if (S_ISDIR(inode->i_mode)) { 
+               inode->i_op = filter_c2udiops(cache->cache_filter);
+               inode->i_fop = filter_c2udfops(cache->cache_filter);
+       } else if (S_ISREG(inode->i_mode)) {
+               if ( !filter_c2cfiops(cache->cache_filter) ) {
+                       filter_setup_file_ops(cache->cache_filter, inode, 
+                                             &currentfs_file_iops, 
+                                             &currentfs_file_fops, 
+                                             &currentfs_file_aops);
+               }
+               CDEBUG(D_INODE, "inode %lu, i_op at %p\n", 
+                      inode->i_ino, inode->i_op);
+               inode->i_fop = filter_c2uffops(cache->cache_filter);
+               inode->i_op = filter_c2ufiops(cache->cache_filter);
+               if (inode->i_mapping)
+                       inode->i_mapping->a_ops = filter_c2ufaops(cache->cache_filter);
+
+       }
+       else if (S_ISLNK(inode->i_mode)) {
+               if ( !filter_c2csiops(cache->cache_filter) ) {
+                       filter_setup_symlink_ops(cache->cache_filter, inode,
+                               &currentfs_sym_iops, &currentfs_sym_fops);
+               }
+               inode->i_op = filter_c2usiops(cache->cache_filter);
+               inode->i_fop = filter_c2usfops(cache->cache_filter);
+               CDEBUG(D_INODE, "inode %lu, i_op at %p\n", 
+                      inode->i_ino, inode->i_op);
+       }
+}
+
 /* Superblock operations. */
 static void currentfs_read_inode(struct inode *inode)
 {
         struct snap_cache *cache;
-       struct snapshot_operations *snapops;    
        ENTRY;
 
        if( !inode ) 
@@ -94,36 +127,11 @@ static void currentfs_read_inode(struct inode *inode)
                currentfs_dotsnap_read_inode(cache, inode);
                return;
        }
-       snapops = filter_c2csnapops(cache->cache_filter);
-       
-       if (!snapops || !snapops->get_indirect) 
-               return;
 
        if(filter_c2csops(cache->cache_filter))
                filter_c2csops(cache->cache_filter)->read_inode(inode);
 
-       /* XXX now set the correct snap_{file,dir,sym}_iops */
-       if (S_ISDIR(inode->i_mode)) 
-               inode->i_op = filter_c2udiops(cache->cache_filter);
-       else if (S_ISREG(inode->i_mode)) {
-               if ( !filter_c2cfiops(cache->cache_filter) ) {
-                       filter_setup_file_ops(cache->cache_filter, inode, 
-                                             &currentfs_file_iops, 
-                                             &currentfs_file_fops, 
-                                             &currentfs_file_aops);
-               }
-               CDEBUG(D_INODE, "inode %lu, i_op at %p\n", 
-                      inode->i_ino, inode->i_op);
-       }
-       else if (S_ISLNK(inode->i_mode)) {
-               if ( !filter_c2csiops(cache->cache_filter) ) {
-                       filter_setup_symlink_ops(cache->cache_filter, inode,
-                               &currentfs_sym_iops, &currentfs_sym_fops);
-               }
-               inode->i_op = filter_c2usiops(cache->cache_filter);
-               CDEBUG(D_INODE, "inode %lu, i_op at %p\n", 
-                      inode->i_ino, inode->i_op);
-       }
+       set_filter_ops(cache, inode);
        /*init filter_data struct 
         * FIXME flag should be set future*/
        init_filter_data(inode, 0); 
index dba867f..8fcaeaf 100644 (file)
@@ -116,6 +116,8 @@ int snap_do_cow(struct inode *inode, ino_t parent_ino, int del)
        ind = snapops->create_indirect(inode, snap.index, snap.gen, parent_ino, del);
        if(!ind)
                RETURN(-EINVAL);                
+       init_filter_data(ind, 0);
+       set_filter_ops(cache, ind);             
        iput(ind);
        RETURN(0);
 }
index 936f66c..1ac04d7 100644 (file)
@@ -283,7 +283,7 @@ extern struct super_operations currentfs_super_ops;
 void cleanup_filter_info_cache(void);
 int init_filter_info_cache(void);
 extern void init_filter_data(struct inode *inode, int flag);
-
+extern void set_filter_ops(struct snap_cache *cache, struct inode *inode);
 /* dir.c */
 extern struct inode_operations currentfs_dir_iops;
 extern struct file_operations currentfs_dir_fops;
@@ -327,7 +327,6 @@ struct filter_fs {
 #define FILTER_FS_EXT3 1
 #define FILTER_FS_REISER 2
 extern struct filter_fs filter_oppar[FILTER_FS_TYPES];
-
 struct filter_fs *filter_get_filter_fs(const char *cache_type);
 inline struct super_operations *filter_c2usops(struct filter_fs *cache);
 inline struct inode_operations *filter_c2ufiops(struct filter_fs *cache);
@@ -337,12 +336,16 @@ inline struct super_operations *filter_c2csops(struct filter_fs *cache);
 inline struct inode_operations *filter_c2cfiops(struct filter_fs *cache);
 inline struct inode_operations *filter_c2cdiops(struct filter_fs *cache);
 inline struct inode_operations *filter_c2csiops(struct filter_fs *cache);
+inline struct file_operations *filter_c2udfops(struct filter_fs *cache);
 inline struct file_operations *filter_c2cffops(struct filter_fs *cache);
 inline struct file_operations *filter_c2cdfops(struct filter_fs *cache);
 inline struct file_operations *filter_c2csfops(struct filter_fs *cache);
+inline struct file_operations *filter_c2uffops(struct filter_fs *cache);
+inline struct file_operations *filter_c2usfops(struct filter_fs *cache);
 inline struct dentry_operations *filter_c2cdops(struct filter_fs *cache);
 inline struct dentry_operations *filter_c2udops(struct filter_fs *cache);
 inline struct address_space_operations *filter_c2cfaops(struct filter_fs *cache);
+inline struct address_space_operations *filter_c2ufaops(struct filter_fs *cache);
 /* for snapfs */
 inline struct snapshot_operations *filter_c2csnapops(struct filter_fs *cache);