]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
Update bcachefs sources to b1107114ca bcachefs: Add an ioctl for resizing journal...
authorKent Overstreet <kent.overstreet@gmail.com>
Tue, 17 Nov 2020 15:52:20 +0000 (10:52 -0500)
committerKent Overstreet <kent.overstreet@gmail.com>
Tue, 17 Nov 2020 15:52:20 +0000 (10:52 -0500)
.bcachefs_revision
libbcachefs/bcachefs_ioctl.h
libbcachefs/chardev.c
libbcachefs/journal.c

index 9c20ba85dcace21114f7c3dbcab1676997b7dc7b..ec3e6587dca9fb63f704d9a0361f5e71d228fcbf 100644 (file)
@@ -1 +1 @@
-d1fd47183051729471bce1c9f84fa63cb84dc557
+b1107114caf6aa6f725170f3d75b072badcfa573
index d71157a3e073277c7d80d81d4a814214fc95760b..0e626b098d9140c1093fa458a6b121250c59f5f5 100644 (file)
@@ -73,6 +73,7 @@ struct bch_ioctl_incremental {
 #define BCH_IOCTL_READ_SUPER   _IOW(0xbc,      12, struct bch_ioctl_read_super)
 #define BCH_IOCTL_DISK_GET_IDX _IOW(0xbc,      13,  struct bch_ioctl_disk_get_idx)
 #define BCH_IOCTL_DISK_RESIZE  _IOW(0xbc,      14,  struct bch_ioctl_disk_resize)
+#define BCH_IOCTL_DISK_RESIZE_JOURNAL _IOW(0xbc,15,  struct bch_ioctl_disk_resize_journal)
 
 /* ioctl below act on a particular file, not the filesystem as a whole: */
 
@@ -329,4 +330,17 @@ struct bch_ioctl_disk_resize {
        __u64                   nbuckets;
 };
 
+/*
+ * BCH_IOCTL_DISK_RESIZE_JOURNAL: resize journal on a device
+ *
+ * @dev                - member to resize
+ * @nbuckets   - new number of buckets
+ */
+struct bch_ioctl_disk_resize_journal {
+       __u32                   flags;
+       __u32                   pad;
+       __u64                   dev;
+       __u64                   nbuckets;
+};
+
 #endif /* _BCACHEFS_IOCTL_H */
index 0377f9018d27a2d4cbd3d941db6b9f2080584932..4663784d2f28bd1bb1d953ac4f3c7d74760d5a42 100644 (file)
@@ -5,6 +5,7 @@
 #include "bcachefs_ioctl.h"
 #include "buckets.h"
 #include "chardev.h"
+#include "journal.h"
 #include "move.h"
 #include "replicas.h"
 #include "super.h"
@@ -563,6 +564,26 @@ static long bch2_ioctl_disk_resize(struct bch_fs *c,
        return ret;
 }
 
+static long bch2_ioctl_disk_resize_journal(struct bch_fs *c,
+                                  struct bch_ioctl_disk_resize_journal arg)
+{
+       struct bch_dev *ca;
+       int ret;
+
+       if ((arg.flags & ~BCH_BY_INDEX) ||
+           arg.pad)
+               return -EINVAL;
+
+       ca = bch2_device_lookup(c, arg.dev, arg.flags);
+       if (IS_ERR(ca))
+               return PTR_ERR(ca);
+
+       ret = bch2_set_nr_journal_buckets(c, ca, arg.nbuckets);
+
+       percpu_ref_put(&ca->ref);
+       return ret;
+}
+
 #define BCH_IOCTL(_name, _argtype)                                     \
 do {                                                                   \
        _argtype i;                                                     \
@@ -619,6 +640,8 @@ long bch2_fs_ioctl(struct bch_fs *c, unsigned cmd, void __user *arg)
                BCH_IOCTL(data, struct bch_ioctl_data);
        case BCH_IOCTL_DISK_RESIZE:
                BCH_IOCTL(disk_resize, struct bch_ioctl_disk_resize);
+       case BCH_IOCTL_DISK_RESIZE_JOURNAL:
+               BCH_IOCTL(disk_resize_journal, struct bch_ioctl_disk_resize_journal);
 
        default:
                return -ENOTTY;
index e99faad8098b4d4aeb4dfb57f7b1d0327b87c7d5..1b3f249bc3e4211019996ac38538b02fcbaa6534 100644 (file)
@@ -685,7 +685,7 @@ static int __bch2_set_nr_journal_buckets(struct bch_dev *ca, unsigned nr,
                goto err;
 
        journal_buckets = bch2_sb_resize_journal(&ca->disk_sb,
-                                                nr + sizeof(*journal_buckets) / sizeof(u64));
+                                       nr + sizeof(*journal_buckets) / sizeof(u64));
        if (!journal_buckets)
                goto err;
 
@@ -731,6 +731,12 @@ static int __bch2_set_nr_journal_buckets(struct bch_dev *ca, unsigned nr,
                        spin_lock(&c->journal.lock);
                }
 
+               /*
+                * XXX
+                * For resize at runtime, we should be writing the new
+                * superblock before inserting into the journal array
+                */
+
                pos = ja->nr ? (ja->cur_idx + 1) % ja->nr : 0;
                __array_insert_item(ja->buckets,                ja->nr, pos);
                __array_insert_item(ja->bucket_seq,             ja->nr, pos);
@@ -766,6 +772,8 @@ static int __bch2_set_nr_journal_buckets(struct bch_dev *ca, unsigned nr,
 
        ret = 0;
 err:
+       bch2_sb_resize_journal(&ca->disk_sb,
+               ja->nr + sizeof(*journal_buckets) / sizeof(u64));
        kfree(new_bucket_seq);
        kfree(new_buckets);