From b9c4efcb0fd63aedb9955593ceafec0fc84af3af Mon Sep 17 00:00:00 2001 From: fslongjin Date: Sat, 21 May 2022 19:31:24 +0800 Subject: [PATCH] =?UTF-8?q?bugfix:=20=E5=AD=98=E5=82=A8=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E7=9A=84=E5=86=85=E5=AD=98=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E4=B8=AD=E5=B7=B2=E7=BB=8F=E5=90=AB=E6=9C=89=E8=84=8F=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=97=B6=EF=BC=8C=E6=96=87=E4=BB=B6=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E4=BC=9A=E5=87=BA=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/filesystem/fat32/fat32.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/kernel/filesystem/fat32/fat32.c b/kernel/filesystem/fat32/fat32.c index a95f643c..65d06044 100644 --- a/kernel/filesystem/fat32/fat32.c +++ b/kernel/filesystem/fat32/fat32.c @@ -343,6 +343,11 @@ find_lookup_success:; // 找到目标dentry finode->write_date = tmp_dEntry->DIR_WrtDate; finode->write_time = tmp_dEntry->DIR_WrtTime; + // 暂时使用fat32的高4bit来标志设备文件 + // todo: 引入devfs后删除这段代码 + if ((tmp_dEntry->DIR_FstClusHI >> 12) && (p->attribute & VFS_ATTR_FILE)) + p->attribute |= VFS_ATTR_DEVICE; + dest_dentry->dir_inode = p; kfree(buf); return dest_dentry; @@ -486,7 +491,6 @@ void fat32_write_inode(struct vfs_index_node_t *inode) // 计算目标inode对应数据区的LBA地址 uint64_t fLBA = fsbi->first_data_sector + (finode->dEntry_location_clus - 2) * fsbi->sec_per_clus; - struct fat32_Directory_t *buf = (struct fat32_Directory_t *)kmalloc(fsbi->bytes_per_clus, 0); memset(buf, 0, fsbi->bytes_per_clus); ahci_operation.transfer(AHCI_CMD_READ_DMA_EXT, fLBA, fsbi->sec_per_clus, (uint64_t)buf, fsbi->ahci_ctrl_num, fsbi->ahci_port_num); @@ -499,7 +503,6 @@ void fat32_write_inode(struct vfs_index_node_t *inode) fdEntry->DIR_FstClusLO = finode->first_clus & 0xffff; fdEntry->DIR_FstClusHI = (finode->first_clus >> 16) | (fdEntry->DIR_FstClusHI & 0xf000); - // 将dir entry写回磁盘 ahci_operation.transfer(AHCI_CMD_WRITE_DMA_EXT, fLBA, fsbi->sec_per_clus, (uint64_t)buf, fsbi->ahci_ctrl_num, fsbi->ahci_port_num); @@ -841,10 +844,10 @@ long fat32_lseek(struct vfs_file_t *file_ptr, long offset, long whence) break; } - if(pos<0||pos>file_ptr->dEntry->dir_inode->file_size) + if (pos < 0 || pos > file_ptr->dEntry->dir_inode->file_size) return -EOVERFLOW; file_ptr->position = pos; - + // kdebug("fat32 lseek -> position=%d", file_ptr->position); return pos; }