Skip to content

Commit 81dcb2c

Browse files
committed
🐛 minix 文件名匹配
1 parent 658cc39 commit 81dcb2c

File tree

5 files changed

+21
-18
lines changed

5 files changed

+21
-18
lines changed

src/fs/minix/minix.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,7 @@ int minix_readdir(inode_t *inode, dentry_t *entry, size_t count, off_t offset)
509509
return ret;
510510

511511
entry->length = sizeof(mentry);
512-
entry->namelen = strnlen(mentry.name, NAME_LEN);
512+
entry->namelen = strnlen(mentry.name, MINIX1_NAME_LEN);
513513
memcpy(entry->name, mentry.name, entry->namelen + 1);
514514
entry->name[entry->namelen] = 0;
515515
entry->nr = mentry.nr;
@@ -615,7 +615,7 @@ static buffer_t *find_entry(inode_t *dir, const char *name, char **next, minix_d
615615
buf = bread(dir->dev, block, BLOCK_SIZE);
616616
entry = (minix_dentry_t *)buf->data;
617617
}
618-
if (match_name(name, entry->name, next) && entry->nr)
618+
if (match_name(name, entry->name, next, MINIX1_NAME_LEN) && entry->nr)
619619
{
620620
*result = entry;
621621
return buf;
@@ -638,7 +638,7 @@ static buffer_t *add_entry(inode_t *dir, const char *name, minix_dentry_t **resu
638638
}
639639

640640
// name 中不能有分隔符
641-
for (size_t i = 0; i < NAME_LEN && name[i]; i++)
641+
for (size_t i = 0; i < MINIX1_NAME_LEN && name[i]; i++)
642642
{
643643
assert(!IS_SEPARATOR(name[i]));
644644
}
@@ -668,7 +668,7 @@ static buffer_t *add_entry(inode_t *dir, const char *name, minix_dentry_t **resu
668668
if (entry->nr)
669669
continue;
670670

671-
strncpy(entry->name, name, NAME_LEN);
671+
strncpy(entry->name, name, MINIX1_NAME_LEN);
672672

673673
buf->dirty = true;
674674
dir->mtime = minode->mtime = time();

src/fs/minix/minix.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
#include <onix/fs.h>
55
#include <onix/buffer.h>
66

7-
#define BLOCK_SIZE 1024 // 块大小
8-
#define SECTOR_SIZE 512 // 扇区大小
7+
#define BLOCK_SIZE 1024 // 块大小
8+
#define SECTOR_SIZE 512 // 扇区大小
99
#define BLOCK_SECS (BLOCK_SIZE / SECTOR_SIZE) // 一块占 2 个扇区
1010

1111
#define MINIX1_MAGIC 0x137F // 文件系统魔数
12-
#define NAME_LEN 14 // 文件名长度
12+
#define MINIX1_NAME_LEN 14 // 文件名长度
1313

1414
#define BLOCK_BITS (BLOCK_SIZE * 8) // 块位图大小
1515
#define BLOCK_INODES (BLOCK_SIZE / sizeof(minix_inode_t)) // 块 inode 数量
@@ -25,7 +25,7 @@
2525
#define P_READ IROTH
2626
#define P_WRITE IWOTH
2727

28-
#define ACC_MODE(x) ("\004\002\006\377"[(x)&O_ACCMODE])
28+
#define ACC_MODE(x) ("\004\002\006\377"[(x) & O_ACCMODE])
2929

3030
typedef struct minix_super_t
3131
{
@@ -53,8 +53,8 @@ typedef struct minix_inode_t
5353
// 文件目录项结构
5454
typedef struct minix_dentry_t
5555
{
56-
u16 nr; // i 节点
57-
char name[NAME_LEN]; // 文件名
56+
u16 nr; // i 节点
57+
char name[MINIX1_NAME_LEN]; // 文件名
5858
} minix_dentry_t;
5959

6060
#endif

src/fs/namei.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,18 @@
1010
#define LOGK(fmt, args...) DEBUGK(fmt, ##args)
1111

1212
// 判断文件名是否相等
13-
bool match_name(const char *name, const char *entry_name, char **next)
13+
bool match_name(const char *name, const char *entry_name, char **next, int count)
1414
{
1515
char *lhs = (char *)name;
1616
char *rhs = (char *)entry_name;
17-
while (*lhs == *rhs && *lhs != EOS && *rhs != EOS)
17+
18+
while (*lhs == *rhs && *lhs != EOS && *rhs != EOS && count--)
1819
{
1920
lhs++;
2021
rhs++;
2122
}
22-
if (*rhs)
23+
24+
if (*rhs && count)
2325
return false;
2426
if (*lhs && !IS_SEPARATOR(*lhs))
2527
return false;
@@ -67,7 +69,7 @@ inode_t *named(char *pathname, char **next)
6769
while (true)
6870
{
6971
// 返回上一级目录且上一级目录是个挂载点
70-
if (match_name(name, "..", next) && dir == dir->super->iroot)
72+
if (match_name(name, "..", next, 3) && dir == dir->super->iroot)
7173
{
7274
super_t *super = dir->super;
7375
inode = super->imount;
@@ -113,7 +115,7 @@ inode_t *namei(char *pathname)
113115
inode_t *inode = NULL;
114116

115117
// 返回上一级目录且上一级目录是个挂载点
116-
if (match_name(name, "..", &next) && dir == dir->super->iroot)
118+
if (match_name(name, "..", &next, 3) && dir == dir->super->iroot)
117119
{
118120
super_t *super = dir->super;
119121
inode = super->imount;

src/include/onix/fs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,6 @@ void put_file(file_t *file);
172172
#define P_READ IROTH
173173
#define P_WRITE IWOTH
174174

175-
bool match_name(const char *name, const char *entry_name, char **next);
175+
bool match_name(const char *name, const char *entry_name, char **next, int count);
176176

177177
#endif

src/kernel/memory.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,8 +278,9 @@ void mapping_init()
278278
page_entry_t *tentry = &pte[tidx];
279279
entry_init(tentry, index);
280280
tentry->user = USER_MEMORY; // 只能被内核访问
281-
if(memory_map[index] == 0) free_pages--;
282-
memory_map[index] = 1; // 设置物理内存数组,该页被占用
281+
if (memory_map[index] == 0)
282+
free_pages--;
283+
memory_map[index] = 1; // 设置物理内存数组,该页被占用
283284
}
284285
}
285286

0 commit comments

Comments
 (0)