simple_fill_super(): don't bother with d_genocide() on failure
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 11 Nov 2023 20:56:55 +0000 (15:56 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 25 Nov 2023 07:50:11 +0000 (02:50 -0500)
Failing ->fill_super() will be followed by ->kill_sb(), which should
include kill_litter_super() if the call of simple_fill_super() had
been asked to create anything besides the root dentry.  So there's
no need to empty the partially populated tree - it will be trimmed
by inevitable kill_litter_super().

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/libfs.c

index e9440d55073c50962486f3f4f047a7872544fcff..6fa8ad36049f1a393889cb8605eb307d5a40ada1 100644 (file)
@@ -912,7 +912,6 @@ int simple_fill_super(struct super_block *s, unsigned long magic,
                      const struct tree_descr *files)
 {
        struct inode *inode;
-       struct dentry *root;
        struct dentry *dentry;
        int i;
 
@@ -935,8 +934,8 @@ int simple_fill_super(struct super_block *s, unsigned long magic,
        inode->i_op = &simple_dir_inode_operations;
        inode->i_fop = &simple_dir_operations;
        set_nlink(inode, 2);
-       root = d_make_root(inode);
-       if (!root)
+       s->s_root = d_make_root(inode);
+       if (!s->s_root)
                return -ENOMEM;
        for (i = 0; !files->name || files->name[0]; i++, files++) {
                if (!files->name)
@@ -948,13 +947,13 @@ int simple_fill_super(struct super_block *s, unsigned long magic,
                                "with an index of 1!\n", __func__,
                                s->s_type->name);
 
-               dentry = d_alloc_name(root, files->name);
+               dentry = d_alloc_name(s->s_root, files->name);
                if (!dentry)
-                       goto out;
+                       return -ENOMEM;
                inode = new_inode(s);
                if (!inode) {
                        dput(dentry);
-                       goto out;
+                       return -ENOMEM;
                }
                inode->i_mode = S_IFREG | files->mode;
                simple_inode_init_ts(inode);
@@ -962,13 +961,7 @@ int simple_fill_super(struct super_block *s, unsigned long magic,
                inode->i_ino = i;
                d_add(dentry, inode);
        }
-       s->s_root = root;
        return 0;
-out:
-       d_genocide(root);
-       shrink_dcache_parent(root);
-       dput(root);
-       return -ENOMEM;
 }
 EXPORT_SYMBOL(simple_fill_super);