- Update to snapshot 1.1+git37.a5e3753
OBS-URL: https://build.opensuse.org/package/show/filesystems/bcache-tools?expand=0&rev=37
This commit is contained in:
parent
fe813a0354
commit
9ce026285f
@ -1,204 +0,0 @@
|
||||
From 5042df018d651677e8a315bbf6b3bc654fdde5f2 Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Sat, 16 May 2020 19:55:12 +0800
|
||||
Subject: [PATCH 01/17] bcache-tools: set zoned size aligned data_offset on
|
||||
backing device for zoned devive
|
||||
Git-commit: 5042df018d651677e8a315bbf6b3bc654fdde5f2
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
If the backing device is a zoned device, e.g. host managed SMR hard
|
||||
drive, the data_offset of the backing device should be set to a zone
|
||||
size aligned value, this is necessary for the zoned device I/O LBA
|
||||
and length requirement.
|
||||
|
||||
This patch set the data_offset for zoned backing device by following
|
||||
rules,
|
||||
- If no manually inputed data_offset specified, set it to default
|
||||
value:
|
||||
- If BDEV_DATA_START_DEFAULT >= zone size and aligned to zone size,
|
||||
keep data_offset as BDEV_DATA_START_DEFAULT.
|
||||
- If BDEV_DATA_START_DEFAULT < zone size, set data_offset to zone
|
||||
size.
|
||||
- If data_offset is manually set, it must be a non-zero value aligned
|
||||
to zone size. Of cause it can be multiple zones size, but must be
|
||||
aligned to zone size.
|
||||
|
||||
This patch also creates a new zone.c and zone.h and places all the
|
||||
above zoned device related code there.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
Makefile | 4 +--
|
||||
make.c | 7 ++++-
|
||||
zoned.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
zoned.h | 13 +++++++++
|
||||
4 files changed, 110 insertions(+), 3 deletions(-)
|
||||
create mode 100644 zoned.c
|
||||
create mode 100644 zoned.h
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 4359866..2c326cf 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -24,7 +24,7 @@ bcache-test: LDLIBS += `pkg-config --libs openssl` -lm
|
||||
|
||||
make-bcache: LDLIBS += `pkg-config --libs uuid blkid smartcols`
|
||||
make-bcache: CFLAGS += `pkg-config --cflags uuid blkid smartcols`
|
||||
-make-bcache: make.o crc64.o lib.o
|
||||
+make-bcache: make.o crc64.o lib.o zoned.o
|
||||
|
||||
probe-bcache: LDLIBS += `pkg-config --libs uuid blkid`
|
||||
probe-bcache: CFLAGS += `pkg-config --cflags uuid blkid`
|
||||
@@ -38,4 +38,4 @@ bcache-register: bcache-register.o
|
||||
bcache: CFLAGS += `pkg-config --cflags blkid uuid smartcols`
|
||||
bcache: LDLIBS += `pkg-config --libs blkid uuid smartcols`
|
||||
bcache: CFLAGS += -std=gnu99
|
||||
-bcache: crc64.o lib.o make.o
|
||||
+bcache: crc64.o lib.o make.o zoned.o
|
||||
diff --git a/make.c b/make.c
|
||||
index d46d925..c1090a6 100644
|
||||
--- a/make.c
|
||||
+++ b/make.c
|
||||
@@ -35,6 +35,7 @@
|
||||
#include "bcache.h"
|
||||
#include "lib.h"
|
||||
#include "bitwise.h"
|
||||
+#include "zoned.h"
|
||||
|
||||
#define max(x, y) ({ \
|
||||
typeof(x) _max1 = (x); \
|
||||
@@ -636,11 +637,15 @@ int make_bcache(int argc, char **argv)
|
||||
cache_replacement_policy,
|
||||
data_offset, set_uuid, false, force, label);
|
||||
|
||||
- for (i = 0; i < nbacking_devices; i++)
|
||||
+ for (i = 0; i < nbacking_devices; i++) {
|
||||
+ check_data_offset_for_zoned_device(backing_devices[i],
|
||||
+ &data_offset);
|
||||
+
|
||||
write_sb(backing_devices[i], block_size, bucket_size,
|
||||
writeback, discard, wipe_bcache,
|
||||
cache_replacement_policy,
|
||||
data_offset, set_uuid, true, force, label);
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
diff --git a/zoned.c b/zoned.c
|
||||
new file mode 100644
|
||||
index 0000000..31c9136
|
||||
--- /dev/null
|
||||
+++ b/zoned.c
|
||||
@@ -0,0 +1,89 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * This file is part of bcache tools.
|
||||
+ * Copyright (c) 2020 SUSE Software Solutions
|
||||
+ *
|
||||
+ * Authors: Coly Li <colyli@suse.de>
|
||||
+ */
|
||||
+
|
||||
+#include <errno.h>
|
||||
+#include <stdbool.h>
|
||||
+#include <stdint.h>
|
||||
+#include <stdio.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <string.h>
|
||||
+#include <libgen.h>
|
||||
+
|
||||
+#include "bcache.h"
|
||||
+
|
||||
+/*
|
||||
+ * copied and modified from zonefs_get_dev_capacity() of
|
||||
+ * zonefs-tools.
|
||||
+ * returns 0: zone size 0 indicates a non-zoned device
|
||||
+ * > 0: actual zone size of the zoned device
|
||||
+ */
|
||||
+static size_t get_zone_size(char *devname)
|
||||
+{
|
||||
+ char str[128];
|
||||
+ FILE *file;
|
||||
+ int res;
|
||||
+ size_t zone_size = 0;
|
||||
+
|
||||
+ snprintf(str, sizeof(str),
|
||||
+ "/sys/block/%s/queue/chunk_sectors",
|
||||
+ basename(devname));
|
||||
+ file = fopen(str, "r");
|
||||
+ if (!file)
|
||||
+ goto out;
|
||||
+
|
||||
+ memset(str, 0, sizeof(str));
|
||||
+ res = fscanf(file, "%s", str);
|
||||
+ fclose(file);
|
||||
+
|
||||
+ if (res != 1)
|
||||
+ goto out;
|
||||
+
|
||||
+ zone_size = atol(str);
|
||||
+
|
||||
+out:
|
||||
+ return zone_size;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Update data_offset for zoned device, if the backing
|
||||
+ * device is a zoned device,
|
||||
+ * - just leave whole zone 0 to bcache super block on
|
||||
+ * backing device.
|
||||
+ * - if data_offset is specified and larger than
|
||||
+ * BDEV_DATA_START_DEFAULT, then it should be a zone
|
||||
+ * size aligned value.
|
||||
+ */
|
||||
+void check_data_offset_for_zoned_device(char *devname,
|
||||
+ uint64_t *data_offset)
|
||||
+{
|
||||
+ uint64_t _data_offset = *data_offset;
|
||||
+ size_t zone_size = get_zone_size(devname);
|
||||
+
|
||||
+ if (!zone_size)
|
||||
+ return;
|
||||
+
|
||||
+ if (!_data_offset ||
|
||||
+ (_data_offset == BDEV_DATA_START_DEFAULT &&
|
||||
+ zone_size > BDEV_DATA_START_DEFAULT))
|
||||
+ _data_offset = zone_size;
|
||||
+
|
||||
+ if (_data_offset < zone_size) {
|
||||
+ fprintf(stderr,
|
||||
+ "data_offset %lu should be larger than zone_size %lu for zoned device %s\n",
|
||||
+ _data_offset, zone_size, devname);
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+
|
||||
+ if (_data_offset & (zone_size - 1)) {
|
||||
+ fprintf(stderr,
|
||||
+ "data_offset %lu is not aligned to zone size %lu for zoned device %s\n",
|
||||
+ _data_offset, zone_size, devname);
|
||||
+ }
|
||||
+
|
||||
+ *data_offset = _data_offset;
|
||||
+}
|
||||
diff --git a/zoned.h b/zoned.h
|
||||
new file mode 100644
|
||||
index 0000000..1c5cce8
|
||||
--- /dev/null
|
||||
+++ b/zoned.h
|
||||
@@ -0,0 +1,13 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * This file is part of bcache tools.
|
||||
+ * Copyright (c) 2020 SUSE Software Solutions
|
||||
+ *
|
||||
+ * Authors: Coly Li <colyli@suse.de>
|
||||
+ */
|
||||
+#ifndef __ZONED_H
|
||||
+#define __ZONED_H
|
||||
+
|
||||
+void check_data_offset_for_zoned_device(char *devname, uint64_t *data_offset);
|
||||
+
|
||||
+#endif
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,44 +0,0 @@
|
||||
From 0898a6c8899355b75a13bf490c09e21289d28478 Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Sat, 16 May 2020 21:46:29 +0800
|
||||
Subject: [PATCH 02/17] bcache-tools: add is_zoned_device()
|
||||
Git-commit: 0898a6c8899355b75a13bf490c09e21289d28478
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
This is a wrapper of get_zone_size(), to check whether a device is
|
||||
zoned device or not by checking its chunk_sectors.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
zoned.c | 5 +++++
|
||||
zoned.h | 1 +
|
||||
2 files changed, 6 insertions(+)
|
||||
|
||||
diff --git a/zoned.c b/zoned.c
|
||||
index 31c9136..d078286 100644
|
||||
--- a/zoned.c
|
||||
+++ b/zoned.c
|
||||
@@ -87,3 +87,8 @@ void check_data_offset_for_zoned_device(char *devname,
|
||||
|
||||
*data_offset = _data_offset;
|
||||
}
|
||||
+
|
||||
+int is_zoned_device(char *devname)
|
||||
+{
|
||||
+ return (get_zone_size(devname) != 0);
|
||||
+}
|
||||
diff --git a/zoned.h b/zoned.h
|
||||
index 1c5cce8..25e5c91 100644
|
||||
--- a/zoned.h
|
||||
+++ b/zoned.h
|
||||
@@ -9,5 +9,6 @@
|
||||
#define __ZONED_H
|
||||
|
||||
void check_data_offset_for_zoned_device(char *devname, uint64_t *data_offset);
|
||||
+int is_zoned_device(char *devname);
|
||||
|
||||
#endif
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,50 +0,0 @@
|
||||
From 33b90323056f65225c5b557d7f578b7f37abee3c Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Sat, 16 May 2020 21:57:17 +0800
|
||||
Subject: [PATCH 03/17] bcache-tools: convert writeback to writethrough mode
|
||||
for zoned backing device
|
||||
Git-commit: 33b90323056f65225c5b557d7f578b7f37abee3c
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
Currently bcache does not support writeback cache mode for zoned device
|
||||
as backing device.
|
||||
|
||||
If the backing device is zoned device, and cache mode is explicitly set
|
||||
to writeback mode, a information will be print to terminal,
|
||||
"Zoned device <device name> detected: convert to writethrough mode."
|
||||
Then the cache mode will be automatically converted to writethrough,
|
||||
which is the default cache mode of bcache-tools.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
make.c | 13 +++++++++++++
|
||||
1 file changed, 13 insertions(+)
|
||||
|
||||
diff --git a/make.c b/make.c
|
||||
index c1090a6..cc76863 100644
|
||||
--- a/make.c
|
||||
+++ b/make.c
|
||||
@@ -378,6 +378,19 @@ static void write_sb(char *dev, unsigned int block_size,
|
||||
SET_BDEV_CACHE_MODE(&sb, writeback ?
|
||||
CACHE_MODE_WRITEBACK : CACHE_MODE_WRITETHROUGH);
|
||||
|
||||
+ /*
|
||||
+ * Currently bcache does not support writeback mode for
|
||||
+ * zoned device as backing device. If the cache mode is
|
||||
+ * explicitly set to writeback, automatically convert to
|
||||
+ * writethough mode.
|
||||
+ */
|
||||
+ if (is_zoned_device(dev) &&
|
||||
+ BDEV_CACHE_MODE(&sb) == CACHE_MODE_WRITEBACK) {
|
||||
+ printf("Zoned device %s detected: convert to writethrough mode.\n\n",
|
||||
+ dev);
|
||||
+ SET_BDEV_CACHE_MODE(&sb, CACHE_MODE_WRITETHROUGH);
|
||||
+ }
|
||||
+
|
||||
if (data_offset != BDEV_DATA_START_DEFAULT) {
|
||||
sb.version = BCACHE_SB_VERSION_BDEV_WITH_OFFSET;
|
||||
sb.data_offset = data_offset;
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,93 +0,0 @@
|
||||
From e46282f62364379a6c79b88afd5ed3b78c9781b7 Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Sun, 16 Aug 2020 21:45:28 +0800
|
||||
Subject: [PATCH 04/17] bcache-tools: add struct cache_sb_disk into bcache.h
|
||||
Git-commit: e46282f62364379a6c79b88afd5ed3b78c9781b7
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
This is to sync the data structure from bcache kernel code uapi header.
|
||||
The new added struct cache_sb_disk is used to define the on-disk format
|
||||
bcache super block. Later struct cache_sb will be used for the in-memory
|
||||
format bcache super block.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
bcache.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 54 insertions(+)
|
||||
|
||||
diff --git a/bcache.h b/bcache.h
|
||||
index c83f838..82fe580 100644
|
||||
--- a/bcache.h
|
||||
+++ b/bcache.h
|
||||
@@ -7,6 +7,8 @@
|
||||
#ifndef _BCACHE_H
|
||||
#define _BCACHE_H
|
||||
|
||||
+#include <linux/types.h>
|
||||
+
|
||||
#define BITMASK(name, type, field, offset, size) \
|
||||
static inline uint64_t name(const type *k) \
|
||||
{ return (k->field >> offset) & ~(((uint64_t) ~0) << size); } \
|
||||
@@ -40,6 +42,58 @@ static const char bcache_magic[] = {
|
||||
#define BDEV_DATA_START_DEFAULT 16 /* sectors */
|
||||
#define SB_START (SB_SECTOR * 512)
|
||||
|
||||
+struct cache_sb_disk {
|
||||
+ __le64 csum;
|
||||
+ __le64 offset; /* sector where this sb was written */
|
||||
+ __le64 version;
|
||||
+
|
||||
+ __u8 magic[16];
|
||||
+
|
||||
+ __u8 uuid[16];
|
||||
+ union {
|
||||
+ __u8 set_uuid[16];
|
||||
+ __le64 set_magic;
|
||||
+ };
|
||||
+ __u8 label[SB_LABEL_SIZE];
|
||||
+
|
||||
+ __le64 flags;
|
||||
+ __le64 seq;
|
||||
+
|
||||
+ __le64 pad[8];
|
||||
+
|
||||
+ union {
|
||||
+ struct {
|
||||
+ /* Cache devices */
|
||||
+ __le64 nbuckets; /* device size */
|
||||
+
|
||||
+ __le16 block_size; /* sectors */
|
||||
+ __le16 bucket_size; /* sectors */
|
||||
+
|
||||
+ __le16 nr_in_set;
|
||||
+ __le16 nr_this_dev;
|
||||
+ };
|
||||
+ struct {
|
||||
+ /* Backing devices */
|
||||
+ __le64 data_offset;
|
||||
+
|
||||
+ /*
|
||||
+ * block_size from the cache device section is still used by
|
||||
+ * backing devices, so don't add anything here until we fix
|
||||
+ * things to not need it for backing devices anymore
|
||||
+ */
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ __le32 last_mount; /* time overflow in y2106 */
|
||||
+
|
||||
+ __le16 first_bucket;
|
||||
+ union {
|
||||
+ __le16 njournal_buckets;
|
||||
+ __le16 keys;
|
||||
+ };
|
||||
+ __le64 d[SB_JOURNAL_BUCKETS]; /* journal buckets */
|
||||
+};
|
||||
+
|
||||
struct cache_sb {
|
||||
uint64_t csum;
|
||||
uint64_t offset; /* sector where this sb was written */
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,48 +0,0 @@
|
||||
From 45d1412ee834b062a03b42596ee945d9916d3242 Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Sun, 16 Aug 2020 23:41:32 +0800
|
||||
Subject: [PATCH 05/17] bcache-tools: bitwise.h: more swap bitwise for
|
||||
different CPU endians
|
||||
Git-commit: 45d1412ee834b062a03b42596ee945d9916d3242
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
This patch adds more swap routines to bitwise.h,
|
||||
le16_to_cpu()
|
||||
le32_to_cpu()
|
||||
le64_to_cpu()
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
bitwise.h | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
diff --git a/bitwise.h b/bitwise.h
|
||||
index 968002f..1194b27 100644
|
||||
--- a/bitwise.h
|
||||
+++ b/bitwise.h
|
||||
@@ -45,11 +45,21 @@
|
||||
#define cpu_to_le16(val) ((__le16)(val))
|
||||
#define cpu_to_le32(val) ((__le32)(val))
|
||||
#define cpu_to_le64(val) ((__le64)(val))
|
||||
+
|
||||
+#define le16_to_cpu(val) ((__le16)(val))
|
||||
+#define le32_to_cpu(val) ((__le32)(val))
|
||||
+#define le64_to_cpu(val) ((__le64)(val))
|
||||
+
|
||||
#else
|
||||
/* For big endian */
|
||||
#define cpu_to_le16(val) ((__be16)__swab16((__u16)(val)))
|
||||
#define cpu_to_le32(val) ((__be32)__swab32((__u32)(val)))
|
||||
#define cpu_to_le64(val) ((__be64)__swab64((__u64)(val)))
|
||||
+
|
||||
+#define le16_to_cpu(val) ((__be16)__swab16((__u16)(val)))
|
||||
+#define le32_to_cpu(val) ((__be32)__swab32((__u32)(val)))
|
||||
+#define le64_to_cpu(val) ((__be64)__swab64((__u64)(val)))
|
||||
+
|
||||
#endif
|
||||
|
||||
#endif
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,40 +0,0 @@
|
||||
From 1129319af1cb5ec0cd38b283a4a3d14e55d616c7 Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Sun, 16 Aug 2020 23:57:56 +0800
|
||||
Subject: [PATCH 06/17] bcache-tools: list.h: only define offsetof() when it is
|
||||
undefined
|
||||
Git-commit: 1129319af1cb5ec0cd38b283a4a3d14e55d616c7
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
For new gcc headers, offsetof() is defined, the definition in list.h
|
||||
will be warned as redefined.
|
||||
|
||||
This patch checks whether offsetof() is defined, and only defines local
|
||||
version of offsetof() when it is not defined by gcc headers.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
list.h | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/list.h b/list.h
|
||||
index 55d2bb4..458281d 100644
|
||||
--- a/list.h
|
||||
+++ b/list.h
|
||||
@@ -25,10 +25,12 @@
|
||||
*/
|
||||
/*@{*/
|
||||
|
||||
+#ifndef offsetof
|
||||
/**
|
||||
* Get offset of a member
|
||||
*/
|
||||
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
|
||||
+#endif /* offsetof*/
|
||||
|
||||
/**
|
||||
* Casts a member of a structure out to the containing structure
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,150 +0,0 @@
|
||||
From 9642a1d29d8d1034039344bdd0cf55f71b5c16c8 Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Mon, 17 Aug 2020 00:02:23 +0800
|
||||
Subject: [PATCH 07/17] bcache-tools: add to_cache_sb() and to_cache_sb_disk()
|
||||
Git-commit: 9642a1d29d8d1034039344bdd0cf55f71b5c16c8
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
This patch adds routines to_cache_sb() to_cache_sb_disk() to lib.c,
|
||||
which convert bcache super block between in-memory and on-disk formats.
|
||||
|
||||
This is a preparation to separate current struct cache_sb into two
|
||||
structures,
|
||||
- struct cache_sb is for in-memory super block
|
||||
- struct cache_sb_disk is for on-disk super block
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
lib.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
|
||||
lib.h | 3 +-
|
||||
2 files changed, 90 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/lib.c b/lib.c
|
||||
index 9e69419..542f115 100644
|
||||
--- a/lib.c
|
||||
+++ b/lib.c
|
||||
@@ -8,14 +8,14 @@
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
-#include "bcache.h"
|
||||
-#include "lib.h"
|
||||
#include <uuid.h>
|
||||
#include <string.h>
|
||||
#include <malloc.h>
|
||||
#include <regex.h>
|
||||
|
||||
-
|
||||
+#include "bcache.h"
|
||||
+#include "lib.h"
|
||||
+#include "bitwise.h"
|
||||
/*
|
||||
* utils function
|
||||
*/
|
||||
@@ -681,3 +681,88 @@ int set_label(char *devname, char *label)
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
+
|
||||
+
|
||||
+struct cache_sb *to_cache_sb(struct cache_sb *sb,
|
||||
+ struct cache_sb_disk *sb_disk)
|
||||
+{
|
||||
+ /* Convert common part */
|
||||
+ sb->offset = le64_to_cpu(sb_disk->offset);
|
||||
+ sb->version = le64_to_cpu(sb_disk->version);
|
||||
+ memcpy(sb->magic, sb_disk->magic, 16);
|
||||
+ memcpy(sb->uuid, sb_disk->uuid, 16);
|
||||
+ memcpy(sb->set_uuid, sb_disk->set_uuid, 16);
|
||||
+ memcpy(sb->label, sb_disk->label, SB_LABEL_SIZE);
|
||||
+ sb->flags = le64_to_cpu(sb_disk->flags);
|
||||
+ sb->seq = le64_to_cpu(sb_disk->seq);
|
||||
+ sb->block_size = le16_to_cpu(sb_disk->block_size);
|
||||
+ sb->last_mount = le32_to_cpu(sb_disk->last_mount);
|
||||
+ sb->first_bucket = le16_to_cpu(sb_disk->first_bucket);
|
||||
+ sb->keys = le16_to_cpu(sb_disk->keys);
|
||||
+
|
||||
+ /* For cache or backing devices*/
|
||||
+
|
||||
+ if (sb->version > BCACHE_SB_MAX_VERSION) {
|
||||
+ /* Unsupported version */
|
||||
+ fprintf(stderr, "Unsupported super block version: %lld\n",
|
||||
+ sb->version);
|
||||
+ } else if (SB_IS_BDEV(sb)) {
|
||||
+ /* Backing device */
|
||||
+ sb->data_offset = le64_to_cpu(sb_disk->data_offset);
|
||||
+ } else {
|
||||
+ int i;
|
||||
+
|
||||
+ /* Cache device */
|
||||
+ sb->nbuckets = le64_to_cpu(sb_disk->nbuckets);
|
||||
+ sb->nr_in_set = le16_to_cpu(sb_disk->nr_in_set);
|
||||
+ sb->nr_this_dev = le16_to_cpu(sb_disk->nr_this_dev);
|
||||
+ sb->bucket_size = le32_to_cpu(sb_disk->bucket_size);
|
||||
+
|
||||
+ for (i = 0; i < SB_JOURNAL_BUCKETS; i++)
|
||||
+ sb->d[i]= le64_to_cpu(sb_disk->d[i]);
|
||||
+ }
|
||||
+
|
||||
+ return sb;
|
||||
+}
|
||||
+
|
||||
+struct cache_sb_disk *to_cache_sb_disk(struct cache_sb_disk *sb_disk,
|
||||
+ struct cache_sb *sb)
|
||||
+{
|
||||
+ /* Convert common part */
|
||||
+ sb_disk->offset = cpu_to_le64(sb->offset);
|
||||
+ sb_disk->version = cpu_to_le64(sb->version);
|
||||
+ memcpy(sb_disk->magic, sb->magic, 16);
|
||||
+ memcpy(sb_disk->uuid, sb->uuid, 16);
|
||||
+ memcpy(sb_disk->set_uuid, sb->set_uuid, 16);
|
||||
+ memcpy(sb_disk->label, sb->label, SB_LABEL_SIZE);
|
||||
+ sb_disk->flags = cpu_to_le64(sb->flags);
|
||||
+ sb_disk->seq = cpu_to_le64(sb->seq);
|
||||
+ sb_disk->block_size = cpu_to_le16(sb->block_size);
|
||||
+ sb_disk->last_mount = cpu_to_le32(sb->last_mount);
|
||||
+ sb_disk->first_bucket = cpu_to_le16(sb->first_bucket);
|
||||
+ sb_disk->keys = cpu_to_le16(sb->keys);
|
||||
+
|
||||
+ /* For cache and backing devices */
|
||||
+
|
||||
+ if (sb->version > BCACHE_SB_MAX_VERSION) {
|
||||
+ /* Unsupported version */
|
||||
+ fprintf(stderr, "Unsupported super block version: %lld\n",
|
||||
+ sb->version);
|
||||
+ } else if (SB_IS_BDEV(sb)) {
|
||||
+ /* Backing device */
|
||||
+ sb_disk->data_offset = cpu_to_le64(sb->data_offset);
|
||||
+ } else {
|
||||
+ int i;
|
||||
+
|
||||
+ /* Cache device */
|
||||
+ sb_disk->nbuckets = cpu_to_le64(sb->nbuckets);
|
||||
+ sb_disk->nr_in_set = cpu_to_le16(sb->nr_in_set);
|
||||
+ sb_disk->nr_this_dev = cpu_to_le16(sb->nr_this_dev);
|
||||
+ sb_disk->bucket_size = cpu_to_le32(sb->bucket_size);
|
||||
+
|
||||
+ for (i = 0; i < SB_JOURNAL_BUCKETS; i++)
|
||||
+ sb_disk->d[i] = cpu_to_le64(sb->d[i]);
|
||||
+ }
|
||||
+
|
||||
+ return sb_disk;
|
||||
+}
|
||||
diff --git a/lib.h b/lib.h
|
||||
index d4537b0..b37608e 100644
|
||||
--- a/lib.h
|
||||
+++ b/lib.h
|
||||
@@ -50,7 +50,8 @@ int detach_backdev(char *devname);
|
||||
int set_backdev_cachemode(char *devname, char *cachemode);
|
||||
int set_label(char *devname, char *label);
|
||||
int cset_to_devname(struct list_head *head, char *cset, char *devname);
|
||||
-
|
||||
+struct cache_sb *to_cache_sb(struct cache_sb *sb, struct cache_sb_disk *sb_disk);
|
||||
+struct cache_sb_disk *to_cache_sb_disk(struct cache_sb_disk *sb_disk,struct cache_sb *sb);
|
||||
|
||||
#define DEVLEN sizeof(struct dev)
|
||||
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,443 +0,0 @@
|
||||
From 2891723d70759fb9d11cd74943ad72de9bfe092e Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Mon, 17 Aug 2020 00:15:26 +0800
|
||||
Subject: [PATCH 08/17] bcache-tools: define separated super block for
|
||||
in-memory and on-disk format
|
||||
Git-commit: 2891723d70759fb9d11cd74943ad72de9bfe092e
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
This patch syncrhonizes the super block definition from bcache kernel
|
||||
code, now the original super block structure is changed into two,
|
||||
- struct cache_sb_disk
|
||||
This is for on-disk bcache super block format, which is exactly same
|
||||
as original struct cache_sb.
|
||||
- struct cache_sb
|
||||
This is only for in-memory super block, it is no longer exactly
|
||||
mapping to the members and offsets to the cache_sb_disk.
|
||||
|
||||
Most part of the patch is to make source code to be consistent to the
|
||||
data structures change.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
Makefile | 2 +-
|
||||
bcache-super-show.c | 22 +++++++++++--------
|
||||
bcache.h | 49 ++++++++++++++++++++++--------------------
|
||||
lib.c | 18 +++++++++++-----
|
||||
make.c | 52 ++++++++++-----------------------------------
|
||||
probe-bcache.c | 8 +++----
|
||||
6 files changed, 68 insertions(+), 83 deletions(-)
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 2c326cf..b4546a1 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -31,7 +31,7 @@ probe-bcache: CFLAGS += `pkg-config --cflags uuid blkid`
|
||||
|
||||
bcache-super-show: LDLIBS += `pkg-config --libs uuid`
|
||||
bcache-super-show: CFLAGS += -std=gnu99
|
||||
-bcache-super-show: crc64.o
|
||||
+bcache-super-show: crc64.o lib.o
|
||||
|
||||
bcache-register: bcache-register.o
|
||||
|
||||
diff --git a/bcache-super-show.c b/bcache-super-show.c
|
||||
index 26cc40e..883410f 100644
|
||||
--- a/bcache-super-show.c
|
||||
+++ b/bcache-super-show.c
|
||||
@@ -25,7 +25,8 @@
|
||||
#include <uuid/uuid.h>
|
||||
|
||||
#include "bcache.h"
|
||||
-
|
||||
+#include "lib.h"
|
||||
+#include "bitwise.h"
|
||||
|
||||
static void usage()
|
||||
{
|
||||
@@ -61,6 +62,7 @@ int main(int argc, char **argv)
|
||||
bool force_csum = false;
|
||||
int o;
|
||||
extern char *optarg;
|
||||
+ struct cache_sb_disk sb_disk;
|
||||
struct cache_sb sb;
|
||||
char uuid[40];
|
||||
uint64_t expected_csum;
|
||||
@@ -90,11 +92,13 @@ int main(int argc, char **argv)
|
||||
exit(2);
|
||||
}
|
||||
|
||||
- if (pread(fd, &sb, sizeof(sb), SB_START) != sizeof(sb)) {
|
||||
+ if (pread(fd, &sb_disk, sizeof(sb_disk), SB_START) != sizeof(sb_disk)) {
|
||||
fprintf(stderr, "Couldn't read\n");
|
||||
exit(2);
|
||||
}
|
||||
|
||||
+ to_cache_sb(&sb, &sb_disk);
|
||||
+
|
||||
printf("sb.magic\t\t");
|
||||
if (!memcmp(sb.magic, bcache_magic, 16)) {
|
||||
printf("ok\n");
|
||||
@@ -104,7 +108,7 @@ int main(int argc, char **argv)
|
||||
exit(2);
|
||||
}
|
||||
|
||||
- printf("sb.first_sector\t\t%" PRIu64, sb.offset);
|
||||
+ printf("sb.first_sector\t\t%llu", sb.offset);
|
||||
if (sb.offset == SB_SECTOR) {
|
||||
printf(" [match]\n");
|
||||
} else {
|
||||
@@ -113,9 +117,9 @@ int main(int argc, char **argv)
|
||||
exit(2);
|
||||
}
|
||||
|
||||
- printf("sb.csum\t\t\t%" PRIX64, sb.csum);
|
||||
- expected_csum = csum_set(&sb);
|
||||
- if (sb.csum == expected_csum) {
|
||||
+ printf("sb.csum\t\t\t%llx", le64_to_cpu(sb_disk.csum));
|
||||
+ expected_csum = csum_set(&sb_disk);
|
||||
+ if (le64_to_cpu(sb_disk.csum) == expected_csum) {
|
||||
printf(" [match]\n");
|
||||
} else {
|
||||
printf(" [expected %" PRIX64 "]\n", expected_csum);
|
||||
@@ -125,7 +129,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
- printf("sb.version\t\t%" PRIu64, sb.version);
|
||||
+ printf("sb.version\t\t%llu", sb.version);
|
||||
switch (sb.version) {
|
||||
// These are handled the same by the kernel
|
||||
case BCACHE_SB_VERSION_CDEV:
|
||||
@@ -168,8 +172,8 @@ int main(int argc, char **argv)
|
||||
if (!SB_IS_BDEV(&sb)) {
|
||||
// total_sectors includes the superblock;
|
||||
printf("dev.cache.first_sector\t%u\n"
|
||||
- "dev.cache.cache_sectors\t%ju\n"
|
||||
- "dev.cache.total_sectors\t%ju\n"
|
||||
+ "dev.cache.cache_sectors\t%llu\n"
|
||||
+ "dev.cache.total_sectors\t%llu\n"
|
||||
"dev.cache.ordered\t%s\n"
|
||||
"dev.cache.discard\t%s\n"
|
||||
"dev.cache.pos\t\t%u\n"
|
||||
diff --git a/bcache.h b/bcache.h
|
||||
index 82fe580..250da9d 100644
|
||||
--- a/bcache.h
|
||||
+++ b/bcache.h
|
||||
@@ -94,38 +94,41 @@ struct cache_sb_disk {
|
||||
__le64 d[SB_JOURNAL_BUCKETS]; /* journal buckets */
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * This is for in-memory bcache super block.
|
||||
+ * NOTE: cache_sb is NOT exactly mapping to cache_sb_disk, the member
|
||||
+ * size, ordering and even whole struct size may be different
|
||||
+ * from cache_sb_disk.
|
||||
+ */
|
||||
struct cache_sb {
|
||||
- uint64_t csum;
|
||||
- uint64_t offset; /* sector where this sb was written */
|
||||
- uint64_t version;
|
||||
+ __u64 offset; /* sector where this sb was written */
|
||||
+ __u64 version;
|
||||
|
||||
- uint8_t magic[16];
|
||||
+ __u8 magic[16];
|
||||
|
||||
- uint8_t uuid[16];
|
||||
+ __u8 uuid[16];
|
||||
union {
|
||||
- uint8_t set_uuid[16];
|
||||
- uint64_t set_magic;
|
||||
+ __u8 set_uuid[16];
|
||||
+ __u64 set_magic;
|
||||
};
|
||||
- uint8_t label[SB_LABEL_SIZE];
|
||||
+ __u8 label[SB_LABEL_SIZE];
|
||||
|
||||
- uint64_t flags;
|
||||
- uint64_t seq;
|
||||
- uint64_t pad[8];
|
||||
+ __u64 flags;
|
||||
+ __u64 seq;
|
||||
|
||||
union {
|
||||
struct {
|
||||
/* Cache devices */
|
||||
- uint64_t nbuckets; /* device size */
|
||||
-
|
||||
- uint16_t block_size; /* sectors */
|
||||
- uint16_t bucket_size; /* sectors */
|
||||
+ __u64 nbuckets; /* device size */
|
||||
|
||||
- uint16_t nr_in_set;
|
||||
- uint16_t nr_this_dev;
|
||||
+ __u16 block_size; /* sectors */
|
||||
+ __u16 nr_in_set;
|
||||
+ __u16 nr_this_dev;
|
||||
+ __u32 bucket_size; /* sectors */
|
||||
};
|
||||
struct {
|
||||
/* Backing devices */
|
||||
- uint64_t data_offset;
|
||||
+ __u64 data_offset;
|
||||
|
||||
/*
|
||||
* block_size from the cache device section is still used by
|
||||
@@ -135,14 +138,14 @@ struct cache_sb {
|
||||
};
|
||||
};
|
||||
|
||||
- uint32_t last_mount; /* time_t */
|
||||
+ __u32 last_mount; /* time overflow in y2106 */
|
||||
|
||||
- uint16_t first_bucket;
|
||||
+ __u16 first_bucket;
|
||||
union {
|
||||
- uint16_t njournal_buckets;
|
||||
- uint16_t keys;
|
||||
+ __u16 njournal_buckets;
|
||||
+ __u16 keys;
|
||||
};
|
||||
- uint64_t d[SB_JOURNAL_BUCKETS]; /* journal buckets */
|
||||
+ __u64 d[SB_JOURNAL_BUCKETS]; /* journal buckets */
|
||||
};
|
||||
|
||||
static inline bool SB_IS_BDEV(const struct cache_sb *sb)
|
||||
diff --git a/lib.c b/lib.c
|
||||
index 542f115..9a2fa26 100644
|
||||
--- a/lib.c
|
||||
+++ b/lib.c
|
||||
@@ -293,7 +293,6 @@ int detail_base(char *devname, struct cache_sb sb, struct dev *base)
|
||||
strcpy(base->name, devname);
|
||||
base->magic = "ok";
|
||||
base->first_sector = SB_SECTOR;
|
||||
- base->csum = sb.csum;
|
||||
base->version = sb.version;
|
||||
|
||||
strncpy(base->label, (char *) sb.label, SB_LABEL_SIZE);
|
||||
@@ -325,6 +324,7 @@ int detail_base(char *devname, struct cache_sb sb, struct dev *base)
|
||||
|
||||
int may_add_item(char *devname, struct list_head *head)
|
||||
{
|
||||
+ struct cache_sb_disk sb_disk;
|
||||
struct cache_sb sb;
|
||||
|
||||
if (strcmp(devname, ".") == 0 || strcmp(devname, "..") == 0)
|
||||
@@ -336,10 +336,13 @@ int may_add_item(char *devname, struct list_head *head)
|
||||
|
||||
if (fd == -1)
|
||||
return 0;
|
||||
- if (pread(fd, &sb, sizeof(sb), SB_START) != sizeof(sb)) {
|
||||
+ if (pread(fd, &sb_disk, sizeof(sb_disk), SB_START) != sizeof(sb_disk)) {
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
+
|
||||
+ to_cache_sb(&sb, &sb_disk);
|
||||
+
|
||||
if (memcmp(sb.magic, bcache_magic, 16)) {
|
||||
close(fd);
|
||||
return 0;
|
||||
@@ -348,6 +351,8 @@ int may_add_item(char *devname, struct list_head *head)
|
||||
int ret;
|
||||
|
||||
tmp = (struct dev *) malloc(DEVLEN);
|
||||
+
|
||||
+ tmp->csum = le64_to_cpu(sb_disk.csum);
|
||||
ret = detail_base(dev, sb, tmp);
|
||||
if (ret != 0) {
|
||||
fprintf(stderr, "Failed to get information for %s\n", dev);
|
||||
@@ -399,6 +404,7 @@ int list_bdevs(struct list_head *head)
|
||||
|
||||
int detail_dev(char *devname, struct bdev *bd, struct cdev *cd, int *type)
|
||||
{
|
||||
+ struct cache_sb_disk sb_disk;
|
||||
struct cache_sb sb;
|
||||
uint64_t expected_csum;
|
||||
int fd = open(devname, O_RDONLY);
|
||||
@@ -408,11 +414,13 @@ int detail_dev(char *devname, struct bdev *bd, struct cdev *cd, int *type)
|
||||
return 1;
|
||||
}
|
||||
|
||||
- if (pread(fd, &sb, sizeof(sb), SB_START) != sizeof(sb)) {
|
||||
+ if (pread(fd, &sb_disk, sizeof(sb_disk), SB_START) != sizeof(sb_disk)) {
|
||||
fprintf(stderr, "Couldn't read\n");
|
||||
goto Fail;
|
||||
}
|
||||
|
||||
+ to_cache_sb(&sb, &sb_disk);
|
||||
+
|
||||
if (memcmp(sb.magic, bcache_magic, 16)) {
|
||||
fprintf(stderr,
|
||||
"Bad magic,make sure this is an bcache device\n");
|
||||
@@ -424,8 +432,8 @@ int detail_dev(char *devname, struct bdev *bd, struct cdev *cd, int *type)
|
||||
goto Fail;
|
||||
}
|
||||
|
||||
- expected_csum = csum_set(&sb);
|
||||
- if (!(sb.csum == expected_csum)) {
|
||||
+ expected_csum = csum_set(&sb_disk);
|
||||
+ if (le64_to_cpu(sb_disk.csum) != expected_csum) {
|
||||
fprintf(stderr, "Csum is not match with expected one\n");
|
||||
goto Fail;
|
||||
}
|
||||
diff --git a/make.c b/make.c
|
||||
index cc76863..a239023 100644
|
||||
--- a/make.c
|
||||
+++ b/make.c
|
||||
@@ -223,35 +223,6 @@ err:
|
||||
return -1;
|
||||
}
|
||||
|
||||
-static void swap_sb(struct cache_sb *sb, int write_cdev_super)
|
||||
-{
|
||||
- int i;
|
||||
-
|
||||
- /* swap to little endian byte order to write */
|
||||
- sb->offset = cpu_to_le64(sb->offset);
|
||||
- sb->version = cpu_to_le64(sb->version);
|
||||
- sb->flags = cpu_to_le64(sb->flags);
|
||||
- sb->seq = cpu_to_le64(sb->seq);
|
||||
- sb->last_mount = cpu_to_le32(sb->last_mount);
|
||||
- sb->first_bucket = cpu_to_le16(sb->first_bucket);
|
||||
- sb->keys = cpu_to_le16(sb->keys);
|
||||
- sb->block_size = cpu_to_le16(sb->block_size);
|
||||
-
|
||||
- for (i = 0; i < SB_JOURNAL_BUCKETS; i++)
|
||||
- sb->d[i] = cpu_to_le64(sb->d[i]);
|
||||
-
|
||||
- if (write_cdev_super) {
|
||||
- /* Cache devices */
|
||||
- sb->nbuckets = cpu_to_le64(sb->nbuckets);
|
||||
- sb->bucket_size = cpu_to_le16(sb->bucket_size);
|
||||
- sb->nr_in_set = cpu_to_le16(sb->nr_in_set);
|
||||
- sb->nr_this_dev = cpu_to_le16(sb->nr_this_dev);
|
||||
- } else {
|
||||
- /* Backing devices */
|
||||
- sb->data_offset = cpu_to_le64(sb->data_offset);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
static void write_sb(char *dev, unsigned int block_size,
|
||||
unsigned int bucket_size,
|
||||
bool writeback, bool discard, bool wipe_bcache,
|
||||
@@ -261,9 +232,9 @@ static void write_sb(char *dev, unsigned int block_size,
|
||||
{
|
||||
int fd;
|
||||
char uuid_str[40], set_uuid_str[40], zeroes[SB_START] = {0};
|
||||
+ struct cache_sb_disk sb_disk;
|
||||
struct cache_sb sb;
|
||||
blkid_probe pr;
|
||||
- int write_cdev_super = 1;
|
||||
|
||||
fd = open(dev, O_RDWR|O_EXCL);
|
||||
|
||||
@@ -320,13 +291,13 @@ static void write_sb(char *dev, unsigned int block_size,
|
||||
if (force)
|
||||
wipe_bcache = true;
|
||||
|
||||
- if (pread(fd, &sb, sizeof(sb), SB_START) != sizeof(sb))
|
||||
+ if (pread(fd, &sb_disk, sizeof(sb_disk), SB_START) != sizeof(sb_disk))
|
||||
exit(EXIT_FAILURE);
|
||||
|
||||
- if (!memcmp(sb.magic, bcache_magic, 16)) {
|
||||
+ if (!memcmp(sb_disk.magic, bcache_magic, 16)) {
|
||||
if (wipe_bcache) {
|
||||
- if (pwrite(fd, zeroes, sizeof(sb),
|
||||
- SB_START) != sizeof(sb)) {
|
||||
+ if (pwrite(fd, zeroes, sizeof(sb_disk),
|
||||
+ SB_START) != sizeof(sb_disk)) {
|
||||
fprintf(stderr,
|
||||
"Failed to erase super block for %s\n",
|
||||
dev);
|
||||
@@ -355,6 +326,7 @@ static void write_sb(char *dev, unsigned int block_size,
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
+ memset(&sb_disk, 0, sizeof(struct cache_sb_disk));
|
||||
memset(&sb, 0, sizeof(struct cache_sb));
|
||||
|
||||
sb.offset = SB_SECTOR;
|
||||
@@ -373,8 +345,6 @@ static void write_sb(char *dev, unsigned int block_size,
|
||||
uuid_unparse(sb.set_uuid, set_uuid_str);
|
||||
|
||||
if (SB_IS_BDEV(&sb)) {
|
||||
- write_cdev_super = 0;
|
||||
-
|
||||
SET_BDEV_CACHE_MODE(&sb, writeback ?
|
||||
CACHE_MODE_WRITEBACK : CACHE_MODE_WRITETHROUGH);
|
||||
|
||||
@@ -415,7 +385,7 @@ static void write_sb(char *dev, unsigned int block_size,
|
||||
sb.first_bucket = (23 / sb.bucket_size) + 1;
|
||||
|
||||
if (sb.nbuckets < 1 << 7) {
|
||||
- fprintf(stderr, "Not enough buckets: %ju, need %u\n",
|
||||
+ fprintf(stderr, "Not enough buckets: %llu, need %u\n",
|
||||
sb.nbuckets, 1 << 7);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
@@ -429,7 +399,7 @@ static void write_sb(char *dev, unsigned int block_size,
|
||||
printf("UUID: %s\n"
|
||||
"Set UUID: %s\n"
|
||||
"version: %u\n"
|
||||
- "nbuckets: %ju\n"
|
||||
+ "nbuckets: %llu\n"
|
||||
"block_size_in_sectors: %u\n"
|
||||
"bucket_size_in_sectors: %u\n"
|
||||
"nr_in_set: %u\n"
|
||||
@@ -462,17 +432,17 @@ static void write_sb(char *dev, unsigned int block_size,
|
||||
* Swap native bytes order to little endian for writing
|
||||
* the super block out.
|
||||
*/
|
||||
- swap_sb(&sb, write_cdev_super);
|
||||
+ to_cache_sb_disk(&sb_disk, &sb);
|
||||
|
||||
/* write csum */
|
||||
- sb.csum = csum_set(&sb);
|
||||
+ sb_disk.csum = cpu_to_le64(csum_set(&sb_disk));
|
||||
/* Zero start of disk */
|
||||
if (pwrite(fd, zeroes, SB_START, 0) != SB_START) {
|
||||
perror("write error\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
/* Write superblock */
|
||||
- if (pwrite(fd, &sb, sizeof(sb), SB_START) != sizeof(sb)) {
|
||||
+ if (pwrite(fd, &sb_disk, sizeof(sb_disk), SB_START) != sizeof(sb_disk)) {
|
||||
perror("write error\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
diff --git a/probe-bcache.c b/probe-bcache.c
|
||||
index c94c972..a640046 100644
|
||||
--- a/probe-bcache.c
|
||||
+++ b/probe-bcache.c
|
||||
@@ -29,7 +29,7 @@ int main(int argc, char **argv)
|
||||
bool udev = false;
|
||||
int i, o;
|
||||
extern char *optarg;
|
||||
- struct cache_sb sb;
|
||||
+ struct cache_sb_disk sb_disk;
|
||||
char uuid[40];
|
||||
blkid_probe pr;
|
||||
|
||||
@@ -66,13 +66,13 @@ int main(int argc, char **argv)
|
||||
continue;
|
||||
}
|
||||
|
||||
- if (pread(fd, &sb, sizeof(sb), SB_START) != sizeof(sb))
|
||||
+ if (pread(fd, &sb_disk, sizeof(sb_disk), SB_START) != sizeof(sb_disk))
|
||||
continue;
|
||||
|
||||
- if (memcmp(sb.magic, bcache_magic, 16))
|
||||
+ if (memcmp(sb_disk.magic, bcache_magic, 16))
|
||||
continue;
|
||||
|
||||
- uuid_unparse(sb.uuid, uuid);
|
||||
+ uuid_unparse(sb_disk.uuid, uuid);
|
||||
|
||||
if (udev)
|
||||
printf("ID_FS_UUID=%s\n"
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,228 +0,0 @@
|
||||
From 5e7bd462ee91793708d6f0c34c46fb904bee7efb Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Mon, 17 Aug 2020 00:40:17 +0800
|
||||
Subject: [PATCH 09/17] bcache-tools: upgrade super block versions for feature
|
||||
sets
|
||||
Git-commit: 5e7bd462ee91793708d6f0c34c46fb904bee7efb
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
This patch upgrades super block versions for adding feature sets into
|
||||
struct cache_sb_disk,
|
||||
128 __u64 feature_compat;
|
||||
129 __u64 feature_incompat;
|
||||
130 __u64 feature_ro_compat;
|
||||
|
||||
With the feature set flags, it will be convenient to add new features
|
||||
without upgrade super block version again (at least for a long time).
|
||||
|
||||
The new added versions are,
|
||||
- BCACHE_SB_VERSION_CDEV_WITH_FEATURES for cache device super block
|
||||
- BCACHE_SB_VERSION_BDEV_WITH_FEATURES for backing device super block
|
||||
|
||||
The feature set flags are also added into the in-memory super block
|
||||
struct cache_sb. The feature sets conversion between cache_sb_disk and
|
||||
cache_sb also added into to_cache_sb() and to_cache_sb_disk().
|
||||
|
||||
Some feature sets related macros are also added into bcache.h, and a new
|
||||
file feature.c is added for future new features record and display.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
Makefile | 2 +-
|
||||
bcache.h | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
|
||||
features.c | 22 ++++++++++++++
|
||||
lib.c | 12 ++++++++
|
||||
4 files changed, 118 insertions(+), 3 deletions(-)
|
||||
create mode 100644 features.c
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index b4546a1..8b87a67 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -38,4 +38,4 @@ bcache-register: bcache-register.o
|
||||
bcache: CFLAGS += `pkg-config --cflags blkid uuid smartcols`
|
||||
bcache: LDLIBS += `pkg-config --libs blkid uuid smartcols`
|
||||
bcache: CFLAGS += -std=gnu99
|
||||
-bcache: crc64.o lib.o make.o zoned.o
|
||||
+bcache: crc64.o lib.o make.o zoned.o features.o
|
||||
diff --git a/bcache.h b/bcache.h
|
||||
index 250da9d..9d969e1 100644
|
||||
--- a/bcache.h
|
||||
+++ b/bcache.h
|
||||
@@ -29,12 +29,16 @@ static const char bcache_magic[] = {
|
||||
* Version 2: Seed pointer into btree node checksum
|
||||
* Version 3: Cache device with new UUID format
|
||||
* Version 4: Backing device with data offset
|
||||
+ * Version 5: Cache adn backing devices with compat/incompat/ro_compat
|
||||
+ * feature sets
|
||||
*/
|
||||
#define BCACHE_SB_VERSION_CDEV 0
|
||||
#define BCACHE_SB_VERSION_BDEV 1
|
||||
#define BCACHE_SB_VERSION_CDEV_WITH_UUID 3
|
||||
#define BCACHE_SB_VERSION_BDEV_WITH_OFFSET 4
|
||||
-#define BCACHE_SB_MAX_VERSION 4
|
||||
+#define BCACHE_SB_VERSION_CDEV_WITH_FEATURES 5
|
||||
+#define BCACHE_SB_VERSION_BDEV_WITH_FEATURES 6
|
||||
+#define BCACHE_SB_MAX_VERSION 6
|
||||
|
||||
#define SB_SECTOR 8
|
||||
#define SB_LABEL_SIZE 32
|
||||
@@ -59,7 +63,11 @@ struct cache_sb_disk {
|
||||
__le64 flags;
|
||||
__le64 seq;
|
||||
|
||||
- __le64 pad[8];
|
||||
+ __le64 feature_compat;
|
||||
+ __le64 feature_incompat;
|
||||
+ __le64 feature_ro_compat;
|
||||
+
|
||||
+ __le64 pad[5];
|
||||
|
||||
union {
|
||||
struct {
|
||||
@@ -116,6 +124,10 @@ struct cache_sb {
|
||||
__u64 flags;
|
||||
__u64 seq;
|
||||
|
||||
+ __u64 feature_compat;
|
||||
+ __u64 feature_incompat;
|
||||
+ __u64 feature_ro_compat;
|
||||
+
|
||||
union {
|
||||
struct {
|
||||
/* Cache devices */
|
||||
@@ -180,4 +192,73 @@ uint64_t crc64(const void *data, size_t len);
|
||||
#define csum_set(i) \
|
||||
crc64(((void *) (i)) + 8, ((void *) end(i)) - (((void *) (i)) + 8))
|
||||
|
||||
+/* Feature set definition */
|
||||
+
|
||||
+#define BCH_FEATURE_COMPAT 0
|
||||
+#define BCH_FEATURE_RO_COMPAT 1
|
||||
+#define BCH_FEATURE_INCOMPAT 2
|
||||
+#define BCH_FEATURE_TYPE_MASK 0x03
|
||||
+
|
||||
+#define BCH_FEATURE_COMPAT_SUUP 0
|
||||
+#define BCH_FEATURE_INCOMPAT_SUUP 0
|
||||
+#define BCH_FEATURE_RO_COMPAT_SUUP 0
|
||||
+
|
||||
+#define BCH_HAS_COMPAT_FEATURE(sb, mask) \
|
||||
+ ((sb)->feature_compat & (mask))
|
||||
+#define BCH_HAS_RO_COMPAT_FEATURE(sb, mask) \
|
||||
+ ((sb)->feature_ro_compat & (mask))
|
||||
+#define BCH_HAS_INCOMPAT_FEATURE(sb, mask) \
|
||||
+ ((sb)->feature_incompat & (mask))
|
||||
+
|
||||
+#define BCH_FEATURE_COMPAT_FUNCS(name, flagname) \
|
||||
+static inline int bch_has_feature_##name(struct cache_sb *sb) \
|
||||
+{ \
|
||||
+ return (((sb)->feature_compat & \
|
||||
+ BCH##_FEATURE_COMPAT_##flagname) != 0); \
|
||||
+} \
|
||||
+static inline void bch_set_feature_##name(struct cache_sb *sb) \
|
||||
+{ \
|
||||
+ (sb)->feature_compat |= \
|
||||
+ BCH##_FEATURE_COMPAT_##flagname; \
|
||||
+} \
|
||||
+static inline void bch_clear_feature_##name(struct cache_sb *sb) \
|
||||
+{ \
|
||||
+ (sb)->feature_compat &= \
|
||||
+ ~BCH##_FEATURE_COMPAT_##flagname; \
|
||||
+}
|
||||
+
|
||||
+#define BCH_FEATURE_RO_COMPAT_FUNCS(name, flagname) \
|
||||
+static inline int bch_has_feature_##name(struct cache_sb *sb) \
|
||||
+{ \
|
||||
+ return (((sb)->feature_ro_compat & \
|
||||
+ BCH##_FEATURE_RO_COMPAT_##flagname) != 0); \
|
||||
+} \
|
||||
+static inline void bch_set_feature_##name(struct cache_sb *sb) \
|
||||
+{ \
|
||||
+ (sb)->feature_ro_compat |= \
|
||||
+ BCH##_FEATURE_RO_COMPAT_##flagname; \
|
||||
+} \
|
||||
+static inline void bch_clear_feature_##name(struct cache_sb *sb) \
|
||||
+{ \
|
||||
+ (sb)->feature_ro_compat &= \
|
||||
+ ~BCH##_FEATURE_RO_COMPAT_##flagname; \
|
||||
+}
|
||||
+
|
||||
+#define BCH_FEATURE_INCOMPAT_FUNCS(name, flagname) \
|
||||
+static inline int bch_has_feature_##name(struct cache_sb *sb) \
|
||||
+{ \
|
||||
+ return (((sb)->feature_incompat & \
|
||||
+ BCH##_FEATURE_INCOMPAT_##flagname) != 0); \
|
||||
+} \
|
||||
+static inline void bch_set_feature_##name(struct cache_sb *sb) \
|
||||
+{ \
|
||||
+ (sb)->feature_incompat |= \
|
||||
+ BCH##_FEATURE_INCOMPAT_##flagname; \
|
||||
+} \
|
||||
+static inline void bch_clear_feature_##name(struct cache_sb *sb) \
|
||||
+{ \
|
||||
+ (sb)->feature_incompat &= \
|
||||
+ ~BCH##_FEATURE_INCOMPAT_##flagname; \
|
||||
+}
|
||||
+
|
||||
#endif
|
||||
diff --git a/features.c b/features.c
|
||||
new file mode 100644
|
||||
index 0000000..a1c9884
|
||||
--- /dev/null
|
||||
+++ b/features.c
|
||||
@@ -0,0 +1,22 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * Author: Coly Li <colyli@suse.de>
|
||||
+ *
|
||||
+ * Inspired by e2fsprogs features compat/incompat/ro_compat
|
||||
+ * related code.
|
||||
+ */
|
||||
+#include <stdbool.h>
|
||||
+#include <stdint.h>
|
||||
+#include <sys/types.h>
|
||||
+
|
||||
+#include "bcache.h"
|
||||
+
|
||||
+struct feature {
|
||||
+ int compat;
|
||||
+ unsigned int mask;
|
||||
+ const char *string;
|
||||
+};
|
||||
+
|
||||
+static struct feature feature_list[] = {
|
||||
+ {0, 0, 0 },
|
||||
+};
|
||||
diff --git a/lib.c b/lib.c
|
||||
index 9a2fa26..dcf752c 100644
|
||||
--- a/lib.c
|
||||
+++ b/lib.c
|
||||
@@ -730,6 +730,12 @@ struct cache_sb *to_cache_sb(struct cache_sb *sb,
|
||||
sb->d[i]= le64_to_cpu(sb_disk->d[i]);
|
||||
}
|
||||
|
||||
+ if (sb->version >= BCACHE_SB_VERSION_CDEV_WITH_FEATURES) {
|
||||
+ sb->feature_compat = le64_to_cpu(sb_disk->feature_compat);
|
||||
+ sb->feature_incompat = le64_to_cpu(sb_disk->feature_incompat);
|
||||
+ sb->feature_ro_compat = le64_to_cpu(sb_disk->feature_ro_compat);
|
||||
+ }
|
||||
+
|
||||
return sb;
|
||||
}
|
||||
|
||||
@@ -772,5 +778,11 @@ struct cache_sb_disk *to_cache_sb_disk(struct cache_sb_disk *sb_disk,
|
||||
sb_disk->d[i] = cpu_to_le64(sb->d[i]);
|
||||
}
|
||||
|
||||
+ if (sb->version >= BCACHE_SB_VERSION_CDEV_WITH_FEATURES) {
|
||||
+ sb_disk->feature_compat = cpu_to_le64(sb->feature_compat);
|
||||
+ sb_disk->feature_incompat = cpu_to_le64(sb->feature_incompat);
|
||||
+ sb_disk->feature_ro_compat = cpu_to_le64(sb->feature_ro_compat);
|
||||
+ }
|
||||
+
|
||||
return sb_disk;
|
||||
}
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,193 +0,0 @@
|
||||
From 8c063851990a5e82ba1727907994a46201d9e842 Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Mon, 17 Aug 2020 01:37:17 +0800
|
||||
Subject: [PATCH 10/17] bcache-tools: add large_bucket incompat feature
|
||||
Git-commit: 8c063851990a5e82ba1727907994a46201d9e842
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
This feature adds __le16 bucket_size_hi into struct cache_sb_disk, to
|
||||
permit bucket size to be 32bit width. Current maximum bucket size is
|
||||
16MB, extend it to 32bits will permit much large bucket size which is
|
||||
desired by zoned SSD devices (a typical zone size is 256MB).
|
||||
|
||||
When setting a bucket size > 16MB, large_bucket feature will be set
|
||||
automatically and the super block version will also be set to
|
||||
BCACHE_SB_VERSION_CDEV_WITH_FEATURES.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
bcache.h | 8 ++++++++
|
||||
features.c | 2 ++
|
||||
lib.c | 19 +++++++++++++++++++
|
||||
lib.h | 1 +
|
||||
make.c | 18 ++++++++++++------
|
||||
5 files changed, 42 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/bcache.h b/bcache.h
|
||||
index 9d969e1..6aef9c4 100644
|
||||
--- a/bcache.h
|
||||
+++ b/bcache.h
|
||||
@@ -100,6 +100,7 @@ struct cache_sb_disk {
|
||||
__le16 keys;
|
||||
};
|
||||
__le64 d[SB_JOURNAL_BUCKETS]; /* journal buckets */
|
||||
+ __le16 bucket_size_hi;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -210,6 +211,11 @@ uint64_t crc64(const void *data, size_t len);
|
||||
#define BCH_HAS_INCOMPAT_FEATURE(sb, mask) \
|
||||
((sb)->feature_incompat & (mask))
|
||||
|
||||
+/* Feature set definition */
|
||||
+
|
||||
+/* Incompat feature set */
|
||||
+#define BCH_FEATURE_INCOMPAT_LARGE_BUCKET 0x0001 /* 32bit bucket size */
|
||||
+
|
||||
#define BCH_FEATURE_COMPAT_FUNCS(name, flagname) \
|
||||
static inline int bch_has_feature_##name(struct cache_sb *sb) \
|
||||
{ \
|
||||
@@ -261,4 +267,6 @@ static inline void bch_clear_feature_##name(struct cache_sb *sb) \
|
||||
~BCH##_FEATURE_INCOMPAT_##flagname; \
|
||||
}
|
||||
|
||||
+BCH_FEATURE_INCOMPAT_FUNCS(large_bucket, LARGE_BUCKET);
|
||||
+
|
||||
#endif
|
||||
diff --git a/features.c b/features.c
|
||||
index a1c9884..df15862 100644
|
||||
--- a/features.c
|
||||
+++ b/features.c
|
||||
@@ -18,5 +18,7 @@ struct feature {
|
||||
};
|
||||
|
||||
static struct feature feature_list[] = {
|
||||
+ {BCH_FEATURE_INCOMPAT, BCH_FEATURE_INCOMPAT_LARGE_BUCKET,
|
||||
+ "large_bucket"},
|
||||
{0, 0, 0 },
|
||||
};
|
||||
diff --git a/lib.c b/lib.c
|
||||
index dcf752c..efabeb1 100644
|
||||
--- a/lib.c
|
||||
+++ b/lib.c
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <stdbool.h>
|
||||
#include <blkid.h>
|
||||
#include <dirent.h>
|
||||
+#include <limits.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
@@ -736,6 +737,10 @@ struct cache_sb *to_cache_sb(struct cache_sb *sb,
|
||||
sb->feature_ro_compat = le64_to_cpu(sb_disk->feature_ro_compat);
|
||||
}
|
||||
|
||||
+ if (sb->version >= BCACHE_SB_VERSION_CDEV_WITH_FEATURES &&
|
||||
+ bch_has_feature_large_bucket(sb))
|
||||
+ sb->bucket_size += le16_to_cpu(sb_disk->bucket_size_hi) << 16;
|
||||
+
|
||||
return sb;
|
||||
}
|
||||
|
||||
@@ -784,5 +789,19 @@ struct cache_sb_disk *to_cache_sb_disk(struct cache_sb_disk *sb_disk,
|
||||
sb_disk->feature_ro_compat = cpu_to_le64(sb->feature_ro_compat);
|
||||
}
|
||||
|
||||
+ if (sb->version >= BCACHE_SB_VERSION_CDEV_WITH_FEATURES &&
|
||||
+ bch_has_feature_large_bucket(sb))
|
||||
+ sb_disk->bucket_size_hi = cpu_to_le16(sb->bucket_size >> 16);
|
||||
+
|
||||
return sb_disk;
|
||||
}
|
||||
+
|
||||
+void set_bucket_size(struct cache_sb *sb, unsigned int bucket_size)
|
||||
+{
|
||||
+ if (bucket_size > USHRT_MAX) {
|
||||
+ sb->version = BCACHE_SB_VERSION_CDEV_WITH_FEATURES;
|
||||
+ bch_set_feature_large_bucket(sb);
|
||||
+ }
|
||||
+
|
||||
+ sb->bucket_size = bucket_size;
|
||||
+}
|
||||
diff --git a/lib.h b/lib.h
|
||||
index b37608e..1dd2bfe 100644
|
||||
--- a/lib.h
|
||||
+++ b/lib.h
|
||||
@@ -52,6 +52,7 @@ int set_label(char *devname, char *label);
|
||||
int cset_to_devname(struct list_head *head, char *cset, char *devname);
|
||||
struct cache_sb *to_cache_sb(struct cache_sb *sb, struct cache_sb_disk *sb_disk);
|
||||
struct cache_sb_disk *to_cache_sb_disk(struct cache_sb_disk *sb_disk,struct cache_sb *sb);
|
||||
+void set_bucket_size(struct cache_sb *sb, unsigned int bucket_size);
|
||||
|
||||
#define DEVLEN sizeof(struct dev)
|
||||
|
||||
diff --git a/make.c b/make.c
|
||||
index a239023..9631857 100644
|
||||
--- a/make.c
|
||||
+++ b/make.c
|
||||
@@ -83,7 +83,9 @@ uint64_t hatoi(const char *s)
|
||||
return i;
|
||||
}
|
||||
|
||||
-unsigned int hatoi_validate(const char *s, const char *msg)
|
||||
+unsigned int hatoi_validate(const char *s,
|
||||
+ const char *msg,
|
||||
+ unsigned long max)
|
||||
{
|
||||
uint64_t v = hatoi(s);
|
||||
|
||||
@@ -94,7 +96,7 @@ unsigned int hatoi_validate(const char *s, const char *msg)
|
||||
|
||||
v /= 512;
|
||||
|
||||
- if (v > USHRT_MAX) {
|
||||
+ if (v > max) {
|
||||
fprintf(stderr, "%s too large\n", msg);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
@@ -338,7 +340,7 @@ static void write_sb(char *dev, unsigned int block_size,
|
||||
uuid_generate(sb.uuid);
|
||||
memcpy(sb.set_uuid, set_uuid, sizeof(sb.set_uuid));
|
||||
|
||||
- sb.bucket_size = bucket_size;
|
||||
+ set_bucket_size(&sb, bucket_size);
|
||||
sb.block_size = block_size;
|
||||
|
||||
uuid_unparse(sb.uuid, uuid_str);
|
||||
@@ -362,7 +364,8 @@ static void write_sb(char *dev, unsigned int block_size,
|
||||
}
|
||||
|
||||
if (data_offset != BDEV_DATA_START_DEFAULT) {
|
||||
- sb.version = BCACHE_SB_VERSION_BDEV_WITH_OFFSET;
|
||||
+ if (sb.version < BCACHE_SB_VERSION_BDEV_WITH_OFFSET)
|
||||
+ sb.version = BCACHE_SB_VERSION_BDEV_WITH_OFFSET;
|
||||
sb.data_offset = data_offset;
|
||||
}
|
||||
|
||||
@@ -382,6 +385,7 @@ static void write_sb(char *dev, unsigned int block_size,
|
||||
} else {
|
||||
sb.nbuckets = getblocks(fd) / sb.bucket_size;
|
||||
sb.nr_in_set = 1;
|
||||
+ /* 23 is (SB_SECTOR + SB_SIZE) - 1 sectors */
|
||||
sb.first_bucket = (23 / sb.bucket_size) + 1;
|
||||
|
||||
if (sb.nbuckets < 1 << 7) {
|
||||
@@ -538,10 +542,12 @@ int make_bcache(int argc, char **argv)
|
||||
bdev = 1;
|
||||
break;
|
||||
case 'b':
|
||||
- bucket_size = hatoi_validate(optarg, "bucket size");
|
||||
+ bucket_size =
|
||||
+ hatoi_validate(optarg, "bucket size", UINT_MAX);
|
||||
break;
|
||||
case 'w':
|
||||
- block_size = hatoi_validate(optarg, "block size");
|
||||
+ block_size =
|
||||
+ hatoi_validate(optarg, "block size", USHRT_MAX);
|
||||
break;
|
||||
#if 0
|
||||
case 'U':
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,270 +0,0 @@
|
||||
From 047c4c4abdb49140ecf91d5e17624f2bf2535a69 Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Mon, 17 Aug 2020 19:23:10 +0800
|
||||
Subject: [PATCH 11/17] bcache-tools: add
|
||||
print_cache_set_supported_feature_sets() in lib.c
|
||||
Git-commit: 047c4c4abdb49140ecf91d5e17624f2bf2535a69
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
print_cache_set_supported_feature_sets() is used to print out feature
|
||||
set strings for a specified cache device super block. It can be used
|
||||
when make a bcache cache device, or show a super block information of
|
||||
a bcache cache device.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
bcache-super-show.c | 2 ++
|
||||
bcache.c | 15 +++++++++++---
|
||||
features.c | 50 +++++++++++++++++++++++++++++++++++++++++++++
|
||||
features.h | 8 ++++++++
|
||||
lib.c | 20 +++++++++++-------
|
||||
lib.h | 4 ++++
|
||||
6 files changed, 89 insertions(+), 10 deletions(-)
|
||||
create mode 100644 features.h
|
||||
|
||||
diff --git a/bcache-super-show.c b/bcache-super-show.c
|
||||
index 883410f..cc36029 100644
|
||||
--- a/bcache-super-show.c
|
||||
+++ b/bcache-super-show.c
|
||||
@@ -134,12 +134,14 @@ int main(int argc, char **argv)
|
||||
// These are handled the same by the kernel
|
||||
case BCACHE_SB_VERSION_CDEV:
|
||||
case BCACHE_SB_VERSION_CDEV_WITH_UUID:
|
||||
+ case BCACHE_SB_VERSION_CDEV_WITH_FEATURES:
|
||||
printf(" [cache device]\n");
|
||||
break;
|
||||
|
||||
// The second adds data offset support
|
||||
case BCACHE_SB_VERSION_BDEV:
|
||||
case BCACHE_SB_VERSION_BDEV_WITH_OFFSET:
|
||||
+ case BCACHE_SB_VERSION_BDEV_WITH_FEATURES:
|
||||
printf(" [backing device]\n");
|
||||
break;
|
||||
|
||||
diff --git a/bcache.c b/bcache.c
|
||||
index b866271..50e3a88 100644
|
||||
--- a/bcache.c
|
||||
+++ b/bcache.c
|
||||
@@ -18,6 +18,7 @@
|
||||
#include "list.h"
|
||||
#include <limits.h>
|
||||
|
||||
+#include "features.h"
|
||||
|
||||
#define BCACHE_TOOLS_VERSION "1.1"
|
||||
|
||||
@@ -203,11 +204,13 @@ int show_bdevs_detail(void)
|
||||
// These are handled the same by the kernel
|
||||
case BCACHE_SB_VERSION_CDEV:
|
||||
case BCACHE_SB_VERSION_CDEV_WITH_UUID:
|
||||
+ case BCACHE_SB_VERSION_CDEV_WITH_FEATURES:
|
||||
printf(" (cache)");
|
||||
break;
|
||||
// The second adds data offset supporet
|
||||
case BCACHE_SB_VERSION_BDEV:
|
||||
case BCACHE_SB_VERSION_BDEV_WITH_OFFSET:
|
||||
+ case BCACHE_SB_VERSION_BDEV_WITH_FEATURES:
|
||||
printf(" (data)");
|
||||
break;
|
||||
default:
|
||||
@@ -257,12 +260,14 @@ int show_bdevs(void)
|
||||
// These are handled the same by the kernel
|
||||
case BCACHE_SB_VERSION_CDEV:
|
||||
case BCACHE_SB_VERSION_CDEV_WITH_UUID:
|
||||
+ case BCACHE_SB_VERSION_CDEV_WITH_FEATURES:
|
||||
printf(" (cache)");
|
||||
break;
|
||||
|
||||
// The second adds data offset supporet
|
||||
case BCACHE_SB_VERSION_BDEV:
|
||||
case BCACHE_SB_VERSION_BDEV_WITH_OFFSET:
|
||||
+ case BCACHE_SB_VERSION_BDEV_WITH_FEATURES:
|
||||
printf(" (data)");
|
||||
break;
|
||||
|
||||
@@ -304,7 +309,9 @@ int detail_single(char *devname)
|
||||
fprintf(stderr, "Failed to detail device\n");
|
||||
return ret;
|
||||
}
|
||||
- if (type == BCACHE_SB_VERSION_BDEV) {
|
||||
+ if (type == BCACHE_SB_VERSION_BDEV ||
|
||||
+ type == BCACHE_SB_VERSION_BDEV_WITH_OFFSET ||
|
||||
+ type == BCACHE_SB_VERSION_BDEV_WITH_FEATURES) {
|
||||
printf("sb.magic\t\t%s\n", bd.base.magic);
|
||||
printf("sb.first_sector\t\t%" PRIu64 "\n",
|
||||
bd.base.first_sector);
|
||||
@@ -362,14 +369,16 @@ int detail_single(char *devname)
|
||||
|
||||
putchar('\n');
|
||||
printf("cset.uuid\t\t%s\n", bd.base.cset);
|
||||
- } else if (type == BCACHE_SB_VERSION_CDEV
|
||||
- || type == BCACHE_SB_VERSION_CDEV_WITH_UUID) {
|
||||
+ } else if (type == BCACHE_SB_VERSION_CDEV ||
|
||||
+ type == BCACHE_SB_VERSION_CDEV_WITH_UUID ||
|
||||
+ type == BCACHE_SB_VERSION_CDEV_WITH_FEATURES) {
|
||||
printf("sb.magic\t\t%s\n", cd.base.magic);
|
||||
printf("sb.first_sector\t\t%" PRIu64 "\n",
|
||||
cd.base.first_sector);
|
||||
printf("sb.csum\t\t\t%" PRIX64 "\n", cd.base.csum);
|
||||
printf("sb.version\t\t%" PRIu64, cd.base.version);
|
||||
printf(" [cache device]\n");
|
||||
+ print_cache_set_supported_feature_sets(&cd.base.sb);
|
||||
putchar('\n');
|
||||
printf("dev.label\t\t");
|
||||
if (*cd.base.label)
|
||||
diff --git a/features.c b/features.c
|
||||
index df15862..181e348 100644
|
||||
--- a/features.c
|
||||
+++ b/features.c
|
||||
@@ -7,7 +7,9 @@
|
||||
*/
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
+#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
+#include <string.h>
|
||||
|
||||
#include "bcache.h"
|
||||
|
||||
@@ -22,3 +24,51 @@ static struct feature feature_list[] = {
|
||||
"large_bucket"},
|
||||
{0, 0, 0 },
|
||||
};
|
||||
+
|
||||
+#define compose_feature_string(type, header) \
|
||||
+({ \
|
||||
+ struct feature *f; \
|
||||
+ bool first = true; \
|
||||
+ \
|
||||
+ for (f = &feature_list[0]; f->compat != 0; f++) { \
|
||||
+ if (f->compat != BCH_FEATURE_ ## type) \
|
||||
+ continue; \
|
||||
+ if (!(BCH_HAS_ ## type ## _FEATURE(sb, f->mask))) \
|
||||
+ continue; \
|
||||
+ \
|
||||
+ if (first) { \
|
||||
+ out += snprintf(out, buf + size - out, \
|
||||
+ "%s:\t", (header)); \
|
||||
+ first = false; \
|
||||
+ } else { \
|
||||
+ out += snprintf(out, buf + size - out, " "); \
|
||||
+ } \
|
||||
+ \
|
||||
+ out += snprintf(out, buf + size - out, "%s", f->string);\
|
||||
+ \
|
||||
+ } \
|
||||
+ if (!first) \
|
||||
+ out += snprintf(out, buf + size - out, "\n"); \
|
||||
+})
|
||||
+
|
||||
+void print_cache_set_supported_feature_sets(struct cache_sb *sb)
|
||||
+{
|
||||
+ char buf[4096];
|
||||
+ char *out;
|
||||
+ int size = sizeof(buf) - 1;
|
||||
+
|
||||
+ out = buf;
|
||||
+ memset(buf, 0, sizeof(buf));
|
||||
+ compose_feature_string(COMPAT, "sb.feature_compat");
|
||||
+ printf("%s", buf);
|
||||
+
|
||||
+ out = buf;
|
||||
+ memset(buf, 0, sizeof(buf));
|
||||
+ compose_feature_string(RO_COMPAT, "sb.feature_ro_compat");
|
||||
+ printf("%s", buf);
|
||||
+
|
||||
+ out = buf;
|
||||
+ memset(buf, 0, sizeof(buf));
|
||||
+ compose_feature_string(INCOMPAT, "sb.feature_incompat");
|
||||
+ printf("%s", buf);
|
||||
+}
|
||||
diff --git a/features.h b/features.h
|
||||
new file mode 100644
|
||||
index 0000000..028b774
|
||||
--- /dev/null
|
||||
+++ b/features.h
|
||||
@@ -0,0 +1,8 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 */
|
||||
+
|
||||
+#ifndef _BCACHE_FEATURES_H
|
||||
+#define _BCACHE_FEATURES_H
|
||||
+
|
||||
+void print_cache_set_supported_feature_sets(struct cache_sb *sb);
|
||||
+
|
||||
+#endif
|
||||
diff --git a/lib.c b/lib.c
|
||||
index efabeb1..29172f5 100644
|
||||
--- a/lib.c
|
||||
+++ b/lib.c
|
||||
@@ -192,11 +192,13 @@ int get_cachedev_state(char *cset_id, char *state)
|
||||
|
||||
int get_state(struct dev *dev, char *state)
|
||||
{
|
||||
- if (dev->version == BCACHE_SB_VERSION_CDEV
|
||||
- || dev->version == BCACHE_SB_VERSION_CDEV_WITH_UUID)
|
||||
+ if (dev->version == BCACHE_SB_VERSION_CDEV ||
|
||||
+ dev->version == BCACHE_SB_VERSION_CDEV_WITH_UUID ||
|
||||
+ dev->version == BCACHE_SB_VERSION_CDEV_WITH_FEATURES)
|
||||
return get_cachedev_state(dev->cset, state);
|
||||
- else if (dev->version == BCACHE_SB_VERSION_BDEV
|
||||
- || dev->version == BCACHE_SB_VERSION_BDEV_WITH_OFFSET)
|
||||
+ else if (dev->version == BCACHE_SB_VERSION_BDEV ||
|
||||
+ dev->version == BCACHE_SB_VERSION_BDEV_WITH_OFFSET ||
|
||||
+ dev->version == BCACHE_SB_VERSION_BDEV_WITH_FEATURES)
|
||||
return get_backdev_state(dev->name, state);
|
||||
else
|
||||
return 1;
|
||||
@@ -291,6 +293,7 @@ int detail_base(char *devname, struct cache_sb sb, struct dev *base)
|
||||
{
|
||||
int ret;
|
||||
|
||||
+ base->sb = sb;
|
||||
strcpy(base->name, devname);
|
||||
base->magic = "ok";
|
||||
base->first_sector = SB_SECTOR;
|
||||
@@ -440,13 +443,16 @@ int detail_dev(char *devname, struct bdev *bd, struct cdev *cd, int *type)
|
||||
}
|
||||
|
||||
*type = sb.version;
|
||||
- if (sb.version == BCACHE_SB_VERSION_BDEV) {
|
||||
+ if (sb.version == BCACHE_SB_VERSION_BDEV ||
|
||||
+ sb.version == BCACHE_SB_VERSION_BDEV_WITH_OFFSET ||
|
||||
+ sb.version == BCACHE_SB_VERSION_BDEV_WITH_FEATURES) {
|
||||
detail_base(devname, sb, &bd->base);
|
||||
bd->first_sector = BDEV_DATA_START_DEFAULT;
|
||||
bd->cache_mode = BDEV_CACHE_MODE(&sb);
|
||||
bd->cache_state = BDEV_STATE(&sb);
|
||||
- } else if (sb.version == BCACHE_SB_VERSION_CDEV
|
||||
- || sb.version == BCACHE_SB_VERSION_CDEV_WITH_UUID) {
|
||||
+ } else if (sb.version == BCACHE_SB_VERSION_CDEV ||
|
||||
+ sb.version == BCACHE_SB_VERSION_CDEV_WITH_UUID ||
|
||||
+ sb.version == BCACHE_SB_VERSION_CDEV_WITH_FEATURES) {
|
||||
detail_base(devname, sb, &cd->base);
|
||||
cd->first_sector = sb.bucket_size * sb.first_bucket;
|
||||
cd->cache_sectors =
|
||||
diff --git a/lib.h b/lib.h
|
||||
index 1dd2bfe..9b5ed02 100644
|
||||
--- a/lib.h
|
||||
+++ b/lib.h
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "list.h"
|
||||
|
||||
struct dev {
|
||||
+ struct cache_sb sb;
|
||||
char name[40];
|
||||
char *magic;
|
||||
uint64_t first_sector;
|
||||
@@ -17,6 +18,9 @@ struct dev {
|
||||
char state[40];
|
||||
char bname[40];
|
||||
char attachuuid[40];
|
||||
+ uint64_t feature_compat;
|
||||
+ uint64_t feature_ro_compat;
|
||||
+ uint64_t feature_incompat;
|
||||
struct list_head dev_list;
|
||||
};
|
||||
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,99 +0,0 @@
|
||||
From b0f5169a13976b05b183e0cde1fd23ef4f90101c Mon Sep 17 00:00:00 2001
|
||||
From: Shaoxiong Li <dahefanteng@gmail.com>
|
||||
Date: Wed, 19 Aug 2020 18:51:26 +0800
|
||||
Subject: [PATCH 12/17] bcache-tools: Fix potential coredump issues
|
||||
Git-commit: b0f5169a13976b05b183e0cde1fd23ef4f90101c
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
In some distributions, such as opensuse 15.2, when the free_dev
|
||||
function is called, it may refer to the memory that has been
|
||||
released, causing a coredump. Changing 'list_for_each_entry'
|
||||
to 'list_for_each_entry_safe' can avoid this problem.
|
||||
|
||||
Signed-off-by: Shaoxiong Li <dahefanteng@gmail.com>
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
bcache.c | 18 +++++++++---------
|
||||
1 file changed, 9 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/bcache.c b/bcache.c
|
||||
index 50e3a88..3b963e4 100644
|
||||
--- a/bcache.c
|
||||
+++ b/bcache.c
|
||||
@@ -175,9 +175,9 @@ int version_usagee(void)
|
||||
|
||||
void free_dev(struct list_head *head)
|
||||
{
|
||||
- struct dev *dev;
|
||||
+ struct dev *dev, *n;
|
||||
|
||||
- list_for_each_entry(dev, head, dev_list) {
|
||||
+ list_for_each_entry_safe(dev, n, head, dev_list) {
|
||||
free(dev);
|
||||
}
|
||||
}
|
||||
@@ -185,7 +185,7 @@ void free_dev(struct list_head *head)
|
||||
int show_bdevs_detail(void)
|
||||
{
|
||||
struct list_head head;
|
||||
- struct dev *devs;
|
||||
+ struct dev *devs, *n;
|
||||
|
||||
INIT_LIST_HEAD(&head);
|
||||
int ret;
|
||||
@@ -197,7 +197,7 @@ int show_bdevs_detail(void)
|
||||
}
|
||||
printf("Name\t\tUuid\t\t\t\t\tCset_Uuid\t\t\t\tType\t\tState");
|
||||
printf("\t\t\tBname\t\tAttachToDev\tAttachToCset\n");
|
||||
- list_for_each_entry(devs, &head, dev_list) {
|
||||
+ list_for_each_entry_safe(devs, n, &head, dev_list) {
|
||||
printf("%s\t%s\t%s\t%lu", devs->name, devs->uuid,
|
||||
devs->cset, devs->version);
|
||||
switch (devs->version) {
|
||||
@@ -242,7 +242,7 @@ int show_bdevs_detail(void)
|
||||
int show_bdevs(void)
|
||||
{
|
||||
struct list_head head;
|
||||
- struct dev *devs;
|
||||
+ struct dev *devs, *n;
|
||||
|
||||
INIT_LIST_HEAD(&head);
|
||||
int ret;
|
||||
@@ -254,7 +254,7 @@ int show_bdevs(void)
|
||||
}
|
||||
|
||||
printf("Name\t\tType\t\tState\t\t\tBname\t\tAttachToDev\n");
|
||||
- list_for_each_entry(devs, &head, dev_list) {
|
||||
+ list_for_each_entry_safe(devs, n, &head, dev_list) {
|
||||
printf("%s\t%lu", devs->name, devs->version);
|
||||
switch (devs->version) {
|
||||
// These are handled the same by the kernel
|
||||
@@ -428,7 +428,7 @@ int detail_single(char *devname)
|
||||
int tree(void)
|
||||
{
|
||||
struct list_head head;
|
||||
- struct dev *devs, *tmp;
|
||||
+ struct dev *devs, *tmp, *n, *m;
|
||||
|
||||
INIT_LIST_HEAD(&head);
|
||||
int ret;
|
||||
@@ -445,13 +445,13 @@ int tree(void)
|
||||
tb = scols_new_table();
|
||||
scols_table_new_column(tb, ".", 0.1, SCOLS_FL_TREE);
|
||||
scols_table_new_column(tb, "", 2, SCOLS_FL_TRUNC);
|
||||
- list_for_each_entry(devs, &head, dev_list) {
|
||||
+ list_for_each_entry_safe(devs, n, &head, dev_list) {
|
||||
if ((devs->version == BCACHE_SB_VERSION_CDEV
|
||||
|| devs->version == BCACHE_SB_VERSION_CDEV_WITH_UUID)
|
||||
&& strcmp(devs->state, BCACHE_BASIC_STATE_ACTIVE) == 0) {
|
||||
dad = scols_table_new_line(tb, NULL);
|
||||
scols_line_set_data(dad, COL_CSET, devs->name);
|
||||
- list_for_each_entry(tmp, &head, dev_list) {
|
||||
+ list_for_each_entry_safe(tmp, m, &head, dev_list) {
|
||||
if (strcmp(devs->cset, tmp->attachuuid) ==
|
||||
0) {
|
||||
son =
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,131 +0,0 @@
|
||||
From 2cfea71ab753fc65f1d97b0af327e6e9e3fa204b Mon Sep 17 00:00:00 2001
|
||||
From: Ryan Harper <ryan.harper@canonical.com>
|
||||
Date: Wed, 19 Aug 2020 18:51:27 +0800
|
||||
Subject: [PATCH 13/17] bcache-tools: Export CACHED_UUID and CACHED_LABEL
|
||||
Git-commit: 2cfea71ab753fc65f1d97b0af327e6e9e3fa204b
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
https://github.com/koverstreet/bcache-tools/pull/1
|
||||
|
||||
Add bcache-export-cached helper to export CACHED_UUID and CACHED_LABEL always
|
||||
|
||||
Linux kernel bcache driver does not always emit a uevent[1] for when
|
||||
a backing device is bound to a bcacheN device. When this happens, the udev
|
||||
rule for creating /dev/bcache/by-uuid or /dev/bcache/by-label symlinks does
|
||||
not fire and removes any persistent symlink to a specific backing device
|
||||
since the bcache minor numbers (bcache0, 1, 2) are not guaranteed across reboots.
|
||||
|
||||
This script reads the superblock of the bcache device slaves,ensuring the slave
|
||||
is a backing device via sb.version check, extracts the dev.uuid and
|
||||
dev.label values and exports them to udev for triggering the symlink rules in
|
||||
the existing rules file.
|
||||
|
||||
1. https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1729145
|
||||
|
||||
Signed-off-by: Shaoxiong Li <dahefanteng@gmail.com>
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
69-bcache.rules | 7 +++----
|
||||
Makefile | 2 +-
|
||||
bcache-export-cached | 31 +++++++++++++++++++++++++++++++
|
||||
initcpio/install | 1 +
|
||||
initramfs/hook | 1 +
|
||||
5 files changed, 37 insertions(+), 5 deletions(-)
|
||||
create mode 100644 bcache-export-cached
|
||||
|
||||
diff --git a/69-bcache.rules b/69-bcache.rules
|
||||
index 9cc7f0d..fd25f5b 100644
|
||||
--- a/69-bcache.rules
|
||||
+++ b/69-bcache.rules
|
||||
@@ -23,10 +23,9 @@ RUN+="bcache-register $tempnode"
|
||||
LABEL="bcache_backing_end"
|
||||
|
||||
# Cached devices: symlink
|
||||
-DRIVER=="bcache", ENV{CACHED_UUID}=="?*", \
|
||||
- SYMLINK+="bcache/by-uuid/$env{CACHED_UUID}"
|
||||
-DRIVER=="bcache", ENV{CACHED_LABEL}=="?*", \
|
||||
- SYMLINK+="bcache/by-label/$env{CACHED_LABEL}"
|
||||
+IMPORT{program}="bcache-export-cached $tempnode"
|
||||
+ENV{CACHED_UUID}=="?*", SYMLINK+="bcache/by-uuid/$env{CACHED_UUID}"
|
||||
+ENV{CACHED_LABEL}=="?*", SYMLINK+="bcache/by-label/$env{CACHED_LABEL}"
|
||||
|
||||
LABEL="bcache_end"
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 8b87a67..90db951 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -9,7 +9,7 @@ all: make-bcache probe-bcache bcache-super-show bcache-register bcache
|
||||
|
||||
install: make-bcache probe-bcache bcache-super-show
|
||||
$(INSTALL) -m0755 make-bcache bcache-super-show bcache $(DESTDIR)${PREFIX}/sbin/
|
||||
- $(INSTALL) -m0755 probe-bcache bcache-register $(DESTDIR)$(UDEVLIBDIR)/
|
||||
+ $(INSTALL) -m0755 probe-bcache bcache-register bcache-export-cached $(DESTDIR)$(UDEVLIBDIR)/
|
||||
$(INSTALL) -m0644 69-bcache.rules $(DESTDIR)$(UDEVLIBDIR)/rules.d/
|
||||
$(INSTALL) -m0644 -- *.8 $(DESTDIR)${PREFIX}/share/man/man8/
|
||||
$(INSTALL) -D -m0755 initramfs/hook $(DESTDIR)/usr/share/initramfs-tools/hooks/bcache
|
||||
diff --git a/bcache-export-cached b/bcache-export-cached
|
||||
new file mode 100644
|
||||
index 0000000..b345922
|
||||
--- /dev/null
|
||||
+++ b/bcache-export-cached
|
||||
@@ -0,0 +1,31 @@
|
||||
+#!/bin/sh
|
||||
+#
|
||||
+# This program reads the bcache superblock on bcacheX slaves to extract the
|
||||
+# dev.uuid and dev.label which refer to a specific backing device.
|
||||
+#
|
||||
+# It integrates with udev 'import' by writing CACHED_UUID=X and optionally
|
||||
+# CACHED_LABEL=X for the backing device of the provided bcache device.
|
||||
+# Ignore caching devices by skipping unless sb.version=1
|
||||
+#
|
||||
+# There is 1 and only 1 backing device (slaves/*) for a bcache device.
|
||||
+
|
||||
+TEMPNODE=${1} # /dev/bcacheN
|
||||
+DEVNAME=${TEMPNODE##*/} # /dev/bcacheN -> bcacheN
|
||||
+
|
||||
+for slave in "/sys/class/block/$DEVNAME/slaves"/*; do
|
||||
+ [ -d "$slave" ] || continue
|
||||
+ bcache-super-show "/dev/${slave##*/}" |
|
||||
+ awk '$1 == "sb.version" { sbver=$2; }
|
||||
+ $1 == "dev.uuid" { uuid=$2; }
|
||||
+ $1 == "dev.label" && $2 != "(empty)" { label=$2; }
|
||||
+ END {
|
||||
+ if (sbver == 1 && uuid) {
|
||||
+ print("CACHED_UUID=" uuid)
|
||||
+ if (label) print("CACHED_LABEL=" label)
|
||||
+ exit(0)
|
||||
+ }
|
||||
+ exit(1);
|
||||
+ }'
|
||||
+ # awk exits 0 if it found a backing device.
|
||||
+ [ $? -eq 0 ] && exit 0
|
||||
+done
|
||||
diff --git a/initcpio/install b/initcpio/install
|
||||
index 72d4231..c1a86fe 100755
|
||||
--- a/initcpio/install
|
||||
+++ b/initcpio/install
|
||||
@@ -1,6 +1,7 @@
|
||||
#!/bin/bash
|
||||
build() {
|
||||
add_module bcache
|
||||
+ add_binary /usr/lib/udev/bcache-export-cached
|
||||
add_binary /usr/lib/udev/bcache-register
|
||||
add_binary /usr/lib/udev/probe-bcache
|
||||
add_file /usr/lib/udev/rules.d/69-bcache.rules
|
||||
diff --git a/initramfs/hook b/initramfs/hook
|
||||
index a6baa24..485491d 100755
|
||||
--- a/initramfs/hook
|
||||
+++ b/initramfs/hook
|
||||
@@ -22,6 +22,7 @@ elif [ -e /lib/udev/rules.d/69-bcache.rules ]; then
|
||||
cp -pt "${DESTDIR}/lib/udev/rules.d" /lib/udev/rules.d/69-bcache.rules
|
||||
fi
|
||||
|
||||
+copy_exec /lib/udev/bcache-export-cached
|
||||
copy_exec /lib/udev/bcache-register
|
||||
copy_exec /lib/udev/probe-bcache
|
||||
manual_add_modules bcache
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,150 +0,0 @@
|
||||
From 38726cd652e3a3b75f2ae26f8b73e05dff7ed662 Mon Sep 17 00:00:00 2001
|
||||
From: Shaoxiong Li <dahefanteng@gmail.com>
|
||||
Date: Wed, 19 Aug 2020 18:51:28 +0800
|
||||
Subject: [PATCH 14/17] bcache-tools: Remove the dependency on libsmartcols
|
||||
Git-commit: 38726cd652e3a3b75f2ae26f8b73e05dff7ed662
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
The bcache tree function relies on the libsmartcols library to
|
||||
display the relationship between the cache device and the bdev
|
||||
device in a tree shape. However, it is difficult for many old
|
||||
operating systems (such as Ubuntu 12) to install this library.
|
||||
|
||||
For better compatibility, a simpler implementation is used to
|
||||
achieve the same purpose, while removing the dependency on
|
||||
libsmartcols.
|
||||
|
||||
Signed-off-by: Shaoxiong Li <dahefanteng@gmail.com>
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
Makefile | 8 ++++----
|
||||
bcache.c | 53 +++++++++++++++++++++++++++++++++++------------------
|
||||
2 files changed, 39 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 90db951..df44085 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -22,8 +22,8 @@ clean:
|
||||
|
||||
bcache-test: LDLIBS += `pkg-config --libs openssl` -lm
|
||||
|
||||
-make-bcache: LDLIBS += `pkg-config --libs uuid blkid smartcols`
|
||||
-make-bcache: CFLAGS += `pkg-config --cflags uuid blkid smartcols`
|
||||
+make-bcache: LDLIBS += `pkg-config --libs uuid blkid`
|
||||
+make-bcache: CFLAGS += `pkg-config --cflags uuid blkid`
|
||||
make-bcache: make.o crc64.o lib.o zoned.o
|
||||
|
||||
probe-bcache: LDLIBS += `pkg-config --libs uuid blkid`
|
||||
@@ -35,7 +35,7 @@ bcache-super-show: crc64.o lib.o
|
||||
|
||||
bcache-register: bcache-register.o
|
||||
|
||||
-bcache: CFLAGS += `pkg-config --cflags blkid uuid smartcols`
|
||||
-bcache: LDLIBS += `pkg-config --libs blkid uuid smartcols`
|
||||
+bcache: CFLAGS += `pkg-config --cflags blkid uuid`
|
||||
+bcache: LDLIBS += `pkg-config --libs blkid uuid`
|
||||
bcache: CFLAGS += -std=gnu99
|
||||
bcache: crc64.o lib.o make.o zoned.o features.o
|
||||
diff --git a/bcache.c b/bcache.c
|
||||
index 3b963e4..a0c5a67 100644
|
||||
--- a/bcache.c
|
||||
+++ b/bcache.c
|
||||
@@ -10,13 +10,13 @@
|
||||
#include <unistd.h>
|
||||
#include <getopt.h>
|
||||
#include <regex.h>
|
||||
-#include <libsmartcols/libsmartcols.h>
|
||||
#include "bcache.h"
|
||||
#include "lib.h"
|
||||
#include "make.h"
|
||||
#include <locale.h>
|
||||
#include "list.h"
|
||||
#include <limits.h>
|
||||
+#include <assert.h>
|
||||
|
||||
#include "features.h"
|
||||
|
||||
@@ -425,8 +425,34 @@ int detail_single(char *devname)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+void replace_line(char **dest, const char *from, const char *to)
|
||||
+{
|
||||
+ assert(strlen(from) == strlen(to));
|
||||
+ char sub[4096] = "";
|
||||
+ char new[4096] = "";
|
||||
+
|
||||
+ strcpy(sub, *dest);
|
||||
+ while (1) {
|
||||
+ char *tmp = strpbrk(sub, from);
|
||||
+
|
||||
+ if (tmp != NULL) {
|
||||
+ strcpy(new, tmp);
|
||||
+ strcpy(sub, tmp + strlen(from));
|
||||
+ } else
|
||||
+ break;
|
||||
+ }
|
||||
+ if (strlen(new) > 0) {
|
||||
+ strncpy(new, to, strlen(to));
|
||||
+ sprintf(*dest + strlen(*dest) - strlen(new), new, strlen(new));
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
int tree(void)
|
||||
{
|
||||
+ char *out = (char *)malloc(4096);
|
||||
+ const char *begin = ".\n";
|
||||
+ const char *middle = "├─";
|
||||
+ const char *tail = "└─";
|
||||
struct list_head head;
|
||||
struct dev *devs, *tmp, *n, *m;
|
||||
|
||||
@@ -438,35 +464,26 @@ int tree(void)
|
||||
fprintf(stderr, "Failed to list devices\n");
|
||||
return ret;
|
||||
}
|
||||
- struct libscols_table *tb;
|
||||
- struct libscols_line *dad, *son;
|
||||
- enum { COL_CSET, COL_BNAME };
|
||||
- setlocale(LC_ALL, "");
|
||||
- tb = scols_new_table();
|
||||
- scols_table_new_column(tb, ".", 0.1, SCOLS_FL_TREE);
|
||||
- scols_table_new_column(tb, "", 2, SCOLS_FL_TRUNC);
|
||||
+ sprintf(out, "%s", begin);
|
||||
list_for_each_entry_safe(devs, n, &head, dev_list) {
|
||||
if ((devs->version == BCACHE_SB_VERSION_CDEV
|
||||
|| devs->version == BCACHE_SB_VERSION_CDEV_WITH_UUID)
|
||||
&& strcmp(devs->state, BCACHE_BASIC_STATE_ACTIVE) == 0) {
|
||||
- dad = scols_table_new_line(tb, NULL);
|
||||
- scols_line_set_data(dad, COL_CSET, devs->name);
|
||||
+ sprintf(out + strlen(out), "%s\n", devs->name);
|
||||
list_for_each_entry_safe(tmp, m, &head, dev_list) {
|
||||
if (strcmp(devs->cset, tmp->attachuuid) ==
|
||||
0) {
|
||||
- son =
|
||||
- scols_table_new_line(tb, dad);
|
||||
- scols_line_set_data(son, COL_CSET,
|
||||
- tmp->name);
|
||||
- scols_line_set_data(son, COL_BNAME,
|
||||
- tmp->bname);
|
||||
+ replace_line(&out, tail, middle);
|
||||
+ sprintf(out + strlen(out), "%s%s %s\n",
|
||||
+ tail, tmp->name, tmp->bname);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
- scols_print_table(tb);
|
||||
- scols_unref_table(tb);
|
||||
+ if (strlen(out) > strlen(begin))
|
||||
+ printf("%s", out);
|
||||
free_dev(&head);
|
||||
+ free(out);
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,40 +0,0 @@
|
||||
From 67163cc86255bb93d524051e488de15172ab396c Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Sun, 23 Aug 2020 00:26:31 +0800
|
||||
Subject: [PATCH 15/17] bcache-tools: make: permit only one cache device to be
|
||||
specified
|
||||
Git-commit: 67163cc86255bb93d524051e488de15172ab396c
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
Now a cache set only has a single cache, therefore "bcache make" should
|
||||
permit only one cache device to be specified for a cache set.
|
||||
|
||||
This patch checks if more than one cache devices are specified by "-C"
|
||||
an error message "Please specify only one cache device" will be printed
|
||||
and bcache exits with usage information.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
make.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/make.c b/make.c
|
||||
index 9631857..ad89377 100644
|
||||
--- a/make.c
|
||||
+++ b/make.c
|
||||
@@ -604,6 +604,11 @@ int make_bcache(int argc, char **argv)
|
||||
usage();
|
||||
}
|
||||
|
||||
+ if (ncache_devices > 1) {
|
||||
+ fprintf(stderr, "Please specify only one cache device\n");
|
||||
+ usage();
|
||||
+ }
|
||||
+
|
||||
if (bucket_size < block_size) {
|
||||
fprintf(stderr,
|
||||
"Bucket size cannot be smaller than block size\n");
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,384 +0,0 @@
|
||||
From 10824170800268e91508e2edc6ed745f40370f0a Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Wed, 2 Sep 2020 19:27:08 +0800
|
||||
Subject: [PATCH 16/17] bcache-tools: add bcache-status
|
||||
Git-commit: 10824170800268e91508e2edc6ed745f40370f0a
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
People request to include bcache-status into bcache-tools package. This
|
||||
patch picks bcache-status script from github page of the orginal author
|
||||
Darrick J. Wong,
|
||||
https://github.com/djwong/bcache-tools/blob/master/bcache-status
|
||||
|
||||
Thanks to Darrick for writing the great bcache-status, and I will keep
|
||||
this script being updated from Darrick's repo time to time.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
Cc: Darrick J. Wong <darrick.wong@oracle.com>
|
||||
---
|
||||
bcache-status | 352 ++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 352 insertions(+)
|
||||
create mode 100755 bcache-status
|
||||
|
||||
diff --git a/bcache-status b/bcache-status
|
||||
new file mode 100755
|
||||
index 0000000..ac5a22f
|
||||
--- /dev/null
|
||||
+++ b/bcache-status
|
||||
@@ -0,0 +1,352 @@
|
||||
+#!/usr/bin/env python
|
||||
+#
|
||||
+# Dumb script to dump (some) of bcache status
|
||||
+# Copyright 2014 Darrick J. Wong. All rights reserved.
|
||||
+#
|
||||
+# This file is part of Bcache. Bcache is free software: you can
|
||||
+# redistribute it and/or modify it under the terms of the GNU General Public
|
||||
+# License as published by the Free Software Foundation, version 2.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
+# details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License along with
|
||||
+# this program; if not, write to the Free Software Foundation, Inc., 51
|
||||
+# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
+#
|
||||
+
|
||||
+import os
|
||||
+import sys
|
||||
+import argparse
|
||||
+
|
||||
+MAX_KEY_LENGTH = 28
|
||||
+DEV_BLOCK_PATH = '/dev/block/'
|
||||
+SYSFS_BCACHE_PATH = '/sys/fs/bcache/'
|
||||
+SYSFS_BLOCK_PATH = '/sys/block/'
|
||||
+
|
||||
+def file_to_lines(fname):
|
||||
+ try:
|
||||
+ with open(fname, "r") as fd:
|
||||
+ return fd.readlines()
|
||||
+ except:
|
||||
+ return []
|
||||
+
|
||||
+def file_to_line(fname):
|
||||
+ ret = file_to_lines(fname)
|
||||
+ if ret:
|
||||
+ return ret[0].strip()
|
||||
+ return ''
|
||||
+
|
||||
+def str_to_bool(x):
|
||||
+ return x == '1'
|
||||
+
|
||||
+def format_sectors(x):
|
||||
+ '''Pretty print a sector count.'''
|
||||
+ sectors = float(x)
|
||||
+ asectors = abs(sectors)
|
||||
+
|
||||
+ if asectors < 2:
|
||||
+ return '%d B' % (sectors * 512)
|
||||
+ elif asectors < 2048:
|
||||
+ return '%.2f KiB' % (sectors / 2)
|
||||
+ elif asectors < 2097152:
|
||||
+ return '%.1f MiB' % (sectors / 2048)
|
||||
+ elif asectors < 2147483648:
|
||||
+ return '%.0f GiB' % (sectors / 2097152)
|
||||
+ else:
|
||||
+ return '%.0f TiB' % (sectors / 2147483648)
|
||||
+
|
||||
+def interpret_sectors(x):
|
||||
+ '''Interpret a pretty-printed disk size.'''
|
||||
+ factors = {
|
||||
+ 'k': 1 << 10,
|
||||
+ 'M': 1 << 20,
|
||||
+ 'G': 1 << 30,
|
||||
+ 'T': 1 << 40,
|
||||
+ 'P': 1 << 50,
|
||||
+ 'E': 1 << 60,
|
||||
+ 'Z': 1 << 70,
|
||||
+ 'Y': 1 << 80,
|
||||
+ }
|
||||
+
|
||||
+ factor = 1
|
||||
+ if x[-1] in factors:
|
||||
+ factor = factors[x[-1]]
|
||||
+ x = x[:-1]
|
||||
+ return int(float(x) * factor / 512)
|
||||
+
|
||||
+def pretty_size(x):
|
||||
+ return format_sectors(interpret_sectors(x))
|
||||
+
|
||||
+def device_path(x):
|
||||
+ if not os.path.isdir(DEV_BLOCK_PATH):
|
||||
+ return '?'
|
||||
+ x = '%s/%s' % (DEV_BLOCK_PATH, x)
|
||||
+ return os.path.abspath(os.path.join(os.path.dirname(x), os.readlink(x)))
|
||||
+
|
||||
+def str_device_path(x):
|
||||
+ return '%s (%s)' % (device_path(x), x)
|
||||
+
|
||||
+def dump_bdev(bdev_path):
|
||||
+ '''Dump a backing device stats.'''
|
||||
+ global MAX_KEY_LENGTH
|
||||
+ attrs = [
|
||||
+ ('../dev', 'Device File', str_device_path),
|
||||
+ ('dev/dev', 'bcache Device File', str_device_path),
|
||||
+ ('../size', 'Size', format_sectors),
|
||||
+ ('cache_mode', 'Cache Mode', None),
|
||||
+ ('readahead', 'Readahead', None),
|
||||
+ ('sequential_cutoff', 'Sequential Cutoff', pretty_size),
|
||||
+ ('sequential_merge', 'Merge sequential?', str_to_bool),
|
||||
+ ('state', 'State', None),
|
||||
+ ('writeback_running', 'Writeback?', str_to_bool),
|
||||
+ ('dirty_data', 'Dirty Data', pretty_size),
|
||||
+ ('writeback_rate', 'Writeback Rate', lambda x: '%s/s' % x),
|
||||
+ ('writeback_percent', 'Dirty Target', lambda x: '%s%%' % x),
|
||||
+ ]
|
||||
+
|
||||
+ print('--- Backing Device ---')
|
||||
+ for (sysfs_name, display_name, conversion_func) in attrs:
|
||||
+ val = file_to_line('%s/%s' % (bdev_path, sysfs_name))
|
||||
+ if conversion_func is not None:
|
||||
+ val = conversion_func(val)
|
||||
+ if display_name is None:
|
||||
+ display_name = sysfs_name
|
||||
+ print(' %-*s%s' % (MAX_KEY_LENGTH - 2, display_name, val))
|
||||
+
|
||||
+def dump_cachedev(cachedev_path):
|
||||
+ '''Dump a cachding device stats.'''
|
||||
+ def fmt_cachesize(val):
|
||||
+ return '%s\t(%.0f%%)' % (format_sectors(val), float(val) / cache_size * 100)
|
||||
+
|
||||
+ global MAX_KEY_LENGTH
|
||||
+ attrs = [
|
||||
+ ('../dev', 'Device File', str_device_path),
|
||||
+ ('../size', 'Size', format_sectors),
|
||||
+ ('block_size', 'Block Size', pretty_size),
|
||||
+ ('bucket_size', 'Bucket Size', pretty_size),
|
||||
+ ('cache_replacement_policy', 'Replacement Policy', None),
|
||||
+ ('discard', 'Discard?', str_to_bool),
|
||||
+ ('io_errors', 'I/O Errors', None),
|
||||
+ ('metadata_written', 'Metadata Written', pretty_size),
|
||||
+ ('written', 'Data Written', pretty_size),
|
||||
+ ('nbuckets', 'Buckets', None),
|
||||
+ (None, 'Cache Used', lambda x: fmt_cachesize(used_sectors)),
|
||||
+ (None, 'Cache Unused', lambda x: fmt_cachesize(unused_sectors)),
|
||||
+ ]
|
||||
+
|
||||
+ stats = get_cache_priority_stats(cachedev_path)
|
||||
+ cache_size = int(file_to_line('%s/../size' % cachedev_path))
|
||||
+ unused_sectors = float(stats['Unused'][:-1]) * cache_size / 100
|
||||
+ used_sectors = cache_size - unused_sectors
|
||||
+
|
||||
+ print('--- Cache Device ---')
|
||||
+ for (sysfs_name, display_name, conversion_func) in attrs:
|
||||
+ if sysfs_name is not None:
|
||||
+ val = file_to_line('%s/%s' % (cachedev_path, sysfs_name))
|
||||
+ if conversion_func is not None:
|
||||
+ val = conversion_func(val)
|
||||
+ if display_name is None:
|
||||
+ display_name = sysfs_name
|
||||
+ print(' %-*s%s' % (MAX_KEY_LENGTH - 2, display_name, val))
|
||||
+
|
||||
+def hits_to_str(hits_str, misses_str):
|
||||
+ '''Render a hits/misses ratio as a string.'''
|
||||
+ hits = int(hits_str)
|
||||
+ misses = int(misses_str)
|
||||
+
|
||||
+ ret = '%d' % hits
|
||||
+ if hits + misses != 0:
|
||||
+ ret = '%s\t(%.d%%)' % (ret, 100 * hits / (hits + misses))
|
||||
+ return ret
|
||||
+
|
||||
+def dump_stats(sysfs_path, indent_str, stats):
|
||||
+ '''Dump stats on a bcache device.'''
|
||||
+ stat_types = [
|
||||
+ ('five_minute', 'Last 5min'),
|
||||
+ ('hour', 'Last Hour'),
|
||||
+ ('day', 'Last Day'),
|
||||
+ ('total', 'Total'),
|
||||
+ ]
|
||||
+ attrs = ['bypassed', 'cache_bypass_hits', 'cache_bypass_misses', 'cache_hits', 'cache_misses']
|
||||
+ display = [
|
||||
+ ('Hits', lambda: hits_to_str(stat_data['cache_hits'], stat_data['cache_misses'])),
|
||||
+ ('Misses', lambda: stat_data['cache_misses']),
|
||||
+ ('Bypass Hits', lambda: hits_to_str(stat_data['cache_bypass_hits'], stat_data['cache_bypass_misses'])),
|
||||
+ ('Bypass Misses', lambda: stat_data['cache_bypass_misses']),
|
||||
+ ('Bypassed', lambda: pretty_size(stat_data['bypassed'])),
|
||||
+ ]
|
||||
+
|
||||
+ for (sysfs_name, stat_display_name) in stat_types:
|
||||
+ if len(stats) > 0 and sysfs_name not in stats:
|
||||
+ continue
|
||||
+ stat_data = {}
|
||||
+ for attr in attrs:
|
||||
+ val = file_to_line('%s/stats_%s/%s' % (sysfs_path, sysfs_name, attr))
|
||||
+ stat_data[attr] = val
|
||||
+ for (display_name, str_func) in display:
|
||||
+ d = '%s%s %s' % (indent_str, stat_display_name, display_name)
|
||||
+ print('%-*s%s' % (MAX_KEY_LENGTH, d, str_func()))
|
||||
+
|
||||
+def get_cache_priority_stats(cache):
|
||||
+ '''Retrieve priority stats from a cache.'''
|
||||
+ attrs = {}
|
||||
+
|
||||
+ for line in file_to_lines('%s/priority_stats' % cache):
|
||||
+ x = line.split()
|
||||
+ key = x[0]
|
||||
+ value = x[1]
|
||||
+ attrs[key[:-1]] = value
|
||||
+ return attrs
|
||||
+
|
||||
+def dump_bcache(bcache_sysfs_path, stats, print_subdevices, device):
|
||||
+ '''Dump bcache stats'''
|
||||
+ def fmt_cachesize(val):
|
||||
+ return '%s\t(%.0f%%)' % (format_sectors(val), 100.0 * val / cache_sectors)
|
||||
+
|
||||
+ attrs = [
|
||||
+ (None, 'UUID', lambda x: os.path.basename(bcache_sysfs_path)),
|
||||
+ ('block_size', 'Block Size', pretty_size),
|
||||
+ ('bucket_size', 'Bucket Size', pretty_size),
|
||||
+ ('congested', 'Congested?', str_to_bool),
|
||||
+ ('congested_read_threshold_us', 'Read Congestion', lambda x: '%.1fms' % (int(x) / 1000)),
|
||||
+ ('congested_write_threshold_us', 'Write Congestion', lambda x: '%.1fms' % (int(x) / 1000)),
|
||||
+ (None, 'Total Cache Size', lambda x: format_sectors(cache_sectors)),
|
||||
+ (None, 'Total Cache Used', lambda x: fmt_cachesize(cache_used_sectors)),
|
||||
+ (None, 'Total Cache Unused', lambda x: fmt_cachesize(cache_unused_sectors)),
|
||||
+ #('dirty_data', 'Dirty Data', lambda x: fmt_cachesize(interpret_sectors(x))), # disappeared in 3.13?
|
||||
+ ('cache_available_percent', 'Evictable Cache', lambda x: '%s\t(%s%%)' % (format_sectors(float(x) * cache_sectors / 100), x)),
|
||||
+ (None, 'Replacement Policy', lambda x: replacement_policies.pop() if len(replacement_policies) == 1 else '(Various)'),
|
||||
+ (None, 'Cache Mode', lambda x: cache_modes.pop() if len(cache_modes) == 1 else '(Various)'),
|
||||
+ ]
|
||||
+
|
||||
+ # Calculate aggregate data
|
||||
+ cache_sectors = 0
|
||||
+ cache_unused_sectors = 0
|
||||
+ cache_modes = set()
|
||||
+ replacement_policies = set()
|
||||
+ for obj in os.listdir(bcache_sysfs_path):
|
||||
+ if not os.path.isdir('%s/%s' % (bcache_sysfs_path, obj)):
|
||||
+ continue
|
||||
+ if obj.startswith('cache'):
|
||||
+ cache_size = int(file_to_line('%s/%s/../size' % (bcache_sysfs_path, obj)))
|
||||
+ cache_sectors += cache_size
|
||||
+ cstats = get_cache_priority_stats('%s/%s' % (bcache_sysfs_path, obj))
|
||||
+ unused_size = float(cstats['Unused'][:-1]) * cache_size / 100
|
||||
+ cache_unused_sectors += unused_size
|
||||
+ replacement_policies.add(file_to_line('%s/%s/cache_replacement_policy' % (bcache_sysfs_path, obj)))
|
||||
+ elif obj.startswith('bdev'):
|
||||
+ cache_modes.add(file_to_line('%s/%s/cache_mode' % (bcache_sysfs_path, obj)))
|
||||
+ cache_used_sectors = cache_sectors - cache_unused_sectors
|
||||
+
|
||||
+ # Dump basic stats
|
||||
+ print("--- bcache ---")
|
||||
+ for (sysfs_name, display_name, conversion_func) in attrs:
|
||||
+ if sysfs_name is not None:
|
||||
+ val = file_to_line('%s/%s' % (bcache_sysfs_path, sysfs_name))
|
||||
+ else:
|
||||
+ val = None
|
||||
+ if conversion_func is not None:
|
||||
+ val = conversion_func(val)
|
||||
+ if display_name is None:
|
||||
+ display_name = sysfs_name
|
||||
+ print('%-*s%s' % (MAX_KEY_LENGTH, display_name, val))
|
||||
+ dump_stats(bcache_sysfs_path, '', stats)
|
||||
+
|
||||
+ # Dump sub-device stats
|
||||
+ if not print_subdevices:
|
||||
+ return
|
||||
+ for obj in os.listdir(bcache_sysfs_path):
|
||||
+ if not os.path.isdir('%s/%s' % (bcache_sysfs_path, obj)):
|
||||
+ continue
|
||||
+ if obj.startswith('bdev'):
|
||||
+ dump_bdev('%s/%s' % (bcache_sysfs_path, obj))
|
||||
+ dump_stats('%s/%s' % (bcache_sysfs_path, obj), ' ', stats)
|
||||
+ elif obj.startswith('cache'):
|
||||
+ dump_cachedev('%s/%s' % (bcache_sysfs_path, obj))
|
||||
+
|
||||
+def map_uuid_to_device():
|
||||
+ '''Map bcache UUIDs to device files.'''
|
||||
+ global SYSFS_BLOCK_PATH
|
||||
+ ret = {}
|
||||
+
|
||||
+ if not os.path.isdir(SYSFS_BLOCK_PATH):
|
||||
+ return ret
|
||||
+ for bdev in os.listdir(SYSFS_BLOCK_PATH):
|
||||
+ link = '%s%s/bcache/cache' % (SYSFS_BLOCK_PATH, bdev)
|
||||
+ if not os.path.islink(link):
|
||||
+ continue
|
||||
+ basename = os.path.basename(os.readlink(link))
|
||||
+ ret[basename] = file_to_line('%s%s/dev' % (SYSFS_BLOCK_PATH, bdev))
|
||||
+ return ret
|
||||
+
|
||||
+def main():
|
||||
+ '''Main function'''
|
||||
+ global SYSFS_BCACHE_PATH
|
||||
+ global uuid_map
|
||||
+ stats = set()
|
||||
+ reset_stats = False
|
||||
+ print_subdevices = False
|
||||
+ run_gc = False
|
||||
+
|
||||
+ parser = argparse.ArgumentParser(add_help=False)
|
||||
+ parser.add_argument('--help', help='Show this help message and exit', action='store_true')
|
||||
+ parser.add_argument('-f', '--five-minute', help='Print the last five minutes of stats.', action='store_true')
|
||||
+ parser.add_argument('-h', '--hour', help='Print the last hour of stats.', action='store_true')
|
||||
+ parser.add_argument('-d', '--day', help='Print the last day of stats.', action='store_true')
|
||||
+ parser.add_argument('-t', '--total', help='Print total stats.', action='store_true')
|
||||
+ parser.add_argument('-a', '--all', help='Print all stats.', action='store_true')
|
||||
+ parser.add_argument('-r', '--reset-stats', help='Reset stats after printing them.', action='store_true')
|
||||
+ parser.add_argument('-s', '--sub-status', help='Print subdevice status.', action='store_true')
|
||||
+ parser.add_argument('-g', '--gc', help='Invoke GC before printing status.', action='store_true')
|
||||
+ args = parser.parse_args()
|
||||
+
|
||||
+ if args.help:
|
||||
+ parser.print_help()
|
||||
+ return 0
|
||||
+
|
||||
+ if args.five_minute:
|
||||
+ stats.add('five_minute')
|
||||
+ if args.hour:
|
||||
+ stats.add('hour')
|
||||
+ if args.day:
|
||||
+ stats.add('day')
|
||||
+ if args.total:
|
||||
+ stats.add('total')
|
||||
+ if args.all:
|
||||
+ stats.add('five_minute')
|
||||
+ stats.add('hour')
|
||||
+ stats.add('day')
|
||||
+ stats.add('total')
|
||||
+ if args.reset_stats:
|
||||
+ reset_stats = True
|
||||
+ if args.sub_status:
|
||||
+ print_subdevices = True
|
||||
+ if args.gc:
|
||||
+ run_gc = True
|
||||
+
|
||||
+ if not stats:
|
||||
+ stats.add('total')
|
||||
+
|
||||
+ uuid_map = map_uuid_to_device()
|
||||
+ if not os.path.isdir(SYSFS_BCACHE_PATH):
|
||||
+ print('bcache is not loaded.')
|
||||
+ return
|
||||
+ for cache in os.listdir(SYSFS_BCACHE_PATH):
|
||||
+ if not os.path.isdir('%s%s' % (SYSFS_BCACHE_PATH, cache)):
|
||||
+ continue
|
||||
+
|
||||
+ if run_gc:
|
||||
+ with open('%s%s/internal/trigger_gc' % (SYSFS_BCACHE_PATH, cache), 'w') as fd:
|
||||
+ fd.write('1\n')
|
||||
+
|
||||
+ dump_bcache('%s%s' % (SYSFS_BCACHE_PATH, cache), stats, print_subdevices, uuid_map.get(cache, '?'))
|
||||
+
|
||||
+ if reset_stats:
|
||||
+ with open('%s%s/clear_stats' % (SYSFS_BCACHE_PATH, cache), 'w') as fd:
|
||||
+ fd.write('1\n')
|
||||
+
|
||||
+if __name__ == '__main__':
|
||||
+ main()
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,72 +0,0 @@
|
||||
From 91fd5fb518ae535e36cff1ae188d1bcef874cf40 Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Wed, 2 Sep 2020 20:09:06 +0800
|
||||
Subject: [PATCH 17/17] bcache-tools: add man page bcache-status.8
|
||||
Git-commit: 91fd5fb518ae535e36cff1ae188d1bcef874cf40
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807
|
||||
|
||||
Add the initial man page for bcache-status.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
bcache-status.8 | 47 +++++++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 47 insertions(+)
|
||||
create mode 100644 bcache-status.8
|
||||
|
||||
diff --git a/bcache-status.8 b/bcache-status.8
|
||||
new file mode 100644
|
||||
index 0000000..f56cfb6
|
||||
--- /dev/null
|
||||
+++ b/bcache-status.8
|
||||
@@ -0,0 +1,47 @@
|
||||
+.TH bcache-status 8
|
||||
+.SH NAME
|
||||
+bcache-status \- Display useful bcache statistics
|
||||
+
|
||||
+.SH SYNOPSIS
|
||||
+.B bcache-status [ --help ] [ -f ] [ -h ] [ -d ] [ -t ] [ -a ] [ -r ] [ -s ] [ -g ]
|
||||
+
|
||||
+.SH DESCRIPTION
|
||||
+This command displays useful bcache statistics in a convenient way.
|
||||
+
|
||||
+.SH OPTIONS
|
||||
+
|
||||
+.TP
|
||||
+.BR \-\-help
|
||||
+Print help message and exit.
|
||||
+
|
||||
+.TP
|
||||
+.BR \-f ", " \-\-five\-minute
|
||||
+Print the last five minutes of stats.
|
||||
+
|
||||
+.TP
|
||||
+.BR \-h ", " \-\-hour
|
||||
+Print the last hour of stats.
|
||||
+
|
||||
+.TP
|
||||
+.BR \-d ", " \-\-day
|
||||
+Print the last day of stats.
|
||||
+
|
||||
+.TP
|
||||
+.BR \-t ", " \-\-total
|
||||
+Print total stats.
|
||||
+
|
||||
+.TP
|
||||
+.BR \-a ", " \-\-all
|
||||
+Print all stats.
|
||||
+
|
||||
+.TP
|
||||
+.BR \-r ", " \-\-reset\-stats
|
||||
+Reset stats after printing them.
|
||||
+
|
||||
+.TP
|
||||
+.BR \-s ", " \-\-sub\-status
|
||||
+Print subdevice status.
|
||||
+
|
||||
+.TP
|
||||
+.BR \-g ", " \-\-gc
|
||||
+Invoke GC before printing status (root only).
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,31 +0,0 @@
|
||||
From 096d205a9f1be8540cbc5a468c0da8203023de70 Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Sun, 15 Nov 2020 23:18:31 +0800
|
||||
Subject: [PATCH] Makefile: install bcache-status
|
||||
Git-commit: 096d205a9f1be8540cbc5a468c0da8203023de70
|
||||
Patch-mainline: bcache-tools-1.1
|
||||
References: jsc#SLE-9807, bsc#1178725
|
||||
|
||||
This patch modifies Makefile to intall bcache-status into
|
||||
$(DESTDIR)${PREFIX}/sbin/.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
Makefile | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index df44085..d914200 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -9,6 +9,7 @@ all: make-bcache probe-bcache bcache-super-show bcache-register bcache
|
||||
|
||||
install: make-bcache probe-bcache bcache-super-show
|
||||
$(INSTALL) -m0755 make-bcache bcache-super-show bcache $(DESTDIR)${PREFIX}/sbin/
|
||||
+ $(INSTALL) -m0755 bcache-status $(DESTDIR)${PREFIX}/sbin/
|
||||
$(INSTALL) -m0755 probe-bcache bcache-register bcache-export-cached $(DESTDIR)$(UDEVLIBDIR)/
|
||||
$(INSTALL) -m0644 69-bcache.rules $(DESTDIR)$(UDEVLIBDIR)/rules.d/
|
||||
$(INSTALL) -m0644 -- *.8 $(DESTDIR)${PREFIX}/share/man/man8/
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,38 +0,0 @@
|
||||
From d5503bda96efdca8e2ebaa7b3d43845fda4b404d Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Mon, 28 Dec 2020 16:10:42 +0800
|
||||
Subject: [PATCH 1/9] bcache.h: fix typo from SUUP to SUPP
|
||||
Git-commit: d5503bda96efdca8e2ebaa7b3d43845fda4b404d
|
||||
References: jsc#SLE-9807
|
||||
|
||||
This patch fixes the following typos,
|
||||
from BCH_FEATURE_COMPAT_SUUP to BCH_FEATURE_COMPAT_SUPP
|
||||
from BCH_FEATURE_INCOMPAT_SUUP to BCH_FEATURE_INCOMPAT_SUPP
|
||||
from BCH_FEATURE_INCOMPAT_SUUP to BCH_FEATURE_RO_COMPAT_SUPP
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
|
||||
---
|
||||
bcache.h | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/bcache.h b/bcache.h
|
||||
index 6aef9c4..50dd2b5 100644
|
||||
--- a/bcache.h
|
||||
+++ b/bcache.h
|
||||
@@ -200,9 +200,9 @@ uint64_t crc64(const void *data, size_t len);
|
||||
#define BCH_FEATURE_INCOMPAT 2
|
||||
#define BCH_FEATURE_TYPE_MASK 0x03
|
||||
|
||||
-#define BCH_FEATURE_COMPAT_SUUP 0
|
||||
-#define BCH_FEATURE_INCOMPAT_SUUP 0
|
||||
-#define BCH_FEATURE_RO_COMPAT_SUUP 0
|
||||
+#define BCH_FEATURE_COMPAT_SUPP 0
|
||||
+#define BCH_FEATURE_INCOMPAT_SUPP 0
|
||||
+#define BCH_FEATURE_RO_COMPAT_SUPP 0
|
||||
|
||||
#define BCH_HAS_COMPAT_FEATURE(sb, mask) \
|
||||
((sb)->feature_compat & (mask))
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,41 +0,0 @@
|
||||
From 287e2a743ccded3916a97a631855b1368427d6ab Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Tue, 29 Dec 2020 22:29:41 +0800
|
||||
Subject: [PATCH 2/9] bcache-tools: only call set_bucket_size() for cache
|
||||
device
|
||||
Git-commit: 287e2a743ccded3916a97a631855b1368427d6ab
|
||||
References: jsc#SLE-9807
|
||||
|
||||
It doesn't make sense to set bucket size for backing device, this patch
|
||||
moves set_bucket_size() into the code block for cache device only.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
|
||||
---
|
||||
make.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/make.c b/make.c
|
||||
index ad89377..a3f97f6 100644
|
||||
--- a/make.c
|
||||
+++ b/make.c
|
||||
@@ -340,7 +340,6 @@ static void write_sb(char *dev, unsigned int block_size,
|
||||
uuid_generate(sb.uuid);
|
||||
memcpy(sb.set_uuid, set_uuid, sizeof(sb.set_uuid));
|
||||
|
||||
- set_bucket_size(&sb, bucket_size);
|
||||
sb.block_size = block_size;
|
||||
|
||||
uuid_unparse(sb.uuid, uuid_str);
|
||||
@@ -383,6 +382,8 @@ static void write_sb(char *dev, unsigned int block_size,
|
||||
data_offset);
|
||||
putchar('\n');
|
||||
} else {
|
||||
+ set_bucket_size(&sb, bucket_size);
|
||||
+
|
||||
sb.nbuckets = getblocks(fd) / sb.bucket_size;
|
||||
sb.nr_in_set = 1;
|
||||
/* 23 is (SB_SECTOR + SB_SIZE) - 1 sectors */
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,35 +0,0 @@
|
||||
From 86d708d996935edd2f53ada336c40c38cc7fdfd7 Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Mon, 28 Dec 2020 16:24:31 +0800
|
||||
Subject: [PATCH 3/9] bcache.h: add BCH_FEATURE_INCOMPAT_LARGE_BUCKET to
|
||||
BCH_FEATURE_INCOMPAT_SUPP
|
||||
Git-commit: 86d708d996935edd2f53ada336c40c38cc7fdfd7
|
||||
References: jsc#SLE-9807
|
||||
|
||||
BCH_FEATURE_INCOMPAT_LARGE_BUCKET is a feature to support 32bits bucket
|
||||
size, which is incompatible feature for existing on-disk layout. This
|
||||
patch adds this feature bit to BCH_FEATURE_INCOMPAT_SUPP feature set.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
|
||||
---
|
||||
bcache.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/bcache.h b/bcache.h
|
||||
index 50dd2b5..58e973c 100644
|
||||
--- a/bcache.h
|
||||
+++ b/bcache.h
|
||||
@@ -201,8 +201,8 @@ uint64_t crc64(const void *data, size_t len);
|
||||
#define BCH_FEATURE_TYPE_MASK 0x03
|
||||
|
||||
#define BCH_FEATURE_COMPAT_SUPP 0
|
||||
-#define BCH_FEATURE_INCOMPAT_SUPP 0
|
||||
#define BCH_FEATURE_RO_COMPAT_SUPP 0
|
||||
+#define BCH_FEATURE_INCOMPAT_SUPP BCH_FEATURE_INCOMPAT_LARGE_BUCKET
|
||||
|
||||
#define BCH_HAS_COMPAT_FEATURE(sb, mask) \
|
||||
((sb)->feature_compat & (mask))
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,62 +0,0 @@
|
||||
From 93e83d620d21411eb82fd3c4e95d7b73e79ce49d Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Thu, 31 Dec 2020 23:59:16 +0800
|
||||
Subject: [PATCH 4/9] bcache-tools: check incompatible feature set
|
||||
Git-commit: 93e83d620d21411eb82fd3c4e95d7b73e79ce49d
|
||||
References: jsc#SLE-9807
|
||||
|
||||
When bcache-tools is not updated with kernel driver (or on the versus),
|
||||
we need to make sure the feature set conflict can be detected to avoid
|
||||
unexpected data operation.
|
||||
|
||||
This patch checks whether there is unsupported {compatc, ro_compat,
|
||||
incompat} features detected in detail_dev(). If there is, prints out
|
||||
error message and return error to its caller.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
|
||||
---
|
||||
lib.c | 27 +++++++++++++++++++++++++++
|
||||
1 file changed, 27 insertions(+)
|
||||
|
||||
diff --git a/lib.c b/lib.c
|
||||
index 29172f5..a529ad3 100644
|
||||
--- a/lib.c
|
||||
+++ b/lib.c
|
||||
@@ -442,6 +442,33 @@ int detail_dev(char *devname, struct bdev *bd, struct cdev *cd, int *type)
|
||||
goto Fail;
|
||||
}
|
||||
|
||||
+ /* Check for incompat feature set */
|
||||
+ if (sb.version >= BCACHE_SB_VERSION_BDEV_WITH_FEATURES ||
|
||||
+ sb.version >= BCACHE_SB_VERSION_CDEV_WITH_FEATURES) {
|
||||
+ uint64_t features;
|
||||
+
|
||||
+ features = sb.feature_compat & ~BCH_FEATURE_COMPAT_SUPP;
|
||||
+ if (features) {
|
||||
+ fprintf(stderr,
|
||||
+ "Unsupported compatible feature found\n");
|
||||
+ goto Fail;
|
||||
+ }
|
||||
+
|
||||
+ features = sb.feature_ro_compat & ~BCH_FEATURE_RO_COMPAT_SUPP;
|
||||
+ if (features) {
|
||||
+ fprintf(stderr,
|
||||
+ "Unsupported read-only compatible feature found\n");
|
||||
+ goto Fail;
|
||||
+ }
|
||||
+
|
||||
+ features = sb.feature_incompat & ~BCH_FEATURE_INCOMPAT_SUPP;
|
||||
+ if (features) {
|
||||
+ fprintf(stderr,
|
||||
+ "Unsupported incompatible feature found\n");
|
||||
+ goto Fail;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
*type = sb.version;
|
||||
if (sb.version == BCACHE_SB_VERSION_BDEV ||
|
||||
sb.version == BCACHE_SB_VERSION_BDEV_WITH_OFFSET ||
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,165 +0,0 @@
|
||||
From c0b421f3b5e4479a6f8f25b7cddf53cd240a0a7e Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Fri, 1 Jan 2021 00:16:34 +0800
|
||||
Subject: [PATCH 5/9] bcache-tools: introduce
|
||||
BCH_FEATURE_INCOMPAT_LOG_LARGE_BUCKET_SIZE for large bucket
|
||||
Git-commit: c0b421f3b5e4479a6f8f25b7cddf53cd240a0a7e
|
||||
References: jsc#SLE-9807
|
||||
|
||||
When large bucket feature was added, BCH_FEATURE_INCOMPAT_LARGE_BUCKET
|
||||
was introduced into incompat feature set. It indicates bucket_size_hi is
|
||||
added at the tail of struct cache_sb_disk, to extend current 16bit
|
||||
bucket size to 32bit with existing bucket_size in struct cache_sb_disk.
|
||||
|
||||
This is not a good idea, there are two obvious problems,
|
||||
- Bucket size is always value power of 2, if store log2(bucket size) in
|
||||
existing bucket_size of struct cache_sb_disk, it is unnecessary to add
|
||||
bucket_size_hi.
|
||||
- Macro csum_set() assumes d[SB_JOURNAL_BUCKETS] is the last member in
|
||||
struct cache_sb_disk, bucket_size_hi was added after d[] which makes
|
||||
csum_set calculate an unexpected super block checksum.
|
||||
|
||||
To fix the above problems, this patch introduces a new incompat feature
|
||||
bit BCH_FEATURE_INCOMPAT_LOG_LARGE_BUCKET_SIZE, when this bit is set, it
|
||||
means bucket_size in struct cache_sb_disk stores the order of power of
|
||||
2 bucket size value. When user specifies a bucket size larger than 32768
|
||||
sectors, BCH_FEATURE_INCOMPAT_LOG_LARGE_BUCKET_SIZE will be set to
|
||||
incompat feature set, and bucket_size stores log2(bucket size) more
|
||||
than store the real bucket size value.
|
||||
|
||||
The obsoleted BCH_FEATURE_INCOMPAT_LARGE_BUCKET won't be used anymore,
|
||||
bcache-tools only display "obso_large_bucket" for cache device created
|
||||
with BCH_FEATURE_INCOMPAT_LARGE_BUCKET, kernel driver will make bcache
|
||||
device as read-only if BCH_FEATURE_INCOMPAT_LARGE_BUCKET is set.
|
||||
|
||||
With this change, the unnecessary extra space extend of bcache on-disk
|
||||
super block can be avoided, and csum_set() may generate expected check
|
||||
sum as well.
|
||||
|
||||
Fixes: 8c063851990a ("bcache-tools: add large_bucket incompat feature")
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
|
||||
---
|
||||
bcache.h | 13 +++++++++----
|
||||
features.c | 4 +++-
|
||||
lib.c | 17 +++++++++++++++--
|
||||
lib.h | 2 +-
|
||||
4 files changed, 28 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/bcache.h b/bcache.h
|
||||
index 58e973c..6dcdbb7 100644
|
||||
--- a/bcache.h
|
||||
+++ b/bcache.h
|
||||
@@ -100,7 +100,7 @@ struct cache_sb_disk {
|
||||
__le16 keys;
|
||||
};
|
||||
__le64 d[SB_JOURNAL_BUCKETS]; /* journal buckets */
|
||||
- __le16 bucket_size_hi;
|
||||
+ __le16 obso_bucket_size_hi; /* obsoleted */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -202,7 +202,8 @@ uint64_t crc64(const void *data, size_t len);
|
||||
|
||||
#define BCH_FEATURE_COMPAT_SUPP 0
|
||||
#define BCH_FEATURE_RO_COMPAT_SUPP 0
|
||||
-#define BCH_FEATURE_INCOMPAT_SUPP BCH_FEATURE_INCOMPAT_LARGE_BUCKET
|
||||
+#define BCH_FEATURE_INCOMPAT_SUPP (BCH_FEATURE_INCOMPAT_OBSO_LARGE_BUCKET| \
|
||||
+ BCH_FEATURE_INCOMPAT_LOG_LARGE_BUCKET_SIZE)
|
||||
|
||||
#define BCH_HAS_COMPAT_FEATURE(sb, mask) \
|
||||
((sb)->feature_compat & (mask))
|
||||
@@ -214,7 +215,10 @@ uint64_t crc64(const void *data, size_t len);
|
||||
/* Feature set definition */
|
||||
|
||||
/* Incompat feature set */
|
||||
-#define BCH_FEATURE_INCOMPAT_LARGE_BUCKET 0x0001 /* 32bit bucket size */
|
||||
+/* 32bit bucket size, obsoleted */
|
||||
+#define BCH_FEATURE_INCOMPAT_OBSO_LARGE_BUCKET 0x0001
|
||||
+/* real bucket size is (1 << bucket_size) */
|
||||
+#define BCH_FEATURE_INCOMPAT_LOG_LARGE_BUCKET_SIZE 0x0002
|
||||
|
||||
#define BCH_FEATURE_COMPAT_FUNCS(name, flagname) \
|
||||
static inline int bch_has_feature_##name(struct cache_sb *sb) \
|
||||
@@ -267,6 +271,7 @@ static inline void bch_clear_feature_##name(struct cache_sb *sb) \
|
||||
~BCH##_FEATURE_INCOMPAT_##flagname; \
|
||||
}
|
||||
|
||||
-BCH_FEATURE_INCOMPAT_FUNCS(large_bucket, LARGE_BUCKET);
|
||||
+BCH_FEATURE_INCOMPAT_FUNCS(obso_large_bucket, OBSO_LARGE_BUCKET);
|
||||
+BCH_FEATURE_INCOMPAT_FUNCS(large_bucket, LOG_LARGE_BUCKET_SIZE);
|
||||
|
||||
#endif
|
||||
diff --git a/features.c b/features.c
|
||||
index 181e348..f7f6224 100644
|
||||
--- a/features.c
|
||||
+++ b/features.c
|
||||
@@ -20,7 +20,9 @@ struct feature {
|
||||
};
|
||||
|
||||
static struct feature feature_list[] = {
|
||||
- {BCH_FEATURE_INCOMPAT, BCH_FEATURE_INCOMPAT_LARGE_BUCKET,
|
||||
+ {BCH_FEATURE_INCOMPAT, BCH_FEATURE_INCOMPAT_OBSO_LARGE_BUCKET,
|
||||
+ "obso_large_bucket"},
|
||||
+ {BCH_FEATURE_INCOMPAT, BCH_FEATURE_INCOMPAT_LOG_LARGE_BUCKET_SIZE,
|
||||
"large_bucket"},
|
||||
{0, 0, 0 },
|
||||
};
|
||||
diff --git a/lib.c b/lib.c
|
||||
index a529ad3..8e7da8b 100644
|
||||
--- a/lib.c
|
||||
+++ b/lib.c
|
||||
@@ -21,6 +21,19 @@
|
||||
* utils function
|
||||
*/
|
||||
|
||||
+static unsigned int log2_u32(uint32_t n)
|
||||
+{
|
||||
+ int r = 0;
|
||||
+
|
||||
+ n = n >> 1;
|
||||
+ while (n) {
|
||||
+ n = n >> 1;
|
||||
+ r++;
|
||||
+ }
|
||||
+
|
||||
+ return r;
|
||||
+}
|
||||
+
|
||||
static void trim_prefix(char *dest, char *src, int num)
|
||||
{
|
||||
strcpy(dest, src + num);
|
||||
@@ -772,7 +785,7 @@ struct cache_sb *to_cache_sb(struct cache_sb *sb,
|
||||
|
||||
if (sb->version >= BCACHE_SB_VERSION_CDEV_WITH_FEATURES &&
|
||||
bch_has_feature_large_bucket(sb))
|
||||
- sb->bucket_size += le16_to_cpu(sb_disk->bucket_size_hi) << 16;
|
||||
+ sb->bucket_size = 1 << le16_to_cpu(sb_disk->bucket_size);
|
||||
|
||||
return sb;
|
||||
}
|
||||
@@ -824,7 +837,7 @@ struct cache_sb_disk *to_cache_sb_disk(struct cache_sb_disk *sb_disk,
|
||||
|
||||
if (sb->version >= BCACHE_SB_VERSION_CDEV_WITH_FEATURES &&
|
||||
bch_has_feature_large_bucket(sb))
|
||||
- sb_disk->bucket_size_hi = cpu_to_le16(sb->bucket_size >> 16);
|
||||
+ sb_disk->bucket_size = cpu_to_le16(log2_u32(sb->bucket_size));
|
||||
|
||||
return sb_disk;
|
||||
}
|
||||
diff --git a/lib.h b/lib.h
|
||||
index 9b5ed02..0357a11 100644
|
||||
--- a/lib.h
|
||||
+++ b/lib.h
|
||||
@@ -13,7 +13,7 @@ struct dev {
|
||||
char label[SB_LABEL_SIZE + 1];
|
||||
char uuid[40];
|
||||
uint16_t sectors_per_block;
|
||||
- uint16_t sectors_per_bucket;
|
||||
+ uint32_t sectors_per_bucket;
|
||||
char cset[40];
|
||||
char state[40];
|
||||
char bname[40];
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,47 +0,0 @@
|
||||
From 40cf747541aea3905c328ff351e88cc6ad9a66bf Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Fri, 1 Jan 2021 14:38:27 +0800
|
||||
Subject: [PATCH 6/9] bcache-tools: display obsoleted bucket size configuration
|
||||
Git-commit: 40cf747541aea3905c328ff351e88cc6ad9a66bf
|
||||
References: jsc#SLE-9807
|
||||
|
||||
Although BCH_FEATURE_INCOMPAT_LARGE_BUCKET is obsoleted and we don't
|
||||
support it anymore, we still need to display the obsoleted bucket
|
||||
size combines by,
|
||||
bucket_size + (obso_bucket_size_hi << 16)
|
||||
for the legancy consistency purpose.
|
||||
|
||||
This patch checks bch_has_feature_obso_large_bucket() in to_cache_sb(),
|
||||
if it is true, still try to combine and display the bucket size from
|
||||
obso_bucket_size_hi.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
|
||||
---
|
||||
lib.c | 10 +++++++---
|
||||
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/lib.c b/lib.c
|
||||
index 8e7da8b..b005eb5 100644
|
||||
--- a/lib.c
|
||||
+++ b/lib.c
|
||||
@@ -783,9 +783,13 @@ struct cache_sb *to_cache_sb(struct cache_sb *sb,
|
||||
sb->feature_ro_compat = le64_to_cpu(sb_disk->feature_ro_compat);
|
||||
}
|
||||
|
||||
- if (sb->version >= BCACHE_SB_VERSION_CDEV_WITH_FEATURES &&
|
||||
- bch_has_feature_large_bucket(sb))
|
||||
- sb->bucket_size = 1 << le16_to_cpu(sb_disk->bucket_size);
|
||||
+ if (sb->version >= BCACHE_SB_VERSION_CDEV_WITH_FEATURES) {
|
||||
+ if (bch_has_feature_large_bucket(sb))
|
||||
+ sb->bucket_size = 1 << le16_to_cpu(sb_disk->bucket_size);
|
||||
+ else if (bch_has_feature_obso_large_bucket(sb))
|
||||
+ sb->bucket_size +=
|
||||
+ le16_to_cpu(sb_disk->obso_bucket_size_hi) << 16;
|
||||
+ }
|
||||
|
||||
return sb;
|
||||
}
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,52 +0,0 @@
|
||||
From 0c6e42ef568cece1c041fea5dcd0178d403b517b Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Sun, 3 Jan 2021 23:35:50 +0800
|
||||
Subject: [PATCH 7/9] bcache-tools: recover the missing sb.csum for showing
|
||||
bcache device super block
|
||||
Git-commit: 0c6e42ef568cece1c041fea5dcd0178d403b517b
|
||||
References: jsc#SLE-9807
|
||||
|
||||
Commit 2891723d7075 ("bcache-tools: define separated super block for
|
||||
in-memory and on-disk format") does following change in detail_base(),
|
||||
strcpy(base->name, devname);
|
||||
base->magic = "ok";
|
||||
base->first_sector = SB_SECTOR;
|
||||
- base->csum = sb.csum;
|
||||
base->version = sb.version;
|
||||
because sb (in type struct cache_sb) doesn't have csum of the on-disk
|
||||
super block anymore. The aftermath is base.csum was missing, and the
|
||||
"show" command always display sb.csum as 0.
|
||||
|
||||
This patch recovers the csum value setting for base.csum, then command
|
||||
"bcache show -d" may display the correct super block check sum.
|
||||
|
||||
Fixes: 2891723d7075 ("bcache-tools: define separated super block for in-memory and on-disk format")
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
|
||||
---
|
||||
lib.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/lib.c b/lib.c
|
||||
index b005eb5..340ddf3 100644
|
||||
--- a/lib.c
|
||||
+++ b/lib.c
|
||||
@@ -487,6 +487,7 @@ int detail_dev(char *devname, struct bdev *bd, struct cdev *cd, int *type)
|
||||
sb.version == BCACHE_SB_VERSION_BDEV_WITH_OFFSET ||
|
||||
sb.version == BCACHE_SB_VERSION_BDEV_WITH_FEATURES) {
|
||||
detail_base(devname, sb, &bd->base);
|
||||
+ bd->base.csum = expected_csum;
|
||||
bd->first_sector = BDEV_DATA_START_DEFAULT;
|
||||
bd->cache_mode = BDEV_CACHE_MODE(&sb);
|
||||
bd->cache_state = BDEV_STATE(&sb);
|
||||
@@ -494,6 +495,7 @@ int detail_dev(char *devname, struct bdev *bd, struct cdev *cd, int *type)
|
||||
sb.version == BCACHE_SB_VERSION_CDEV_WITH_UUID ||
|
||||
sb.version == BCACHE_SB_VERSION_CDEV_WITH_FEATURES) {
|
||||
detail_base(devname, sb, &cd->base);
|
||||
+ cd->base.csum = expected_csum;
|
||||
cd->first_sector = sb.bucket_size * sb.first_bucket;
|
||||
cd->cache_sectors =
|
||||
sb.bucket_size * (sb.nbuckets - sb.first_bucket);
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,69 +0,0 @@
|
||||
From 11f6bab95e5a8d4ec0089692ec78285a1fc96bab Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Mon, 4 Jan 2021 00:07:46 +0800
|
||||
Subject: [PATCH 8/9] bcache-tools: only call to_cache_sb() for bcache device
|
||||
in may_add_item()
|
||||
Git-commit: 11f6bab95e5a8d4ec0089692ec78285a1fc96bab
|
||||
References: jsc#SLE-9807
|
||||
|
||||
to_cache_sb() will print an error message "Unsupported super block
|
||||
version" if the super block version is invalid. For non-bcache devices,
|
||||
it is unnecessary to check version number and print bogus error messages.
|
||||
|
||||
This patch checks bcache_magic earlier in may_add_item(), and only calls
|
||||
to_cache_sb() if the magic string matched. Then the non-bcache devices
|
||||
can be skipped, and no more bogus error message observed.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
|
||||
---
|
||||
lib.c | 15 +++++++--------
|
||||
1 file changed, 7 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/lib.c b/lib.c
|
||||
index 340ddf3..b8487db 100644
|
||||
--- a/lib.c
|
||||
+++ b/lib.c
|
||||
@@ -343,32 +343,31 @@ int may_add_item(char *devname, struct list_head *head)
|
||||
{
|
||||
struct cache_sb_disk sb_disk;
|
||||
struct cache_sb sb;
|
||||
+ char dev[512];
|
||||
+ struct dev *tmp;
|
||||
+ int ret;
|
||||
|
||||
if (strcmp(devname, ".") == 0 || strcmp(devname, "..") == 0)
|
||||
return 0;
|
||||
- char dev[261];
|
||||
|
||||
sprintf(dev, "/dev/%s", devname);
|
||||
int fd = open(dev, O_RDONLY);
|
||||
-
|
||||
if (fd == -1)
|
||||
return 0;
|
||||
+
|
||||
if (pread(fd, &sb_disk, sizeof(sb_disk), SB_START) != sizeof(sb_disk)) {
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
- to_cache_sb(&sb, &sb_disk);
|
||||
-
|
||||
- if (memcmp(sb.magic, bcache_magic, 16)) {
|
||||
+ if (memcmp(sb_disk.magic, bcache_magic, 16)) {
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
- struct dev *tmp;
|
||||
- int ret;
|
||||
|
||||
- tmp = (struct dev *) malloc(DEVLEN);
|
||||
+ to_cache_sb(&sb, &sb_disk);
|
||||
|
||||
+ tmp = (struct dev *) malloc(DEVLEN);
|
||||
tmp->csum = le64_to_cpu(sb_disk.csum);
|
||||
ret = detail_base(dev, sb, tmp);
|
||||
if (ret != 0) {
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,43 +0,0 @@
|
||||
From 59338c230950a9d20ed210b9b169eb91fc8b37d8 Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Mon, 4 Jan 2021 00:15:53 +0800
|
||||
Subject: [PATCH 9/9] bcache-tools: improve column alignment for "bcache show
|
||||
-m" output
|
||||
Git-commit: 59338c230950a9d20ed210b9b169eb91fc8b37d8
|
||||
References: jsc#SLE-9807
|
||||
|
||||
This patch improves the output column alignment for command
|
||||
"bcache show -m". The changes are adding missing '\t' in printf
|
||||
format strings.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
|
||||
---
|
||||
bcache.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/bcache.c b/bcache.c
|
||||
index a0c5a67..234702b 100644
|
||||
--- a/bcache.c
|
||||
+++ b/bcache.c
|
||||
@@ -195,7 +195,7 @@ int show_bdevs_detail(void)
|
||||
fprintf(stderr, "Failed to list devices\n");
|
||||
return ret;
|
||||
}
|
||||
- printf("Name\t\tUuid\t\t\t\t\tCset_Uuid\t\t\t\tType\t\tState");
|
||||
+ printf("Name\t\tUuid\t\t\t\t\tCset_Uuid\t\t\t\tType\t\t\tState");
|
||||
printf("\t\t\tBname\t\tAttachToDev\tAttachToCset\n");
|
||||
list_for_each_entry_safe(devs, n, &head, dev_list) {
|
||||
printf("%s\t%s\t%s\t%lu", devs->name, devs->uuid,
|
||||
@@ -217,7 +217,7 @@ int show_bdevs_detail(void)
|
||||
printf(" (unknown)");
|
||||
break;
|
||||
}
|
||||
- printf("\t%-16s", devs->state);
|
||||
+ printf("\t\t%-16s", devs->state);
|
||||
printf("\t%-16s", devs->bname);
|
||||
char attachdev[30];
|
||||
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,56 +0,0 @@
|
||||
From 9e72a28b0faca4754ebcc1d7030d555120b03be4 Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Fri, 22 Jan 2021 23:05:07 +0800
|
||||
Subject: [PATCH] bcache-tools: Update super block version in bch_set_feature_*
|
||||
routines
|
||||
Git-commit: 9e72a28b0faca4754ebcc1d7030d555120b03be4
|
||||
References: jsc#SLE-9807
|
||||
|
||||
When calling bch_set_feature_* routines, it indicates the super block
|
||||
supports feature set and its version of cache device should at least be
|
||||
BCACHE_SB_VERSION_CDEV_WITH_FEATURES.
|
||||
|
||||
In order to always keep the cache device super block version being
|
||||
updated, this patch checks whether the super block version is set
|
||||
correctly when calling bch_set_feature_* routines, if not then set
|
||||
the version to BCACHE_SB_VERSION_CDEV_WITH_FEATURES.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
bcache.h | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/bcache.h b/bcache.h
|
||||
index 6dcdbb7..46d9683 100644
|
||||
--- a/bcache.h
|
||||
+++ b/bcache.h
|
||||
@@ -228,6 +228,8 @@ static inline int bch_has_feature_##name(struct cache_sb *sb) \
|
||||
} \
|
||||
static inline void bch_set_feature_##name(struct cache_sb *sb) \
|
||||
{ \
|
||||
+ if ((sb)->version < BCACHE_SB_VERSION_CDEV_WITH_FEATURES) \
|
||||
+ (sb)->version = BCACHE_SB_VERSION_CDEV_WITH_FEATURES; \
|
||||
(sb)->feature_compat |= \
|
||||
BCH##_FEATURE_COMPAT_##flagname; \
|
||||
} \
|
||||
@@ -245,6 +247,8 @@ static inline int bch_has_feature_##name(struct cache_sb *sb) \
|
||||
} \
|
||||
static inline void bch_set_feature_##name(struct cache_sb *sb) \
|
||||
{ \
|
||||
+ if ((sb)->version < BCACHE_SB_VERSION_CDEV_WITH_FEATURES) \
|
||||
+ (sb)->version = BCACHE_SB_VERSION_CDEV_WITH_FEATURES; \
|
||||
(sb)->feature_ro_compat |= \
|
||||
BCH##_FEATURE_RO_COMPAT_##flagname; \
|
||||
} \
|
||||
@@ -262,6 +266,8 @@ static inline int bch_has_feature_##name(struct cache_sb *sb) \
|
||||
} \
|
||||
static inline void bch_set_feature_##name(struct cache_sb *sb) \
|
||||
{ \
|
||||
+ if ((sb)->version < BCACHE_SB_VERSION_CDEV_WITH_FEATURES) \
|
||||
+ (sb)->version = BCACHE_SB_VERSION_CDEV_WITH_FEATURES; \
|
||||
(sb)->feature_incompat |= \
|
||||
BCH##_FEATURE_INCOMPAT_##flagname; \
|
||||
} \
|
||||
--
|
||||
2.26.2
|
||||
|
@ -1,56 +0,0 @@
|
||||
From a5e3753516bd39c431def86c8dfec8a9cea1ddd4 Mon Sep 17 00:00:00 2001
|
||||
From: Coly Li <colyli@suse.de>
|
||||
Date: Fri, 17 Feb 2023 21:08:10 +0800
|
||||
Subject: [PATCH] bcache-tools: improve is_zoned_device()
|
||||
Git-commit: a5e3753516bd39c431def86c8dfec8a9cea1ddd4
|
||||
References: bsc#1208425
|
||||
|
||||
To check whether a block device is zoned or not, is_zoned_device()
|
||||
returns true when /sys/block/<device>/queue/chunk_sectors is not zero.
|
||||
|
||||
Now there are devices which are not zoned devices but has non-zero
|
||||
chunk-sectors values. For such situation, the more accurate method is
|
||||
to read file /sys/block/<device>/queue/zoned. If the content is not
|
||||
string "none", this device is not a zoned device. Otherwise (e.g.
|
||||
"host-aware" or "host- managed"), it is a zoned device.
|
||||
|
||||
For elder kernel if the above sysfs file doesn't exist, get_zone_size()
|
||||
is still called by is_zoned_device() for compatibility.
|
||||
|
||||
Signed-off-by: Coly Li <colyli@suse.de>
|
||||
---
|
||||
zoned.c | 19 +++++++++++++++++++
|
||||
1 file changed, 19 insertions(+)
|
||||
|
||||
diff --git a/zoned.c b/zoned.c
|
||||
index d078286..f214787 100644
|
||||
--- a/zoned.c
|
||||
+++ b/zoned.c
|
||||
@@ -90,5 +90,24 @@ void check_data_offset_for_zoned_device(char *devname,
|
||||
|
||||
int is_zoned_device(char *devname)
|
||||
{
|
||||
+ char str[128];
|
||||
+ FILE *file;
|
||||
+ int res;
|
||||
+
|
||||
+ snprintf(str, sizeof(str),
|
||||
+ "/sys/block/%s/queue/zoned",
|
||||
+ basename(devname));
|
||||
+ file = fopen(str, "r");
|
||||
+ if (file) {
|
||||
+ memset(str, 0, sizeof(str));
|
||||
+ res = fscanf(file, "%s", str);
|
||||
+ fclose(file);
|
||||
+
|
||||
+ /* "none" indicates non-zoned device */
|
||||
+ if (res == 1)
|
||||
+ return !(strcmp(str, "none") == 0);
|
||||
+ }
|
||||
+
|
||||
+ /* Only used when "zoned" file doesn't exist */
|
||||
return (get_zone_size(devname) != 0);
|
||||
}
|
||||
--
|
||||
2.39.2
|
||||
|
10
_service
10
_service
@ -1,15 +1,15 @@
|
||||
<services>
|
||||
<service name="tar_scm" mode="disabled">
|
||||
<service name="tar_scm" mode="manual">
|
||||
<param name="scm">git</param>
|
||||
<!-- original author's repo: https://evilpiepirate.org/git/bcache-tools.git -->
|
||||
<param name="url">git://git.kernel.org/pub/scm/linux/kernel/git/colyli/bcache-tools</param>
|
||||
<param name="revision">bcache-tools-1.1</param>
|
||||
<param name="revision">master</param>
|
||||
<param name="parent-tag">bcache-tools-1.1</param>
|
||||
<param name="versionformat">1.1</param>
|
||||
<param name="versionformat">1.1+git@TAG_OFFSET@.%h</param>
|
||||
</service>
|
||||
<service name="recompress" mode="disabled">
|
||||
<service name="recompress" mode="manual">
|
||||
<param name="file">*.tar</param>
|
||||
<param name="compression">xz</param>
|
||||
</service>
|
||||
<service name="set_version" mode="disabled"/>
|
||||
<service name="set_version" mode="manual"/>
|
||||
</services>
|
||||
|
BIN
bcache-tools-1.1+git37.a5e3753.tar.xz
(Stored with Git LFS)
Normal file
BIN
bcache-tools-1.1+git37.a5e3753.tar.xz
(Stored with Git LFS)
Normal file
Binary file not shown.
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:22f105e8f87bd06783f03ffdf0d79b3c4d032facbf24def78aaf04c216644bc8
|
||||
size 29376
|
@ -1,3 +1,40 @@
|
||||
-------------------------------------------------------------------
|
||||
Thu Nov 9 11:29:38 UTC 2023 - Jan Engelhardt <jengelh@inai.de>
|
||||
|
||||
- Update to snapshot 1.1+git37.a5e3753
|
||||
* support ``bcache show -d`` for nvdimm-meta device
|
||||
- Abolish /usr/bin/env [boo#1216370]
|
||||
- Delete (merged):
|
||||
0001-bcache-tools-set-zoned-size-aligned-data_offset-on-b.patch
|
||||
0002-bcache-tools-add-is_zoned_device.patch
|
||||
0003-bcache-tools-convert-writeback-to-writethrough-mode-.patch
|
||||
0004-bcache-tools-add-struct-cache_sb_disk-into-bcache.h.patch
|
||||
0005-bcache-tools-bitwise.h-more-swap-bitwise-for-differe.patch
|
||||
0006-bcache-tools-list.h-only-define-offsetof-when-it-is-.patch
|
||||
0007-bcache-tools-add-to_cache_sb-and-to_cache_sb_disk.patch
|
||||
0008-bcache-tools-define-separated-super-block-for-in-mem.patch
|
||||
0009-bcache-tools-upgrade-super-block-versions-for-featur.patch
|
||||
0010-bcache-tools-add-large_bucket-incompat-feature.patch
|
||||
0011-bcache-tools-add-print_cache_set_supported_feature_s.patch
|
||||
0012-bcache-tools-Fix-potential-coredump-issues.patch
|
||||
0013-bcache-tools-Export-CACHED_UUID-and-CACHED_LABEL.patch
|
||||
0014-bcache-tools-Remove-the-dependency-on-libsmartcols.patch
|
||||
0015-bcache-tools-make-permit-only-one-cache-device-to-be.patch
|
||||
0016-bcache-tools-add-bcache-status.patch
|
||||
0017-bcache-tools-add-man-page-bcache-status.8.patch
|
||||
0018-Makefile-install-bcache-status.patch
|
||||
0019-bcache.h-fix-typo-from-SUUP-to-SUPP.patch
|
||||
0020-bcache-tools-only-call-set_bucket_size-for-cache-dev.patch
|
||||
0021-bcache.h-add-BCH_FEATURE_INCOMPAT_LARGE_BUCKET-to-BC.patch
|
||||
0022-bcache-tools-check-incompatible-feature-set.patch
|
||||
0023-bcache-tools-introduce-BCH_FEATURE_INCOMPAT_LOG_LARG.patch
|
||||
0024-bcache-tools-display-obsoleted-bucket-size-configura.patch
|
||||
0025-bcache-tools-recover-the-missing-sb.csum-for-showing.patch
|
||||
0026-bcache-tools-only-call-to_cache_sb-for-bcache-device.patch
|
||||
0027-bcache-tools-improve-column-alignment-for-bcache-sho.patch
|
||||
0028-bcache-tools-Update-super-block-version-in-bch_set_f.patch
|
||||
0029-bcache-tools-improve-is_zoned_device.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Mar 2 07:58:54 UTC 2023 - Coly Li <colyli@suse.com>
|
||||
|
||||
|
@ -17,50 +17,21 @@
|
||||
|
||||
|
||||
Name: bcache-tools
|
||||
Version: 1.1
|
||||
Version: 1.1+git37.a5e3753
|
||||
Release: 0
|
||||
Summary: Configuration utilities for bcache
|
||||
License: GPL-2.0-only
|
||||
Group: System/Base
|
||||
URL: http://bcache.evilpiepirate.org/
|
||||
|
||||
Source: %name-%version.tar.xz
|
||||
Patch1: 0001-bcache-tools-set-zoned-size-aligned-data_offset-on-b.patch
|
||||
Patch2: 0002-bcache-tools-add-is_zoned_device.patch
|
||||
Patch3: 0003-bcache-tools-convert-writeback-to-writethrough-mode-.patch
|
||||
Patch4: 0004-bcache-tools-add-struct-cache_sb_disk-into-bcache.h.patch
|
||||
Patch5: 0005-bcache-tools-bitwise.h-more-swap-bitwise-for-differe.patch
|
||||
Patch6: 0006-bcache-tools-list.h-only-define-offsetof-when-it-is-.patch
|
||||
Patch7: 0007-bcache-tools-add-to_cache_sb-and-to_cache_sb_disk.patch
|
||||
Patch8: 0008-bcache-tools-define-separated-super-block-for-in-mem.patch
|
||||
Patch9: 0009-bcache-tools-upgrade-super-block-versions-for-featur.patch
|
||||
Patch10: 0010-bcache-tools-add-large_bucket-incompat-feature.patch
|
||||
Patch11: 0011-bcache-tools-add-print_cache_set_supported_feature_s.patch
|
||||
Patch12: 0012-bcache-tools-Fix-potential-coredump-issues.patch
|
||||
Patch13: 0013-bcache-tools-Export-CACHED_UUID-and-CACHED_LABEL.patch
|
||||
Patch14: 0014-bcache-tools-Remove-the-dependency-on-libsmartcols.patch
|
||||
Patch15: 0015-bcache-tools-make-permit-only-one-cache-device-to-be.patch
|
||||
Patch16: 0016-bcache-tools-add-bcache-status.patch
|
||||
Patch17: 0017-bcache-tools-add-man-page-bcache-status.8.patch
|
||||
Patch18: 0018-Makefile-install-bcache-status.patch
|
||||
Patch19: 0019-bcache.h-fix-typo-from-SUUP-to-SUPP.patch
|
||||
Patch20: 0020-bcache-tools-only-call-set_bucket_size-for-cache-dev.patch
|
||||
Patch21: 0021-bcache.h-add-BCH_FEATURE_INCOMPAT_LARGE_BUCKET-to-BC.patch
|
||||
Patch22: 0022-bcache-tools-check-incompatible-feature-set.patch
|
||||
Patch23: 0023-bcache-tools-introduce-BCH_FEATURE_INCOMPAT_LOG_LARG.patch
|
||||
Patch24: 0024-bcache-tools-display-obsoleted-bucket-size-configura.patch
|
||||
Patch25: 0025-bcache-tools-recover-the-missing-sb.csum-for-showing.patch
|
||||
Patch26: 0026-bcache-tools-only-call-to_cache_sb-for-bcache-device.patch
|
||||
Patch27: 0027-bcache-tools-improve-column-alignment-for-bcache-sho.patch
|
||||
Patch28: 0028-bcache-tools-Update-super-block-version-in-bch_set_f.patch
|
||||
Patch29: 0029-bcache-tools-improve-is_zoned_device.patch
|
||||
BuildRequires: pkg-config
|
||||
BuildRequires: xz
|
||||
BuildRequires: pkgconfig(blkid)
|
||||
BuildRequires: pkgconfig(uuid)
|
||||
|
||||
%description
|
||||
This package contains utilities for configuring the bcache Module.
|
||||
This package contains utilities for creating and inspecting
|
||||
bcache filesystems.
|
||||
|
||||
%prep
|
||||
%autosetup -p1
|
||||
@ -70,6 +41,7 @@ export SUSE_ASNEEDED=0
|
||||
%make_build all \
|
||||
CFLAGS="%optflags $(pkg-config blkid uuid --cflags) -std=gnu99" \
|
||||
LDFLAGS="$(pkg-config blkid uuid --libs)"
|
||||
perl -i -lpe 's{^#!/usr/bin/env python\b}{#!/usr/bin/python3}' bcache-status
|
||||
|
||||
%install
|
||||
b="%buildroot"
|
||||
|
Loading…
Reference in New Issue
Block a user