use crate::passthrough::file_handle::SerializableFileHandle;
use crate::passthrough::inode_store::Inode as InodeId;
use crate::passthrough::Handle as HandleId;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Deserialize, Serialize)]
pub(super) enum PassthroughFs {
V1(PassthroughFsV1),
V2(PassthroughFsV2),
}
#[derive(Debug, Deserialize, Serialize)]
pub(super) struct PassthroughFsV1 {
pub(super) inodes: Vec<Inode>,
pub(super) next_inode: u64,
pub(super) handles: Vec<Handle>,
pub(super) next_handle: u64,
pub(super) negotiated_opts: NegotiatedOpts,
}
#[derive(Debug, Deserialize, Serialize)]
pub(super) struct PassthroughFsV2 {
pub(super) v1: PassthroughFsV1,
pub(super) mount_paths: HashMap<u64, String>,
}
#[derive(Debug, Deserialize, Serialize)]
pub(super) struct NegotiatedOpts {
pub(super) writeback: bool,
pub(super) announce_submounts: bool,
pub(super) posix_acl: bool,
pub(super) sup_group_extension: bool,
}
#[derive(Debug, Deserialize, Serialize)]
pub(super) struct Inode {
pub(super) id: InodeId,
pub(super) refcount: u64,
pub(super) location: InodeLocation,
pub(super) file_handle: Option<SerializableFileHandle>,
}
#[derive(Debug, Deserialize, Serialize)]
pub(super) enum InodeLocation {
RootNode,
Path {
parent: InodeId,
filename: String,
},
Invalid,
FullPath {
filename: String,
},
FileHandle {
handle: SerializableFileHandle,
},
}
#[derive(Debug, Deserialize, Serialize)]
pub(super) struct Handle {
pub(super) id: HandleId,
pub(super) inode: InodeId,
pub(super) source: HandleSource,
}
#[derive(Debug, Deserialize, Serialize)]
pub(super) enum HandleSource {
OpenInode {
flags: i32,
},
}