mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-02-23 00:00:02 +03:00
Merge remote-tracking branch 'remotes/angband/master'
Conflicts: make-bcache.c
This commit is contained in:
commit
a1aa5961dc
@ -4,15 +4,19 @@
|
|||||||
SUBSYSTEM!="block", GOTO="bcache_end"
|
SUBSYSTEM!="block", GOTO="bcache_end"
|
||||||
ACTION=="remove", GOTO="bcache_end"
|
ACTION=="remove", GOTO="bcache_end"
|
||||||
|
|
||||||
# Backing devices: scan, symlink, register
|
# blkid was run by the standard udev rules
|
||||||
IMPORT{program}="/sbin/blkid -o udev $tempnode"
|
# It recognised bcache (util-linux 2.24+)
|
||||||
# blkid and probe-bcache can disagree, in which case don't register
|
ENV{ID_FS_TYPE}=="bcache", GOTO="bcache_backing_found"
|
||||||
ENV{ID_FS_TYPE}=="?*", ENV{ID_FS_TYPE}!="bcache", GOTO="bcache_backing_end"
|
# It recognised something else; bail
|
||||||
|
ENV{ID_FS_TYPE}=="?*", GOTO="bcache_backing_end"
|
||||||
|
|
||||||
IMPORT{program}="/sbin/probe-bcache -o udev $tempnode"
|
# Backing devices: scan, symlink, register
|
||||||
|
IMPORT{program}="probe-bcache -o udev $tempnode"
|
||||||
|
ENV{ID_FS_TYPE}!="bcache", GOTO="bcache_backing_end"
|
||||||
ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}"
|
ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}"
|
||||||
SUBSYSTEM=="block", ACTION=="add|change", ENV{ID_FS_TYPE}=="bcache", \
|
|
||||||
RUN+="bcache-register $tempnode"
|
LABEL="bcache_backing_found"
|
||||||
|
RUN+="bcache-register $tempnode"
|
||||||
LABEL="bcache_backing_end"
|
LABEL="bcache_backing_end"
|
||||||
|
|
||||||
# Cached devices: symlink
|
# Cached devices: symlink
|
30
Makefile
30
Makefile
@ -1,24 +1,32 @@
|
|||||||
|
|
||||||
PREFIX=/usr
|
PREFIX=/usr
|
||||||
|
UDEVLIBDIR=/lib/udev
|
||||||
|
DRACUTLIBDIR=/lib/dracut
|
||||||
|
INSTALL=install
|
||||||
CFLAGS+=-O2 -Wall -g
|
CFLAGS+=-O2 -Wall -g
|
||||||
|
|
||||||
all: make-bcache probe-bcache bcache-super-show
|
all: make-bcache probe-bcache bcache-super-show
|
||||||
|
|
||||||
install: make-bcache probe-bcache bcache-super-show
|
install: make-bcache probe-bcache bcache-super-show
|
||||||
install -m0755 make-bcache bcache-super-show $(DESTDIR)${PREFIX}/sbin/
|
$(INSTALL) -m0755 make-bcache bcache-super-show $(DESTDIR)${PREFIX}/sbin/
|
||||||
install -m0755 probe-bcache $(DESTDIR)/sbin/
|
$(INSTALL) -m0755 probe-bcache bcache-register $(DESTDIR)$(UDEVLIBDIR)/
|
||||||
install -m0644 61-bcache.rules $(DESTDIR)/lib/udev/rules.d/
|
$(INSTALL) -m0644 69-bcache.rules $(DESTDIR)$(UDEVLIBDIR)/rules.d/
|
||||||
install -m0755 bcache-register $(DESTDIR)/lib/udev/
|
-$(INSTALL) -T -m0755 initramfs/hook $(DESTDIR)/usr/share/initramfs-tools/hooks/bcache
|
||||||
-install -m0755 initramfs/hook $(DESTDIR)/etc/initramfs-tools/hooks/bcache
|
if [ -d $(DESTDIR)$(DRACUTLIBDIR)/modules.d ]; \
|
||||||
install -m0644 -- *.8 $(DESTDIR)${PREFIX}/share/man/man8
|
then $(INSTALL) -D -m0755 dracut/module-setup.sh $(DESTDIR)$(DRACUTLIBDIR)/modules.d/90bcache/module-setup.sh; \
|
||||||
# install -m0755 bcache-test $(DESTDIR)${PREFIX}/sbin/
|
fi
|
||||||
|
$(INSTALL) -m0644 -- *.8 $(DESTDIR)${PREFIX}/share/man/man8/
|
||||||
|
# $(INSTALL) -m0755 bcache-test $(DESTDIR)${PREFIX}/sbin/
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) -f make-bcache probe-bcache bcache-super-show bcache-test *.o
|
$(RM) -f make-bcache probe-bcache bcache-super-show bcache-test *.o
|
||||||
|
|
||||||
bcache-test: LDLIBS += -lm -lssl -lcrypto
|
bcache-test: LDLIBS += `pkg-config --libs openssl`
|
||||||
make-bcache: LDLIBS += -luuid
|
make-bcache: LDLIBS += `pkg-config --libs uuid blkid`
|
||||||
|
make-bcache: CFLAGS += `pkg-config --cflags uuid blkid`
|
||||||
make-bcache: bcache.o
|
make-bcache: bcache.o
|
||||||
probe-bcache: LDLIBS += -luuid
|
probe-bcache: LDLIBS += `pkg-config --libs uuid blkid`
|
||||||
bcache-super-show: LDLIBS += -luuid
|
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: bcache.o
|
bcache-super-show: bcache.o
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
modprobe -qba bcache
|
/sbin/modprobe -qba bcache
|
||||||
test -f /sys/fs/bcache/register && echo "$1" > /sys/fs/bcache/register
|
test -f /sys/fs/bcache/register_quiet && echo "$1" > /sys/fs/bcache/register_quiet
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
* GPLv2
|
* GPLv2
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#define _FILE_OFFSET_BITS 64
|
#define _FILE_OFFSET_BITS 64
|
||||||
#define __USE_FILE_OFFSET64
|
#define __USE_FILE_OFFSET64
|
||||||
#define _XOPEN_SOURCE 500
|
#define _XOPEN_SOURCE 500
|
||||||
@ -32,6 +33,29 @@ static void usage()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool accepted_char(char c)
|
||||||
|
{
|
||||||
|
if ('0' <= c && c <= '9')
|
||||||
|
return true;
|
||||||
|
if ('A' <= c && c <= 'Z')
|
||||||
|
return true;
|
||||||
|
if ('a' <= c && c <= 'z')
|
||||||
|
return true;
|
||||||
|
if (strchr(".-_", c))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void print_encode(char* in)
|
||||||
|
{
|
||||||
|
for (char* pos = in; *pos; pos++)
|
||||||
|
if (accepted_char(*pos))
|
||||||
|
putchar(*pos);
|
||||||
|
else
|
||||||
|
printf("%%%x", *pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
bool force_csum = false;
|
bool force_csum = false;
|
||||||
@ -123,6 +147,16 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
|
|
||||||
|
char label[SB_LABEL_SIZE + 1];
|
||||||
|
strncpy(label, (char*)sb.label, SB_LABEL_SIZE);
|
||||||
|
label[SB_LABEL_SIZE] = '\0';
|
||||||
|
printf("dev.label\t\t");
|
||||||
|
if (*label)
|
||||||
|
print_encode(label);
|
||||||
|
else
|
||||||
|
printf("(empty)");
|
||||||
|
putchar('\n');
|
||||||
|
|
||||||
uuid_unparse(sb.uuid, uuid);
|
uuid_unparse(sb.uuid, uuid);
|
||||||
printf("dev.uuid\t\t%s\n", uuid);
|
printf("dev.uuid\t\t%s\n", uuid);
|
||||||
|
|
||||||
@ -136,13 +170,31 @@ int main(int argc, char **argv)
|
|||||||
printf("dev.cache.first_sector\t%u\n"
|
printf("dev.cache.first_sector\t%u\n"
|
||||||
"dev.cache.cache_sectors\t%ju\n"
|
"dev.cache.cache_sectors\t%ju\n"
|
||||||
"dev.cache.total_sectors\t%ju\n"
|
"dev.cache.total_sectors\t%ju\n"
|
||||||
|
"dev.cache.ordered\t%s\n"
|
||||||
"dev.cache.discard\t%s\n"
|
"dev.cache.discard\t%s\n"
|
||||||
"dev.cache.pos\t\t%u\n",
|
"dev.cache.pos\t\t%u\n"
|
||||||
|
"dev.cache.replacement\t%ju",
|
||||||
sb.bucket_size * sb.first_bucket,
|
sb.bucket_size * sb.first_bucket,
|
||||||
sb.bucket_size * (sb.nbuckets - sb.first_bucket),
|
sb.bucket_size * (sb.nbuckets - sb.first_bucket),
|
||||||
sb.bucket_size * sb.nbuckets,
|
sb.bucket_size * sb.nbuckets,
|
||||||
|
CACHE_SYNC(&sb) ? "yes" : "no",
|
||||||
CACHE_DISCARD(&sb) ? "yes" : "no",
|
CACHE_DISCARD(&sb) ? "yes" : "no",
|
||||||
sb.nr_this_dev);
|
sb.nr_this_dev,
|
||||||
|
CACHE_REPLACEMENT(&sb));
|
||||||
|
switch (CACHE_REPLACEMENT(&sb)) {
|
||||||
|
case CACHE_REPLACEMENT_LRU:
|
||||||
|
printf(" [lru]\n");
|
||||||
|
break;
|
||||||
|
case CACHE_REPLACEMENT_FIFO:
|
||||||
|
printf(" [fifo]\n");
|
||||||
|
break;
|
||||||
|
case CACHE_REPLACEMENT_RANDOM:
|
||||||
|
printf(" [random]\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
uint64_t first_sector;
|
uint64_t first_sector;
|
||||||
if (sb.version == BCACHE_SB_VERSION_BDEV) {
|
if (sb.version == BCACHE_SB_VERSION_BDEV) {
|
||||||
|
2
bcache.h
2
bcache.h
@ -115,7 +115,7 @@ BITMASK(BDEV_STATE, struct cache_sb, flags, 61, 2);
|
|||||||
#define BDEV_STATE_DIRTY 2U
|
#define BDEV_STATE_DIRTY 2U
|
||||||
#define BDEV_STATE_STALE 3U
|
#define BDEV_STATE_STALE 3U
|
||||||
|
|
||||||
inline uint64_t crc64(const void *_data, size_t len);
|
uint64_t crc64(const void *_data, size_t len);
|
||||||
|
|
||||||
#define node(i, j) ((void *) ((i)->d + (j)))
|
#define node(i, j) ((void *) ((i)->d + (j)))
|
||||||
#define end(i) node(i, (i)->keys)
|
#define end(i) node(i, (i)->keys)
|
||||||
|
34
dracut/module-setup.sh
Normal file
34
dracut/module-setup.sh
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||||
|
# ex: ts=8 sw=4 sts=4 et filetype=sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# At some point (util-linux v2.24) blkid will be able to identify bcache
|
||||||
|
# but until every system has this version of util-linux, probe-bcache is
|
||||||
|
# provided as an alternative.
|
||||||
|
#
|
||||||
|
|
||||||
|
check() {
|
||||||
|
if [[ $hostonly ]] || [[ $mount_needs ]]
|
||||||
|
then
|
||||||
|
for fs in "${host_fs_types[@]}"; do
|
||||||
|
[[ $fs = "bcache" ]] && return 0
|
||||||
|
done
|
||||||
|
return 255
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
depends() {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
installkernel() {
|
||||||
|
instmods bcache
|
||||||
|
}
|
||||||
|
|
||||||
|
install() {
|
||||||
|
inst_multiple ${udevdir}/probe-bcache ${udevdir}/bcache-register
|
||||||
|
inst_rules 69-bcache.rules
|
||||||
|
}
|
@ -16,7 +16,7 @@ esac
|
|||||||
|
|
||||||
. /usr/share/initramfs-tools/hook-functions
|
. /usr/share/initramfs-tools/hook-functions
|
||||||
|
|
||||||
cp -pt "${DESTDIR}/lib/udev/rules.d" /lib/udev/rules.d/61-bcache.rules
|
cp -pt "${DESTDIR}/lib/udev/rules.d" /lib/udev/rules.d/69-bcache.rules
|
||||||
copy_exec /lib/udev/bcache-register
|
copy_exec /lib/udev/bcache-register
|
||||||
copy_exec /sbin/probe-bcache
|
copy_exec /lib/udev/probe-bcache
|
||||||
manual_add_modules bcache
|
manual_add_modules bcache
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#define __USE_FILE_OFFSET64
|
#define __USE_FILE_OFFSET64
|
||||||
#define _XOPEN_SOURCE 600
|
#define _XOPEN_SOURCE 600
|
||||||
|
|
||||||
|
#include <blkid.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
@ -76,19 +77,19 @@ unsigned hatoi_validate(const char *s, const char *msg)
|
|||||||
uint64_t v = hatoi(s);
|
uint64_t v = hatoi(s);
|
||||||
|
|
||||||
if (v & (v - 1)) {
|
if (v & (v - 1)) {
|
||||||
printf("%s must be a power of two\n", msg);
|
fprintf(stderr, "%s must be a power of two\n", msg);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
v /= 512;
|
v /= 512;
|
||||||
|
|
||||||
if (v > USHRT_MAX) {
|
if (v > USHRT_MAX) {
|
||||||
printf("%s too large\n", msg);
|
fprintf(stderr, "%s too large\n", msg);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!v) {
|
if (!v) {
|
||||||
printf("%s too small\n", msg);
|
fprintf(stderr, "%s too small\n", msg);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +144,8 @@ ssize_t read_string_list(const char *buf, const char * const list[])
|
|||||||
|
|
||||||
void usage()
|
void usage()
|
||||||
{
|
{
|
||||||
printf("Usage: make-bcache [options] device\n"
|
fprintf(stderr,
|
||||||
|
"Usage: make-bcache [options] device\n"
|
||||||
" -C, --cache Format a cache device\n"
|
" -C, --cache Format a cache device\n"
|
||||||
" -B, --bdev Format a backing device\n"
|
" -B, --bdev Format a backing device\n"
|
||||||
" -b, --bucket bucket size\n"
|
" -b, --bucket bucket size\n"
|
||||||
@ -166,18 +168,42 @@ const char * const cache_replacement_policies[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static void write_sb(char *dev, unsigned block_size, unsigned bucket_size,
|
static void write_sb(char *dev, unsigned block_size, unsigned bucket_size,
|
||||||
bool writeback, bool discard,
|
bool writeback, bool discard, bool wipe_bcache,
|
||||||
unsigned cache_replacement_policy,
|
unsigned cache_replacement_policy,
|
||||||
uint64_t data_offset,
|
uint64_t data_offset,
|
||||||
uuid_t set_uuid, bool bdev,
|
uuid_t set_uuid, bool bdev,
|
||||||
uint16_t nr_in_set, uint16_t nr_this_dev)
|
uint16_t nr_in_set, uint16_t nr_this_dev)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
char uuid_str[40], set_uuid_str[40];
|
char uuid_str[40], set_uuid_str[40], zeroes[SB_START] = {0};
|
||||||
struct cache_sb sb;
|
struct cache_sb sb;
|
||||||
|
blkid_probe pr;
|
||||||
|
|
||||||
if ((fd = open(dev, O_RDWR|O_EXCL)) == -1) {
|
if ((fd = open(dev, O_RDWR|O_EXCL)) == -1) {
|
||||||
printf("Can't open dev %s: %s\n", dev, strerror(errno));
|
fprintf(stderr, "Can't open dev %s: %s\n", dev, strerror(errno));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pread(fd, &sb, sizeof(sb), SB_START) != sizeof(sb))
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
|
if (!memcmp(sb.magic, bcache_magic, 16) && !wipe_bcache) {
|
||||||
|
fprintf(stderr, "Already a bcache device on %s, "
|
||||||
|
"overwrite with --wipe-bcache\n", dev);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(pr = blkid_new_probe()))
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
if (blkid_probe_set_device(pr, fd, 0, 0))
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
/* enable ptable probing; superblock probing is enabled by default */
|
||||||
|
if (blkid_probe_enable_partitions(pr, true))
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
if (!blkid_do_probe(pr)) {
|
||||||
|
/* XXX wipefs doesn't know how to remove partition tables */
|
||||||
|
fprintf(stderr, "Device %s already has a non-bcache superblock, "
|
||||||
|
"remove it using wipefs and wipefs -a\n", dev);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,7 +249,7 @@ static void write_sb(char *dev, unsigned block_size, unsigned bucket_size,
|
|||||||
sb.first_bucket = (23 / sb.bucket_size) + 1;
|
sb.first_bucket = (23 / sb.bucket_size) + 1;
|
||||||
|
|
||||||
if (sb.nbuckets < 1 << 7) {
|
if (sb.nbuckets < 1 << 7) {
|
||||||
printf("Not enough buckets: %ju, need %u\n",
|
fprintf(stderr, "Not enough buckets: %ju, need %u\n",
|
||||||
sb.nbuckets, 1 << 7);
|
sb.nbuckets, 1 << 7);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
@ -252,7 +278,13 @@ static void write_sb(char *dev, unsigned block_size, unsigned bucket_size,
|
|||||||
|
|
||||||
sb.csum = csum_set(&sb);
|
sb.csum = csum_set(&sb);
|
||||||
|
|
||||||
if (pwrite(fd, &sb, sizeof(sb), SB_SECTOR << 9) != sizeof(sb)) {
|
/* 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)) {
|
||||||
perror("write error\n");
|
perror("write error\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
@ -313,7 +345,7 @@ int main(int argc, char **argv)
|
|||||||
char *backing_devices[argc];
|
char *backing_devices[argc];
|
||||||
|
|
||||||
unsigned block_size = 0, bucket_size = 1024;
|
unsigned block_size = 0, bucket_size = 1024;
|
||||||
int writeback = 0, discard = 0;
|
int writeback = 0, discard = 0, wipe_bcache = 0;
|
||||||
unsigned cache_replacement_policy = 0;
|
unsigned cache_replacement_policy = 0;
|
||||||
uint64_t data_offset = BDEV_DATA_START_DEFAULT;
|
uint64_t data_offset = BDEV_DATA_START_DEFAULT;
|
||||||
uuid_t set_uuid;
|
uuid_t set_uuid;
|
||||||
@ -326,6 +358,7 @@ int main(int argc, char **argv)
|
|||||||
{ "bucket", 1, NULL, 'b' },
|
{ "bucket", 1, NULL, 'b' },
|
||||||
{ "block", 1, NULL, 'w' },
|
{ "block", 1, NULL, 'w' },
|
||||||
{ "writeback", 0, &writeback, 1 },
|
{ "writeback", 0, &writeback, 1 },
|
||||||
|
{ "wipe-bcache", 0, &wipe_bcache, 1 },
|
||||||
{ "discard", 0, &discard, 1 },
|
{ "discard", 0, &discard, 1 },
|
||||||
{ "cache_replacement_policy", 1, NULL, 'p' },
|
{ "cache_replacement_policy", 1, NULL, 'p' },
|
||||||
{ "data_offset", 1, NULL, 'o' },
|
{ "data_offset", 1, NULL, 'o' },
|
||||||
@ -353,7 +386,7 @@ int main(int argc, char **argv)
|
|||||||
#if 0
|
#if 0
|
||||||
case 'U':
|
case 'U':
|
||||||
if (uuid_parse(optarg, sb.uuid)) {
|
if (uuid_parse(optarg, sb.uuid)) {
|
||||||
printf("Bad uuid\n");
|
fprintf(stderr, "Bad uuid\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -365,14 +398,14 @@ int main(int argc, char **argv)
|
|||||||
case 'o':
|
case 'o':
|
||||||
data_offset = atoll(optarg);
|
data_offset = atoll(optarg);
|
||||||
if (data_offset < BDEV_DATA_START_DEFAULT) {
|
if (data_offset < BDEV_DATA_START_DEFAULT) {
|
||||||
printf("Bad data offset; minimum %d sectors\n",
|
fprintf(stderr, "Bad data offset; minimum %d sectors\n",
|
||||||
BDEV_DATA_START_DEFAULT);
|
BDEV_DATA_START_DEFAULT);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
if (uuid_parse(optarg, set_uuid)) {
|
if (uuid_parse(optarg, set_uuid)) {
|
||||||
printf("Bad uuid\n");
|
fprintf(stderr, "Bad uuid\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -381,7 +414,7 @@ int main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
if (bdev == -1) {
|
if (bdev == -1) {
|
||||||
printf("Please specify -C or -B\n");
|
fprintf(stderr, "Please specify -C or -B\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -393,12 +426,12 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!ncache_devices && !nbacking_devices) {
|
if (!ncache_devices && !nbacking_devices) {
|
||||||
printf("Please supply a device\n");
|
fprintf(stderr, "Please supply a device\n");
|
||||||
usage();
|
usage();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bucket_size < block_size) {
|
if (bucket_size < block_size) {
|
||||||
printf("Bucket size cannot be smaller than block size\n");
|
fprintf(stderr, "Bucket size cannot be smaller than block size\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -414,15 +447,15 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
for (i = 0; i < ncache_devices; i++)
|
for (i = 0; i < ncache_devices; i++)
|
||||||
write_sb(cache_devices[i], block_size, bucket_size,
|
write_sb(cache_devices[i], block_size, bucket_size,
|
||||||
writeback, discard, cache_replacement_policy,
|
writeback, discard, wipe_bcache,
|
||||||
data_offset, set_uuid, false,
|
cache_replacement_policy, data_offset,
|
||||||
ncache_devices, i);
|
set_uuid, false, ncache_devices, i);
|
||||||
|
|
||||||
for (i = 0; i < nbacking_devices; i++)
|
for (i = 0; i < nbacking_devices; i++)
|
||||||
write_sb(backing_devices[i], block_size, bucket_size,
|
write_sb(backing_devices[i], block_size, bucket_size,
|
||||||
writeback, discard, cache_replacement_policy,
|
writeback, discard, wipe_bcache,
|
||||||
data_offset, set_uuid, true,
|
cache_replacement_policy, data_offset,
|
||||||
nbacking_devices, i);
|
set_uuid, true, nbacking_devices, i);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#define __USE_FILE_OFFSET64
|
#define __USE_FILE_OFFSET64
|
||||||
#define _XOPEN_SOURCE 500
|
#define _XOPEN_SOURCE 500
|
||||||
|
|
||||||
|
#include <blkid.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
@ -30,6 +31,7 @@ int main(int argc, char **argv)
|
|||||||
extern char *optarg;
|
extern char *optarg;
|
||||||
struct cache_sb sb;
|
struct cache_sb sb;
|
||||||
char uuid[40];
|
char uuid[40];
|
||||||
|
blkid_probe pr;
|
||||||
|
|
||||||
while ((o = getopt(argc, argv, "o:")) != EOF)
|
while ((o = getopt(argc, argv, "o:")) != EOF)
|
||||||
switch (o) {
|
switch (o) {
|
||||||
@ -51,8 +53,20 @@ int main(int argc, char **argv)
|
|||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (!(pr = blkid_new_probe()))
|
||||||
|
continue;
|
||||||
|
if (blkid_probe_set_device(pr, fd, 0, 0))
|
||||||
|
continue;
|
||||||
|
/* probe partitions too */
|
||||||
|
if (blkid_probe_enable_partitions(pr, true))
|
||||||
|
continue;
|
||||||
|
/* bail if anything was found
|
||||||
|
* probe-bcache isn't needed once blkid recognizes bcache */
|
||||||
|
if (!blkid_do_probe(pr)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (pread(fd, &sb, sizeof(sb), 4096) != sizeof(sb))
|
if (pread(fd, &sb, sizeof(sb), SB_START) != sizeof(sb))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (memcmp(sb.magic, bcache_magic, 16))
|
if (memcmp(sb.magic, bcache_magic, 16))
|
||||||
|
Loading…
Reference in New Issue
Block a user