[PATCH] bcache: fix UUID room exhausted fake issue.

From: Yi Li
Date: Thu Dec 17 2020 - 03:07:13 EST


The UUID room will be exhausted fake when loop attach/dettach backing dev.

Using zero_uuid to the UUID room after dettach normaly.
And attach dev can request UUID room successfully.

Signed-off-by: Yi Li <yili@xxxxxxxxxxx>
Signed-off-by: Li bing <libing@xxxxxxxxxxx>
---
drivers/md/bcache/super.c | 20 +++++---------------
1 file changed, 5 insertions(+), 15 deletions(-)

diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
index 0e06d721cd8e..f7ad1e26b013 100644
--- a/drivers/md/bcache/super.c
+++ b/drivers/md/bcache/super.c
@@ -34,10 +34,7 @@ static const char bcache_magic[] = {
0x82, 0x65, 0xf5, 0x7f, 0x48, 0xba, 0x6d, 0x81
};

-static const char invalid_uuid[] = {
- 0xa0, 0x3e, 0xf8, 0xed, 0x3e, 0xe1, 0xb8, 0x78,
- 0xc8, 0x50, 0xfc, 0x5e, 0xcb, 0x16, 0xcd, 0x99
-};
+static const char zero_uuid[16] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";

static struct kobject *bcache_kobj;
struct mutex bch_register_lock;
@@ -515,13 +512,6 @@ static struct uuid_entry *uuid_find(struct cache_set *c, const char *uuid)
return NULL;
}

-static struct uuid_entry *uuid_find_empty(struct cache_set *c)
-{
- static const char zero_uuid[16] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
-
- return uuid_find(c, zero_uuid);
-}
-
/*
* Bucket priorities/gens:
*
@@ -803,7 +793,7 @@ static void bcache_device_detach(struct bcache_device *d)
struct uuid_entry *u = d->c->uuids + d->id;

SET_UUID_FLASH_ONLY(u, 0);
- memcpy(u->uuid, invalid_uuid, 16);
+ memcpy(u->uuid, zero_uuid, 16);
u->invalidated = cpu_to_le32((u32)ktime_get_real_seconds());
bch_uuid_write(d->c);
}
@@ -1211,7 +1201,7 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c,
if (u &&
(BDEV_STATE(&dc->sb) == BDEV_STATE_STALE ||
BDEV_STATE(&dc->sb) == BDEV_STATE_NONE)) {
- memcpy(u->uuid, invalid_uuid, 16);
+ memcpy(u->uuid, zero_uuid, 16);
u->invalidated = cpu_to_le32((u32)ktime_get_real_seconds());
u = NULL;
}
@@ -1223,7 +1213,7 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c,
return -ENOENT;
}

- u = uuid_find_empty(c);
+ u = uuid_find(c, zero_uuid);
if (!u) {
pr_err("Not caching %s, no room for UUID\n",
dc->backing_dev_name);
@@ -1554,7 +1544,7 @@ int bch_flash_dev_create(struct cache_set *c, uint64_t size)
if (!test_bit(CACHE_SET_RUNNING, &c->flags))
return -EPERM;

- u = uuid_find_empty(c);
+ u = uuid_find(c, zero_uuid);
if (!u) {
pr_err("Can't create volume, no room for UUID\n");
return -EINVAL;
--
2.25.3