From: Serge Hallyn <serge.hallyn-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
To: "Eric W. Biederman" <ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
Cc: linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Linux Containers
<containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH review 14/16] proc: Generalize proc inode allocation
Date: Mon, 19 Nov 2012 12:04:58 -0600 [thread overview]
Message-ID: <20121119180458.GD1883@serge-ThinkPad-X130e> (raw)
In-Reply-To: <1353337961-12962-14-git-send-email-ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
Quoting Eric W. Biederman (ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org):
> From: "Eric W. Biederman" <ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
>
> Generalize the proc inode allocation so that it can be
> used without having to having to create a proc_dir_entry.
>
> This will allow namespace file descriptors to remain light
> weight entitities but still have the same inode number
> when the backing namespace is the same.
>
> Signed-off-by: Eric W. Biederman <ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
Acked-by: Serge E. Hallyn <serge.hallyn-GeWIH/nMZzLQT0dZR+AlfA@public.gmane.org>
> ---
> fs/proc/generic.c | 26 +++++++++++++-------------
> include/linux/proc_fs.h | 10 ++++++++++
> 2 files changed, 23 insertions(+), 13 deletions(-)
>
> diff --git a/fs/proc/generic.c b/fs/proc/generic.c
> index 0d80cef..7b3ae3c 100644
> --- a/fs/proc/generic.c
> +++ b/fs/proc/generic.c
> @@ -350,14 +350,14 @@ static DEFINE_SPINLOCK(proc_inum_lock); /* protects the above */
> * Return an inode number between PROC_DYNAMIC_FIRST and
> * 0xffffffff, or zero on failure.
> */
> -static unsigned int get_inode_number(void)
> +int proc_alloc_inum(unsigned int *inum)
> {
> unsigned int i;
> int error;
>
> retry:
> - if (ida_pre_get(&proc_inum_ida, GFP_KERNEL) == 0)
> - return 0;
> + if (!ida_pre_get(&proc_inum_ida, GFP_KERNEL))
> + return -ENOMEM;
>
> spin_lock(&proc_inum_lock);
> error = ida_get_new(&proc_inum_ida, &i);
> @@ -365,18 +365,19 @@ retry:
> if (error == -EAGAIN)
> goto retry;
> else if (error)
> - return 0;
> + return error;
>
> if (i > UINT_MAX - PROC_DYNAMIC_FIRST) {
> spin_lock(&proc_inum_lock);
> ida_remove(&proc_inum_ida, i);
> spin_unlock(&proc_inum_lock);
> - return 0;
> + return -ENOSPC;
> }
> - return PROC_DYNAMIC_FIRST + i;
> + *inum = PROC_DYNAMIC_FIRST + i;
> + return 0;
> }
>
> -static void release_inode_number(unsigned int inum)
> +void proc_free_inum(unsigned int inum)
> {
> spin_lock(&proc_inum_lock);
> ida_remove(&proc_inum_ida, inum - PROC_DYNAMIC_FIRST);
> @@ -554,13 +555,12 @@ static const struct inode_operations proc_dir_inode_operations = {
>
> static int proc_register(struct proc_dir_entry * dir, struct proc_dir_entry * dp)
> {
> - unsigned int i;
> struct proc_dir_entry *tmp;
> + int ret;
>
> - i = get_inode_number();
> - if (i == 0)
> - return -EAGAIN;
> - dp->low_ino = i;
> + ret = proc_alloc_inum(&dp->low_ino);
> + if (ret)
> + return ret;
>
> if (S_ISDIR(dp->mode)) {
> if (dp->proc_iops == NULL) {
> @@ -764,7 +764,7 @@ EXPORT_SYMBOL(proc_create_data);
>
> static void free_proc_entry(struct proc_dir_entry *de)
> {
> - release_inode_number(de->low_ino);
> + proc_free_inum(de->low_ino);
>
> if (S_ISLNK(de->mode))
> kfree(de->data);
> diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h
> index 3144781..bf1d000 100644
> --- a/include/linux/proc_fs.h
> +++ b/include/linux/proc_fs.h
> @@ -176,6 +176,8 @@ extern struct proc_dir_entry *proc_net_mkdir(struct net *net, const char *name,
> extern struct file *proc_ns_fget(int fd);
> extern bool proc_ns_inode(struct inode *inode);
>
> +extern int proc_alloc_inum(unsigned int *pino);
> +extern void proc_free_inum(unsigned int inum);
> #else
>
> #define proc_net_fops_create(net, name, mode, fops) ({ (void)(mode), NULL; })
> @@ -235,6 +237,14 @@ static inline bool proc_ns_inode(struct inode *inode)
> return false;
> }
>
> +static inline int proc_alloc_inum(unsigned int *inum)
> +{
> + *inum = 1;
> + return 0;
> +}
> +static inline void proc_free_inum(unsigned int inum)
> +{
> +}
> #endif /* CONFIG_PROC_FS */
>
> #if !defined(CONFIG_PROC_KCORE)
> --
> 1.7.5.4
>
> _______________________________________________
> Containers mailing list
> Containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
> https://lists.linuxfoundation.org/mailman/listinfo/containers
WARNING: multiple messages have this Message-ID (diff)
From: Serge Hallyn <serge.hallyn@canonical.com>
To: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Linux Containers <containers@lists.linux-foundation.org>,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH review 14/16] proc: Generalize proc inode allocation
Date: Mon, 19 Nov 2012 12:04:58 -0600 [thread overview]
Message-ID: <20121119180458.GD1883@serge-ThinkPad-X130e> (raw)
In-Reply-To: <1353337961-12962-14-git-send-email-ebiederm@xmission.com>
Quoting Eric W. Biederman (ebiederm@xmission.com):
> From: "Eric W. Biederman" <ebiederm@xmission.com>
>
> Generalize the proc inode allocation so that it can be
> used without having to having to create a proc_dir_entry.
>
> This will allow namespace file descriptors to remain light
> weight entitities but still have the same inode number
> when the backing namespace is the same.
>
> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com>
> ---
> fs/proc/generic.c | 26 +++++++++++++-------------
> include/linux/proc_fs.h | 10 ++++++++++
> 2 files changed, 23 insertions(+), 13 deletions(-)
>
> diff --git a/fs/proc/generic.c b/fs/proc/generic.c
> index 0d80cef..7b3ae3c 100644
> --- a/fs/proc/generic.c
> +++ b/fs/proc/generic.c
> @@ -350,14 +350,14 @@ static DEFINE_SPINLOCK(proc_inum_lock); /* protects the above */
> * Return an inode number between PROC_DYNAMIC_FIRST and
> * 0xffffffff, or zero on failure.
> */
> -static unsigned int get_inode_number(void)
> +int proc_alloc_inum(unsigned int *inum)
> {
> unsigned int i;
> int error;
>
> retry:
> - if (ida_pre_get(&proc_inum_ida, GFP_KERNEL) == 0)
> - return 0;
> + if (!ida_pre_get(&proc_inum_ida, GFP_KERNEL))
> + return -ENOMEM;
>
> spin_lock(&proc_inum_lock);
> error = ida_get_new(&proc_inum_ida, &i);
> @@ -365,18 +365,19 @@ retry:
> if (error == -EAGAIN)
> goto retry;
> else if (error)
> - return 0;
> + return error;
>
> if (i > UINT_MAX - PROC_DYNAMIC_FIRST) {
> spin_lock(&proc_inum_lock);
> ida_remove(&proc_inum_ida, i);
> spin_unlock(&proc_inum_lock);
> - return 0;
> + return -ENOSPC;
> }
> - return PROC_DYNAMIC_FIRST + i;
> + *inum = PROC_DYNAMIC_FIRST + i;
> + return 0;
> }
>
> -static void release_inode_number(unsigned int inum)
> +void proc_free_inum(unsigned int inum)
> {
> spin_lock(&proc_inum_lock);
> ida_remove(&proc_inum_ida, inum - PROC_DYNAMIC_FIRST);
> @@ -554,13 +555,12 @@ static const struct inode_operations proc_dir_inode_operations = {
>
> static int proc_register(struct proc_dir_entry * dir, struct proc_dir_entry * dp)
> {
> - unsigned int i;
> struct proc_dir_entry *tmp;
> + int ret;
>
> - i = get_inode_number();
> - if (i == 0)
> - return -EAGAIN;
> - dp->low_ino = i;
> + ret = proc_alloc_inum(&dp->low_ino);
> + if (ret)
> + return ret;
>
> if (S_ISDIR(dp->mode)) {
> if (dp->proc_iops == NULL) {
> @@ -764,7 +764,7 @@ EXPORT_SYMBOL(proc_create_data);
>
> static void free_proc_entry(struct proc_dir_entry *de)
> {
> - release_inode_number(de->low_ino);
> + proc_free_inum(de->low_ino);
>
> if (S_ISLNK(de->mode))
> kfree(de->data);
> diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h
> index 3144781..bf1d000 100644
> --- a/include/linux/proc_fs.h
> +++ b/include/linux/proc_fs.h
> @@ -176,6 +176,8 @@ extern struct proc_dir_entry *proc_net_mkdir(struct net *net, const char *name,
> extern struct file *proc_ns_fget(int fd);
> extern bool proc_ns_inode(struct inode *inode);
>
> +extern int proc_alloc_inum(unsigned int *pino);
> +extern void proc_free_inum(unsigned int inum);
> #else
>
> #define proc_net_fops_create(net, name, mode, fops) ({ (void)(mode), NULL; })
> @@ -235,6 +237,14 @@ static inline bool proc_ns_inode(struct inode *inode)
> return false;
> }
>
> +static inline int proc_alloc_inum(unsigned int *inum)
> +{
> + *inum = 1;
> + return 0;
> +}
> +static inline void proc_free_inum(unsigned int inum)
> +{
> +}
> #endif /* CONFIG_PROC_FS */
>
> #if !defined(CONFIG_PROC_KCORE)
> --
> 1.7.5.4
>
> _______________________________________________
> Containers mailing list
> Containers@lists.linux-foundation.org
> https://lists.linuxfoundation.org/mailman/listinfo/containers
next prev parent reply other threads:[~2012-11-19 18:04 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-19 15:08 [PATCH review 0/16] user namespace and namespace infrastructure completion Eric W. Biederman
2012-11-19 15:08 ` Eric W. Biederman
[not found] ` <87lidx8wbo.fsf-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
2012-11-19 15:12 ` [PATCH review 01/16] userns: Ignore suid and sgid on binaries if the uid or gid can not be mapped Eric W. Biederman
2012-11-19 15:12 ` Eric W. Biederman
2012-11-19 15:12 ` [PATCH review 08/16] userns: Kill task_user_ns Eric W. Biederman
[not found] ` <1353337961-12962-8-git-send-email-ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
2012-11-19 22:34 ` Kees Cook
2012-11-19 22:34 ` Kees Cook
2012-11-19 15:12 ` [PATCH review 10/16] userns: Implement unshare of the user namespace Eric W. Biederman
[not found] ` <1353337961-12962-1-git-send-email-ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
2012-11-19 15:12 ` [PATCH review 02/16] userns: Allow unprivileged users to create user namespaces Eric W. Biederman
2012-11-19 15:12 ` Eric W. Biederman
2012-11-19 15:12 ` [PATCH review 03/16] userns: Allow chown and setgid preservation Eric W. Biederman
2012-11-19 15:12 ` Eric W. Biederman
[not found] ` <1353337961-12962-3-git-send-email-ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
2012-11-19 17:49 ` Serge Hallyn
2012-11-19 17:49 ` Serge Hallyn
2012-11-19 15:12 ` [PATCH review 04/16] userns: Allow setting a userns mapping to your current uid Eric W. Biederman
2012-11-19 15:12 ` Eric W. Biederman
2012-11-19 15:12 ` [PATCH review 05/16] userns: Allow unprivileged users to create new namespaces Eric W. Biederman
2012-11-19 15:12 ` Eric W. Biederman
2012-11-19 15:12 ` [PATCH review 06/16] userns: Allow unprivileged use of setns Eric W. Biederman
2012-11-19 15:12 ` Eric W. Biederman
2012-11-19 15:12 ` [PATCH review 07/16] userns: Make create_new_namespaces take a user_ns parameter Eric W. Biederman
2012-11-19 15:12 ` Eric W. Biederman
2012-11-19 15:12 ` [PATCH review 08/16] userns: Kill task_user_ns Eric W. Biederman
2012-11-19 15:12 ` [PATCH review 09/16] userns: Implent proc namespace operations Eric W. Biederman
2012-11-19 15:12 ` Eric W. Biederman
2012-11-19 15:12 ` [PATCH review 10/16] userns: Implement unshare of the user namespace Eric W. Biederman
2012-11-19 15:12 ` [PATCH review 11/16] procfs: Print task uids and gids in the userns that opened the proc file Eric W. Biederman
2012-11-19 15:12 ` Eric W. Biederman
[not found] ` <1353337961-12962-11-git-send-email-ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
2012-11-19 17:58 ` Serge Hallyn
2012-11-19 17:58 ` Serge Hallyn
2012-11-19 15:12 ` [PATCH review 12/16] userns: For /proc/self/{uid, gid}_map derive the lower userns from the struct file Eric W. Biederman
2012-11-19 15:12 ` [PATCH review 12/16] userns: For /proc/self/{uid,gid}_map " Eric W. Biederman
[not found] ` <1353337961-12962-12-git-send-email-ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
2012-11-19 18:03 ` [PATCH review 12/16] userns: For /proc/self/{uid, gid}_map " Serge Hallyn
2012-11-19 18:03 ` Serge Hallyn
2012-11-19 18:29 ` Eric W. Biederman
2012-11-19 18:29 ` Eric W. Biederman
[not found] ` <87fw451m5i.fsf-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
2012-11-19 21:01 ` Serge Hallyn
2012-11-19 21:01 ` Serge Hallyn
2012-11-19 21:09 ` Eric W. Biederman
2012-11-19 21:09 ` Eric W. Biederman
[not found] ` <877gphz4d9.fsf-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
2012-11-19 21:19 ` Serge Hallyn
2012-11-19 21:19 ` Serge Hallyn
2012-11-19 21:27 ` Eric W. Biederman
2012-11-19 21:27 ` Eric W. Biederman
2012-11-19 15:12 ` [PATCH review 13/16] userns: Allow unprivilged mounts of proc and sysfs Eric W. Biederman
2012-11-19 15:12 ` Eric W. Biederman
2012-11-19 15:12 ` [PATCH review 14/16] proc: Generalize proc inode allocation Eric W. Biederman
2012-11-19 15:12 ` Eric W. Biederman
[not found] ` <1353337961-12962-14-git-send-email-ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>
2012-11-19 18:04 ` Serge Hallyn [this message]
2012-11-19 18:04 ` Serge Hallyn
2012-11-19 15:12 ` [PATCH review 15/16] proc: Fix the namespace inode permission checks Eric W. Biederman
2012-11-19 15:12 ` Eric W. Biederman
2012-11-19 15:12 ` [PATCH review 16/16] proc: Usable inode numbers for the namespace file descriptors Eric W. Biederman
2012-11-19 15:12 ` Eric W. Biederman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20121119180458.GD1883@serge-ThinkPad-X130e \
--to=serge.hallyn-z7wlfzj8ewms+fvcfc7uqw@public.gmane.org \
--cc=containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org \
--cc=linux-fsdevel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.