Whamcloud - gitweb
b=7354
authortappro <tappro>
Sun, 21 Aug 2005 22:56:12 +0000 (22:56 +0000)
committertappro <tappro>
Sun, 21 Aug 2005 22:56:12 +0000 (22:56 +0000)
 smfs didn't update backfs file pos with smfs file pos value before operation. This were critical for llog processing in some situations.

lustre/include/linux/lustre_smfs.h
lustre/smfs/file.c
lustre/smfs/fsfilt.c

index e6cede1..6533c2a 100644 (file)
@@ -381,6 +381,26 @@ static inline void duplicate_file(struct file *dst_file, struct file *src_file)
        #endif
        }
 }
+static inline void pre_smfs_file(struct file * file, loff_t *off,
+                                 loff_t **backfs_off)
+{
+               
+        if (off != &file->f_pos)
+                *backfs_off = off;
+        else
+                *backfs_off = &(F2CF(file)->f_pos);
+        
+        F2CF(file)->f_pos = file->f_pos;
+        pre_smfs_inode(file->f_dentry->d_inode, 
+                       I2CI(file->f_dentry->d_inode));
+}
+
+static inline void post_smfs_file(struct file *file)
+{
+        post_smfs_inode(file->f_dentry->d_inode,
+                        I2CI(file->f_dentry->d_inode));
+        duplicate_file(file, F2CF(file));
+}
 
 static inline void duplicate_sb(struct super_block *dst_sb,
                                 struct super_block *src_sb)
index 583bff2..5862589 100644 (file)
@@ -62,33 +62,20 @@ static ssize_t smfs_write(struct file *filp, const char *buf, size_t count,
         LASSERT(cache_inode->i_fop->write);
 
         sfi = F2SMFI(filp);
-
-        if (sfi->magic != SMFS_FILE_MAGIC) 
-                LBUG();
+        LASSERT(sfi->magic == SMFS_FILE_MAGIC);
 
         if (filp->f_flags & O_APPEND)
                 msg.pos = filp->f_dentry->d_inode->i_size;
         
-        pre_smfs_inode(filp->f_dentry->d_inode, cache_inode);
-
+        pre_smfs_file(filp, &msg.pos, &cache_ppos);
         SMFS_PRE_HOOK(filp->f_dentry->d_inode, HOOK_WRITE, &msg);
 
-        if (ppos != &(filp->f_pos)) {
-                cache_ppos = &msg.pos;
-        } else {
-                cache_ppos = &sfi->c_file->f_pos;
-        }
-        
-        *cache_ppos = *ppos;
-
         rc = cache_inode->i_fop->write(sfi->c_file, buf, count,
                                        cache_ppos);
         
         SMFS_POST_HOOK(filp->f_dentry->d_inode, HOOK_WRITE, &msg, rc);
-        
-        post_smfs_inode(filp->f_dentry->d_inode, cache_inode);
+        post_smfs_file(filp);
         *ppos = *cache_ppos;
-        duplicate_file(filp, sfi->c_file);
         
         RETURN(rc);
 }
@@ -110,7 +97,7 @@ int smfs_ioctl(struct inode * inode, struct file * filp,
                 LBUG();
 
         pre_smfs_inode(inode, cache_inode);
-
+        
         rc = cache_inode->i_fop->ioctl(cache_inode, sfi->c_file, cmd, arg);
         
         post_smfs_inode(inode, cache_inode);
@@ -137,21 +124,10 @@ static ssize_t smfs_read(struct file *filp, char *buf,
         if (sfi->magic != SMFS_FILE_MAGIC) 
                 LBUG();
 
-        if (ppos != &(filp->f_pos)) {
-                cache_ppos = &tmp_ppos;
-        } else {
-                cache_ppos = &sfi->c_file->f_pos;
-        }
-        *cache_ppos = *ppos;
-
-        pre_smfs_inode(filp->f_dentry->d_inode, cache_inode);
-
+        pre_smfs_file(filp, ppos, &cache_ppos);
         rc = cache_inode->i_fop->read(sfi->c_file, buf, count, cache_ppos);
+        post_smfs_file(filp);
         
-        *ppos = *cache_ppos;
-        post_smfs_inode(filp->f_dentry->d_inode, cache_inode);
-        duplicate_file(filp, sfi->c_file);
-
         RETURN(rc);
 }
 
index 8190181..a4cf04c 100644 (file)
@@ -266,7 +266,6 @@ static ssize_t fsfilt_smfs_readpage(struct file *file, char *buf,
         struct fsfilt_operations *cache_fsfilt;
         struct smfs_file_info *sfi;
         struct inode *cache_inode;
-        loff_t tmp_ppos;
         loff_t *cache_ppos;
         ssize_t rc = -EIO;
         struct hook_msg msg = {
@@ -287,13 +286,7 @@ static ssize_t fsfilt_smfs_readpage(struct file *file, char *buf,
         if (sfi->magic != SMFS_FILE_MAGIC)
                 BUG();
 
-        if (off != &(file->f_pos))
-                cache_ppos = &tmp_ppos;
-        else
-                cache_ppos = &sfi->c_file->f_pos;
-        *cache_ppos = *off;
-
-        pre_smfs_inode(file->f_dentry->d_inode, cache_inode);
+        pre_smfs_file(file, off, &cache_ppos);
         SMFS_PRE_HOOK(file->f_dentry->d_inode, HOOK_READDIR, &msg);
 
 #if CONFIG_SNAPFS
@@ -318,10 +311,8 @@ static ssize_t fsfilt_smfs_readpage(struct file *file, char *buf,
 
 #endif
         SMFS_POST_HOOK(file->f_dentry->d_inode, HOOK_READDIR, &msg, rc);
-        *off = *cache_ppos;
-        post_smfs_inode(file->f_dentry->d_inode, cache_inode);
-        duplicate_file(file, sfi->c_file);
-
+        post_smfs_file(file);
+        
         RETURN(rc);
 }
 
@@ -448,7 +439,6 @@ static int fsfilt_smfs_read_record(struct file * file, void *buf,
         struct  fsfilt_operations *cache_fsfilt;
         struct  inode *cache_inode;
         struct  smfs_file_info *sfi;
-        loff_t  tmp_ppos;
         loff_t  *cache_ppos;
         ssize_t rc;
 
@@ -458,29 +448,18 @@ static int fsfilt_smfs_read_record(struct file * file, void *buf,
                 RETURN(-EINVAL);
 
         cache_inode = I2CI(file->f_dentry->d_inode);
-
         if (!cache_inode)
                 RETURN(-EINVAL);
 
         sfi = F2SMFI(file);
-        if (sfi->magic != SMFS_FILE_MAGIC) BUG();
-
-        if (offs != &(file->f_pos))
-                cache_ppos = &tmp_ppos;
-        else
-                cache_ppos = &sfi->c_file->f_pos;
-        *cache_ppos = *offs;
-
-        pre_smfs_inode(file->f_dentry->d_inode, cache_inode);
+        LASSERT(sfi->magic == SMFS_FILE_MAGIC);
 
         if (!cache_fsfilt->fs_read_record)
                 RETURN(-ENOSYS);
 
+        pre_smfs_file(file, offs, &cache_ppos);
         rc = cache_fsfilt->fs_read_record(sfi->c_file, buf, size, cache_ppos);
-
-        *offs = *cache_ppos;
-        post_smfs_inode(file->f_dentry->d_inode, cache_inode);
-        duplicate_file(file, sfi->c_file);
+        post_smfs_file(file);
 
         RETURN(rc);
 }
@@ -491,7 +470,6 @@ static int fsfilt_smfs_write_record(struct file *file, void *buf, int bufsize,
         struct  fsfilt_operations *cache_fsfilt;
         struct  inode *cache_inode;
         struct  smfs_file_info *sfi;
-        loff_t  tmp_ppos;
         loff_t  *cache_ppos;
         ssize_t rc = -EIO;
 
@@ -502,30 +480,20 @@ static int fsfilt_smfs_write_record(struct file *file, void *buf, int bufsize,
                 RETURN(-EINVAL);
 
         cache_inode = I2CI(file->f_dentry->d_inode);
-
         if (!cache_inode)
                 RETURN(-EINVAL);
 
         sfi = F2SMFI(file);
-        if (sfi->magic != SMFS_FILE_MAGIC)
-                BUG();
-
-        if (offs != &(file->f_pos))
-                cache_ppos = &tmp_ppos;
-        else
-                cache_ppos = &sfi->c_file->f_pos;
-        *cache_ppos = *offs;
-
-        pre_smfs_inode(file->f_dentry->d_inode, cache_inode);
+        LASSERT(sfi->magic == SMFS_FILE_MAGIC);
 
         if (!cache_fsfilt->fs_write_record)
                 RETURN(-ENOSYS);
-
+        
+        pre_smfs_file(file, offs, &cache_ppos);
         rc = cache_fsfilt->fs_write_record(sfi->c_file, buf,
                                            bufsize, cache_ppos, force_sync);
-        *offs = *cache_ppos;
-        post_smfs_inode(file->f_dentry->d_inode, cache_inode);
-        duplicate_file(file, sfi->c_file);
+
+        post_smfs_file(file);
 
         RETURN(rc);
 }