Whamcloud - gitweb
smash the HEAD with the contents of b_cmd. HEAD_PRE_CMD_SMASH and
[fs/lustre-release.git] / lustre / smfs / inode.c
index ae985c3..117d503 100644 (file)
 #include <linux/fs.h>
 #include <linux/slab.h>
 #include <linux/string.h>
+#include <linux/lustre_idl.h>
 #include "smfs_internal.h" 
 
-void duplicate_inode(struct inode *cache_inode, struct inode *inode)
+static void duplicate_inode(struct inode *dst_inode, 
+                    struct inode *src_inode) 
 {
-       
-       inode->i_mode = cache_inode->i_mode;
-       inode->i_uid = cache_inode->i_uid;
-       inode->i_gid = cache_inode->i_gid;
-
-       inode->i_nlink = cache_inode->i_nlink;
-       inode->i_size = cache_inode->i_size;
-       inode->i_atime = cache_inode->i_atime;
-       inode->i_ctime = cache_inode->i_ctime;
-       inode->i_mtime = cache_inode->i_mtime;
-       inode->i_blksize = cache_inode->i_blksize; /* This is the optimal IO size
-                                        * (for stat), not the fs block
-                                        * size */  
-       inode->i_blocks = cache_inode->i_blocks;
-       inode->i_version = cache_inode->i_version;
-       inode->i_state = cache_inode->i_state;
+       dst_inode->i_mode = src_inode->i_mode;
+       dst_inode->i_uid = src_inode->i_uid;
+       dst_inode->i_gid = src_inode->i_gid;
+       dst_inode->i_nlink = src_inode->i_nlink;
+       dst_inode->i_size = src_inode->i_size;
+       dst_inode->i_atime = src_inode->i_atime;
+       dst_inode->i_ctime = src_inode->i_ctime;
+       dst_inode->i_mtime = src_inode->i_mtime;
+       dst_inode->i_blksize = src_inode->i_blksize;  
+       dst_inode->i_blocks = src_inode->i_blocks;
+       dst_inode->i_version = src_inode->i_version;
+       dst_inode->i_state = src_inode->i_state;
+}
+
+void post_smfs_inode(struct inode *inode, 
+                    struct inode *cache_inode)
+{
+       if (inode && cache_inode) {
+               duplicate_inode(inode, cache_inode);
+               /*Here we must release the cache_inode,
+                *Otherwise we will have no chance to
+                *do it
+                */
+               cache_inode->i_state &=~I_LOCK; 
+       }
 }
+void pre_smfs_inode(struct inode *inode,
+                   struct inode *cache_inode)
+{
+       if (inode && cache_inode) {
+               duplicate_inode(cache_inode, inode);
+       }
+}
+
 static void smfs_read_inode(struct inode *inode)
 {
        struct super_block *cache_sb;
@@ -49,7 +68,7 @@ static void smfs_read_inode(struct inode *inode)
        if(cache_sb && cache_sb->s_op->read_inode)
                cache_sb->s_op->read_inode(cache_inode);
 
-       duplicate_inode(cache_inode, inode);
+       post_smfs_inode(inode, cache_inode);
        sm_set_inode_ops(cache_inode, inode);
        
        CDEBUG(D_INODE, "read_inode ino %lu icount %d \n", 
@@ -58,6 +77,7 @@ static void smfs_read_inode(struct inode *inode)
        iput(cache_inode);      
        return; 
 }
+
 /* Although some filesystem(such as ext3) do not have
  * clear_inode method, but we need it to free the 
  * cache inode 
@@ -114,7 +134,7 @@ static void smfs_delete_inode(struct inode *inode)
                atomic_dec(&cache_inode->i_count);
        }
        
-       duplicate_inode(inode, cache_inode); 
+       pre_smfs_inode(inode, cache_inode);
        
        list_del(&cache_inode->i_hash);
         INIT_LIST_HEAD(&cache_inode->i_hash);
@@ -127,7 +147,7 @@ static void smfs_delete_inode(struct inode *inode)
        if (cache_sb->s_op->delete_inode)
                cache_sb->s_op->delete_inode(cache_inode);
 
-       duplicate_inode(cache_inode, inode); 
+       post_smfs_inode(inode, cache_inode);
        
        I2CI(inode) = NULL;
        return;
@@ -144,10 +164,12 @@ static void smfs_write_inode(struct inode *inode, int wait)
        if (!cache_inode || !cache_sb)
                return;
                
+       pre_smfs_inode(inode, cache_inode);
+       
        if (cache_sb->s_op->write_inode)
                cache_sb->s_op->write_inode(cache_inode, wait);
 
-       duplicate_inode(cache_inode, inode); 
+       post_smfs_inode(inode, cache_inode);
        
        return;
 }
@@ -163,10 +185,11 @@ static void smfs_dirty_inode(struct inode *inode)
        if (!cache_inode || !cache_sb)
                return;
                
+       pre_smfs_inode(inode, cache_inode);
        if (cache_sb->s_op->dirty_inode)
                cache_sb->s_op->dirty_inode(cache_inode);
 
-       duplicate_inode(cache_inode, inode); 
+       post_smfs_inode(inode, cache_inode);
        return;
 }