From f966587ba345ae96ece99059dad26cd2752a21cc Mon Sep 17 00:00:00 2001 From: tappro Date: Sun, 21 Aug 2005 22:56:12 +0000 Subject: [PATCH] b=7354 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 | 20 ++++++++++++++ lustre/smfs/file.c | 36 +++++-------------------- lustre/smfs/fsfilt.c | 54 ++++++++------------------------------ 3 files changed, 37 insertions(+), 73 deletions(-) diff --git a/lustre/include/linux/lustre_smfs.h b/lustre/include/linux/lustre_smfs.h index e6cede1..6533c2a 100644 --- a/lustre/include/linux/lustre_smfs.h +++ b/lustre/include/linux/lustre_smfs.h @@ -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) diff --git a/lustre/smfs/file.c b/lustre/smfs/file.c index 583bff2..5862589 100644 --- a/lustre/smfs/file.c +++ b/lustre/smfs/file.c @@ -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); } diff --git a/lustre/smfs/fsfilt.c b/lustre/smfs/fsfilt.c index 8190181..a4cf04c 100644 --- a/lustre/smfs/fsfilt.c +++ b/lustre/smfs/fsfilt.c @@ -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); } -- 1.8.3.1