* Copyright (C) 2025 Haodong Xia <3394797836@qq.com>
*/
#ifndef _DEFRAG_H
#define _DEFRAG_H
#include <stdint.h>
struct exfat;
struct buffer_desc;
* This structure tracks the linkage of all cluster chains on the device.
*
* In exFAT, a cluster chain is typically represented by:
* - The 'first cluster' field in directory entries (e.g., file/directory start)
* - The rest of the chain maintained by FAT entries
*
* We model this as a linked list with two types of nodes:
* - Virtual Node: Represents the 'first cluster' from directory entries
* - Physical Node: Represents clusters linked by FAT entries
*
* Each chain starts with a Virtual Node, followed by zero or more Physical Nodes.
* The entire structure is maintained as a doubly-linked list using two arrays:
* - 'next_clus': stores forward pointers
* - 'prev_clus': stores backward pointers
*
* Virtual Nodes are placed after Physical Nodes in the arrays.
* Since the number of Virtual Nodes (i.e., number of files/directories)
* is unknown until the file tree is traversed, memory for them is allocated dynamically.
*/
struct cluster_info_set {
uint32_t *next_clus;
uint32_t *prev_clus;
uint32_t num_phys_clus;
uint32_t num_clus_chain;
* Number of cluster chains (Virtual Nodes),
* one per file/directory
*/
};
#define VIRT_SPACE_ALIGN 4096
struct exfat_defrag {
struct exfat *exfat;
struct cluster_info_set clu_info_set;
* Doubly-linked list representing cluster
* chain structure
*/
struct buffer_desc *dentry_buffer;
uint8_t *tmp_clus;
};
#define WATERMARK_1 30
#define WATERMARK_2 70
#endif