]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - cmd_device.c
fix list_journal for nochanges
[bcachefs-tools-debian] / cmd_device.c
index ef2dfa14654d2a3c6d5f37f48678f611b9c5fc3c..d4282f75290c40517818203c4a45af60db300f99 100644 (file)
@@ -14,7 +14,9 @@
 
 #include "libbcachefs/bcachefs.h"
 #include "libbcachefs/bcachefs_ioctl.h"
+#include "libbcachefs/errcode.h"
 #include "libbcachefs/journal.h"
+#include "libbcachefs/sb-members.h"
 #include "libbcachefs/super-io.h"
 #include "cmds.h"
 #include "libbcachefs.h"
@@ -53,7 +55,7 @@ static void device_add_usage(void)
             "  -f, --force                 Use device even if it appears to already be formatted\n"
             "  -h, --help                  Display this help and exit\n"
             "\n"
-            "Report bugs to <linux-bcache@vger.kernel.org>");
+            "Report bugs to <linux-bcachefs@vger.kernel.org>");
 }
 
 int cmd_device_add(int argc, char *argv[])
@@ -111,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));
@@ -128,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;
@@ -147,7 +151,7 @@ static void device_remove_usage(void)
             "  -F, --force-metadata        Force removal, even if some metadata\n"
             "                              couldn't be migrated\n"
             "  -h, --help                  display this help and exit\n"
-            "Report bugs to <linux-bcache@vger.kernel.org>");
+            "Report bugs to <linux-bcachefs@vger.kernel.org>");
        exit(EXIT_SUCCESS);
 }
 
@@ -214,7 +218,7 @@ static void device_online_usage(void)
             "Options:\n"
             "  -h, --help                  Display this help and exit\n"
             "\n"
-            "Report bugs to <linux-bcache@vger.kernel.org>");
+            "Report bugs to <linux-bcachefs@vger.kernel.org>");
 }
 
 int cmd_device_online(int argc, char *argv[])
@@ -251,7 +255,7 @@ static void device_offline_usage(void)
             "  -f, --force                 Force, if data redundancy will be degraded\n"
             "  -h, --help                  Display this help and exit\n"
             "\n"
-            "Report bugs to <linux-bcache@vger.kernel.org>");
+            "Report bugs to <linux-bcachefs@vger.kernel.org>");
 }
 
 int cmd_device_offline(int argc, char *argv[])
@@ -295,7 +299,7 @@ static void device_evacuate_usage(void)
             "Options:\n"
             "  -h, --help                  Display this help and exit\n"
             "\n"
-            "Report bugs to <linux-bcache@vger.kernel.org>");
+            "Report bugs to <linux-bcachefs@vger.kernel.org>");
 }
 
 int cmd_device_evacuate(int argc, char *argv[])
@@ -320,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,
@@ -350,7 +356,7 @@ static void device_set_state_usage(void)
             "      --force-if-data-lost    Force, if data will be lost\n"
             "  -o, --offline               Set state of an offline device\n"
             "  -h, --help                  display this help and exit\n"
-            "Report bugs to <linux-bcache@vger.kernel.org>");
+            "Report bugs to <linux-bcachefs@vger.kernel.org>");
        exit(EXIT_SUCCESS);
 }
 
@@ -410,17 +416,20 @@ int cmd_device_set_state(int argc, char *argv[])
 
                int ret = bch2_read_super(dev_str, &opts, &sb);
                if (ret)
-                       die("error opening %s: %s", dev_str, strerror(-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);
 
                le64_add_cpu(&sb.sb->seq, 1);
 
-               bch2_super_write(sb.bdev->bd_fd, sb.sb);
+               bch2_super_write(sb.bdev->bd_buffered_fd, sb.sb);
+               ret = fsync(sb.bdev->bd_buffered_fd);
+               if (ret)
+                       fprintf(stderr, "error writing superblock: fsync error (%m)");
                bch2_free_super(&sb);
-               return 0;
+               return ret;
        }
 
        char *fs_path = arg_pop();
@@ -451,7 +460,7 @@ static void device_resize_usage(void)
             "\n"
             "Options:\n"
             "  -h, --help                  display this help and exit\n"
-            "Report bugs to <linux-bcache@vger.kernel.org>");
+            "Report bugs to <linux-bcachefs@vger.kernel.org>");
        exit(EXIT_SUCCESS);
 }
 
@@ -479,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");
 
@@ -505,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");
+               struct bch_member m = bch2_sb_member_get(sb, idx);
 
-               /* could also just read this out of sysfs... meh */
-               struct bch_member *m = mi->members + 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);
@@ -524,12 +528,11 @@ int cmd_device_resize(int argc, char *argv[])
 
                struct bch_fs *c = bch2_fs_open(&dev, 1, bch2_opts_empty());
                if (IS_ERR(c))
-                       die("error opening %s: %s", dev, strerror(-PTR_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;
@@ -544,7 +547,7 @@ int cmd_device_resize(int argc, char *argv[])
                printf("resizing %s to %llu buckets\n", dev, nbuckets);
                int ret = bch2_dev_resize(c, resize, nbuckets);
                if (ret)
-                       fprintf(stderr, "resize error: %s\n", strerror(-ret));
+                       fprintf(stderr, "resize error: %s\n", bch2_err_str(ret));
 
                percpu_ref_put(&resize->io_ref);
                bch2_fs_stop(c);
@@ -559,7 +562,7 @@ static void device_resize_journal_usage(void)
             "\n"
             "Options:\n"
             "  -h, --help                  display this help and exit\n"
-            "Report bugs to <linux-bcache@vger.kernel.org>");
+            "Report bugs to <linux-bcachefs@vger.kernel.org>");
        exit(EXIT_SUCCESS);
 }
 
@@ -611,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);
@@ -627,12 +625,11 @@ int cmd_device_resize_journal(int argc, char *argv[])
 
                struct bch_fs *c = bch2_fs_open(&dev, 1, bch2_opts_empty());
                if (IS_ERR(c))
-                       die("error opening %s: %s", dev, strerror(-PTR_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;
@@ -644,7 +641,7 @@ int cmd_device_resize_journal(int argc, char *argv[])
                printf("resizing journal on %s to %llu buckets\n", dev, nbuckets);
                int ret = bch2_set_nr_journal_buckets(c, resize, nbuckets);
                if (ret)
-                       fprintf(stderr, "resize error: %s\n", strerror(-ret));
+                       fprintf(stderr, "resize error: %s\n", bch2_err_str(ret));
 
                percpu_ref_put(&resize->io_ref);
                bch2_fs_stop(c);