From f7dab9f9965c8568c2110591ed9b2122040a7851 Mon Sep 17 00:00:00 2001 From: fuletian Date: Fri, 11 Jul 2025 15:43:35 +0800 Subject: [PATCH 01/17] 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 02/17] 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 03/17] 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 04/17] 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 05/17] 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 From 6f5f65e37b6f49e7bd5029b882ade9bcf326ce3c Mon Sep 17 00:00:00 2001 From: fuletian Date: Sat, 12 Jul 2025 00:44:59 +0000 Subject: [PATCH 06/17] update fs/hmdfs/inode_merge.c. Signed-off-by: fuletian --- fs/hmdfs/inode_merge.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/fs/hmdfs/inode_merge.c b/fs/hmdfs/inode_merge.c index c37d82d098c3..ecdbf7b54024 100644 --- a/fs/hmdfs/inode_merge.c +++ b/fs/hmdfs/inode_merge.c @@ -676,6 +676,9 @@ static int lookup_merge_root(struct inode *root_inode, int buf_len; char *buf = NULL; bool locked, down; + struct dentry *tmp_dentry = NULL; + struct dentry *p_dentry = NULL; + struct dentry *dentry = NULL; // consider additional one slash and one '\0' buf_len = strlen(sbi->real_dst) + 1 + sizeof(DEVICE_VIEW_ROOT); @@ -692,6 +695,28 @@ static int lookup_merge_root(struct inode *root_inode, &path_dev); if (ret) goto free_buf; + tmp_dentry = path_dev.dentry; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in lookup_merge_root 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, DEVICE_VIEW_ROOT, flags); + if (dentry == NULL || IS_ERR(dentry)) { + hmdfs_err("flt :: in lookup_merge_root 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; + hmdfs_err("flt :: in lookup_merge_root 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); + } ret = do_lookup_merge_root(path_dev, child_dentry, flags); path_put(&path_dev); -- Gitee From 4f824288ab790b2a20288d99dce9070793fe73ac Mon Sep 17 00:00:00 2001 From: fuletian Date: Sat, 12 Jul 2025 00:51:00 +0000 Subject: [PATCH 07/17] update fs/hmdfs/inode_merge.c. Signed-off-by: fuletian --- fs/hmdfs/inode_merge.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/fs/hmdfs/inode_merge.c b/fs/hmdfs/inode_merge.c index ecdbf7b54024..ba3a4ed872dc 100644 --- a/fs/hmdfs/inode_merge.c +++ b/fs/hmdfs/inode_merge.c @@ -992,6 +992,10 @@ int hmdfs_create_lower_dentry(struct inode *i_parent, struct dentry *d_child, char *path_name = NULL; struct path path = { .mnt = NULL, .dentry = NULL }; int ret = 0; + struct dentry *tmp_dentry = NULL; + struct dentry *p_dentry = NULL; + struct dentry *dentry = NULL; + char *absolute_path_buf_tmp = kmalloc(PATH_MAX, GFP_KERNEL); if (unlikely(!path_buf || !absolute_path_buf)) { ret = -ENOMEM; @@ -1011,6 +1015,8 @@ int hmdfs_create_lower_dentry(struct inode *i_parent, struct dentry *d_child, sprintf(absolute_path_buf, "%s%s/%s", sbi->real_dst, path_name, d_child->d_name.name); + sprintf(absolute_path_buf_tmp, "%s/%s", path_name, + d_child->d_name.name); if (is_dir) lo_d_child = kern_path_create(AT_FDCWD, absolute_path_buf, @@ -1022,7 +1028,42 @@ int hmdfs_create_lower_dentry(struct inode *i_parent, struct dentry *d_child, ret = PTR_ERR(lo_d_child); goto out; } + tmp_dentry = lo_d_child; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in hmdfs_create_lower_dentry 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); + + if (is_dir) + dentry = lookup_multi_dir(sbi->sb->s_root, absolute_path_buf_tmp, LOOKUP_DIRECTORY); + else + dentry = lookup_multi_dir(sbi->sb->s_root, absolute_path_buf_tmp, 0); + if (dentry == NULL || IS_ERR(dentry)) { + hmdfs_err("flt :: in hmdfs_create_lower_dentry lookup_multi_dir FAILED!"); + } else if (d_is_positive(dentry)) { + hmdfs_err("flt :: in hmdfs_create_lower_dentry EXIST!"); + dput(dentry); + } else { + tmp_dentry = dentry; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in hmdfs_create_lower_dentry 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); + } + kfree(absolute_path_buf_tmp); // to ensure link_comrade after vfs_mkdir succeed + tmp_dentry = path.dentry; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in hmdfs_create_lower_dentry goto next 11111 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); + tmp_dentry = lo_d_parent; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in hmdfs_create_lower_dentry goto next 22222 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); + ret = hmdfs_do_ops_merge(i_parent, d_child, lo_d_child, path, rec_op_para); if (ret) -- Gitee From 0699b72bfd4c2e586d40105a02a062adbc9386a4 Mon Sep 17 00:00:00 2001 From: fuletian Date: Sat, 12 Jul 2025 02:18:44 +0000 Subject: [PATCH 08/17] update fs/hmdfs/inode_merge.c. Signed-off-by: fuletian --- fs/hmdfs/inode_merge.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/fs/hmdfs/inode_merge.c b/fs/hmdfs/inode_merge.c index ba3a4ed872dc..56305c2b3070 100644 --- a/fs/hmdfs/inode_merge.c +++ b/fs/hmdfs/inode_merge.c @@ -355,22 +355,7 @@ static struct hmdfs_dentry_comrade *merge_lookup_comrade( 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); - goto out; - } - err = vfs_path_lookup(root.dentry, root.mnt, name, flags, &path); - if (err) { - 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)) { @@ -392,6 +377,21 @@ static struct hmdfs_dentry_comrade *merge_lookup_comrade( p_dentry, p_dentry->d_name.name); } + err = kern_path(sbi->real_dst, LOOKUP_DIRECTORY, &root); + if (err) { + hmdfs("flt :: original kern_path!"); + } + + err = vfs_path_lookup(root.dentry, root.mnt, name, flags, &path); + if (err) { + hmdfs("flt :: original lookup failed!"); + } + 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); + comrade = alloc_comrade(dentry, devid); dput(dentry); -- Gitee From 07239dd1230ff2988aebe2923336fd668dbe1a42 Mon Sep 17 00:00:00 2001 From: fuletian Date: Sat, 12 Jul 2025 03:32:36 +0000 Subject: [PATCH 09/17] update fs/hmdfs/inode_merge.c. Signed-off-by: fuletian --- fs/hmdfs/inode_merge.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/fs/hmdfs/inode_merge.c b/fs/hmdfs/inode_merge.c index 56305c2b3070..8d39a7b6f829 100644 --- a/fs/hmdfs/inode_merge.c +++ b/fs/hmdfs/inode_merge.c @@ -355,7 +355,24 @@ static struct hmdfs_dentry_comrade *merge_lookup_comrade( 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); + hmdfs_err("flt :: kern_path failed, err = %d", err); + goto out; + } + err = vfs_path_lookup(root.dentry, root.mnt, name, flags, &path); + if (err) { + comrade = ERR_PTR(err); + hmdfs_err("flt :: vfs_path_lookup failed, err = %d", 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)) { @@ -368,6 +385,7 @@ static struct hmdfs_dentry_comrade *merge_lookup_comrade( dput(dentry); path_put(&root); path_put(&path); + hmdfs_revert_creds(old_cred); return ERR_PTR(PTR_ERR(dentry)); } else { tmp_dentry = dentry; @@ -377,21 +395,6 @@ static struct hmdfs_dentry_comrade *merge_lookup_comrade( p_dentry, p_dentry->d_name.name); } - err = kern_path(sbi->real_dst, LOOKUP_DIRECTORY, &root); - if (err) { - hmdfs("flt :: original kern_path!"); - } - - err = vfs_path_lookup(root.dentry, root.mnt, name, flags, &path); - if (err) { - hmdfs("flt :: original lookup failed!"); - } - 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); - comrade = alloc_comrade(dentry, devid); dput(dentry); -- Gitee From 90bc7694725bf38fdba21b2eaa09438bfc1bc1a0 Mon Sep 17 00:00:00 2001 From: fuletian Date: Sat, 12 Jul 2025 03:36:49 +0000 Subject: [PATCH 10/17] update fs/hmdfs/inode_merge.c. Signed-off-by: fuletian --- fs/hmdfs/inode_merge.c | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/fs/hmdfs/inode_merge.c b/fs/hmdfs/inode_merge.c index 8d39a7b6f829..e20d4e512a7f 100644 --- a/fs/hmdfs/inode_merge.c +++ b/fs/hmdfs/inode_merge.c @@ -1031,42 +1031,7 @@ int hmdfs_create_lower_dentry(struct inode *i_parent, struct dentry *d_child, ret = PTR_ERR(lo_d_child); goto out; } - tmp_dentry = lo_d_child; - p_dentry = tmp_dentry->d_parent; - hmdfs_err("flt :: in hmdfs_create_lower_dentry 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); - - if (is_dir) - dentry = lookup_multi_dir(sbi->sb->s_root, absolute_path_buf_tmp, LOOKUP_DIRECTORY); - else - dentry = lookup_multi_dir(sbi->sb->s_root, absolute_path_buf_tmp, 0); - if (dentry == NULL || IS_ERR(dentry)) { - hmdfs_err("flt :: in hmdfs_create_lower_dentry lookup_multi_dir FAILED!"); - } else if (d_is_positive(dentry)) { - hmdfs_err("flt :: in hmdfs_create_lower_dentry EXIST!"); - dput(dentry); - } else { - tmp_dentry = dentry; - p_dentry = tmp_dentry->d_parent; - hmdfs_err("flt :: in hmdfs_create_lower_dentry 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); - } - kfree(absolute_path_buf_tmp); // to ensure link_comrade after vfs_mkdir succeed - tmp_dentry = path.dentry; - p_dentry = tmp_dentry->d_parent; - hmdfs_err("flt :: in hmdfs_create_lower_dentry goto next 11111 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); - tmp_dentry = lo_d_parent; - p_dentry = tmp_dentry->d_parent; - hmdfs_err("flt :: in hmdfs_create_lower_dentry goto next 22222 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); - ret = hmdfs_do_ops_merge(i_parent, d_child, lo_d_child, path, rec_op_para); if (ret) -- Gitee From ec4c7ba1fdfeaf28218312d75717e64e2ba6b90b Mon Sep 17 00:00:00 2001 From: fuletian Date: Sat, 12 Jul 2025 03:37:57 +0000 Subject: [PATCH 11/17] update fs/hmdfs/inode_merge.c. Signed-off-by: fuletian --- fs/hmdfs/inode_merge.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/fs/hmdfs/inode_merge.c b/fs/hmdfs/inode_merge.c index e20d4e512a7f..5e7bd3f5f89e 100644 --- a/fs/hmdfs/inode_merge.c +++ b/fs/hmdfs/inode_merge.c @@ -995,10 +995,6 @@ int hmdfs_create_lower_dentry(struct inode *i_parent, struct dentry *d_child, char *path_name = NULL; struct path path = { .mnt = NULL, .dentry = NULL }; int ret = 0; - struct dentry *tmp_dentry = NULL; - struct dentry *p_dentry = NULL; - struct dentry *dentry = NULL; - char *absolute_path_buf_tmp = kmalloc(PATH_MAX, GFP_KERNEL); if (unlikely(!path_buf || !absolute_path_buf)) { ret = -ENOMEM; @@ -1018,8 +1014,6 @@ int hmdfs_create_lower_dentry(struct inode *i_parent, struct dentry *d_child, sprintf(absolute_path_buf, "%s%s/%s", sbi->real_dst, path_name, d_child->d_name.name); - sprintf(absolute_path_buf_tmp, "%s/%s", path_name, - d_child->d_name.name); if (is_dir) lo_d_child = kern_path_create(AT_FDCWD, absolute_path_buf, -- Gitee From 0ec0b54d82fa08fa841b3163a3e24887eeb78627 Mon Sep 17 00:00:00 2001 From: fuletian Date: Sat, 12 Jul 2025 07:11:01 +0000 Subject: [PATCH 12/17] update fs/hmdfs/inode_merge.c. Signed-off-by: fuletian --- fs/hmdfs/inode_merge.c | 82 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/fs/hmdfs/inode_merge.c b/fs/hmdfs/inode_merge.c index 5e7bd3f5f89e..773b194dd191 100644 --- a/fs/hmdfs/inode_merge.c +++ b/fs/hmdfs/inode_merge.c @@ -995,6 +995,10 @@ int hmdfs_create_lower_dentry(struct inode *i_parent, struct dentry *d_child, char *path_name = NULL; struct path path = { .mnt = NULL, .dentry = NULL }; int ret = 0; + struct dentry *tmp_dentry = NULL; + struct dentry *p_dentry = NULL; + struct dentry *dentry = NULL; + char *absolute_path_buf_tmp = kmalloc(PATH_MAX, GFP_KERNEL); if (unlikely(!path_buf || !absolute_path_buf)) { ret = -ENOMEM; @@ -1014,7 +1018,8 @@ int hmdfs_create_lower_dentry(struct inode *i_parent, struct dentry *d_child, sprintf(absolute_path_buf, "%s%s/%s", sbi->real_dst, path_name, d_child->d_name.name); - + sprintf(absolute_path_buf_tmp, "%s/%s", path_name, + d_child->d_name.name); if (is_dir) lo_d_child = kern_path_create(AT_FDCWD, absolute_path_buf, &path, LOOKUP_DIRECTORY); @@ -1025,7 +1030,42 @@ int hmdfs_create_lower_dentry(struct inode *i_parent, struct dentry *d_child, ret = PTR_ERR(lo_d_child); goto out; } + tmp_dentry = lo_d_child; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in hmdfs_create_lower_dentry 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); + + if (is_dir) + dentry = lookup_multi_dir(sbi->sb->s_root, absolute_path_buf_tmp, LOOKUP_DIRECTORY); + else + dentry = lookup_multi_dir(sbi->sb->s_root, absolute_path_buf_tmp, 0); + if (dentry == NULL || IS_ERR(dentry)) { + hmdfs_err("flt :: in hmdfs_create_lower_dentry lookup_multi_dir FAILED!"); + } else if (d_is_positive(dentry)) { + hmdfs_err("flt :: in hmdfs_create_lower_dentry EXIST!"); + dput(dentry); + } else { + tmp_dentry = dentry; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in hmdfs_create_lower_dentry 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); + } + kfree(absolute_path_buf_tmp); // to ensure link_comrade after vfs_mkdir succeed + tmp_dentry = path.dentry; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in hmdfs_create_lower_dentry goto next 11111 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); + tmp_dentry = lo_d_parent; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in hmdfs_create_lower_dentry goto next 11111 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); + ret = hmdfs_do_ops_merge(i_parent, d_child, lo_d_child, path, rec_op_para); if (ret) @@ -1310,6 +1350,10 @@ int do_rename_merge(struct inode *old_dir, struct dentry *old_dentry, char *path_name = NULL; struct hmdfs_dentry_info_merge *pmdi = NULL; struct renamedata rename_data; + struct dentry *tmp_dentry = NULL; + struct dentry *p_dentry = NULL; + struct dentry *dentry = NULL; + char *absolute_path_buf_tmp = kmalloc(PATH_MAX, GFP_KERNEL); if (flags & ~RENAME_NOREPLACE) { ret = -EINVAL; @@ -1348,6 +1392,9 @@ int do_rename_merge(struct inode *old_dir, struct dentry *old_dentry, snprintf(abs_path_buf, PATH_MAX, "%s%s/%s", sbi->real_dst, path_name, new_dentry->d_name.name); + + sprintf(absolute_path_buf_tmp, "%s/%s", path_name, + new_dentry->d_name.name); if (S_ISDIR(d_inode(old_dentry)->i_mode)) lo_d_new = kern_path_create(AT_FDCWD, abs_path_buf, &lo_p_new, @@ -1359,6 +1406,29 @@ int do_rename_merge(struct inode *old_dir, struct dentry *old_dentry, ret = PTR_ERR(lo_d_new); goto out; } + tmp_dentry = lo_d_new; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in do_rename_merge 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); + if (S_ISDIR(d_inode(old_dentry)->i_mode)) + dentry = lookup_multi_dir(sbi->sb->s_root, absolute_path_buf_tmp, LOOKUP_DIRECTORY); + else + dentry = lookup_multi_dir(sbi->sb->s_root, absolute_path_buf_tmp, 0); + if (dentry == NULL || IS_ERR(dentry)) { + hmdfs_err("flt :: in do_rename_merge lookup_multi_dir FAILED!"); + } else if (d_is_positive(dentry)) { + hmdfs_err("flt :: in do_rename_merge EXIST!"); + dput(dentry); + } else { + tmp_dentry = dentry; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in do_rename_merge 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); + } + kfree(absolute_path_buf_tmp); lo_d_new_dir = dget_parent(lo_d_new); lo_i_new_dir = d_inode(lo_d_new_dir); @@ -1374,6 +1444,16 @@ int do_rename_merge(struct inode *old_dir, struct dentry *old_dentry, rename_data.flags = flags; ret = vfs_rename(&rename_data); + tmp_dentry = lo_p_new.dentry; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in rename goto alloc 111111 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); + tmp_dentry = lo_d_new_dir; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in rename goto alloc 222222 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); new_comrade = alloc_comrade(lo_p_new.dentry, comrade->dev_id); if (IS_ERR(new_comrade)) { ret = PTR_ERR(new_comrade); -- Gitee From 380d8af99c24e9cce78fea528c7eb2a2fa94964e Mon Sep 17 00:00:00 2001 From: fuletian Date: Sun, 13 Jul 2025 03:04:53 +0000 Subject: [PATCH 13/17] update fs/hmdfs/inode.c. Signed-off-by: fuletian --- fs/hmdfs/inode.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/hmdfs/inode.c b/fs/hmdfs/inode.c index d244446368fe..f9a4ba43913e 100644 --- a/fs/hmdfs/inode.c +++ b/fs/hmdfs/inode.c @@ -375,6 +375,9 @@ struct dentry *lookup_multi_dir(struct dentry *root_dentry, } 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 (d_is_negative(ret_dentry)){ + ret_dentry = ERR_PTR(-ENOENT); + } if (IS_ERR(ret_dentry)) { dput(current_dentry); hmdfs_err("flt :: lookup_one_len failed!"); -- Gitee From 0e3102ed6bdad30c181f87a583ffcb7b0b0767bb Mon Sep 17 00:00:00 2001 From: fuletian Date: Sun, 13 Jul 2025 03:09:19 +0000 Subject: [PATCH 14/17] update fs/hmdfs/inode_merge.c. Signed-off-by: fuletian --- fs/hmdfs/inode_merge.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/fs/hmdfs/inode_merge.c b/fs/hmdfs/inode_merge.c index 773b194dd191..f1c932c68304 100644 --- a/fs/hmdfs/inode_merge.c +++ b/fs/hmdfs/inode_merge.c @@ -230,7 +230,31 @@ struct hmdfs_dentry_comrade *lookup_comrade(struct path lower_path, &path); if (err) return ERR_PTR(err); - + tmp_dentry = path.dentry; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in 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(lower_path.dentry, d_name, flags); + if (dentry == NULL || IS_ERR(dentry)) { + hmdfs_err("flt :: in lookup_comrade lookup_multi_dir FAILED!"); + if (dentry == NULL) { + hmdfs_err("flt :: dentry == NULL"); + } else { + hmdfs_err("flt :: IS_ERR(dentry)"); + } + dput(dentry); + path_put(&path); + return ERR_PTR(PTR_ERR(dentry)); + } else { + tmp_dentry = dentry; + p_dentry = tmp_dentry->d_parent; + hmdfs_err("flt :: in 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, dev_id); path_put(&path); return comrade; -- Gitee From 106ad73cccf27b720f5f2b7da58940ec4520f3fa Mon Sep 17 00:00:00 2001 From: fuletian Date: Sun, 13 Jul 2025 03:11:17 +0000 Subject: [PATCH 15/17] update fs/hmdfs/inode_merge.c. Signed-off-by: fuletian --- fs/hmdfs/inode_merge.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/fs/hmdfs/inode_merge.c b/fs/hmdfs/inode_merge.c index f1c932c68304..a055112d1ed6 100644 --- a/fs/hmdfs/inode_merge.c +++ b/fs/hmdfs/inode_merge.c @@ -244,9 +244,6 @@ struct hmdfs_dentry_comrade *lookup_comrade(struct path lower_path, } else { hmdfs_err("flt :: IS_ERR(dentry)"); } - dput(dentry); - path_put(&path); - return ERR_PTR(PTR_ERR(dentry)); } else { tmp_dentry = dentry; p_dentry = tmp_dentry->d_parent; -- Gitee From 5c1e28fc868b0331d2e1343f7cd73516659c0423 Mon Sep 17 00:00:00 2001 From: fuletian Date: Sun, 13 Jul 2025 03:52:18 +0000 Subject: [PATCH 16/17] update fs/hmdfs/inode_merge.c. Signed-off-by: fuletian --- fs/hmdfs/inode_merge.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/hmdfs/inode_merge.c b/fs/hmdfs/inode_merge.c index a055112d1ed6..4059f641aeaa 100644 --- a/fs/hmdfs/inode_merge.c +++ b/fs/hmdfs/inode_merge.c @@ -225,6 +225,9 @@ struct hmdfs_dentry_comrade *lookup_comrade(struct path lower_path, struct path path; struct hmdfs_dentry_comrade *comrade = NULL; int err; + struct dentry *tmp_dentry = NULL; + struct dentry *p_dentry = NULL; + struct dentry *dentry = NULL; err = vfs_path_lookup(lower_path.dentry, lower_path.mnt, d_name, flags, &path); -- Gitee From 26fc34911932853eeaed401b82e6b0371b4f1680 Mon Sep 17 00:00:00 2001 From: fuletian Date: Sun, 13 Jul 2025 08:10:18 +0000 Subject: [PATCH 17/17] update fs/hmdfs/inode.c. Signed-off-by: fuletian --- fs/hmdfs/inode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/hmdfs/inode.c b/fs/hmdfs/inode.c index f9a4ba43913e..f14d478f6f16 100644 --- a/fs/hmdfs/inode.c +++ b/fs/hmdfs/inode.c @@ -373,7 +373,7 @@ 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); + hmdfs_err("flt 1610 :: goto lookup_one_len name = %s, len = %d\n", start, end - start); ret_dentry = lookup_one_len(start, current_dentry, end - start); if (d_is_negative(ret_dentry)){ ret_dentry = ERR_PTR(-ENOENT); -- Gitee