From 006c34c423712608012478243d8f714109203cf0 Mon Sep 17 00:00:00 2001 From: zhangkaixiang Date: Mon, 27 Mar 2023 10:38:28 +0800 Subject: [PATCH 1/2] fixed 3b41850 from https://gitee.com/zkx48/kernel_linux_5.10/pulls/747 modify the ugo while creating a dir or file in merge_view Signed-off-by: zhangkaixiang --- fs/hmdfs/inode_merge.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/hmdfs/inode_merge.c b/fs/hmdfs/inode_merge.c index c5cd7bdc4905..ab6ea9660458 100644 --- a/fs/hmdfs/inode_merge.c +++ b/fs/hmdfs/inode_merge.c @@ -869,6 +869,8 @@ int do_mkdir_merge(struct inode *parent_inode, struct dentry *child_dentry, ret = PTR_ERR(child_inode); goto out; } + child_inode->i_uid = parent_inode->i_uid; + child_inode->i_gid = parent_inode->i_gid; d_add(child_dentry, child_inode); /* nlink should be increased with the joining of children */ @@ -895,6 +897,8 @@ int do_create_merge(struct inode *parent_inode, struct dentry *child_dentry, ret = PTR_ERR(child_inode); goto out; } + child_inode->i_uid = parent_inode->i_uid; + child_inode->i_gid = parent_inode->i_gid; d_add(child_dentry, child_inode); /* nlink should be increased with the joining of children */ -- Gitee From d8b43be74f298fe4aaef25f0d08e2cf63ace0562 Mon Sep 17 00:00:00 2001 From: zhangkaixiang Date: Sat, 25 Mar 2023 18:44:49 +0800 Subject: [PATCH 2/2] fixed 9d2ac7c from https://gitee.com/zkx48/kernel_linux_5.10/pulls/747 add merge_view set xattr Signed-off-by: zhangkaixiang --- fs/hmdfs/dentry.c | 31 ++++++++++++++++++++++++++++++- fs/hmdfs/hmdfs_device_view.h | 3 ++- fs/hmdfs/main.c | 18 ++++++++++++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/fs/hmdfs/dentry.c b/fs/hmdfs/dentry.c index 8ec7ab33412f..fb7c4749bee0 100644 --- a/fs/hmdfs/dentry.c +++ b/fs/hmdfs/dentry.c @@ -273,7 +273,36 @@ void clear_comrades(struct dentry *dentry) */ static int d_revalidate_merge(struct dentry *direntry, unsigned int flags) { - return 0; + struct hmdfs_dentry_info_merge *dim = hmdfs_dm(direntry); + struct hmdfs_dentry_comrade *comrade = NULL; + struct dentry *parent_dentry = NULL; + struct dentry *lower_cur_parent_dentry = NULL; + int ret = 1; + + if (flags & LOOKUP_RCU) { + return -ECHILD; + } + + if (flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET | LOOKUP_REVAL)) { + return 0; + } + + parent_dentry = dget_parent(direntry); + list_for_each_entry(comrade, &(dim->comrade_list), list) { + lower_cur_parent_dentry = dget_parent(comrade->lo_d); + if ((comrade->lo_d->d_flags & DCACHE_OP_REVALIDATE)) { + ret = comrade->lo_d->d_op->d_revalidate( + comrade->lo_d, flags); + if (ret == 0) { + dput(lower_cur_parent_dentry); + goto out; + } + } + dput(lower_cur_parent_dentry); + } +out: + dput(parent_dentry); + return ret; } static void d_release_merge(struct dentry *dentry) diff --git a/fs/hmdfs/hmdfs_device_view.h b/fs/hmdfs/hmdfs_device_view.h index 0e397254c8ea..76be42a7481c 100644 --- a/fs/hmdfs/hmdfs_device_view.h +++ b/fs/hmdfs/hmdfs_device_view.h @@ -233,7 +233,8 @@ static inline bool hmdfs_support_xattr(struct dentry *dentry) struct hmdfs_dentry_info *gdi = hmdfs_d(dentry); if (info->inode_type != HMDFS_LAYER_OTHER_LOCAL && - info->inode_type != HMDFS_LAYER_OTHER_REMOTE) + info->inode_type != HMDFS_LAYER_OTHER_REMOTE && + info->inode_type != HMDFS_LAYER_OTHER_MERGE) return false; if (!S_ISREG(inode->i_mode)) diff --git a/fs/hmdfs/main.c b/fs/hmdfs/main.c index cb3034e95651..f57d67562486 100644 --- a/fs/hmdfs/main.c +++ b/fs/hmdfs/main.c @@ -161,6 +161,22 @@ static int hmdfs_xattr_remote_set(struct dentry *dentry, const char *name, return res; } +static int hmdfs_xattr_merge_set(struct dentry *dentry, const char *name, + const void *value, size_t size, int flags) +{ + int err = 0; + struct dentry *lower_dentry = hmdfs_get_lo_d(dentry, HMDFS_DEVID_LOCAL); + + if (!lower_dentry) { + err = -EOPNOTSUPP; + goto out; + } + err = hmdfs_xattr_local_set(lower_dentry, name, value, size, flags); +out: + dput(lower_dentry); + return err; +} + static int hmdfs_xattr_set(const struct xattr_handler *handler, struct dentry *dentry, struct inode *inode, const char *name, const void *value, @@ -181,6 +197,8 @@ static int hmdfs_xattr_set(const struct xattr_handler *handler, if (info->inode_type == HMDFS_LAYER_OTHER_LOCAL) return hmdfs_xattr_local_set(dentry, name, value, size, flags); + else if (info->inode_type == HMDFS_LAYER_OTHER_MERGE) + return hmdfs_xattr_merge_set(dentry, name, value, size, flags); return hmdfs_xattr_remote_set(dentry, name, value, size, flags); } -- Gitee