\documentclass{article}
\usepackage[a4paper,margin=1in]{geometry}
\usepackage{listings}
\usepackage{xcolor}
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{longtable}
\usepackage{titlesec}
\usepackage{fancyhdr}
\usepackage{caption}
\usepackage{graphicx}

\definecolor{codegray}{gray}{0.95}
\lstset{
  backgroundcolor=\color{codegray},
  basicstyle=\ttfamily\small,
  breaklines=true,
  frame=single,
  tabsize=4,
  language=C++,
  showstringspaces=false
}

\title{NeFS: New Extended File System}
\author{Amlal El Mahrouss}
\date{\today}

\begin{document}

\maketitle

\section{Overview}
NeFS (New Extended File System) is am embedded file system designed to operate over low-level block storage (AHCI/ATA) with a modular architecture. It supports catalogs (like files or directories), forks (similar to macOS data/resource forks), and a formatting mechanism using EPM (Extended Partition Map).

\section{Key Components}

\subsection*{Mountpoint and Drive Access}
\begin{itemize}
  \item `kMountpoint`: Global mountpoint interface to access drives.
  \item `DriveTrait`: Interface used to abstract block-level access.
\end{itemize}

\subsection*{Core Structures}
\begin{longtable}{|l|p{11cm}|}
\hline
\textbf{Structure} & \textbf{Purpose} \\
\hline
NEFS\_FORK\_STRUCT & Represents a data fork (stream of bytes attached to a catalog). \\
\hline
NEFS\_CATALOG\_STRUCT & Represents metadata of a file or directory, including fork pointers. \\
\hline
NEFS\_ROOT\_PARTITION\_BLOCK & Metadata describing a NeFS partition. \\
\hline
EPM\_PART\_BLOCK & EPM descriptor for bootable partition support. \\
\hline
\end{longtable}

\subsection*{Key Functions}

\begin{itemize}
  \item \texttt{CreateCatalog()} — Creates a file or directory catalog.
  \item \texttt{CreateFork()} — Adds a fork to a catalog, with LBA linking.
  \item \texttt{FindCatalog()} — Finds a catalog by traversing sibling links.
  \item \texttt{FindFork()} — Locates a fork by name under a catalog.
  \item \texttt{WriteCatalog()} — Writes a fork's data to the correct offset.
  \item \texttt{Format()} — Initializes a NeFS + EPM partition on a drive.
  \item \texttt{ReadCatalog()} — Reads back a fork's data.
  \item \texttt{RemoveCatalog()} — Marks a catalog as deleted and updates partition metadata.
\end{itemize}

\section{Design Overview}

\subsection*{Fork Management}
Forks are chained using `NextSibling` pointers and are scanned linearly to find unallocated entries. Forks contain:
\begin{itemize}
  \item Fork name
  \item Catalog name
  \item Flags (e.g., created/deleted)
  \item Data size and offset
  \item Sibling pointers (Next, Previous)
\end{itemize}

\subsection*{Catalog Management}
Catalogs act like files or directories. Each has:
\begin{itemize}
  \item Name and type (file/dir)
  \item Data and resource forks
  \item Status flags
  \item Chaining via sibling pointers
\end{itemize}
Catalog creation attempts to find a parent first, then finds a free block to allocate the new catalog structure.

\subsection*{Partition Formatting}
The `Format()` function sets up the NeFS partition and optionally writes an EPM descriptor if bootable. It:
\begin{enumerate}
  \item Verifies the drive
  \item Initializes partition metadata (sector size, catalog start, etc.)
  \item Writes the root directory
\end{enumerate}

\section{Error Handling}
Errors are written to a global error register using `err\_global\_get()`. Common codes include:
\begin{itemize}
  \item \texttt{kErrorDiskIsCorrupted}
  \item \texttt{kErrorFileExists}
  \item \texttt{kErrorFileNotFound}
  \item \texttt{kErrorUnimplemented}
\end{itemize}

\section{Limitations and Notes}
\begin{itemize}
  \item No read/write locking or access concurrency.
  \item Assumes in-memory buffers for fork writing.
  \item Seek/Tell operations are not implemented — only bulk read/write.
  \item Supports one mountpoint at a time.
\end{itemize}

\section{Future Work}
\begin{itemize}
  \item Implement streaming I/O with Seek/Tell.
  \item Support multiple mountpoints or drives.
  \item Improve metadata journaling and recovery features.
\end{itemize}

\end{document}
