Re: [RFC] do we want pipefs et.al. in /proc/filesystems?

2013-10-09 Thread Linus Torvalds
On Wed, Oct 9, 2013 at 5:47 PM, Al Viro  wrote:
>
> These days there's no reason to register the filesystem types
> that can only be used for internal mounts - ia64 pfmfs, anon_inodes,
> bdev, pipefs and sockfs, in the current tree.  The only user-visible
> effect of dropping those register_filesystem() would be shorter
> /proc/filesystems - that bunch wouldn't be mentioned there anymore.
> Does anything care about that?  FWIW, the diff eliminating those
> would be as below (net/socket.c init leaks on early failures;
> I'd left that as-is - it's a separate story).

I like the patch, but I do worry that some user space thing uses this
to check whether the particular filesystem module is loaded.

Those kinds of things can't use /proc/modules (because it might be
built-in), but /proc/filesystems has traditionally contained
everything.

That said, these particular filesystems I really don't think people
would ever possibly check for, so I think it's fine.

  Linus
--
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/


[RFC] do we want pipefs et.al. in /proc/filesystems?

2013-10-09 Thread Al Viro
We used to require register_filesystem() before any mounts
(including the internal ones) could be done.  For userland mounts
it's obviously right - how else could fs type name -> file_system_type
lookup be done?  For internal ones, it used to be really needed for
a while, but after some API massage (about 10 years ago, IIRC) it really
became pointless - kern_mount() takes a pointer to file_system_type
and doesn't bother with searching for it by name.  For a while there
was one remaining reason - the list of struct superblock belonging to
given fs type was a list_head one, with register_filesystem() initializing
the list.  A couple of years ago we switched to hlist, which doesn't
require anything of that sort - hlist_head initialized to NULL is an
empty list.

These days there's no reason to register the filesystem types
that can only be used for internal mounts - ia64 pfmfs, anon_inodes,
bdev, pipefs and sockfs, in the current tree.  The only user-visible
effect of dropping those register_filesystem() would be shorter
/proc/filesystems - that bunch wouldn't be mentioned there anymore.
Does anything care about that?  FWIW, the diff eliminating those
would be as below (net/socket.c init leaks on early failures;
I'd left that as-is - it's a separate story).

diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c
index 5a9ff1c..bb3968e 100644
--- a/arch/ia64/kernel/perfmon.c
+++ b/arch/ia64/kernel/perfmon.c
@@ -1529,16 +1529,10 @@ static struct vfsmount *pfmfs_mnt __read_mostly;
 static int __init
 init_pfm_fs(void)
 {
-   int err = register_filesystem(_fs_type);
-   if (!err) {
-   pfmfs_mnt = kern_mount(_fs_type);
-   err = PTR_ERR(pfmfs_mnt);
-   if (IS_ERR(pfmfs_mnt))
-   unregister_filesystem(_fs_type);
-   else
-   err = 0;
-   }
-   return err;
+   pfmfs_mnt = kern_mount(_fs_type);
+   if (IS_ERR(pfmfs_mnt))
+   return PTR_ERR(pfmfs_mnt);
+   return 0;
 }
 
 static ssize_t
diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c
index 2408473..ad56c5a 100644
--- a/fs/anon_inodes.c
+++ b/fs/anon_inodes.c
@@ -175,22 +175,11 @@ EXPORT_SYMBOL_GPL(anon_inode_getfd);
 
 static int __init anon_inode_init(void)
 {
-   int error;
-
-   error = register_filesystem(_inode_fs_type);
-   if (error)
-   goto err_exit;
anon_inode_mnt = kern_mount(_inode_fs_type);
-   if (IS_ERR(anon_inode_mnt)) {
-   error = PTR_ERR(anon_inode_mnt);
-   goto err_unregister_filesystem;
-   }
+   if (IS_ERR(anon_inode_mnt))
+   panic("anon_inode_init() failed (%ld)\n",
+   PTR_ERR(anon_inode_mnt));
return 0;
-
-err_unregister_filesystem:
-   unregister_filesystem(_inode_fs_type);
-err_exit:
-   panic(KERN_ERR "anon_inode_init() failed (%d)\n", error);
 }
 
 fs_initcall(anon_inode_init);
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 1e86823..ff3bf6a 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -461,9 +461,6 @@ void __init bdev_cache_init(void)
0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
SLAB_MEM_SPREAD|SLAB_PANIC),
init_once);
-   err = register_filesystem(_type);
-   if (err)
-   panic("Cannot register bdev pseudo-fs");
bd_mnt = kern_mount(_type);
if (IS_ERR(bd_mnt))
panic("Cannot create bdev pseudo-fs");
diff --git a/fs/pipe.c b/fs/pipe.c
index d2c45e14..7a63d0a 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -1311,16 +1311,10 @@ static struct file_system_type pipe_fs_type = {
 
 static int __init init_pipe_fs(void)
 {
-   int err = register_filesystem(_fs_type);
-
-   if (!err) {
-   pipe_mnt = kern_mount(_fs_type);
-   if (IS_ERR(pipe_mnt)) {
-   err = PTR_ERR(pipe_mnt);
-   unregister_filesystem(_fs_type);
-   }
-   }
-   return err;
+   pipe_mnt = kern_mount(_fs_type);
+   if (IS_ERR(pipe_mnt))
+   panic("pipe init failed\n");
+   return 0;
 }
 
 fs_initcall(init_pipe_fs);
diff --git a/net/socket.c b/net/socket.c
index ebed4b6..ea534a3 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -2617,7 +2617,7 @@ static int __init sock_init(void)
 */
err = net_sysctl_init();
if (err)
-   goto out;
+   return err;
 
/*
 *  Initialize skbuff SLAB cache
@@ -2630,14 +2630,9 @@ static int __init sock_init(void)
 
init_inodecache();
 
-   err = register_filesystem(_fs_type);
-   if (err)
-   goto out_fs;
sock_mnt = kern_mount(_fs_type);
-   if (IS_ERR(sock_mnt)) {
-   err = PTR_ERR(sock_mnt);
-   goto out_mount;
-   }
+   if (IS_ERR(sock_mnt))
+   return PTR_ERR(sock_mnt);
 
/* 

[RFC] do we want pipefs et.al. in /proc/filesystems?

2013-10-09 Thread Al Viro
We used to require register_filesystem() before any mounts
(including the internal ones) could be done.  For userland mounts
it's obviously right - how else could fs type name - file_system_type
lookup be done?  For internal ones, it used to be really needed for
a while, but after some API massage (about 10 years ago, IIRC) it really
became pointless - kern_mount() takes a pointer to file_system_type
and doesn't bother with searching for it by name.  For a while there
was one remaining reason - the list of struct superblock belonging to
given fs type was a list_head one, with register_filesystem() initializing
the list.  A couple of years ago we switched to hlist, which doesn't
require anything of that sort - hlist_head initialized to NULL is an
empty list.

These days there's no reason to register the filesystem types
that can only be used for internal mounts - ia64 pfmfs, anon_inodes,
bdev, pipefs and sockfs, in the current tree.  The only user-visible
effect of dropping those register_filesystem() would be shorter
/proc/filesystems - that bunch wouldn't be mentioned there anymore.
Does anything care about that?  FWIW, the diff eliminating those
would be as below (net/socket.c init leaks on early failures;
I'd left that as-is - it's a separate story).

diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c
index 5a9ff1c..bb3968e 100644
--- a/arch/ia64/kernel/perfmon.c
+++ b/arch/ia64/kernel/perfmon.c
@@ -1529,16 +1529,10 @@ static struct vfsmount *pfmfs_mnt __read_mostly;
 static int __init
 init_pfm_fs(void)
 {
-   int err = register_filesystem(pfm_fs_type);
-   if (!err) {
-   pfmfs_mnt = kern_mount(pfm_fs_type);
-   err = PTR_ERR(pfmfs_mnt);
-   if (IS_ERR(pfmfs_mnt))
-   unregister_filesystem(pfm_fs_type);
-   else
-   err = 0;
-   }
-   return err;
+   pfmfs_mnt = kern_mount(pfm_fs_type);
+   if (IS_ERR(pfmfs_mnt))
+   return PTR_ERR(pfmfs_mnt);
+   return 0;
 }
 
 static ssize_t
diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c
index 2408473..ad56c5a 100644
--- a/fs/anon_inodes.c
+++ b/fs/anon_inodes.c
@@ -175,22 +175,11 @@ EXPORT_SYMBOL_GPL(anon_inode_getfd);
 
 static int __init anon_inode_init(void)
 {
-   int error;
-
-   error = register_filesystem(anon_inode_fs_type);
-   if (error)
-   goto err_exit;
anon_inode_mnt = kern_mount(anon_inode_fs_type);
-   if (IS_ERR(anon_inode_mnt)) {
-   error = PTR_ERR(anon_inode_mnt);
-   goto err_unregister_filesystem;
-   }
+   if (IS_ERR(anon_inode_mnt))
+   panic(anon_inode_init() failed (%ld)\n,
+   PTR_ERR(anon_inode_mnt));
return 0;
-
-err_unregister_filesystem:
-   unregister_filesystem(anon_inode_fs_type);
-err_exit:
-   panic(KERN_ERR anon_inode_init() failed (%d)\n, error);
 }
 
 fs_initcall(anon_inode_init);
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 1e86823..ff3bf6a 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -461,9 +461,6 @@ void __init bdev_cache_init(void)
0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
SLAB_MEM_SPREAD|SLAB_PANIC),
init_once);
-   err = register_filesystem(bd_type);
-   if (err)
-   panic(Cannot register bdev pseudo-fs);
bd_mnt = kern_mount(bd_type);
if (IS_ERR(bd_mnt))
panic(Cannot create bdev pseudo-fs);
diff --git a/fs/pipe.c b/fs/pipe.c
index d2c45e14..7a63d0a 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -1311,16 +1311,10 @@ static struct file_system_type pipe_fs_type = {
 
 static int __init init_pipe_fs(void)
 {
-   int err = register_filesystem(pipe_fs_type);
-
-   if (!err) {
-   pipe_mnt = kern_mount(pipe_fs_type);
-   if (IS_ERR(pipe_mnt)) {
-   err = PTR_ERR(pipe_mnt);
-   unregister_filesystem(pipe_fs_type);
-   }
-   }
-   return err;
+   pipe_mnt = kern_mount(pipe_fs_type);
+   if (IS_ERR(pipe_mnt))
+   panic(pipe init failed\n);
+   return 0;
 }
 
 fs_initcall(init_pipe_fs);
diff --git a/net/socket.c b/net/socket.c
index ebed4b6..ea534a3 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -2617,7 +2617,7 @@ static int __init sock_init(void)
 */
err = net_sysctl_init();
if (err)
-   goto out;
+   return err;
 
/*
 *  Initialize skbuff SLAB cache
@@ -2630,14 +2630,9 @@ static int __init sock_init(void)
 
init_inodecache();
 
-   err = register_filesystem(sock_fs_type);
-   if (err)
-   goto out_fs;
sock_mnt = kern_mount(sock_fs_type);
-   if (IS_ERR(sock_mnt)) {
-   err = PTR_ERR(sock_mnt);
-   goto out_mount;
-   }
+   if (IS_ERR(sock_mnt))
+   

Re: [RFC] do we want pipefs et.al. in /proc/filesystems?

2013-10-09 Thread Linus Torvalds
On Wed, Oct 9, 2013 at 5:47 PM, Al Viro v...@zeniv.linux.org.uk wrote:

 These days there's no reason to register the filesystem types
 that can only be used for internal mounts - ia64 pfmfs, anon_inodes,
 bdev, pipefs and sockfs, in the current tree.  The only user-visible
 effect of dropping those register_filesystem() would be shorter
 /proc/filesystems - that bunch wouldn't be mentioned there anymore.
 Does anything care about that?  FWIW, the diff eliminating those
 would be as below (net/socket.c init leaks on early failures;
 I'd left that as-is - it's a separate story).

I like the patch, but I do worry that some user space thing uses this
to check whether the particular filesystem module is loaded.

Those kinds of things can't use /proc/modules (because it might be
built-in), but /proc/filesystems has traditionally contained
everything.

That said, these particular filesystems I really don't think people
would ever possibly check for, so I think it's fine.

  Linus
--
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/