Fix the panic when a `memfd` file try to get its `container_dev_id`

This commit is contained in:
Chaoqun Zheng 2026-02-01 13:38:15 +08:00
parent e2fe0cb8c8
commit ce6b81c723
2 changed files with 16 additions and 1 deletions

View File

@ -68,6 +68,7 @@ impl RamFs {
typ: InodeType::Dir,
this: weak_root.clone(),
fs: weak_fs.clone(),
dev_id: None,
extension: Extension::new(),
xattr: RamXattr::new(),
}),
@ -118,6 +119,8 @@ pub(super) struct RamInode {
this: Weak<RamInode>,
/// Reference to fs
fs: Weak<RamFs>,
/// Device ID. Used for detached inodes (memfd) that don't have a valid fs reference.
dev_id: Option<DeviceId>,
/// Extensions
extension: Extension,
/// Extended attributes
@ -453,6 +456,7 @@ impl RamInode {
typ: InodeType::Dir,
this: weak_self.clone(),
fs: Arc::downgrade(fs),
dev_id: None,
extension: Extension::new(),
xattr: RamXattr::new(),
})
@ -466,6 +470,7 @@ impl RamInode {
typ: InodeType::File,
this: weak_self.clone(),
fs: Arc::downgrade(fs),
dev_id: None,
extension: Extension::new(),
xattr: RamXattr::new(),
})
@ -474,6 +479,7 @@ impl RamInode {
/// Creates a `RamInode` that is detached from any `RamFs`, and resides in a `MemfdInode`.
pub(super) fn new_file_detached_in_memfd(
weak_self: &Weak<MemfdInode>,
dev_id: DeviceId,
mode: InodeMode,
uid: Uid,
gid: Gid,
@ -485,6 +491,7 @@ impl RamInode {
typ: InodeType::File,
this: Weak::new(),
fs: Weak::new(),
dev_id: Some(dev_id),
extension: Extension::new(),
xattr: RamXattr::new(),
}
@ -498,6 +505,7 @@ impl RamInode {
typ: InodeType::SymLink,
this: weak_self.clone(),
fs: Arc::downgrade(fs),
dev_id: None,
extension: Extension::new(),
xattr: RamXattr::new(),
})
@ -523,6 +531,7 @@ impl RamInode {
typ: dev_type.into(),
this: weak_self.clone(),
fs: Arc::downgrade(fs),
dev_id: None,
extension: Extension::new(),
xattr: RamXattr::new(),
})
@ -536,6 +545,7 @@ impl RamInode {
typ: InodeType::Socket,
this: weak_self.clone(),
fs: Arc::downgrade(fs),
dev_id: None,
extension: Extension::new(),
xattr: RamXattr::new(),
})
@ -549,6 +559,7 @@ impl RamInode {
typ: InodeType::NamedPipe,
this: weak_self.clone(),
fs: Arc::downgrade(fs),
dev_id: None,
extension: Extension::new(),
xattr: RamXattr::new(),
})
@ -1173,7 +1184,10 @@ impl Inode for RamInode {
fn metadata(&self) -> Metadata {
let rdev = self.inner.device_id().unwrap_or(0);
let inode_metadata = self.metadata.lock();
let container_dev_id = self.fs().sb().dev_id;
let container_dev_id = match self.dev_id {
Some(id) => id,
None => self.fs().sb().dev_id,
};
Metadata {
ino: self.ino as _,
size: inode_metadata.size,

View File

@ -251,6 +251,7 @@ impl MemfdInodeHandle for InodeHandle {
let ram_inode = RamInode::new_file_detached_in_memfd(
weak_self,
MemfdTmpFs::singleton().sb().dev_id,
mode,
Uid::new_root(),
Gid::new_root(),