for (unsigned i = 1; i < argc; i++)
assemble->devs[i] = (__u64) argv[i];
- int ret = ioctl(bcachectl_open(), BCH_IOCTL_ASSEMBLE, assemble);
- if (ret < 0)
- die("BCH_IOCTL_ASSEMBLE error: %s", strerror(errno));
-
+ xioctl(bcachectl_open(), BCH_IOCTL_ASSEMBLE, assemble);
return 0;
}
.dev = (__u64) argv[1],
};
- int ret = ioctl(bcachectl_open(), BCH_IOCTL_INCREMENTAL, &incremental);
- if (ret < 0)
- die("BCH_IOCTL_INCREMENTAL error: %s", strerror(errno));
-
+ xioctl(bcachectl_open(), BCH_IOCTL_INCREMENTAL, &incremental);
return 0;
}
#include "btree_cache.h"
#include "btree_iter.h"
#include "buckets.h"
+#include "error.h"
#include "journal.h"
#include "super.h"
}
static void list_keys(struct bch_fs *c, enum btree_id btree_id,
- struct bpos start, struct bpos end, int mode)
+ struct bpos start, struct bpos end)
{
struct btree_iter iter;
struct bkey_s_c k;
}
static void list_btree_formats(struct bch_fs *c, enum btree_id btree_id,
- struct bpos start, struct bpos end, int mode)
+ struct bpos start, struct bpos end)
{
struct btree_iter iter;
struct btree *b;
bch2_btree_iter_unlock(&iter);
}
+static void list_nodes_keys(struct bch_fs *c, enum btree_id btree_id,
+ struct bpos start, struct bpos end)
+{
+ struct btree_iter iter;
+ struct btree_node_iter node_iter;
+ struct bkey unpacked;
+ struct bkey_s_c k;
+ struct btree *b;
+ char buf[4096];
+
+ for_each_btree_node(&iter, c, btree_id, start, 0, b) {
+ if (bkey_cmp(b->key.k.p, end) > 0)
+ break;
+
+ bch2_print_btree_node(c, b, buf, sizeof(buf));
+ fputs(buf, stdout);
+
+ buf[0] = '\t';
+
+ for_each_btree_node_key_unpack(b, k, &node_iter,
+ btree_node_is_extents(b),
+ &unpacked) {
+ bch2_bkey_val_to_text(c, bkey_type(0, btree_id),
+ buf + 1, sizeof(buf) - 1, k);
+ puts(buf);
+ }
+ }
+ bch2_btree_iter_unlock(&iter);
+}
+
static struct bpos parse_pos(char *buf)
{
char *s = buf, *field;
static const char * const list_modes[] = {
"keys",
"formats",
+ "nodes",
NULL
};
opts.norecovery = true;
opts.errors = BCH_ON_ERROR_CONTINUE;
- while ((opt = getopt(argc, argv, "b:s:e:i:m:h")) != -1)
+ while ((opt = getopt(argc, argv, "b:s:e:i:m:fvh")) != -1)
switch (opt) {
case 'b':
btree_id = read_string_list_or_die(optarg,
mode = read_string_list_or_die(optarg,
list_modes, "list mode");
break;
+ case 'f':
+ opts.fix_errors = FSCK_ERR_YES;
+ opts.norecovery = false;
+ break;
+ case 'v':
+ opts.verbose_recovery = true;
+ break;
case 'h':
list_keys_usage();
exit(EXIT_SUCCESS);
switch (mode) {
case 0:
- list_keys(c, btree_id, start, end, mode);
+ list_keys(c, btree_id, start, end);
break;
case 1:
- list_btree_formats(c, btree_id, start, end, mode);
+ list_btree_formats(c, btree_id, start, end);
+ break;
+ case 2:
+ list_nodes_keys(c, btree_id, start, end);
break;
default:
die("Invalid mode");
char link[PATH_MAX];
if (readlinkat(dirfd(fs.sysfs), entry->d_name,
link, sizeof(link)) < 0)
- die("readlink error: %s\n", strerror(errno));
+ die("readlink error: %m\n");
char *dev_name = basename(dirname(link));
free(sysfs_dev);
if (ret < 0 || ret >= sizeof(link))
- die("readlink error while looking up block device: %s", strerror(errno));
+ die("readlink error while looking up block device: %m");
link[ret] = '\0';
char attrs[XATTR_LIST_MAX];
ssize_t attrs_size = llistxattr(src, attrs, sizeof(attrs));
if (attrs_size < 0)
- die("listxattr error: %s", strerror(errno));
+ die("listxattr error: %m");
for (const char *next, *attr = attrs;
attr < attrs + attrs_size;
ssize_t val_size = lgetxattr(src, attr, val, sizeof(val));
if (val_size < 0)
- die("error getting xattr val: %s", strerror(errno));
+ die("error getting xattr val: %m");
const struct xattr_handler *h = xattr_resolve_name(&attr);
{
ssize_t ret = readlink(src, buf, sizeof(buf));
if (ret < 0)
- die("readlink error: %s", strerror(errno));
+ die("readlink error: %m");
write_data(c, dst, 0, buf, round_up(ret, block_bytes(c)));
}
int fd;
if (fchdir(src_fd))
- die("chdir error: %s", strerror(errno));
+ die("chdir error: %m");
struct stat stat =
xfstatat(src_fd, d->d_name, AT_SYMLINK_NOFOLLOW);
}
if (errno)
- die("readdir error: %s", strerror(errno));
+ die("readdir error: %m");
}
static ranges reserve_new_fs_space(const char *file_path, unsigned block_size,
? open(file_path, O_RDWR|O_CREAT, 0600)
: open(file_path, O_RDWR|O_CREAT|O_EXCL, 0600);
if (fd < 0)
- die("Error creating %s for bcachefs metadata: %s",
- file_path, strerror(errno));
+ die("Error creating %s for bcachefs metadata: %m",
+ file_path);
struct stat statbuf = xfstat(fd);
*bcachefs_inum = statbuf.st_ino;
if (fallocate(fd, 0, 0, size))
- die("Error reserving space for bcachefs metadata: %s",
- strerror(errno));
+ die("Error reserving space for bcachefs metadata: %m");
fsync(fd);
die("error looking up root directory: %s", strerror(-ret));
if (fchdir(src_fd))
- die("chdir error: %s", strerror(errno));
+ die("chdir error: %m");
struct stat stat = xfstat(src_fd);
copy_times(c, &root_inode, &stat);
add_key("user", description,
&passphrase_key, sizeof(passphrase_key),
KEY_SPEC_USER_KEYRING) < 0)
- die("add_key error: %s", strerror(errno));
+ die("add_key error: %m");
memzero_explicit(description, strlen(description));
free(description);
struct timespec now;
if (clock_gettime(CLOCK_REALTIME, &now))
- die("error getting current time: %s", strerror(errno));
+ die("error getting current time: %m");
sb->time_base_lo = cpu_to_le64(now.tv_sec * NSEC_PER_SEC + now.tv_nsec);
sb->time_precision = cpu_to_le32(1);
if (bio->bi_opf & REQ_PREFLUSH) {
ret = fdatasync(bio->bi_bdev->bd_fd);
if (ret) {
- fprintf(stderr, "fsync error: %s\n",
- strerror(errno));
+ fprintf(stderr, "fsync error: %m\n");
return -EIO;
}
}
}
if (ret != bio->bi_iter.bi_size) {
- fprintf(stderr, "IO error: %li (%s)\n",
- ret, strerror(errno));
+ fprintf(stderr, "IO error: %li (%m)\n", ret);
return -EIO;
}
if (bio->bi_opf & REQ_FUA) {
ret = fdatasync(bio->bi_bdev->bd_fd);
if (ret) {
- fprintf(stderr, "fsync error: %s\n",
- strerror(errno));
+ fprintf(stderr, "fsync error: %m\n");
return -EIO;
}
}
len = read(fd, buf, len);
if (len < 0)
- die("read error: %s", strerror(errno));
+ die("read error: %m");
buf[len] = '\0';
if (len && buf[len - 1] == '\n')
ssize_t r = pwrite(fd, buf, count, offset);
if (r != count)
- die("write error (ret %zi err %s)", r, strerror(errno));
+ die("write error (ret %zi err %m)", r);
}
#define xopenat(_dirfd, _path, ...) \
({ \
int _fd = openat((_dirfd), (_path), __VA_ARGS__); \
if (_fd < 0) \
- die("Error opening %s: %s", (_path), strerror(errno)); \
+ die("Error opening %s: %m", (_path)); \
_fd; \
})
{
struct stat stat;
if (fstatat(dirfd, path, &stat, flags))
- die("stat error: %s", strerror(errno));
+ die("stat error: %m");
return stat;
}
{
struct stat stat;
if (fstat(fd, &stat))
- die("stat error: %s", strerror(errno));
+ die("stat error: %m");
return stat;
}
#define xioctl(_fd, _nr, ...) \
do { \
if (ioctl((_fd), (_nr), ##__VA_ARGS__)) \
- die(#_nr " ioctl error: %s", strerror(errno)); \
+ die(#_nr " ioctl error: %m"); \
} while (0)
enum units {