Message ID | 20230302202826.776286-3-mcgrof@kernel.org (mailing list archive) |
---|---|
State | Handled Elsewhere |
Headers | show |
Series | sysctl: deprecate register_sysctl_paths() | expand |
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;
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;
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> --- fs/proc/proc_sysctl.c | 56 ++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 24 deletions(-)