From 0facf623d638816d7d01a700e19a52c3c16a8fa1 Mon Sep 17 00:00:00 2001 From: LoGin Date: Thu, 9 Nov 2023 00:10:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=96=87=E4=BB=B6open?= =?UTF-8?q?=E5=92=8C=E5=86=99=E5=85=A5=E7=9A=84=E9=94=99=E8=AF=AF=20(#429)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 修正文件open的时候可能错误的把inode清空的问题(如果当前inode是mknod创建的) 2. 修正fat和block device中,对文件写入部分的错误问题 --- kernel/src/driver/base/block/block_device.rs | 2 +- kernel/src/filesystem/fat/entry.rs | 2 +- kernel/src/filesystem/vfs/syscall.rs | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/kernel/src/driver/base/block/block_device.rs b/kernel/src/driver/base/block/block_device.rs index 42281b7d..712138fc 100644 --- a/kernel/src/driver/base/block/block_device.rs +++ b/kernel/src/driver/base/block/block_device.rs @@ -261,7 +261,7 @@ pub trait BlockDevice: Device { let mut temp = Vec::new(); temp.resize(1usize << self.blk_size_log2(), 0); // 由于块设备每次读写都是整块的,在不完整写入之前,必须把不完整的地方补全 - self.write_at(range.lba_start, 1, &mut temp[..])?; + self.read_at(range.lba_start, 1, &mut temp[..])?; // 把数据从临时buffer复制到目标buffer temp[range.begin..range.end].copy_from_slice(&buf_slice); self.write_at(range.lba_start, 1, &temp[..])?; diff --git a/kernel/src/filesystem/fat/entry.rs b/kernel/src/filesystem/fat/entry.rs index 021c9c5e..30135a3d 100644 --- a/kernel/src/filesystem/fat/entry.rs +++ b/kernel/src/filesystem/fat/entry.rs @@ -198,7 +198,7 @@ impl FATFile { // 计算本次写入位置在磁盘上的偏移量 let offset = fs.cluster_bytes_offset(current_cluster) + in_cluster_bytes_offset; // 写入磁盘 - let w: usize = fs.partition.disk().write_at( + let w: usize = fs.partition.disk().write_at_bytes( offset as usize, end_len, &buf[start..start + end_len], diff --git a/kernel/src/filesystem/vfs/syscall.rs b/kernel/src/filesystem/vfs/syscall.rs index f62f2eea..80a1cb6a 100644 --- a/kernel/src/filesystem/vfs/syscall.rs +++ b/kernel/src/filesystem/vfs/syscall.rs @@ -191,14 +191,6 @@ impl Syscall { return Err(SystemError::ENOTDIR); } - // 如果O_TRUNC,并且,打开模式包含O_RDWR或O_WRONLY,清空文件 - if mode.contains(FileMode::O_TRUNC) - && (mode.contains(FileMode::O_RDWR) || mode.contains(FileMode::O_WRONLY)) - && file_type == FileType::File - { - inode.truncate(0)?; - } - // 创建文件对象 let mut file: File = File::new(inode, mode)?; @@ -207,6 +199,14 @@ impl Syscall { if mode.contains(FileMode::O_APPEND) { file.lseek(SeekFrom::SeekEnd(0))?; } + + // 如果O_TRUNC,并且,打开模式包含O_RDWR或O_WRONLY,清空文件 + if mode.contains(FileMode::O_TRUNC) + && (mode.contains(FileMode::O_RDWR) || mode.contains(FileMode::O_WRONLY)) + && file_type == FileType::File + { + file.ftruncate(0)?; + } // 把文件对象存入pcb let r = ProcessManager::current_pcb() .fd_table()