libos (arch/lib) emulates a sysctl-like interface by a function call of
userspace by enumerating sysctl tree from sysctl_table_root. It requires
to be publicly accessible to this symbol and related functions.

Signed-off-by: Hajime Tazaki <taz...@sfc.wide.ad.jp>
---
 fs/proc/proc_sysctl.c | 36 +++++++++++++++++++-----------------
 1 file changed, 19 insertions(+), 17 deletions(-)

diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c
index f92d5dd..56feec7 100644
--- a/fs/proc/proc_sysctl.c
+++ b/fs/proc/proc_sysctl.c
@@ -35,7 +35,7 @@ static struct ctl_table root_table[] = {
        },
        { }
 };
-static struct ctl_table_root sysctl_table_root = {
+struct ctl_table_root sysctl_table_root = {
        .default_set.dir.header = {
                {{.count = 1,
                  .nreg = 1,
@@ -77,8 +77,9 @@ static int namecmp(const char *name1, int len1, const char 
*name2, int len2)
 }
 
 /* Called under sysctl_lock */
-static struct ctl_table *find_entry(struct ctl_table_header **phead,
-       struct ctl_dir *dir, const char *name, int namelen)
+struct ctl_table *ctl_table_find_entry(struct ctl_table_header **phead,
+                                      struct ctl_dir *dir, const char *name,
+                                      int namelen)
 {
        struct ctl_table_header *head;
        struct ctl_table *entry;
@@ -300,7 +301,7 @@ static struct ctl_table *lookup_entry(struct 
ctl_table_header **phead,
        struct ctl_table *entry;
 
        spin_lock(&sysctl_lock);
-       entry = find_entry(&head, dir, name, namelen);
+       entry = ctl_table_find_entry(&head, dir, name, namelen);
        if (entry && use_table(head))
                *phead = head;
        else
@@ -321,7 +322,7 @@ static struct ctl_node *first_usable_entry(struct rb_node 
*node)
        return NULL;
 }
 
-static void first_entry(struct ctl_dir *dir,
+void ctl_table_first_entry(struct ctl_dir *dir,
        struct ctl_table_header **phead, struct ctl_table **pentry)
 {
        struct ctl_table_header *head = NULL;
@@ -339,7 +340,7 @@ static void first_entry(struct ctl_dir *dir,
        *pentry = entry;
 }
 
-static void next_entry(struct ctl_table_header **phead, struct ctl_table 
**pentry)
+void ctl_table_next_entry(struct ctl_table_header **phead, struct ctl_table 
**pentry)
 {
        struct ctl_table_header *head = *phead;
        struct ctl_table *entry = *pentry;
@@ -670,7 +671,8 @@ static int proc_sys_readdir(struct file *file, struct 
dir_context *ctx)
 
        pos = 2;
 
-       for (first_entry(ctl_dir, &h, &entry); h; next_entry(&h, &entry)) {
+       for (ctl_table_first_entry(ctl_dir, &h, &entry); h;
+            ctl_table_next_entry(&h, &entry)) {
                if (!scan(h, entry, &pos, file, ctx)) {
                        sysctl_head_finish(h);
                        break;
@@ -828,7 +830,7 @@ static struct ctl_dir *find_subdir(struct ctl_dir *dir,
        struct ctl_table_header *head;
        struct ctl_table *entry;
 
-       entry = find_entry(&head, dir, name, namelen);
+       entry = ctl_table_find_entry(&head, dir, name, namelen);
        if (!entry)
                return ERR_PTR(-ENOENT);
        if (!S_ISDIR(entry->mode))
@@ -924,13 +926,13 @@ failed:
        return subdir;
 }
 
-static struct ctl_dir *xlate_dir(struct ctl_table_set *set, struct ctl_dir 
*dir)
+struct ctl_dir *ctl_table_xlate_dir(struct ctl_table_set *set, struct ctl_dir 
*dir)
 {
        struct ctl_dir *parent;
        const char *procname;
        if (!dir->header.parent)
                return &set->dir;
-       parent = xlate_dir(set, dir->header.parent);
+       parent = ctl_table_xlate_dir(set, dir->header.parent);
        if (IS_ERR(parent))
                return parent;
        procname = dir->header.ctl_table[0].procname;
@@ -951,13 +953,13 @@ static int sysctl_follow_link(struct ctl_table_header 
**phead,
        spin_lock(&sysctl_lock);
        root = (*pentry)->data;
        set = lookup_header_set(root, namespaces);
-       dir = xlate_dir(set, (*phead)->parent);
+       dir = ctl_table_xlate_dir(set, (*phead)->parent);
        if (IS_ERR(dir))
                ret = PTR_ERR(dir);
        else {
                const char *procname = (*pentry)->procname;
                head = NULL;
-               entry = find_entry(&head, dir, procname, strlen(procname));
+               entry = ctl_table_find_entry(&head, dir, procname, 
strlen(procname));
                ret = -ENOENT;
                if (entry && use_table(head)) {
                        unuse_table(*phead);
@@ -1069,7 +1071,7 @@ static bool get_links(struct ctl_dir *dir,
        /* Are there links available for every entry in table? */
        for (entry = table; entry->procname; entry++) {
                const char *procname = entry->procname;
-               link = find_entry(&head, dir, procname, strlen(procname));
+               link = ctl_table_find_entry(&head, dir, procname, 
strlen(procname));
                if (!link)
                        return false;
                if (S_ISDIR(link->mode) && S_ISDIR(entry->mode))
@@ -1082,7 +1084,7 @@ static bool get_links(struct ctl_dir *dir,
        /* The checks passed.  Increase the registration count on the links */
        for (entry = table; entry->procname; entry++) {
                const char *procname = entry->procname;
-               link = find_entry(&head, dir, procname, strlen(procname));
+               link = ctl_table_find_entry(&head, dir, procname, 
strlen(procname));
                head->nreg++;
        }
        return true;
@@ -1098,7 +1100,7 @@ static int insert_links(struct ctl_table_header *head)
        if (head->set == root_set)
                return 0;
 
-       core_parent = xlate_dir(root_set, head->parent);
+       core_parent = ctl_table_xlate_dir(root_set, head->parent);
        if (IS_ERR(core_parent))
                return 0;
 
@@ -1479,7 +1481,7 @@ static void put_links(struct ctl_table_header *header)
        if (header->set == root_set)
                return;
 
-       core_parent = xlate_dir(root_set, parent);
+       core_parent = ctl_table_xlate_dir(root_set, parent);
        if (IS_ERR(core_parent))
                return;
 
@@ -1488,7 +1490,7 @@ static void put_links(struct ctl_table_header *header)
                struct ctl_table *link;
                const char *name = entry->procname;
 
-               link = find_entry(&link_head, core_parent, name, strlen(name));
+               link = ctl_table_find_entry(&link_head, core_parent, name, 
strlen(name));
                if (link &&
                    ((S_ISDIR(link->mode) && S_ISDIR(entry->mode)) ||
                     (S_ISLNK(link->mode) && (link->data == root)))) {
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to