static int scfs_inode_set(struct inode *inode, void *opaque) { struct inode *lower_inode = opaque; scfs_set_lower_inode(inode, lower_inode); fsstack_copy_attr_all(inode, lower_inode); fsstack_copy_inode_size(inode, lower_inode); inode->i_ino = lower_inode->i_ino; inode->i_version++; inode->i_mapping->a_ops = &scfs_aops; inode->i_mapping->backing_dev_info = inode->i_sb->s_bdi; if (S_ISLNK(inode->i_mode)) inode->i_op = &scfs_symlink_iops; else if (S_ISDIR(inode->i_mode)) inode->i_op = &scfs_dir_iops; else inode->i_op = &scfs_file_iops; if (S_ISDIR(inode->i_mode)) inode->i_fop = &scfs_dir_fops; else if (special_file(inode->i_mode)) init_special_inode(inode, inode->i_mode, inode->i_rdev); else inode->i_fop = &scfs_file_fops; return SCFS_SUCCESS; }
static void scfs_evict_inode(struct inode *inode) { struct inode *lower_inode; struct scfs_inode_info *sii = SCFS_I(inode); truncate_inode_pages(&inode->i_data, 0); #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) clear_inode(inode); #else end_writeback(inode); #endif /* to conserve memory, evicted inode will throw out the cluster info */ if (sii->cinfo_array) { scfs_cinfo_free(sii, sii->cinfo_array); sii->cinfo_array = NULL; } if (!list_empty(&sii->cinfo_list)) SCFS_PRINT_ERROR("cinfo list is not empty!\n"); lower_inode = scfs_lower_inode(inode); scfs_set_lower_inode(inode, NULL); iput(lower_inode); }