X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flvfs%2Ffsfilt_snap_smfs.c;h=12e33ef57ac19c839695102e611adff58dc9f7b5;hb=2ef813a8244ea1527395e06645a2f3781cff16cd;hp=764811d481012e5ceecd998652905cb19a427078;hpb=e8fc23a5e634768ed079d9e7e22c0805d4afd392;p=fs%2Flustre-release.git diff --git a/lustre/lvfs/fsfilt_snap_smfs.c b/lustre/lvfs/fsfilt_snap_smfs.c index 764811d..12e33ef 100644 --- a/lustre/lvfs/fsfilt_snap_smfs.c +++ b/lustre/lvfs/fsfilt_snap_smfs.c @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include #include @@ -72,11 +72,13 @@ static struct inode* fsfilt_smfs_create_indirect(struct inode *inode, index, gen, cache_parent, del); post_smfs_inode(inode, cache_inode); post_smfs_inode(inode, cache_parent); - + #if 0 if (cache_ind_inode && !IS_ERR(cache_ind_inode)){ /*FIXME: get indirect inode set_cow flags*/ - ind_inode = iget4(inode->i_sb, cache_ind_inode->i_ino, NULL, 0); - } + ind_inode = smfs_get_inode(inode->i_sb, cache_ind_inode->i_ino, + inode, 0); + } + #endif RETURN(ind_inode); } @@ -102,11 +104,13 @@ static struct inode* fsfilt_smfs_get_indirect(struct inode *inode, cache_ind_inode = snap_fsfilt->fs_get_indirect(cache_inode, table, slot); post_smfs_inode(inode, cache_inode); - +#if 0 if (cache_ind_inode && !IS_ERR(cache_ind_inode)){ /*FIXME: get indirect inode set_cow flags*/ - ind_inode = iget4(inode->i_sb, cache_ind_inode->i_ino, NULL, 0); + ind_inode = smfs_get_inode(inode->i_sb, cache_ind_inode->i_ino, + inode, slot); } +#endif RETURN(ind_inode); } @@ -194,25 +198,20 @@ static int fsfilt_smfs_is_indirect(struct inode *inode) RETURN(rc); } -static ino_t fsfilt_smfs_get_indirect_ino(struct inode *inode, int index) +static ino_t fsfilt_smfs_get_indirect_ino(struct super_block *sb, ino_t ino, + int index) { - struct fsfilt_operations *snap_fsfilt = I2SNAPCOPS(inode); - struct inode *cache_inode = NULL; + struct fsfilt_operations *snap_fsfilt = S2SNAPI(sb)->snap_cache_fsfilt; + struct super_block *csb = S2CSB(sb); int rc = -EIO; ENTRY; if (snap_fsfilt == NULL) RETURN(rc); - cache_inode = I2CI(inode); - if (!cache_inode) - RETURN(rc); - - pre_smfs_inode(inode, cache_inode); if (snap_fsfilt->fs_get_indirect_ino) - rc = snap_fsfilt->fs_get_indirect_ino(cache_inode, index); - post_smfs_inode(inode, cache_inode); - + rc = snap_fsfilt->fs_get_indirect_ino(csb, ino, index); + RETURN(rc); } @@ -322,59 +321,88 @@ static int fsfilt_smfs_copy_block(struct inode *dst, struct inode *src, int blk) RETURN(rc); } -static int fsfilt_smfs_set_snap_info(struct super_block *sb,struct inode *inode, +static int fsfilt_smfs_set_snap_info(struct inode *inode, void* key, __u32 keylen, void *val, __u32 *vallen) { - struct super_block *csb = NULL; - struct inode *cache_inode = NULL; - struct fsfilt_operations *snap_fsfilt = NULL; - int rc = -EIO; - - if (sb) { - csb = S2CSB(sb); - snap_fsfilt = S2SNAPI(sb)->snap_cache_fsfilt; - } else if (inode) { - cache_inode = I2CI(inode); - snap_fsfilt = I2SNAPCOPS(inode); - } + struct fsfilt_operations *snap_fsfilt = I2SNAPCOPS(inode); + struct inode *cache_inode = NULL; + int rc = -EIO; + if (snap_fsfilt == NULL) RETURN(rc); + cache_inode = I2CI(inode); + if (!cache_inode) + RETURN(rc); + + pre_smfs_inode(inode, cache_inode); + if (snap_fsfilt->fs_set_snap_info) - rc = snap_fsfilt->fs_set_snap_info(csb, cache_inode, key, + rc = snap_fsfilt->fs_set_snap_info(cache_inode, key, keylen, val, vallen); - + post_smfs_inode(inode, cache_inode); + RETURN(rc); } -static int fsfilt_smfs_get_snap_info(struct super_block *sb, struct inode *inode, - void *key, __u32 keylen, void *val, - __u32 *vallen) +static int fsfilt_smfs_get_snap_info(struct inode *inode, void *key, + __u32 keylen, void *val, __u32 *vallen) { - struct super_block *csb = NULL; - struct inode *cache_inode = NULL; - struct fsfilt_operations *snap_fsfilt = NULL; + struct fsfilt_operations *snap_fsfilt = I2SNAPCOPS(inode); + struct inode *cache_inode = NULL; int rc = -EIO; - if (sb) { - csb = S2CSB(sb); - snap_fsfilt = S2SNAPI(sb)->snap_cache_fsfilt; - } else if (inode) { - cache_inode = I2CI(inode); - snap_fsfilt = I2SNAPCOPS(inode); - } - if (snap_fsfilt == NULL) RETURN(rc); - + + cache_inode = I2CI(inode); + if (!cache_inode) + RETURN(rc); + if (snap_fsfilt->fs_get_snap_info) - rc = snap_fsfilt->fs_get_snap_info(csb, cache_inode, key, + rc = snap_fsfilt->fs_get_snap_info(cache_inode, key, keylen, val, vallen); - + RETURN(rc); } + +static int fsfilt_smfs_read_dotsnap_dir_page(struct file *file, char *buf, + size_t count, loff_t *off) +{ +#if 0 + struct inode *inode = file->f_dentry->d_inode; + struct fsfilt_operations *snap_cops = I2SNAPCOPS(inode); + int i = 0, size = 0, off_count = 0, buf_off = 0, rc = 0; + ENTRY; + /*Get the offset of dir ent*/ + //struct snap_table *stbl = S2SNAPI(inode->i_sb)->sni_table; + while (size < *off && off_count < stbl->sntbl_count) { + char *name = stbl->sntbl_items[i].sn_name; + size +=snap_cops->fs_dir_ent_size(name); + off_count ++; + } + for (i = off_count; i < stbl->sntbl_count; i++) { + char *name = stbl->sntbl_items[i].sn_name; + rc = snap_cops->fs_set_dir_ent(inode->i_sb, name, buf, buf_off, + rc, count); + if (rc < 0) + break; + + buf_off += rc; + + if (buf_off >= count) + break; + } + if (rc > 0) + rc = 0; +#else +#warning "still not implement read .snap dir page for fsfilt Wangdi" +#endif + RETURN(0); +} + struct fsfilt_operations fsfilt_smfs_snap_ops = { .fs_type = "smfs_snap", .fs_owner = THIS_MODULE, @@ -391,6 +419,7 @@ struct fsfilt_operations fsfilt_smfs_snap_ops = { .fs_copy_block = fsfilt_smfs_copy_block, .fs_set_snap_info = fsfilt_smfs_set_snap_info, .fs_get_snap_info = fsfilt_smfs_get_snap_info, + .fs_read_dotsnap_dir_page = fsfilt_smfs_read_dotsnap_dir_page, };