Messages in this thread | | | Date | Thu, 2 Mar 2023 14:56:21 -0800 | Subject | Re: [PATCH 02/11] proc_sysctl: move helper which creates required subdirectories | From | John Johansen <> |
| |
On 3/2/23 12:28, Luis Chamberlain wrote: > Move the code which creates the subdirectories for a ctl table > into a helper routine so to make it easier to review. Document > the goal. > > This creates no functional changes. > > Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
Reviewed-by: John Johansen <john.johansen@canonical.com>
> --- > fs/proc/proc_sysctl.c | 56 ++++++++++++++++++++++++------------------- > 1 file changed, 32 insertions(+), 24 deletions(-) > > diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c > index 1df0beb50dbe..6b9b2694d430 100644 > --- a/fs/proc/proc_sysctl.c > +++ b/fs/proc/proc_sysctl.c > @@ -1283,6 +1283,35 @@ static int insert_links(struct ctl_table_header *head) > return err; > } > > +/* Find the directory for the ctl_table. If one is not found create it. */ > +static struct ctl_dir *sysctl_mkdir_p(struct ctl_dir *dir, const char *path) > +{ > + const char *name, *nextname; > + > + for (name = path; name; name = nextname) { > + int namelen; > + nextname = strchr(name, '/'); > + if (nextname) { > + namelen = nextname - name; > + nextname++; > + } else { > + namelen = strlen(name); > + } > + if (namelen == 0) > + continue; > + > + /* > + * namelen ensures if name is "foo/bar/yay" only foo is > + * registered first. We traverse as if using mkdir -p and > + * return a ctl_dir for the last directory entry. > + */ > + dir = get_subdir(dir, name, namelen); > + if (IS_ERR(dir)) > + break; > + } > + return dir; > +} > + > /** > * __register_sysctl_table - register a leaf sysctl table > * @set: Sysctl tree to register on > @@ -1334,7 +1363,6 @@ struct ctl_table_header *__register_sysctl_table( > { > struct ctl_table_root *root = set->dir.header.root; > struct ctl_table_header *header; > - const char *name, *nextname; > struct ctl_dir *dir; > struct ctl_table *entry; > struct ctl_node *node; > @@ -1359,29 +1387,9 @@ struct ctl_table_header *__register_sysctl_table( > dir->header.nreg++; > spin_unlock(&sysctl_lock); > > - /* Find the directory for the ctl_table */ > - for (name = path; name; name = nextname) { > - int namelen; > - nextname = strchr(name, '/'); > - if (nextname) { > - namelen = nextname - name; > - nextname++; > - } else { > - namelen = strlen(name); > - } > - if (namelen == 0) > - continue; > - > - /* > - * namelen ensures if name is "foo/bar/yay" only foo is > - * registered first. We traverse as if using mkdir -p and > - * return a ctl_dir for the last directory entry. > - */ > - dir = get_subdir(dir, name, namelen); > - if (IS_ERR(dir)) > - goto fail; > - } > - > + dir = sysctl_mkdir_p(dir, path); > + if (IS_ERR(dir)) > + goto fail; > spin_lock(&sysctl_lock); > if (insert_header(dir, header)) > goto fail_put_dir_locked;
| |