아무것도 몰라요

DeNOVA Test

7. Dedup Queue 선언해보기(dedup-queue 1부)

telomere37 2021. 7. 21. 12:03

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. 결과

Dedup queue initialized!

성공~