Re: [PATCH v2 12/14] fs/configfs: Add a callback to determine attribute visibility

From: Tom Lendacky
Date: Mon Mar 11 2024 - 15:59:18 EST


On 3/8/24 12:35, Tom Lendacky wrote:
In order to support dynamic decisions as to whether an attribute should be
created, add a callback that returns a bool to indicate whether the
attribute should be display. If no callback is registered, the attribute
is displayed by default.

Cc: Joel Becker <jlbec@xxxxxxxxxxxx>
Cc: Christoph Hellwig <hch@xxxxxx>
Signed-off-by: Tom Lendacky <thomas.lendacky@xxxxxxx>
---
fs/configfs/file.c | 13 +++++
include/linux/configfs.h | 114 +++++++++++++++++++++++++++------------
2 files changed, 93 insertions(+), 34 deletions(-)

diff --git a/fs/configfs/file.c b/fs/configfs/file.c
index 0ad32150611e..c758bcc11235 100644
--- a/fs/configfs/file.c
+++ b/fs/configfs/file.c
@@ -451,6 +451,12 @@ int configfs_create_file(struct config_item * item, const struct configfs_attrib
umode_t mode = (attr->ca_mode & S_IALLUGO) | S_IFREG;

I missed making this adjustment on the returned mode parameter below. So this patch will change slightly to just initialize mode to attr->ca_mode and then after the if statement, apply the masks as done above.

Thanks,
Tom

int error = 0;
+ if (attr->ca_is_visible) {
+ mode = attr->ca_is_visible(item, attr);
+ if (!mode)
+ return 0;
+ }
+
inode_lock_nested(d_inode(dir), I_MUTEX_NORMAL);
error = configfs_make_dirent(parent_sd, NULL, (void *) attr, mode,
CONFIGFS_ITEM_ATTR, parent_sd->s_frag);
@@ -470,9 +476,16 @@ int configfs_create_bin_file(struct config_item *item,
{
struct dentry *dir = item->ci_dentry;
struct configfs_dirent *parent_sd = dir->d_fsdata;
+ const struct configfs_attribute *attr = &bin_attr->cb_attr;
umode_t mode = (bin_attr->cb_attr.ca_mode & S_IALLUGO) | S_IFREG;
int error = 0;
+ if (attr->ca_is_visible) {
+ mode = attr->ca_is_visible(item, attr);
+ if (!mode)
+ return 0;
+ }
+
inode_lock_nested(dir->d_inode, I_MUTEX_NORMAL);
error = configfs_make_dirent(parent_sd, NULL, (void *) bin_attr, mode,
CONFIGFS_ITEM_BIN_ATTR, parent_sd->s_frag);