1. <fs/nova/dedup.h>
#ifndef __DEDUP_H
#define __DEDUP_H
#include <linux/slab.h>
#include <linux/uio.h>
#include <linux/uaccess.h>
#include <linux/falloc.h>
#include <asm/mman.h>
#include <linux/radix-tree.h>
#include <linux/list.h>
#include "nova.h"
#include "inode.h"
/* nova_dedup_queue
queue of entries that needs to be deduplicated
*/
struct nova_dedup_queue{
struct nova_file_write_entry *entry_data;
struct list_head list;
};
static struct nova_dedup_queue nova_dedup_queue_head;
/* NOVA_DEDUP_RADIX_TREE_NODE
Leaf node of radix tree, it cotains
the address of the matching
dedup table entry.
*/
struct nova_dedup_radix_tree_node{
loff_t dedup_table_entry;
};
/* nova_dedup_table_entry
Used to read from the dedup_table
size should be 32B
fingerprint: 16B
block_address: 8B
referenc count: 4B
flag: 4B
*/
struct nova_dedup_table_entry{
char fingerprint[16];
loff_t block_address;
int reference_count;
int flag;
};
/* nova_dedup_test
for debugging + test
*/
int nova_dedup_test(struct file *);
#endif
struct nova_dedup_queue를 사용하여 dedup queue의 node들을 선언하였고, head를 선언하였다. pintos에서 그랬던 것처럼 구조체 안에 list가 존재하여 다음 list entry를 찾고 나중에 LIST_ENTRY와 같은 메크로를 사용해서 감싸고 있던 실제 entry를 찾는 것 같다. 우리가 실제 필요한 entry내용은 write_entry임으로 이에 대한 포인터 또한 선언을 한다.
2. <fs/nova/dedup.c>
#include "nova.h"
#include "inode.h"
#include "dedup.h"
extern struct nova_dedup_queue nova_dedup_queue_head;
// Initialize Dedup Queue
int nova_dedup_queue_init(void){
INIT_LIST_HEAD(&nova_dedup_queue_head.list);
nova_dedup_queue_head.entry_data=NULL;
return 0;
}
.
.
.
int nova_dedup_test(struct file * filp){
struct nova_dedup_radix_tree_node temp;
void ** temp2;
struct nova_dedup_radix_tree_node *temp3;
struct address_space *mapping = filp->f_mapping;
struct inode *inode = mapping->host;
struct super_block *sb = inode->i_sb;
struct nova_sb_info *sbi = NOVA_SB(sb);
printk("fs/nova/dedup.c\n");
INIT_RADIX_TREE(&sbi->dedup_tree_fingerprint,GFP_KERNEL);
INIT_RADIX_TREE(&sbi->dedup_tree_address,GFP_KERNEL);
printk("Radix Tree Initialized\n");
// 1. Determine Write Entry
// 1.1 Read Data Pages
// 1.2 For each Data page
// 2. Save Start address of Data Page
// 3. Fingerprint Data Page
// 4. Lookup Fingerprint
// 5.
nova_dedup_queue_init();
printk("Dedup queue initialized\n");
nova_dedup_init_radix_tree_node(&temp,1);
radix_tree_insert(&sbi->dedup_tree_fingerprint,32,&temp);
printk("Inserted!\n");
temp2 = radix_tree_lookup_slot(&sbi->dedup_tree_fingerprint,32);
if(temp2){
printk("Found Entry\n");
temp3 = radix_tree_deref_slot(temp2);
printk("%lld\n",temp3->dedup_table_entry);
}
return 0;
}
Dedup queue를 선언해주는 함수 <nova_dedup_queue_init>을 호출해본다.
3. 결과
성공~
'DeNOVA Test' 카테고리의 다른 글
9. Dedup Queue remove (dedup-queue 3부) (0) | 2021.07.21 |
---|---|
8. Dedup Queue insert (dedup-queue 2부) (0) | 2021.07.21 |
6. Radix Tree추가해보기 2부 (실제 코딩) (0) | 2021.07.20 |
5. Radix Tree추가해보기 1부 (Free list로 탐색) (0) | 2021.07.20 |
4. Module 수정 + test (0) | 2021.07.17 |