]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - cmd_device.c
Update bcachefs sources to 44ac32df8e0c bcachefs: Split brain detection
[bcachefs-tools-debian] / cmd_device.c
index 1914629bbc234fafafe35e11e4a6cd50b01dcb5d..d4282f75290c40517818203c4a45af60db300f99 100644 (file)
@@ -113,7 +113,9 @@ int cmd_device_add(int argc, char *argv[])
 
        struct bchfs_handle fs = bcache_fs_open(fs_path);
 
-       dev_opts.fd = open_for_format(dev_opts.path, force);
+       int ret = open_for_format(&dev_opts, force);
+       if (ret)
+               die("Error opening %s: %s", dev_opts.path, strerror(-ret));
 
        struct bch_opt_strs fs_opt_strs;
        memset(&fs_opt_strs, 0, sizeof(fs_opt_strs));
@@ -130,8 +132,8 @@ int cmd_device_add(int argc, char *argv[])
                                        format_opts,
                                        &dev_opts, 1);
        free(sb);
-       fsync(dev_opts.fd);
-       close(dev_opts.fd);
+       fsync(dev_opts.bdev->bd_buffered_fd);
+       close(dev_opts.bdev->bd_buffered_fd);
 
        bchu_disk_add(fs, dev_opts.path);
        return 0;
@@ -322,15 +324,17 @@ int cmd_device_evacuate(int argc, char *argv[])
        int dev_idx;
        struct bchfs_handle fs = bchu_fs_open_by_dev(dev_path, &dev_idx);
 
-       struct bch_ioctl_dev_usage u = bchu_dev_usage(fs, dev_idx);
+       struct bch_ioctl_dev_usage_v2 *u = bchu_dev_usage(fs, dev_idx);
 
-       if (u.state == BCH_MEMBER_STATE_rw) {
+       if (u->state == BCH_MEMBER_STATE_rw) {
                printf("Setting %s readonly\n", dev_path);
                bchu_disk_set_state(fs, dev_idx, BCH_MEMBER_STATE_ro, 0);
        }
 
+       free(u);
+
        return bchu_data(fs, (struct bch_ioctl_data) {
-               .op             = BCH_DATA_OP_MIGRATE,
+               .op             = BCH_DATA_OP_migrate,
                .start_btree    = 0,
                .start_pos      = POS_MIN,
                .end_btree      = BTREE_ID_NR,
@@ -414,7 +418,7 @@ int cmd_device_set_state(int argc, char *argv[])
                if (ret)
                        die("error opening %s: %s", dev_str, bch2_err_str(ret));
 
-               struct bch_member *m = bch2_sb_get_members(sb.sb)->members + sb.sb->dev_idx;
+               struct bch_member *m = bch2_members_v2_get_mut(sb.sb, sb.sb->dev_idx);
 
                SET_BCH_MEMBER_STATE(m, new_state);
 
@@ -484,7 +488,7 @@ int cmd_device_resize(int argc, char *argv[])
 
        char *size_arg = arg_pop();
        if (!size_arg)
-               size = get_size(dev, dev_fd);
+               size = get_size(dev_fd);
        else if (bch2_strtoull_h(size_arg, &size))
                die("invalid size");
 
@@ -510,16 +514,11 @@ int cmd_device_resize(int argc, char *argv[])
                if (idx >= sb->nr_devices)
                        die("error reading superblock: dev idx >= sb->nr_devices");
 
-               struct bch_sb_field_members *mi = bch2_sb_get_members(sb);
-               if (!mi)
-                       die("error reading superblock: no member info");
-
-               /* could also just read this out of sysfs... meh */
-               struct bch_member *m = mi->members + idx;
+               struct bch_member m = bch2_sb_member_get(sb, idx);
 
-               u64 nbuckets = size / le16_to_cpu(m->bucket_size);
+               u64 nbuckets = size / le16_to_cpu(m.bucket_size);
 
-               if (nbuckets < le64_to_cpu(m->nbuckets))
+               if (nbuckets < le64_to_cpu(m.nbuckets))
                        die("Shrinking not supported yet");
 
                printf("resizing %s to %llu buckets\n", dev, nbuckets);
@@ -531,10 +530,9 @@ int cmd_device_resize(int argc, char *argv[])
                if (IS_ERR(c))
                        die("error opening %s: %s", dev, bch2_err_str(PTR_ERR(c)));
 
-               struct bch_dev *ca, *resize = NULL;
-               unsigned i;
+               struct bch_dev *resize = NULL;
 
-               for_each_online_member(ca, c, i) {
+               for_each_online_member(c, ca) {
                        if (resize)
                                die("confused: more than one online device?");
                        resize = ca;
@@ -616,14 +614,9 @@ int cmd_device_resize_journal(int argc, char *argv[])
                if (idx >= sb->nr_devices)
                        die("error reading superblock: dev idx >= sb->nr_devices");
 
-               struct bch_sb_field_members *mi = bch2_sb_get_members(sb);
-               if (!mi)
-                       die("error reading superblock: no member info");
-
-               /* could also just read this out of sysfs... meh */
-               struct bch_member *m = mi->members + idx;
+               struct bch_member m = bch2_sb_member_get(sb, idx);
 
-               u64 nbuckets = size / le16_to_cpu(m->bucket_size);
+               u64 nbuckets = size / le16_to_cpu(m.bucket_size);
 
                printf("resizing journal on %s to %llu buckets\n", dev, nbuckets);
                bchu_disk_resize_journal(fs, idx, nbuckets);
@@ -634,10 +627,9 @@ int cmd_device_resize_journal(int argc, char *argv[])
                if (IS_ERR(c))
                        die("error opening %s: %s", dev, bch2_err_str(PTR_ERR(c)));
 
-               struct bch_dev *ca, *resize = NULL;
-               unsigned i;
+               struct bch_dev *resize = NULL;
 
-               for_each_online_member(ca, c, i) {
+               for_each_online_member(c, ca) {
                        if (resize)
                                die("confused: more than one online device?");
                        resize = ca;