[PATCH 11/25] hugetlbfs: Add support for fsinfo() [ver #13]
From: David Howells
Date: Tue May 28 2019 - 11:23:14 EST
Add support for fsinfo().
Signed-off-by: David Howells <dhowells@xxxxxxxxxx>
---
fs/hugetlbfs/inode.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index 1dcc57189382..e6ecebd9ebc2 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -28,6 +28,7 @@
#include <linux/hugetlb.h>
#include <linux/pagevec.h>
#include <linux/fs_parser.h>
+#include <linux/fsinfo.h>
#include <linux/mman.h>
#include <linux/slab.h>
#include <linux/dnotify.h>
@@ -958,6 +959,58 @@ static int hugetlbfs_show_options(struct seq_file *m, struct dentry *root)
return 0;
}
+#ifdef CONFIG_FSINFO
+static int hugetlbfs_fsinfo(struct path *path, struct fsinfo_kparams *params)
+{
+ struct dentry *dentry = path->dentry;
+ struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(dentry->d_sb);
+ struct hugepage_subpool *spool = sbinfo->spool;
+ unsigned long hpage_size = huge_page_size(sbinfo->hstate);
+ unsigned hpage_shift = huge_page_shift(sbinfo->hstate);
+ char mod;
+
+ switch (params->request) {
+ case FSINFO_ATTR_PARAMETERS:
+ if (!uid_eq(sbinfo->uid, GLOBAL_ROOT_UID))
+ fsinfo_note_paramf(params, "uid", "%u",
+ from_kuid_munged(&init_user_ns,
+ sbinfo->uid));
+
+ if (!gid_eq(sbinfo->gid, GLOBAL_ROOT_GID))
+ fsinfo_note_paramf(params, "gid", "%u",
+ from_kgid_munged(&init_user_ns,
+ sbinfo->gid));
+
+ if (spool && spool->max_hpages != -1)
+ fsinfo_note_paramf(params, "size", "%llu",
+ (unsigned long long)spool->max_hpages << hpage_shift);
+
+ if (spool && spool->min_hpages != -1)
+ fsinfo_note_paramf(params, "min_size", "%llu",
+ (unsigned long long)spool->min_hpages << hpage_shift);
+
+ hpage_size /= 1024;
+ mod = 'K';
+ if (hpage_size >= 1024) {
+ hpage_size /= 1024;
+ mod = 'M';
+ }
+ fsinfo_note_paramf(params, "pagesize", "%lu%c", hpage_size, mod);
+
+ if (sbinfo->mode != 0755)
+ fsinfo_note_paramf(params, "mode", "%o", sbinfo->mode);
+
+ if (sbinfo->max_inodes != -1)
+ fsinfo_note_paramf(params, "nr_inodes", "%lu",
+ sbinfo->max_inodes);
+ return params->usage;
+
+ default:
+ return generic_fsinfo(path, params);
+ }
+}
+#endif /* CONFIG_FSINFO */
+
static int hugetlbfs_statfs(struct dentry *dentry, struct kstatfs *buf)
{
struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(dentry->d_sb);
@@ -1116,6 +1169,9 @@ static const struct super_operations hugetlbfs_ops = {
.statfs = hugetlbfs_statfs,
.put_super = hugetlbfs_put_super,
.show_options = hugetlbfs_show_options,
+#ifdef CONFIG_FSINFO
+ .fsinfo = hugetlbfs_fsinfo,
+#endif
};
/*