bcachefs: Change bch2_dev_lookup() to not use lookup_bdev()
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 16 Feb 2022 11:23:06 +0000 (06:23 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:24 +0000 (17:09 -0400)
bch2_dev_lookup() is used from the extended attribute set methods, for
setting the target options, where we're already holding an inode lock -
it turns out pathname lookups also take inode locks, so that was
susceptible to deadlocks.

Fortunately we already stash the device name in ca->name. This does
change user-visible behaviour though: instead of specifying e.g.
/dev/sda1, user must now specify sda1.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/super.c

index d35547fbefdb3ab93f0a9261b77824fcdcde13e2..6a32b9a5dc0eded929ef76cba3330d9b1e4ea3f1 100644 (file)
@@ -1883,20 +1883,14 @@ err:
 }
 
 /* return with ref on ca->ref: */
-struct bch_dev *bch2_dev_lookup(struct bch_fs *c, const char *path)
+struct bch_dev *bch2_dev_lookup(struct bch_fs *c, const char *name)
 {
        struct bch_dev *ca;
-       dev_t dev;
        unsigned i;
-       int ret;
-
-       ret = lookup_bdev(path, &dev);
-       if (ret)
-               return ERR_PTR(ret);
 
        rcu_read_lock();
        for_each_member_device_rcu(ca, c, i, NULL)
-               if (ca->dev == dev)
+               if (!strcmp(name, ca->name))
                        goto found;
        ca = ERR_PTR(-ENOENT);
 found: