diff --git a/fs/hmdfs/hmdfs_device_view.h b/fs/hmdfs/hmdfs_device_view.h index 6e53af7bf2bf830b13f35d3559c6769e3a9b067c..2e306fe99de8cc03c8967a6b52dc8e13a8229298 100644 --- a/fs/hmdfs/hmdfs_device_view.h +++ b/fs/hmdfs/hmdfs_device_view.h @@ -245,7 +245,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 3d5f8706386ce615be265e78893baac88b62b1f2..55662860b49ee9a1f07f969a984c17bf672f1a2b 100644 --- a/fs/hmdfs/main.c +++ b/fs/hmdfs/main.c @@ -161,6 +161,30 @@ 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 inode *lower_inode = NULL; + struct hmdfs_inode_info *info = NULL; + struct dentry *lower_dentry = hmdfs_get_fst_lo_d(dentry); + + if (!lower_dentry) { + err = -EOPNOTSUPP; + goto out; + } + + lower_inode = d_inode(lower_dentry); + info = hmdfs_i(lower_inode); + if (info->inode_type == HMDFS_LAYER_OTHER_LOCAL) + err = hmdfs_xattr_local_set(lower_dentry, name, value, size, flags); + else + err = -EOPNOTSUPP; +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 +205,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); }