up_read(&devs->rwsem);
                        return 0;
                }
-               map->m_bdev = dif->bdev;
+               map->m_bdev = dif->bdev_handle->bdev;
                map->m_daxdev = dif->dax_dev;
                map->m_dax_part_off = dif->dax_part_off;
                map->m_fscache = dif->fscache;
                        if (map->m_pa >= startoff &&
                            map->m_pa < startoff + length) {
                                map->m_pa -= startoff;
-                               map->m_bdev = dif->bdev;
+                               map->m_bdev = dif->bdev_handle->bdev;
                                map->m_daxdev = dif->dax_dev;
                                map->m_dax_part_off = dif->dax_part_off;
                                map->m_fscache = dif->fscache;
 
        struct erofs_sb_info *sbi = EROFS_SB(sb);
        struct erofs_fscache *fscache;
        struct erofs_deviceslot *dis;
-       struct block_device *bdev;
+       struct bdev_handle *bdev_handle;
        void *ptr;
 
        ptr = erofs_read_metabuf(buf, sb, erofs_blknr(sb, *pos), EROFS_KMAP);
                        return PTR_ERR(fscache);
                dif->fscache = fscache;
        } else if (!sbi->devs->flatdev) {
-               bdev = blkdev_get_by_path(dif->path, BLK_OPEN_READ, sb->s_type,
-                                         NULL);
-               if (IS_ERR(bdev))
-                       return PTR_ERR(bdev);
-               dif->bdev = bdev;
-               dif->dax_dev = fs_dax_get_by_bdev(bdev, &dif->dax_part_off,
-                                                 NULL, NULL);
+               bdev_handle = bdev_open_by_path(dif->path, BLK_OPEN_READ,
+                                               sb->s_type, NULL);
+               if (IS_ERR(bdev_handle))
+                       return PTR_ERR(bdev_handle);
+               dif->bdev_handle = bdev_handle;
+               dif->dax_dev = fs_dax_get_by_bdev(bdev_handle->bdev,
+                               &dif->dax_part_off, NULL, NULL);
        }
 
        dif->blocks = le32_to_cpu(dis->blocks);
        struct erofs_device_info *dif = ptr;
 
        fs_put_dax(dif->dax_dev, NULL);
-       if (dif->bdev)
-               blkdev_put(dif->bdev, &erofs_fs_type);
+       if (dif->bdev_handle)
+               bdev_release(dif->bdev_handle);
        erofs_fscache_unregister_cookie(dif->fscache);
        dif->fscache = NULL;
        kfree(dif->path);