diff mbox

xenbus: Use proc_create_mount_point() to create /proc/xen

Message ID 1472483029-135090-1-git-send-email-seth.forshee@canonical.com (mailing list archive)
State New, archived
Headers show

Commit Message

Seth Forshee Aug. 29, 2016, 3:03 p.m. UTC
Mounting proc in user namespace containers fails if the xenbus
filesystem is mounted on /proc/xen because this directory fails
the "permanently empty" test. proc_create_mount_point() exists
specifically to create such mountpoints in proc but is currently
proc-internal. Export this interface to modules, then use it in
xenbus when creating /proc/xen.

Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
---
 drivers/xen/xenbus/xenbus_probe.c | 2 +-
 fs/proc/generic.c                 | 1 +
 fs/proc/internal.h                | 1 -
 include/linux/proc_fs.h           | 2 ++
 4 files changed, 4 insertions(+), 2 deletions(-)

Comments

Juergen Gross Aug. 30, 2016, 2:48 p.m. UTC | #1
On 29/08/16 17:03, Seth Forshee wrote:
> Mounting proc in user namespace containers fails if the xenbus
> filesystem is mounted on /proc/xen because this directory fails
> the "permanently empty" test. proc_create_mount_point() exists
> specifically to create such mountpoints in proc but is currently
> proc-internal. Export this interface to modules, then use it in
> xenbus when creating /proc/xen.
> 
> Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
> ---
>  drivers/xen/xenbus/xenbus_probe.c | 2 +-
>  fs/proc/generic.c                 | 1 +
>  fs/proc/internal.h                | 1 -
>  include/linux/proc_fs.h           | 2 ++
>  4 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c
> index 33a31cfef55d..b5c1dec4a7c2 100644
> --- a/drivers/xen/xenbus/xenbus_probe.c
> +++ b/drivers/xen/xenbus/xenbus_probe.c
> @@ -826,7 +826,7 @@ static int __init xenbus_init(void)
>  	 * Create xenfs mountpoint in /proc for compatibility with
>  	 * utilities that expect to find "xenbus" under "/proc/xen".
>  	 */
> -	proc_mkdir("xen", NULL);
> +	proc_create_mount_point("xen");
>  #endif
>  
>  out_error:
> diff --git a/fs/proc/generic.c b/fs/proc/generic.c
> index c633476616e0..be014c544d50 100644
> --- a/fs/proc/generic.c
> +++ b/fs/proc/generic.c
> @@ -477,6 +477,7 @@ struct proc_dir_entry *proc_create_mount_point(const char *name)
>  	}
>  	return ent;
>  }
> +EXPORT_SYMBOL(proc_create_mount_point);

EXPORT_SYMBOL_GPL()?

Juergen
David Vrabel Aug. 30, 2016, 3 p.m. UTC | #2
On 29/08/16 16:03, Seth Forshee wrote:
> Mounting proc in user namespace containers fails if the xenbus
> filesystem is mounted on /proc/xen because this directory fails
> the "permanently empty" test. proc_create_mount_point() exists
> specifically to create such mountpoints in proc but is currently
> proc-internal. Export this interface to modules, then use it in
> xenbus when creating /proc/xen.

Acked-by: David Vrabel <david.vrabel@citrix.com>

This either needs to be acked by the fs maintainer or go via their tree
but you don't appear to have Cc'd the relevant people or lists.

David
Seth Forshee Aug. 30, 2016, 3:02 p.m. UTC | #3
On Tue, Aug 30, 2016 at 04:48:08PM +0200, Juergen Gross wrote:
> On 29/08/16 17:03, Seth Forshee wrote:
> > Mounting proc in user namespace containers fails if the xenbus
> > filesystem is mounted on /proc/xen because this directory fails
> > the "permanently empty" test. proc_create_mount_point() exists
> > specifically to create such mountpoints in proc but is currently
> > proc-internal. Export this interface to modules, then use it in
> > xenbus when creating /proc/xen.
> > 
> > Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
> > ---
> >  drivers/xen/xenbus/xenbus_probe.c | 2 +-
> >  fs/proc/generic.c                 | 1 +
> >  fs/proc/internal.h                | 1 -
> >  include/linux/proc_fs.h           | 2 ++
> >  4 files changed, 4 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c
> > index 33a31cfef55d..b5c1dec4a7c2 100644
> > --- a/drivers/xen/xenbus/xenbus_probe.c
> > +++ b/drivers/xen/xenbus/xenbus_probe.c
> > @@ -826,7 +826,7 @@ static int __init xenbus_init(void)
> >  	 * Create xenfs mountpoint in /proc for compatibility with
> >  	 * utilities that expect to find "xenbus" under "/proc/xen".
> >  	 */
> > -	proc_mkdir("xen", NULL);
> > +	proc_create_mount_point("xen");
> >  #endif
> >  
> >  out_error:
> > diff --git a/fs/proc/generic.c b/fs/proc/generic.c
> > index c633476616e0..be014c544d50 100644
> > --- a/fs/proc/generic.c
> > +++ b/fs/proc/generic.c
> > @@ -477,6 +477,7 @@ struct proc_dir_entry *proc_create_mount_point(const char *name)
> >  	}
> >  	return ent;
> >  }
> > +EXPORT_SYMBOL(proc_create_mount_point);
> 
> EXPORT_SYMBOL_GPL()?

Other similar sorts of calls in proc (proc_mkdir in particular) are
EXPORT_SYMBOL, so I guessed this one should follow suit. But if it
should be EXPORT_SYMOBL_GPL then that's fine too.

Thanks,
Seth
Seth Forshee Aug. 30, 2016, 3:10 p.m. UTC | #4
On Tue, Aug 30, 2016 at 04:00:03PM +0100, David Vrabel wrote:
> On 29/08/16 16:03, Seth Forshee wrote:
> > Mounting proc in user namespace containers fails if the xenbus
> > filesystem is mounted on /proc/xen because this directory fails
> > the "permanently empty" test. proc_create_mount_point() exists
> > specifically to create such mountpoints in proc but is currently
> > proc-internal. Export this interface to modules, then use it in
> > xenbus when creating /proc/xen.
> 
> Acked-by: David Vrabel <david.vrabel@citrix.com>
> 
> This either needs to be acked by the fs maintainer or go via their tree
> but you don't appear to have Cc'd the relevant people or lists.

Huh. I use a script which uses get_maintainer.pl to add the relevant
maintainers and lists, but appaerntly that failed me this time. Even
running get_maintainer.pl by hand though it doesn't suggest
linux-fsdevel though, and it seems it should.

Thanks,
Seth
David Vrabel Aug. 30, 2016, 3:13 p.m. UTC | #5
On 30/08/16 16:10, Seth Forshee wrote:
> On Tue, Aug 30, 2016 at 04:00:03PM +0100, David Vrabel wrote:
>> On 29/08/16 16:03, Seth Forshee wrote:
>>> Mounting proc in user namespace containers fails if the xenbus
>>> filesystem is mounted on /proc/xen because this directory fails
>>> the "permanently empty" test. proc_create_mount_point() exists
>>> specifically to create such mountpoints in proc but is currently
>>> proc-internal. Export this interface to modules, then use it in
>>> xenbus when creating /proc/xen.
>>
>> Acked-by: David Vrabel <david.vrabel@citrix.com>
>>
>> This either needs to be acked by the fs maintainer or go via their tree
>> but you don't appear to have Cc'd the relevant people or lists.
> 
> Huh. I use a script which uses get_maintainer.pl to add the relevant
> maintainers and lists, but appaerntly that failed me this time. Even
> running get_maintainer.pl by hand though it doesn't suggest
> linux-fsdevel though, and it seems it should.

I tend not rely on get_maintainer.pl because it isn't very reliable.
From MAINTAINERS you want:

FILESYSTEMS (VFS and infrastructure)
M:      Alexander Viro <viro@zeniv.linux.org.uk>
L:      linux-fsdevel@vger.kernel.org
S:      Maintained
F:      fs/*

David
diff mbox

Patch

diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c
index 33a31cfef55d..b5c1dec4a7c2 100644
--- a/drivers/xen/xenbus/xenbus_probe.c
+++ b/drivers/xen/xenbus/xenbus_probe.c
@@ -826,7 +826,7 @@  static int __init xenbus_init(void)
 	 * Create xenfs mountpoint in /proc for compatibility with
 	 * utilities that expect to find "xenbus" under "/proc/xen".
 	 */
-	proc_mkdir("xen", NULL);
+	proc_create_mount_point("xen");
 #endif
 
 out_error:
diff --git a/fs/proc/generic.c b/fs/proc/generic.c
index c633476616e0..be014c544d50 100644
--- a/fs/proc/generic.c
+++ b/fs/proc/generic.c
@@ -477,6 +477,7 @@  struct proc_dir_entry *proc_create_mount_point(const char *name)
 	}
 	return ent;
 }
+EXPORT_SYMBOL(proc_create_mount_point);
 
 struct proc_dir_entry *proc_create_data(const char *name, umode_t mode,
 					struct proc_dir_entry *parent,
diff --git a/fs/proc/internal.h b/fs/proc/internal.h
index 7931c558c192..ff7259559d70 100644
--- a/fs/proc/internal.h
+++ b/fs/proc/internal.h
@@ -195,7 +195,6 @@  static inline bool is_empty_pde(const struct proc_dir_entry *pde)
 {
 	return S_ISDIR(pde->mode) && !pde->proc_iops;
 }
-struct proc_dir_entry *proc_create_mount_point(const char *name);
 
 /*
  * inode.c
diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h
index b97bf2ef996e..8bd2f726436a 100644
--- a/include/linux/proc_fs.h
+++ b/include/linux/proc_fs.h
@@ -21,6 +21,7 @@  extern struct proc_dir_entry *proc_mkdir_data(const char *, umode_t,
 					      struct proc_dir_entry *, void *);
 extern struct proc_dir_entry *proc_mkdir_mode(const char *, umode_t,
 					      struct proc_dir_entry *);
+struct proc_dir_entry *proc_create_mount_point(const char *name);
  
 extern struct proc_dir_entry *proc_create_data(const char *, umode_t,
 					       struct proc_dir_entry *,
@@ -56,6 +57,7 @@  static inline struct proc_dir_entry *proc_symlink(const char *name,
 		struct proc_dir_entry *parent,const char *dest) { return NULL;}
 static inline struct proc_dir_entry *proc_mkdir(const char *name,
 	struct proc_dir_entry *parent) {return NULL;}
+static inline struct proc_dir_entry *proc_create_mount_point(const char *name) { return NULL; }
 static inline struct proc_dir_entry *proc_mkdir_data(const char *name,
 	umode_t mode, struct proc_dir_entry *parent, void *data) { return NULL; }
 static inline struct proc_dir_entry *proc_mkdir_mode(const char *name,