From d8f035dc69b6b6cd22770150ce89366fa5a1744f Mon Sep 17 00:00:00 2001 From: Mark Poliakov Date: Thu, 2 Jan 2025 21:34:42 +0200 Subject: [PATCH] ext2: don't try freeing fastlink "blocks" --- kernel/driver/fs/ext2/src/inode/mod.rs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/kernel/driver/fs/ext2/src/inode/mod.rs b/kernel/driver/fs/ext2/src/inode/mod.rs index ec510959..62ffbf8e 100644 --- a/kernel/driver/fs/ext2/src/inode/mod.rs +++ b/kernel/driver/fs/ext2/src/inode/mod.rs @@ -1,6 +1,7 @@ use core::cmp::Ordering; use libk::error::Error; +use yggdrasil_abi::io::FileType; use crate::{ data::{FsReadonlyFeatures, DIRECT_BLOCK_COUNT}, @@ -244,8 +245,23 @@ impl Inode { // TODO check max inode size - let new_blocks = size.div_ceil(fs.block_size as u64); - let old_blocks = self.size(fs).div_ceil(fs.block_size as u64); + let is_symlink = self + .mode + .node_type() + .map(|ty| ty == FileType::Symlink) + .unwrap_or(false); + + let new_blocks = if is_symlink && size < 60 { + 0 + } else { + size.div_ceil(fs.block_size as u64) + }; + // TODO check size_upper as well? + let old_blocks = if is_symlink && self.size_lower < 60 { + 0 + } else { + self.size(fs).div_ceil(fs.block_size as u64) + }; if new_blocks as usize > DIRECT_BLOCK_COUNT