summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-11-04 22:09:51 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2018-11-04 22:09:51 -0500
commit8bf4b038d41230504d3f0315a35e4d7a056e0a65 (patch)
tree6d19f31665111b3664f972ab6e5606be50387846
parentfa89abdbcc49a5f975796dc75b4507d0a69a5b89 (diff)
bcachefs: Assorted fixes for running on very small devices
It's now possible to create and use a filesystem on a 512k device with 4k buckets (though at that size we still waste almost half to internal reserves)
-rw-r--r--fs/bcachefs/alloc_background.c11
-rw-r--r--fs/bcachefs/alloc_background.h2
-rw-r--r--fs/bcachefs/bcachefs.h2
-rw-r--r--fs/bcachefs/bcachefs_format.h4
-rw-r--r--fs/bcachefs/buckets.c6
-rw-r--r--fs/bcachefs/recovery.c4
-rw-r--r--fs/bcachefs/super-io.c2
7 files changed, 18 insertions, 13 deletions
diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c
index 1d1f277a3199..9ff61deb1f5d 100644
--- a/fs/bcachefs/alloc_background.c
+++ b/fs/bcachefs/alloc_background.c
@@ -373,6 +373,11 @@ static void bch2_rescale_bucket_io_times(struct bch_fs *c, int rw)
}
}
+static inline u64 bucket_clock_freq(u64 capacity)
+{
+ return max(capacity >> 10, 2028ULL);
+}
+
static void bch2_inc_clock_hand(struct io_timer *timer)
{
struct bucket_clock *clock = container_of(timer,
@@ -411,7 +416,7 @@ static void bch2_inc_clock_hand(struct io_timer *timer)
* RW mode (that will be 0 when we're RO, yet we can still service
* reads)
*/
- timer->expire += capacity >> 10;
+ timer->expire += bucket_clock_freq(capacity);
bch2_io_timer_add(&c->io_clock[clock->rw], timer);
}
@@ -423,7 +428,7 @@ static void bch2_bucket_clock_init(struct bch_fs *c, int rw)
clock->hand = 1;
clock->rw = rw;
clock->rescale.fn = bch2_inc_clock_hand;
- clock->rescale.expire = c->capacity >> 10;
+ clock->rescale.expire = bucket_clock_freq(c->capacity);
mutex_init(&clock->lock);
}
@@ -1010,8 +1015,6 @@ void bch2_recalc_capacity(struct bch_fs *c)
for (j = 0; j < RESERVE_NONE; j++)
dev_reserve += ca->free[j].size;
- dev_reserve += ca->free_inc.size;
-
dev_reserve += 1; /* btree write point */
dev_reserve += 1; /* copygc write point */
dev_reserve += 1; /* rebalance write point */
diff --git a/fs/bcachefs/alloc_background.h b/fs/bcachefs/alloc_background.h
index 5aeae2cda5f8..ea07705bd173 100644
--- a/fs/bcachefs/alloc_background.h
+++ b/fs/bcachefs/alloc_background.h
@@ -5,7 +5,7 @@
#include "alloc_types.h"
#include "debug.h"
-#define ALLOC_SCAN_BATCH(ca) ((ca)->mi.nbuckets >> 9)
+#define ALLOC_SCAN_BATCH(ca) max_t(size_t, 1, (ca)->mi.nbuckets >> 9)
const char *bch2_alloc_invalid(const struct bch_fs *, struct bkey_s_c);
int bch2_alloc_to_text(struct bch_fs *, char *, size_t, struct bkey_s_c);
diff --git a/fs/bcachefs/bcachefs.h b/fs/bcachefs/bcachefs.h
index 6de8f9c604b2..e23f45e88e96 100644
--- a/fs/bcachefs/bcachefs.h
+++ b/fs/bcachefs/bcachefs.h
@@ -322,7 +322,7 @@ enum bch_time_stats {
#define BTREE_RESERVE_MAX (BTREE_MAX_DEPTH + (BTREE_MAX_DEPTH - 1))
/* Size of the freelist we allocate btree nodes from: */
-#define BTREE_NODE_RESERVE (BTREE_RESERVE_MAX * 4)
+#define BTREE_NODE_RESERVE BTREE_RESERVE_MAX
struct btree;
diff --git a/fs/bcachefs/bcachefs_format.h b/fs/bcachefs/bcachefs_format.h
index cdf392b39bb8..7ad080bfff31 100644
--- a/fs/bcachefs/bcachefs_format.h
+++ b/fs/bcachefs/bcachefs_format.h
@@ -904,6 +904,8 @@ struct bch_sb_field_journal {
/* BCH_SB_FIELD_members: */
+#define BCH_MIN_NR_NBUCKETS (1 << 6)
+
struct bch_member {
uuid_le uuid;
__le64 nbuckets; /* device size */
@@ -1381,7 +1383,7 @@ struct jset {
LE32_BITMASK(JSET_CSUM_TYPE, struct jset, flags, 0, 4);
LE32_BITMASK(JSET_BIG_ENDIAN, struct jset, flags, 4, 5);
-#define BCH_JOURNAL_BUCKETS_MIN 20
+#define BCH_JOURNAL_BUCKETS_MIN 8
/* Btree: */
diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c
index 5bef5bb6bc29..15a07e36d5cb 100644
--- a/fs/bcachefs/buckets.c
+++ b/fs/bcachefs/buckets.c
@@ -878,9 +878,9 @@ int bch2_dev_buckets_resize(struct bch_fs *c, struct bch_dev *ca, u64 nbuckets)
size_t btree_reserve = DIV_ROUND_UP(BTREE_NODE_RESERVE,
ca->mi.bucket_size / c->opts.btree_node_size);
/* XXX: these should be tunable */
- size_t reserve_none = max_t(size_t, 4, nbuckets >> 9);
- size_t copygc_reserve = max_t(size_t, 16, nbuckets >> 7);
- size_t free_inc_nr = max(max_t(size_t, 16, nbuckets >> 12),
+ size_t reserve_none = max_t(size_t, 1, nbuckets >> 9);
+ size_t copygc_reserve = max_t(size_t, 2, nbuckets >> 7);
+ size_t free_inc_nr = max(max_t(size_t, 1, nbuckets >> 12),
btree_reserve);
bool resize = ca->buckets != NULL,
start_copygc = ca->copygc_thread != NULL;
diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c
index 902f39f659c2..f530f2028deb 100644
--- a/fs/bcachefs/recovery.c
+++ b/fs/bcachefs/recovery.c
@@ -277,7 +277,7 @@ out:
return ret;
err:
fsck_err:
- BUG_ON(!ret);
+ pr_err("Error in recovery: %s (%i)", err, ret);
goto out;
}
@@ -380,6 +380,6 @@ int bch2_fs_initialize(struct bch_fs *c)
return 0;
err:
- BUG_ON(!ret);
+ pr_err("Error initializing new filesystem: %s (%i)", err, ret);
return ret;
}
diff --git a/fs/bcachefs/super-io.c b/fs/bcachefs/super-io.c
index 54de9fac6e22..8ef5db3dc023 100644
--- a/fs/bcachefs/super-io.c
+++ b/fs/bcachefs/super-io.c
@@ -808,7 +808,7 @@ static const char *bch2_sb_validate_members(struct bch_sb *sb,
return "Too many buckets";
if (le64_to_cpu(m->nbuckets) -
- le16_to_cpu(m->first_bucket) < 1 << 10)
+ le16_to_cpu(m->first_bucket) < BCH_MIN_NR_NBUCKETS)
return "Not enough buckets";
if (le16_to_cpu(m->bucket_size) <