use crate::dedup::dedup::DDT;
use crate::fscore::structs::{Blkptr, DnodePhys};
pub struct ReflinkEngine;
impl ReflinkEngine {
pub fn entangle(src_dnode: &DnodePhys, dest_dnode: &mut DnodePhys) -> Result<(), &'static str> {
if src_dnode.indirection_levels != dest_dnode.indirection_levels
&& dest_dnode.used_bytes > 0
{
return Err("Destination not empty");
}
dest_dnode.nblkptr = src_dnode.nblkptr;
dest_dnode.indirection_levels = src_dnode.indirection_levels;
dest_dnode.max_blkid = src_dnode.max_blkid;
dest_dnode.used_bytes = src_dnode.used_bytes;
for i in 0..3 {
dest_dnode.blkptr[i] = src_dnode.blkptr[i];
if !src_dnode.blkptr[i].is_hole() {
Self::increment_ref_tree(&src_dnode.blkptr[i]);
}
}
crate::lcpfs_println!("[ QUANTUM] Entanglement Complete. 0 bytes copied.");
Ok(())
}
fn increment_ref_tree(bp: &Blkptr) {
let dva = bp.dva[0];
let mut ddt = DDT.lock();
if let Some(entry) = ddt.table.values_mut().find(|e| e.dva == dva) {
entry.ref_count += 1;
} else {
}
}
}