bcachefs: Switch to .iterate_shared for readdir
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 11 Oct 2019 19:14:36 +0000 (15:14 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:29 +0000 (17:08 -0400)
We definitely don't need an exclusive inode lock for readdir.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/fs.c

index 0042a825a6982ffdb64453714dc2768fb108b39a..65556993bbb9ae9257eb7c75ad9d5ea9d919fa50 100644 (file)
@@ -367,12 +367,12 @@ static struct dentry *bch2_lookup(struct inode *vdir, struct dentry *dentry,
        return d_splice_alias(vinode, dentry);
 }
 
-static int bch2_create(struct mnt_idmap *idmap,
-                      struct inode *vdir, struct dentry *dentry,
-                      umode_t mode, bool excl)
+static int bch2_mknod(struct mnt_idmap *idmap,
+                     struct inode *vdir, struct dentry *dentry,
+                     umode_t mode, dev_t rdev)
 {
        struct bch_inode_info *inode =
-               __bch2_create(idmap, to_bch_ei(vdir), dentry, mode|S_IFREG, 0, false);
+               __bch2_create(idmap, to_bch_ei(vdir), dentry, mode, rdev, false);
 
        if (IS_ERR(inode))
                return PTR_ERR(inode);
@@ -381,6 +381,13 @@ static int bch2_create(struct mnt_idmap *idmap,
        return 0;
 }
 
+static int bch2_create(struct mnt_idmap *idmap,
+                      struct inode *vdir, struct dentry *dentry,
+                      umode_t mode, bool excl)
+{
+       return bch2_mknod(idmap, vdir, dentry, mode|S_IFREG, 0);
+}
+
 static int __bch2_link(struct bch_fs *c,
                       struct bch_inode_info *inode,
                       struct bch_inode_info *dir,
@@ -512,33 +519,7 @@ err:
 static int bch2_mkdir(struct mnt_idmap *idmap,
                      struct inode *vdir, struct dentry *dentry, umode_t mode)
 {
-       struct bch_inode_info *inode =
-               __bch2_create(idmap, to_bch_ei(vdir), dentry, mode|S_IFDIR, 0, false);
-
-       if (IS_ERR(inode))
-               return PTR_ERR(inode);
-
-       d_instantiate(dentry, &inode->v);
-       return 0;
-}
-
-static int bch2_rmdir(struct inode *vdir, struct dentry *dentry)
-{
-       return bch2_unlink(vdir, dentry);
-}
-
-static int bch2_mknod(struct mnt_idmap *idmap,
-                     struct inode *vdir, struct dentry *dentry,
-                     umode_t mode, dev_t rdev)
-{
-       struct bch_inode_info *inode =
-               __bch2_create(idmap, to_bch_ei(vdir), dentry, mode, rdev, false);
-
-       if (IS_ERR(inode))
-               return PTR_ERR(inode);
-
-       d_instantiate(dentry, &inode->v);
-       return 0;
+       return bch2_mknod(idmap, vdir, dentry, mode|S_IFDIR, 0);
 }
 
 static int bch2_rename2(struct mnt_idmap *idmap,
@@ -1034,7 +1015,7 @@ static const struct inode_operations bch_dir_inode_operations = {
        .unlink         = bch2_unlink,
        .symlink        = bch2_symlink,
        .mkdir          = bch2_mkdir,
-       .rmdir          = bch2_rmdir,
+       .rmdir          = bch2_unlink,
        .mknod          = bch2_mknod,
        .rename         = bch2_rename2,
        .getattr        = bch2_getattr,