Re: [PATCH 2/7] kernfs: implement kernfs_walk_and_get()
On Fri, Nov 20, 2015 at 04:12:54PM -0500, Tejun Heo wrote: > On Thu, Nov 19, 2015 at 08:41:04PM -0800, Greg Kroah-Hartman wrote: > > On Thu, Nov 19, 2015 at 01:52:46PM -0500, Tejun Heo wrote: > > > Implement kernfs_walk_and_get() which is similar to > > > kernfs_find_and_get() but can walk a path instead of just a name. > > > > > > v2: Use strlcpy() instead of strlen() + memcpy() as suggested by > > > David. > > > > > > Signed-off-by: Tejun Heo > > > Cc: Greg Kroah-Hartman > > > Cc: David Miller > > > --- > > > fs/kernfs/dir.c| 46 > > > ++ > > > include/linux/kernfs.h | 12 > > > 2 files changed, 58 insertions(+) > > > > Acked-by: Greg Kroah-Hartman > > Greg, would it be okay to route this one through either cgroup or net > tree? Either is fine with me, whatever works best for you. greg k-h -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 2/7] kernfs: implement kernfs_walk_and_get()
On Thu, Nov 19, 2015 at 08:41:04PM -0800, Greg Kroah-Hartman wrote: > On Thu, Nov 19, 2015 at 01:52:46PM -0500, Tejun Heo wrote: > > Implement kernfs_walk_and_get() which is similar to > > kernfs_find_and_get() but can walk a path instead of just a name. > > > > v2: Use strlcpy() instead of strlen() + memcpy() as suggested by > > David. > > > > Signed-off-by: Tejun Heo > > Cc: Greg Kroah-Hartman > > Cc: David Miller > > --- > > fs/kernfs/dir.c| 46 ++ > > include/linux/kernfs.h | 12 > > 2 files changed, 58 insertions(+) > > Acked-by: Greg Kroah-Hartman Greg, would it be okay to route this one through either cgroup or net tree? Thanks. -- tejun -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 2/7] kernfs: implement kernfs_walk_and_get()
On Fri, Nov 20, 2015 at 04:12:54PM -0500, Tejun Heo wrote: > On Thu, Nov 19, 2015 at 08:41:04PM -0800, Greg Kroah-Hartman wrote: > > On Thu, Nov 19, 2015 at 01:52:46PM -0500, Tejun Heo wrote: > > > Implement kernfs_walk_and_get() which is similar to > > > kernfs_find_and_get() but can walk a path instead of just a name. > > > > > > v2: Use strlcpy() instead of strlen() + memcpy() as suggested by > > > David. > > > > > > Signed-off-by: Tejun Heo> > > Cc: Greg Kroah-Hartman > > > Cc: David Miller > > > --- > > > fs/kernfs/dir.c| 46 > > > ++ > > > include/linux/kernfs.h | 12 > > > 2 files changed, 58 insertions(+) > > > > Acked-by: Greg Kroah-Hartman > > Greg, would it be okay to route this one through either cgroup or net > tree? Either is fine with me, whatever works best for you. greg k-h -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 2/7] kernfs: implement kernfs_walk_and_get()
On Thu, Nov 19, 2015 at 08:41:04PM -0800, Greg Kroah-Hartman wrote: > On Thu, Nov 19, 2015 at 01:52:46PM -0500, Tejun Heo wrote: > > Implement kernfs_walk_and_get() which is similar to > > kernfs_find_and_get() but can walk a path instead of just a name. > > > > v2: Use strlcpy() instead of strlen() + memcpy() as suggested by > > David. > > > > Signed-off-by: Tejun Heo> > Cc: Greg Kroah-Hartman > > Cc: David Miller > > --- > > fs/kernfs/dir.c| 46 ++ > > include/linux/kernfs.h | 12 > > 2 files changed, 58 insertions(+) > > Acked-by: Greg Kroah-Hartman Greg, would it be okay to route this one through either cgroup or net tree? Thanks. -- tejun -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 2/7] kernfs: implement kernfs_walk_and_get()
On Thu, Nov 19, 2015 at 01:52:46PM -0500, Tejun Heo wrote: > Implement kernfs_walk_and_get() which is similar to > kernfs_find_and_get() but can walk a path instead of just a name. > > v2: Use strlcpy() instead of strlen() + memcpy() as suggested by > David. > > Signed-off-by: Tejun Heo > Cc: Greg Kroah-Hartman > Cc: David Miller > --- > fs/kernfs/dir.c| 46 ++ > include/linux/kernfs.h | 12 > 2 files changed, 58 insertions(+) Acked-by: Greg Kroah-Hartman -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 2/7] kernfs: implement kernfs_walk_and_get()
Implement kernfs_walk_and_get() which is similar to kernfs_find_and_get() but can walk a path instead of just a name. v2: Use strlcpy() instead of strlen() + memcpy() as suggested by David. Signed-off-by: Tejun Heo Cc: Greg Kroah-Hartman Cc: David Miller --- fs/kernfs/dir.c| 46 ++ include/linux/kernfs.h | 12 2 files changed, 58 insertions(+) diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c index 91e0045..742bf4a 100644 --- a/fs/kernfs/dir.c +++ b/fs/kernfs/dir.c @@ -694,6 +694,29 @@ static struct kernfs_node *kernfs_find_ns(struct kernfs_node *parent, return NULL; } +static struct kernfs_node *kernfs_walk_ns(struct kernfs_node *parent, + const unsigned char *path, + const void *ns) +{ + static char path_buf[PATH_MAX]; /* protected by kernfs_mutex */ + size_t len = strlcpy(path_buf, path, PATH_MAX); + char *p = path_buf; + char *name; + + lockdep_assert_held(_mutex); + + if (len >= PATH_MAX) + return NULL; + + while ((name = strsep(, "/")) && parent) { + if (*name == '\0') + continue; + parent = kernfs_find_ns(parent, name, ns); + } + + return parent; +} + /** * kernfs_find_and_get_ns - find and get kernfs_node with the given name * @parent: kernfs_node to search under @@ -719,6 +742,29 @@ struct kernfs_node *kernfs_find_and_get_ns(struct kernfs_node *parent, EXPORT_SYMBOL_GPL(kernfs_find_and_get_ns); /** + * kernfs_walk_and_get_ns - find and get kernfs_node with the given path + * @parent: kernfs_node to search under + * @path: path to look for + * @ns: the namespace tag to use + * + * Look for kernfs_node with path @path under @parent and get a reference + * if found. This function may sleep and returns pointer to the found + * kernfs_node on success, %NULL on failure. + */ +struct kernfs_node *kernfs_walk_and_get_ns(struct kernfs_node *parent, + const char *path, const void *ns) +{ + struct kernfs_node *kn; + + mutex_lock(_mutex); + kn = kernfs_walk_ns(parent, path, ns); + kernfs_get(kn); + mutex_unlock(_mutex); + + return kn; +} + +/** * kernfs_create_root - create a new kernfs hierarchy * @scops: optional syscall operations for the hierarchy * @flags: KERNFS_ROOT_* flags diff --git a/include/linux/kernfs.h b/include/linux/kernfs.h index 5d4e9c4..af51df3 100644 --- a/include/linux/kernfs.h +++ b/include/linux/kernfs.h @@ -274,6 +274,8 @@ void pr_cont_kernfs_path(struct kernfs_node *kn); struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn); struct kernfs_node *kernfs_find_and_get_ns(struct kernfs_node *parent, const char *name, const void *ns); +struct kernfs_node *kernfs_walk_and_get_ns(struct kernfs_node *parent, + const char *path, const void *ns); void kernfs_get(struct kernfs_node *kn); void kernfs_put(struct kernfs_node *kn); @@ -350,6 +352,10 @@ static inline struct kernfs_node * kernfs_find_and_get_ns(struct kernfs_node *parent, const char *name, const void *ns) { return NULL; } +static inline struct kernfs_node * +kernfs_walk_and_get_ns(struct kernfs_node *parent, const char *path, + const void *ns) +{ return NULL; } static inline void kernfs_get(struct kernfs_node *kn) { } static inline void kernfs_put(struct kernfs_node *kn) { } @@ -431,6 +437,12 @@ kernfs_find_and_get(struct kernfs_node *kn, const char *name) } static inline struct kernfs_node * +kernfs_walk_and_get(struct kernfs_node *kn, const char *path) +{ + return kernfs_walk_and_get_ns(kn, path, NULL); +} + +static inline struct kernfs_node * kernfs_create_dir(struct kernfs_node *parent, const char *name, umode_t mode, void *priv) { -- 2.5.0 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 2/7] kernfs: implement kernfs_walk_and_get()
Implement kernfs_walk_and_get() which is similar to kernfs_find_and_get() but can walk a path instead of just a name. v2: Use strlcpy() instead of strlen() + memcpy() as suggested by David. Signed-off-by: Tejun HeoCc: Greg Kroah-Hartman Cc: David Miller --- fs/kernfs/dir.c| 46 ++ include/linux/kernfs.h | 12 2 files changed, 58 insertions(+) diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c index 91e0045..742bf4a 100644 --- a/fs/kernfs/dir.c +++ b/fs/kernfs/dir.c @@ -694,6 +694,29 @@ static struct kernfs_node *kernfs_find_ns(struct kernfs_node *parent, return NULL; } +static struct kernfs_node *kernfs_walk_ns(struct kernfs_node *parent, + const unsigned char *path, + const void *ns) +{ + static char path_buf[PATH_MAX]; /* protected by kernfs_mutex */ + size_t len = strlcpy(path_buf, path, PATH_MAX); + char *p = path_buf; + char *name; + + lockdep_assert_held(_mutex); + + if (len >= PATH_MAX) + return NULL; + + while ((name = strsep(, "/")) && parent) { + if (*name == '\0') + continue; + parent = kernfs_find_ns(parent, name, ns); + } + + return parent; +} + /** * kernfs_find_and_get_ns - find and get kernfs_node with the given name * @parent: kernfs_node to search under @@ -719,6 +742,29 @@ struct kernfs_node *kernfs_find_and_get_ns(struct kernfs_node *parent, EXPORT_SYMBOL_GPL(kernfs_find_and_get_ns); /** + * kernfs_walk_and_get_ns - find and get kernfs_node with the given path + * @parent: kernfs_node to search under + * @path: path to look for + * @ns: the namespace tag to use + * + * Look for kernfs_node with path @path under @parent and get a reference + * if found. This function may sleep and returns pointer to the found + * kernfs_node on success, %NULL on failure. + */ +struct kernfs_node *kernfs_walk_and_get_ns(struct kernfs_node *parent, + const char *path, const void *ns) +{ + struct kernfs_node *kn; + + mutex_lock(_mutex); + kn = kernfs_walk_ns(parent, path, ns); + kernfs_get(kn); + mutex_unlock(_mutex); + + return kn; +} + +/** * kernfs_create_root - create a new kernfs hierarchy * @scops: optional syscall operations for the hierarchy * @flags: KERNFS_ROOT_* flags diff --git a/include/linux/kernfs.h b/include/linux/kernfs.h index 5d4e9c4..af51df3 100644 --- a/include/linux/kernfs.h +++ b/include/linux/kernfs.h @@ -274,6 +274,8 @@ void pr_cont_kernfs_path(struct kernfs_node *kn); struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn); struct kernfs_node *kernfs_find_and_get_ns(struct kernfs_node *parent, const char *name, const void *ns); +struct kernfs_node *kernfs_walk_and_get_ns(struct kernfs_node *parent, + const char *path, const void *ns); void kernfs_get(struct kernfs_node *kn); void kernfs_put(struct kernfs_node *kn); @@ -350,6 +352,10 @@ static inline struct kernfs_node * kernfs_find_and_get_ns(struct kernfs_node *parent, const char *name, const void *ns) { return NULL; } +static inline struct kernfs_node * +kernfs_walk_and_get_ns(struct kernfs_node *parent, const char *path, + const void *ns) +{ return NULL; } static inline void kernfs_get(struct kernfs_node *kn) { } static inline void kernfs_put(struct kernfs_node *kn) { } @@ -431,6 +437,12 @@ kernfs_find_and_get(struct kernfs_node *kn, const char *name) } static inline struct kernfs_node * +kernfs_walk_and_get(struct kernfs_node *kn, const char *path) +{ + return kernfs_walk_and_get_ns(kn, path, NULL); +} + +static inline struct kernfs_node * kernfs_create_dir(struct kernfs_node *parent, const char *name, umode_t mode, void *priv) { -- 2.5.0 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 2/7] kernfs: implement kernfs_walk_and_get()
On Thu, Nov 19, 2015 at 01:52:46PM -0500, Tejun Heo wrote: > Implement kernfs_walk_and_get() which is similar to > kernfs_find_and_get() but can walk a path instead of just a name. > > v2: Use strlcpy() instead of strlen() + memcpy() as suggested by > David. > > Signed-off-by: Tejun Heo> Cc: Greg Kroah-Hartman > Cc: David Miller > --- > fs/kernfs/dir.c| 46 ++ > include/linux/kernfs.h | 12 > 2 files changed, 58 insertions(+) Acked-by: Greg Kroah-Hartman -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/