From f7dab9f9965c8568c2110591ed9b2122040a7851 Mon Sep 17 00:00:00 2001 From: fuletian Date: Fri, 11 Jul 2025 15:43:35 +0800 Subject: [PATCH 1/5] 1543 Signed-off-by: fuletian --- fs/hmdfs/inode.c | 29 +++++++++++++++++++++++++++++ fs/hmdfs/inode.h | 3 +++ fs/hmdfs/inode_merge.c | 21 +++++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/fs/hmdfs/inode.c b/fs/hmdfs/inode.c index 33cc8c7419d5..ffa3abbca931 100644 --- a/fs/hmdfs/inode.c +++ b/fs/hmdfs/inode.c @@ -354,4 +354,33 @@ void hmdfs_update_upper_file(struct file *upper_file, struct file *lower_file) i_size_write(upper_file->f_inode, lower_size); truncate_inode_pages(upper_file->f_inode->i_mapping, 0); } +} + +struct dentry *lookup_multi_dir(struct dentry *root_dentry, + const char *name, + unsigned int flags) +{ + struct dentry *current_dentry = root_dentry; + struct dentry *ret_dentry = NULL; + const char *start = name; + const char *end = NULL; + if (*start) { + dget(root_dentry); + } + + while (*start) { + end = strchr(start, '/'); + if (!end) { + end = start + strlen(start); + } + ret_dentry = lookup_one_len(start, current_dentry, end - start); + if (IS_ERR(ret_dentry)) { + dput(current_dentry); + return ret_dentry; + } + dput(current_dentry); + current_dentry = ret_dentry; + start = end; + } + return ret_dentry; } \ No newline at end of file diff --git a/fs/hmdfs/inode.h b/fs/hmdfs/inode.h index fb9bd2929d58..aace13926784 100644 --- a/fs/hmdfs/inode.h +++ b/fs/hmdfs/inode.h @@ -261,4 +261,7 @@ struct inode *hmdfs_iget5_locked_cloud(struct super_block *sb, void hmdfs_update_upper_file(struct file *upper_file, struct file *lower_file); uint32_t make_ino_raw_cloud(uint8_t *cloud_id); +struct dentry *lookup_multi_dir(struct dentry *root_dentry, + const char *name, + unsigned int flags); #endif // INODE_H diff --git a/fs/hmdfs/inode_merge.c b/fs/hmdfs/inode_merge.c index 7c1e1e4f8539..244e800c8da9 100644 --- a/fs/hmdfs/inode_merge.c +++ b/fs/hmdfs/inode_merge.c @@ -350,6 +350,10 @@ static struct hmdfs_dentry_comrade *merge_lookup_comrade( struct path root, path; struct hmdfs_dentry_comrade *comrade = NULL; const struct cred *old_cred = hmdfs_override_creds(sbi->cred); + struct dentry *tmp_dentry = NULL; + struct dentry *p_dentry = NULL; + struct dentry *dentry = NULL; + err = kern_path(sbi->real_dst, LOOKUP_DIRECTORY, &root); if (err) { @@ -362,6 +366,23 @@ static struct hmdfs_dentry_comrade *merge_lookup_comrade( comrade = ERR_PTR(err); goto root_put; } + tmp_dentry = path.dentry; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in merge_lookup_comrade BEFORE dentry_name = %s, node = %lu, d_parent = %x, parent_name = %s", + tmp_dentry->d_name.name, tmp_dentry->d_inode->i_ino, + p_dentry, p_dentry->d_name.name); + + dentry = lookup_multi_dir(sbi->sb->s_root, name, flags); + if (dentry == NULL || IS_ERR(dentry)) { + hmdfs_err("flt :: in merge_lookup_comrade lookup_multi_dir FAILED!"); + } else { + tmp_dentry = dentry; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in merge_lookup_comrade AFTER dentry_name = %s, node = %lu, d_parent = %x, parent_name = %s", + tmp_dentry->d_name.name, tmp_dentry->d_inode->i_ino, + p_dentry, p_dentry->d_name.name); + dput(dentry); + } comrade = alloc_comrade(path.dentry, devid); -- Gitee From fcef903a53e4582f67ccff679a956440a20b094b Mon Sep 17 00:00:00 2001 From: fuletian Date: Fri, 11 Jul 2025 16:42:44 +0800 Subject: [PATCH 2/5] updata Signed-off-by: fuletian --- fs/hmdfs/inode.c | 2 ++ fs/hmdfs/inode_merge.c | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/hmdfs/inode.c b/fs/hmdfs/inode.c index ffa3abbca931..7e15727f4107 100644 --- a/fs/hmdfs/inode.c +++ b/fs/hmdfs/inode.c @@ -373,9 +373,11 @@ struct dentry *lookup_multi_dir(struct dentry *root_dentry, if (!end) { end = start + strlen(start); } + hmdfs_err("flt :: goto lookup_one_len name = %s, len = %d\n", start, end - start); ret_dentry = lookup_one_len(start, current_dentry, end - start); if (IS_ERR(ret_dentry)) { dput(current_dentry); + hmdfs_err("flt :: lookup_one_len failed!"); return ret_dentry; } dput(current_dentry); diff --git a/fs/hmdfs/inode_merge.c b/fs/hmdfs/inode_merge.c index 244e800c8da9..17789840a411 100644 --- a/fs/hmdfs/inode_merge.c +++ b/fs/hmdfs/inode_merge.c @@ -354,7 +354,7 @@ static struct hmdfs_dentry_comrade *merge_lookup_comrade( struct dentry *p_dentry = NULL; struct dentry *dentry = NULL; - + hmdfs_err("flt :: init merge_lookup_comrade, name = %s\n", name); err = kern_path(sbi->real_dst, LOOKUP_DIRECTORY, &root); if (err) { comrade = ERR_PTR(err); @@ -375,6 +375,11 @@ static struct hmdfs_dentry_comrade *merge_lookup_comrade( dentry = lookup_multi_dir(sbi->sb->s_root, name, flags); if (dentry == NULL || IS_ERR(dentry)) { hmdfs_err("flt :: in merge_lookup_comrade lookup_multi_dir FAILED!"); + if (dentry == NULL) { + hmdfs_err("flt :: dentry == NULL"); + } else { + hmdfs_err("flt :: IS_ERR(dentry)"); + } } else { tmp_dentry = dentry; p_dentry = tmp_dentry->d_parent; -- Gitee From d8414fb41f48e8d13cbe5474e23f37576ae8e07b Mon Sep 17 00:00:00 2001 From: fuletian Date: Fri, 11 Jul 2025 17:55:00 +0800 Subject: [PATCH 3/5] updata Signed-off-by: fuletian --- fs/hmdfs/inode.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fs/hmdfs/inode.c b/fs/hmdfs/inode.c index 7e15727f4107..1c50b5972c75 100644 --- a/fs/hmdfs/inode.c +++ b/fs/hmdfs/inode.c @@ -382,7 +382,11 @@ struct dentry *lookup_multi_dir(struct dentry *root_dentry, } dput(current_dentry); current_dentry = ret_dentry; - start = end; + if (*end == '/') { + start = end + 1; + } else { + break; + } } return ret_dentry; } \ No newline at end of file -- Gitee From 7c1cbb331a6bc528715f680deba65de32b82bc05 Mon Sep 17 00:00:00 2001 From: fuletian Date: Fri, 11 Jul 2025 11:34:30 +0000 Subject: [PATCH 4/5] update fs/hmdfs/inode.c. Signed-off-by: fuletian --- fs/hmdfs/inode.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/fs/hmdfs/inode.c b/fs/hmdfs/inode.c index 1c50b5972c75..d244446368fe 100644 --- a/fs/hmdfs/inode.c +++ b/fs/hmdfs/inode.c @@ -382,11 +382,10 @@ struct dentry *lookup_multi_dir(struct dentry *root_dentry, } dput(current_dentry); current_dentry = ret_dentry; - if (*end == '/') { - start = end + 1; - } else { - break; + while (*end == '/') { + end = end + 1; } + start = end; } return ret_dentry; } \ No newline at end of file -- Gitee From 3f259fedbec9446465e33ce36bf3bf5cdb9a4bb5 Mon Sep 17 00:00:00 2001 From: fuletian Date: Fri, 11 Jul 2025 13:05:56 +0000 Subject: [PATCH 5/5] update fs/hmdfs/inode_merge.c. Signed-off-by: fuletian --- fs/hmdfs/inode_merge.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/fs/hmdfs/inode_merge.c b/fs/hmdfs/inode_merge.c index 17789840a411..c37d82d098c3 100644 --- a/fs/hmdfs/inode_merge.c +++ b/fs/hmdfs/inode_merge.c @@ -380,17 +380,21 @@ static struct hmdfs_dentry_comrade *merge_lookup_comrade( } else { hmdfs_err("flt :: IS_ERR(dentry)"); } + dput(dentry); + path_put(&root); + path_put(&path); + return ERR_PTR(PTR_ERR(dentry)); } else { tmp_dentry = dentry; p_dentry = tmp_dentry->d_parent; hmdfs_err("flt :: in merge_lookup_comrade AFTER dentry_name = %s, node = %lu, d_parent = %x, parent_name = %s", tmp_dentry->d_name.name, tmp_dentry->d_inode->i_ino, p_dentry, p_dentry->d_name.name); - dput(dentry); } - comrade = alloc_comrade(path.dentry, devid); + comrade = alloc_comrade(dentry, devid); + dput(dentry); path_put(&path); root_put: path_put(&root); -- Gitee