summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.bcachefs_revision2
-rw-r--r--libbcachefs/btree_iter.c8
-rw-r--r--libbcachefs/disk_groups.c93
-rw-r--r--libbcachefs/disk_groups.h4
-rw-r--r--libbcachefs/fs.c8
-rw-r--r--libbcachefs/opts.c5
-rw-r--r--libbcachefs/opts.h4
-rw-r--r--libbcachefs/super-io.c3
-rw-r--r--libbcachefs/super.c2
-rw-r--r--libbcachefs/sysfs.c2
-rw-r--r--libbcachefs/xattr.c2
11 files changed, 64 insertions, 69 deletions
diff --git a/.bcachefs_revision b/.bcachefs_revision
index 671d0fb8..619cb828 100644
--- a/.bcachefs_revision
+++ b/.bcachefs_revision
@@ -1 +1 @@
-b64d9b7b192a641ef4ea036d6e465e8cfe82e83c
+259ff916050fb6a9ff742891fb8aa379924a187f
diff --git a/libbcachefs/btree_iter.c b/libbcachefs/btree_iter.c
index c0357ee9..8186ee7e 100644
--- a/libbcachefs/btree_iter.c
+++ b/libbcachefs/btree_iter.c
@@ -3017,6 +3017,14 @@ void bch2_trans_begin(struct btree_trans *trans)
path->should_be_locked = false;
/*
+ * If the transaction wasn't restarted, we're presuming to be
+ * doing something new: dont keep iterators excpt the ones that
+ * are in use - except for the subvolumes btree:
+ */
+ if (!trans->restarted && path->btree_id != BTREE_ID_subvolumes)
+ path->preserve = false;
+
+ /*
* XXX: we probably shouldn't be doing this if the transaction
* was restarted, but currently we still overflow transaction
* iterators if we do that
diff --git a/libbcachefs/disk_groups.c b/libbcachefs/disk_groups.c
index 19698e50..81b41b07 100644
--- a/libbcachefs/disk_groups.c
+++ b/libbcachefs/disk_groups.c
@@ -445,7 +445,10 @@ int bch2_opt_target_parse(struct bch_fs *c, const char *buf, u64 *v)
return -EINVAL;
}
-void bch2_sb_target_to_text(struct printbuf *out, struct bch_sb *sb, u64 v)
+void bch2_opt_target_to_text(struct printbuf *out,
+ struct bch_fs *c,
+ struct bch_sb *sb,
+ u64 v)
{
struct target t = target_decode(v);
@@ -453,63 +456,49 @@ void bch2_sb_target_to_text(struct printbuf *out, struct bch_sb *sb, u64 v)
case TARGET_NULL:
pr_buf(out, "none");
break;
- case TARGET_DEV: {
- struct bch_sb_field_members *mi = bch2_sb_get_members(sb);
- struct bch_member *m = mi->members + t.dev;
-
- if (bch2_dev_exists(sb, mi, t.dev)) {
- pr_buf(out, "Device ");
- pr_uuid(out, m->uuid.b);
- pr_buf(out, " (%u)", t.dev);
+ case TARGET_DEV:
+ if (c) {
+ struct bch_dev *ca;
+
+ rcu_read_lock();
+ ca = t.dev < c->sb.nr_devices
+ ? rcu_dereference(c->devs[t.dev])
+ : NULL;
+
+ if (ca && percpu_ref_tryget(&ca->io_ref)) {
+ char b[BDEVNAME_SIZE];
+
+ pr_buf(out, "/dev/%s",
+ bdevname(ca->disk_sb.bdev, b));
+ percpu_ref_put(&ca->io_ref);
+ } else if (ca) {
+ pr_buf(out, "offline device %u", t.dev);
+ } else {
+ pr_buf(out, "invalid device %u", t.dev);
+ }
+
+ rcu_read_unlock();
} else {
- pr_buf(out, "Bad device %u", t.dev);
+ struct bch_sb_field_members *mi = bch2_sb_get_members(sb);
+ struct bch_member *m = mi->members + t.dev;
+
+ if (bch2_dev_exists(sb, mi, t.dev)) {
+ pr_buf(out, "Device ");
+ pr_uuid(out, m->uuid.b);
+ pr_buf(out, " (%u)", t.dev);
+ } else {
+ pr_buf(out, "Bad device %u", t.dev);
+ }
}
-
break;
- }
case TARGET_GROUP:
- bch2_disk_path_to_text(out, sb, t.group);
- break;
- default:
- BUG();
- }
-}
-
-void bch2_opt_target_to_text(struct printbuf *out, struct bch_fs *c, u64 v)
-{
- struct target t = target_decode(v);
-
- switch (t.type) {
- case TARGET_NULL:
- pr_buf(out, "none");
- break;
- case TARGET_DEV: {
- struct bch_dev *ca;
-
- rcu_read_lock();
- ca = t.dev < c->sb.nr_devices
- ? rcu_dereference(c->devs[t.dev])
- : NULL;
-
- if (ca && percpu_ref_tryget(&ca->io_ref)) {
- char b[BDEVNAME_SIZE];
-
- pr_buf(out, "/dev/%s",
- bdevname(ca->disk_sb.bdev, b));
- percpu_ref_put(&ca->io_ref);
- } else if (ca) {
- pr_buf(out, "offline device %u", t.dev);
+ if (c) {
+ mutex_lock(&c->sb_lock);
+ bch2_disk_path_to_text(out, c->disk_sb.sb, t.group);
+ mutex_unlock(&c->sb_lock);
} else {
- pr_buf(out, "invalid device %u", t.dev);
+ bch2_disk_path_to_text(out, sb, t.group);
}
-
- rcu_read_unlock();
- break;
- }
- case TARGET_GROUP:
- mutex_lock(&c->sb_lock);
- bch2_disk_path_to_text(out, c->disk_sb.sb, t.group);
- mutex_unlock(&c->sb_lock);
break;
default:
BUG();
diff --git a/libbcachefs/disk_groups.h b/libbcachefs/disk_groups.h
index a274aacb..de915480 100644
--- a/libbcachefs/disk_groups.h
+++ b/libbcachefs/disk_groups.h
@@ -77,10 +77,8 @@ int bch2_disk_path_find_or_create(struct bch_sb_handle *, const char *);
void bch2_disk_path_to_text(struct printbuf *, struct bch_sb *, unsigned);
-void bch2_sb_target_to_text(struct printbuf *, struct bch_sb *, u64);
-
int bch2_opt_target_parse(struct bch_fs *, const char *, u64 *);
-void bch2_opt_target_to_text(struct printbuf *, struct bch_fs *, u64);
+void bch2_opt_target_to_text(struct printbuf *, struct bch_fs *, struct bch_sb *, u64);
int bch2_sb_disk_groups_to_cpu(struct bch_fs *);
diff --git a/libbcachefs/fs.c b/libbcachefs/fs.c
index f6e96132..30720c14 100644
--- a/libbcachefs/fs.c
+++ b/libbcachefs/fs.c
@@ -933,7 +933,8 @@ retry:
bch2_trans_iter_init(&trans, &iter, BTREE_ID_extents,
SPOS(ei->v.i_ino, start, snapshot), 0);
- while ((k = bch2_btree_iter_peek(&iter)).k &&
+ while (!(ret = btree_trans_too_many_iters(&trans)) &&
+ (k = bch2_btree_iter_peek(&iter)).k &&
!(ret = bkey_err(k)) &&
bkey_cmp(iter.pos, end) < 0) {
enum btree_id data_btree = BTREE_ID_extents;
@@ -980,9 +981,6 @@ retry:
bch2_btree_iter_set_pos(&iter,
POS(iter.pos.inode, iter.pos.offset + sectors));
-
- if (btree_trans_too_many_iters(&trans))
- goto retry;
}
start = iter.pos.offset;
bch2_trans_iter_exit(&trans, &iter);
@@ -1691,7 +1689,7 @@ static int bch2_show_options(struct seq_file *seq, struct dentry *root)
continue;
printbuf_reset(&buf);
- bch2_opt_to_text(&buf, c, opt, v,
+ bch2_opt_to_text(&buf, c, c->disk_sb.sb, opt, v,
OPT_SHOW_MOUNT_STYLE);
seq_putc(seq, ',');
seq_puts(seq, buf.buf);
diff --git a/libbcachefs/opts.c b/libbcachefs/opts.c
index 15acbabc..e78d3b75 100644
--- a/libbcachefs/opts.c
+++ b/libbcachefs/opts.c
@@ -290,7 +290,8 @@ int bch2_opt_parse(struct bch_fs *c, const char *msg,
return bch2_opt_validate(opt, msg, *res);
}
-void bch2_opt_to_text(struct printbuf *out, struct bch_fs *c,
+void bch2_opt_to_text(struct printbuf *out,
+ struct bch_fs *c, struct bch_sb *sb,
const struct bch_option *opt, u64 v,
unsigned flags)
{
@@ -320,7 +321,7 @@ void bch2_opt_to_text(struct printbuf *out, struct bch_fs *c,
pr_buf(out, opt->choices[v]);
break;
case BCH_OPT_FN:
- opt->to_text(out, c, v);
+ opt->to_text(out, c, sb, v);
break;
default:
BUG();
diff --git a/libbcachefs/opts.h b/libbcachefs/opts.h
index 9e68f100..033115f7 100644
--- a/libbcachefs/opts.h
+++ b/libbcachefs/opts.h
@@ -461,7 +461,7 @@ struct bch_option {
};
struct {
int (*parse)(struct bch_fs *, const char *, u64 *);
- void (*to_text)(struct printbuf *, struct bch_fs *, u64);
+ void (*to_text)(struct printbuf *, struct bch_fs *, struct bch_sb *, u64);
};
};
@@ -488,7 +488,7 @@ int bch2_opt_parse(struct bch_fs *, const char *, const struct bch_option *,
#define OPT_SHOW_FULL_LIST (1 << 0)
#define OPT_SHOW_MOUNT_STYLE (1 << 1)
-void bch2_opt_to_text(struct printbuf *, struct bch_fs *,
+void bch2_opt_to_text(struct printbuf *, struct bch_fs *, struct bch_sb *,
const struct bch_option *, u64, unsigned);
int bch2_opt_check_may_set(struct bch_fs *, int, u64);
diff --git a/libbcachefs/super-io.c b/libbcachefs/super-io.c
index d87edaad..e17ce91c 100644
--- a/libbcachefs/super-io.c
+++ b/libbcachefs/super-io.c
@@ -1619,7 +1619,8 @@ void bch2_sb_to_text(struct printbuf *out, struct bch_sb *sb,
pr_buf(out, "%s:", opt->attr.name);
pr_tab(out);
- bch2_opt_to_text(out, NULL, opt, v, OPT_HUMAN_READABLE|OPT_SHOW_FULL_LIST);
+ bch2_opt_to_text(out, NULL, sb, opt, v,
+ OPT_HUMAN_READABLE|OPT_SHOW_FULL_LIST);
pr_newline(out);
}
}
diff --git a/libbcachefs/super.c b/libbcachefs/super.c
index fb7f8d6d..46947163 100644
--- a/libbcachefs/super.c
+++ b/libbcachefs/super.c
@@ -886,7 +886,7 @@ static void print_mount_opts(struct bch_fs *c)
if (!first)
pr_buf(&p, ",");
first = false;
- bch2_opt_to_text(&p, c, opt, v, OPT_SHOW_MOUNT_STYLE);
+ bch2_opt_to_text(&p, c, c->disk_sb.sb, opt, v, OPT_SHOW_MOUNT_STYLE);
}
if (!p.pos)
diff --git a/libbcachefs/sysfs.c b/libbcachefs/sysfs.c
index 3018250d..49e38859 100644
--- a/libbcachefs/sysfs.c
+++ b/libbcachefs/sysfs.c
@@ -597,7 +597,7 @@ SHOW(bch2_fs_opts_dir)
int id = opt - bch2_opt_table;
u64 v = bch2_opt_get_by_id(&c->opts, id);
- bch2_opt_to_text(out, c, opt, v, OPT_SHOW_FULL_LIST);
+ bch2_opt_to_text(out, c, c->disk_sb.sb, opt, v, OPT_SHOW_FULL_LIST);
pr_char(out, '\n');
return 0;
diff --git a/libbcachefs/xattr.c b/libbcachefs/xattr.c
index 48e625ab..c2e9520a 100644
--- a/libbcachefs/xattr.c
+++ b/libbcachefs/xattr.c
@@ -448,7 +448,7 @@ static int __bch2_xattr_bcachefs_get(const struct xattr_handler *handler,
return -ENODATA;
v = bch2_opt_get_by_id(&opts, id);
- bch2_opt_to_text(&out, c, opt, v, 0);
+ bch2_opt_to_text(&out, c, c->disk_sb.sb, opt, v, 0);
ret = out.pos;