]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
Merge branch 'work.recursive_removal' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 3 May 2021 18:09:36 +0000 (11:09 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 3 May 2021 18:09:36 +0000 (11:09 -0700)
Pull another simple_recursive_removal() update from Al Viro:
 "I missed one case when simple_recursive_removal() was introduced"

* 'work.recursive_removal' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  qib_fs: switch to simple_recursive_removal()

drivers/infiniband/hw/qib/qib_fs.c

index e336d778e076eddb3d56c37b6fd33be0de87b050..a0c5f3bdc3246b22562c94ac1e7baa78f77161da 100644 (file)
@@ -427,79 +427,21 @@ bail:
        return ret;
 }
 
-static int remove_file(struct dentry *parent, char *name)
-{
-       struct dentry *tmp;
-       int ret;
-
-       tmp = lookup_one_len(name, parent, strlen(name));
-
-       if (IS_ERR(tmp)) {
-               ret = PTR_ERR(tmp);
-               goto bail;
-       }
-
-       spin_lock(&tmp->d_lock);
-       if (simple_positive(tmp)) {
-               __d_drop(tmp);
-               spin_unlock(&tmp->d_lock);
-               simple_unlink(d_inode(parent), tmp);
-       } else {
-               spin_unlock(&tmp->d_lock);
-       }
-       dput(tmp);
-
-       ret = 0;
-bail:
-       /*
-        * We don't expect clients to care about the return value, but
-        * it's there if they need it.
-        */
-       return ret;
-}
-
 static int remove_device_files(struct super_block *sb,
                               struct qib_devdata *dd)
 {
-       struct dentry *dir, *root;
+       struct dentry *dir;
        char unit[10];
-       int ret, i;
 
-       root = dget(sb->s_root);
-       inode_lock(d_inode(root));
        snprintf(unit, sizeof(unit), "%u", dd->unit);
-       dir = lookup_one_len(unit, root, strlen(unit));
+       dir = lookup_one_len_unlocked(unit, sb->s_root, strlen(unit));
 
        if (IS_ERR(dir)) {
-               ret = PTR_ERR(dir);
                pr_err("Lookup of %s failed\n", unit);
-               goto bail;
+               return PTR_ERR(dir);
        }
-
-       inode_lock(d_inode(dir));
-       remove_file(dir, "counters");
-       remove_file(dir, "counter_names");
-       remove_file(dir, "portcounter_names");
-       for (i = 0; i < dd->num_pports; i++) {
-               char fname[24];
-
-               sprintf(fname, "port%dcounters", i + 1);
-               remove_file(dir, fname);
-               if (dd->flags & QIB_HAS_QSFP) {
-                       sprintf(fname, "qsfp%d", i + 1);
-                       remove_file(dir, fname);
-               }
-       }
-       remove_file(dir, "flash");
-       inode_unlock(d_inode(dir));
-       ret = simple_rmdir(d_inode(root), dir);
-       d_drop(dir);
-       dput(dir);
-
-bail:
-       inode_unlock(d_inode(root));
-       dput(root);
-       return ret;
+       simple_recursive_removal(dir, NULL);
+       return 0;
 }
 
 /*