]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bcache: port block device access to files
authorChristian Brauner <brauner@kernel.org>
Tue, 23 Jan 2024 13:26:30 +0000 (14:26 +0100)
committerChristian Brauner <brauner@kernel.org>
Sun, 25 Feb 2024 11:05:24 +0000 (12:05 +0100)
Link: https://lore.kernel.org/r/20240123-vfs-bdev-file-v2-13-adbd023e19cc@kernel.org
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
drivers/md/bcache/bcache.h
drivers/md/bcache/super.c

index 6ae2329052c92c3c2724694c11f586bed8c5c15a..4e6afa89921fe0b79c4a760163d66565a2092d53 100644 (file)
@@ -300,7 +300,7 @@ struct cached_dev {
        struct list_head        list;
        struct bcache_device    disk;
        struct block_device     *bdev;
-       struct bdev_handle      *bdev_handle;
+       struct file             *bdev_file;
 
        struct cache_sb         sb;
        struct cache_sb_disk    *sb_disk;
@@ -423,7 +423,7 @@ struct cache {
 
        struct kobject          kobj;
        struct block_device     *bdev;
-       struct bdev_handle      *bdev_handle;
+       struct file             *bdev_file;
 
        struct task_struct      *alloc_thread;
 
index dc3f50f69714174cd0d649b4d003a9ed5b2d4992..d00b3abab1336bc1b48e3708fc5a95310449b53e 100644 (file)
@@ -1369,8 +1369,8 @@ static CLOSURE_CALLBACK(cached_dev_free)
        if (dc->sb_disk)
                put_page(virt_to_page(dc->sb_disk));
 
-       if (dc->bdev_handle)
-               bdev_release(dc->bdev_handle);
+       if (dc->bdev_file)
+               fput(dc->bdev_file);
 
        wake_up(&unregister_wait);
 
@@ -1445,7 +1445,7 @@ static int cached_dev_init(struct cached_dev *dc, unsigned int block_size)
 /* Cached device - bcache superblock */
 
 static int register_bdev(struct cache_sb *sb, struct cache_sb_disk *sb_disk,
-                                struct bdev_handle *bdev_handle,
+                                struct file *bdev_file,
                                 struct cached_dev *dc)
 {
        const char *err = "cannot allocate memory";
@@ -1453,8 +1453,8 @@ static int register_bdev(struct cache_sb *sb, struct cache_sb_disk *sb_disk,
        int ret = -ENOMEM;
 
        memcpy(&dc->sb, sb, sizeof(struct cache_sb));
-       dc->bdev_handle = bdev_handle;
-       dc->bdev = bdev_handle->bdev;
+       dc->bdev_file = bdev_file;
+       dc->bdev = file_bdev(bdev_file);
        dc->sb_disk = sb_disk;
 
        if (cached_dev_init(dc, sb->block_size << 9))
@@ -2218,8 +2218,8 @@ void bch_cache_release(struct kobject *kobj)
        if (ca->sb_disk)
                put_page(virt_to_page(ca->sb_disk));
 
-       if (ca->bdev_handle)
-               bdev_release(ca->bdev_handle);
+       if (ca->bdev_file)
+               fput(ca->bdev_file);
 
        kfree(ca);
        module_put(THIS_MODULE);
@@ -2339,18 +2339,18 @@ err_free:
 }
 
 static int register_cache(struct cache_sb *sb, struct cache_sb_disk *sb_disk,
-                               struct bdev_handle *bdev_handle,
+                               struct file *bdev_file,
                                struct cache *ca)
 {
        const char *err = NULL; /* must be set for any error case */
        int ret = 0;
 
        memcpy(&ca->sb, sb, sizeof(struct cache_sb));
-       ca->bdev_handle = bdev_handle;
-       ca->bdev = bdev_handle->bdev;
+       ca->bdev_file = bdev_file;
+       ca->bdev = file_bdev(bdev_file);
        ca->sb_disk = sb_disk;
 
-       if (bdev_max_discard_sectors((bdev_handle->bdev)))
+       if (bdev_max_discard_sectors(file_bdev(bdev_file)))
                ca->discard = CACHE_DISCARD(&ca->sb);
 
        ret = cache_alloc(ca);
@@ -2361,20 +2361,20 @@ static int register_cache(struct cache_sb *sb, struct cache_sb_disk *sb_disk,
                        err = "cache_alloc(): cache device is too small";
                else
                        err = "cache_alloc(): unknown error";
-               pr_notice("error %pg: %s\n", bdev_handle->bdev, err);
+               pr_notice("error %pg: %s\n", file_bdev(bdev_file), err);
                /*
                 * If we failed here, it means ca->kobj is not initialized yet,
                 * kobject_put() won't be called and there is no chance to
-                * call bdev_release() to bdev in bch_cache_release(). So
-                * we explicitly call bdev_release() here.
+                * call fput() to bdev in bch_cache_release(). So
+                * we explicitly call fput() on the block device here.
                 */
-               bdev_release(bdev_handle);
+               fput(bdev_file);
                return ret;
        }
 
-       if (kobject_add(&ca->kobj, bdev_kobj(bdev_handle->bdev), "bcache")) {
+       if (kobject_add(&ca->kobj, bdev_kobj(file_bdev(bdev_file)), "bcache")) {
                pr_notice("error %pg: error calling kobject_add\n",
-                         bdev_handle->bdev);
+                         file_bdev(bdev_file));
                ret = -ENOMEM;
                goto out;
        }
@@ -2388,7 +2388,7 @@ static int register_cache(struct cache_sb *sb, struct cache_sb_disk *sb_disk,
                goto out;
        }
 
-       pr_info("registered cache device %pg\n", ca->bdev_handle->bdev);
+       pr_info("registered cache device %pg\n", file_bdev(ca->bdev_file));
 
 out:
        kobject_put(&ca->kobj);
@@ -2446,7 +2446,7 @@ struct async_reg_args {
        char *path;
        struct cache_sb *sb;
        struct cache_sb_disk *sb_disk;
-       struct bdev_handle *bdev_handle;
+       struct file *bdev_file;
        void *holder;
 };
 
@@ -2457,7 +2457,7 @@ static void register_bdev_worker(struct work_struct *work)
                container_of(work, struct async_reg_args, reg_work.work);
 
        mutex_lock(&bch_register_lock);
-       if (register_bdev(args->sb, args->sb_disk, args->bdev_handle,
+       if (register_bdev(args->sb, args->sb_disk, args->bdev_file,
                          args->holder) < 0)
                fail = true;
        mutex_unlock(&bch_register_lock);
@@ -2478,7 +2478,7 @@ static void register_cache_worker(struct work_struct *work)
                container_of(work, struct async_reg_args, reg_work.work);
 
        /* blkdev_put() will be called in bch_cache_release() */
-       if (register_cache(args->sb, args->sb_disk, args->bdev_handle,
+       if (register_cache(args->sb, args->sb_disk, args->bdev_file,
                           args->holder))
                fail = true;
 
@@ -2516,7 +2516,7 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr,
        char *path = NULL;
        struct cache_sb *sb;
        struct cache_sb_disk *sb_disk;
-       struct bdev_handle *bdev_handle, *bdev_handle2;
+       struct file *bdev_file, *bdev_file2;
        void *holder = NULL;
        ssize_t ret;
        bool async_registration = false;
@@ -2549,15 +2549,15 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr,
 
        ret = -EINVAL;
        err = "failed to open device";
-       bdev_handle = bdev_open_by_path(strim(path), BLK_OPEN_READ, NULL, NULL);
-       if (IS_ERR(bdev_handle))
+       bdev_file = bdev_file_open_by_path(strim(path), BLK_OPEN_READ, NULL, NULL);
+       if (IS_ERR(bdev_file))
                goto out_free_sb;
 
        err = "failed to set blocksize";
-       if (set_blocksize(bdev_handle->bdev, 4096))
+       if (set_blocksize(file_bdev(bdev_file), 4096))
                goto out_blkdev_put;
 
-       err = read_super(sb, bdev_handle->bdev, &sb_disk);
+       err = read_super(sb, file_bdev(bdev_file), &sb_disk);
        if (err)
                goto out_blkdev_put;
 
@@ -2569,13 +2569,13 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr,
        }
 
        /* Now reopen in exclusive mode with proper holder */
-       bdev_handle2 = bdev_open_by_dev(bdev_handle->bdev->bd_dev,
+       bdev_file2 = bdev_file_open_by_dev(file_bdev(bdev_file)->bd_dev,
                        BLK_OPEN_READ | BLK_OPEN_WRITE, holder, NULL);
-       bdev_release(bdev_handle);
-       bdev_handle = bdev_handle2;
-       if (IS_ERR(bdev_handle)) {
-               ret = PTR_ERR(bdev_handle);
-               bdev_handle = NULL;
+       fput(bdev_file);
+       bdev_file = bdev_file2;
+       if (IS_ERR(bdev_file)) {
+               ret = PTR_ERR(bdev_file);
+               bdev_file = NULL;
                if (ret == -EBUSY) {
                        dev_t dev;
 
@@ -2610,7 +2610,7 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr,
                args->path      = path;
                args->sb        = sb;
                args->sb_disk   = sb_disk;
-               args->bdev_handle       = bdev_handle;
+               args->bdev_file = bdev_file;
                args->holder    = holder;
                register_device_async(args);
                /* No wait and returns to user space */
@@ -2619,14 +2619,14 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr,
 
        if (SB_IS_BDEV(sb)) {
                mutex_lock(&bch_register_lock);
-               ret = register_bdev(sb, sb_disk, bdev_handle, holder);
+               ret = register_bdev(sb, sb_disk, bdev_file, holder);
                mutex_unlock(&bch_register_lock);
                /* blkdev_put() will be called in cached_dev_free() */
                if (ret < 0)
                        goto out_free_sb;
        } else {
                /* blkdev_put() will be called in bch_cache_release() */
-               ret = register_cache(sb, sb_disk, bdev_handle, holder);
+               ret = register_cache(sb, sb_disk, bdev_file, holder);
                if (ret)
                        goto out_free_sb;
        }
@@ -2642,8 +2642,8 @@ out_free_holder:
 out_put_sb_page:
        put_page(virt_to_page(sb_disk));
 out_blkdev_put:
-       if (bdev_handle)
-               bdev_release(bdev_handle);
+       if (bdev_file)
+               fput(bdev_file);
 out_free_sb:
        kfree(sb);
 out_free_path: