linux-block.git
11 months agobcachefs: Add subvolume to ei_inode_info
Kent Overstreet [Tue, 16 Mar 2021 05:33:39 +0000 (01:33 -0400)]
bcachefs: Add subvolume to ei_inode_info

Filesystem operations generally operate within a subvolume: at the start
of every btree transaction we'll be looking up (and locking) the
subvolume to get the current snapshot ID, which we then use for our
other btree lookups in BTREE_ITER_FILTER_SNAPSHOTS mode.

But inodes don't record what subvolume they're in - they can't, because
if they did we'd have to update every single inode within a subvolume
when taking a snapshot in order to keep that field up to date. So it
needs to be tracked in memory, based on how we got to that inode.

Hence this patch adds a subvolume field to ei_inode_info, and switches
to iget5() so we can index by it in the inode hash table.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Per subvolume lost+found
Kent Overstreet [Tue, 20 Apr 2021 03:31:40 +0000 (23:31 -0400)]
bcachefs: Per subvolume lost+found

On existing filesystems, we have a single global lost+found. Introducing
subvolumes means we need to introduce per subvolume lost+found
directories, because inodes are added to lost+found by their inode
number, and inode numbers are now only unique within a subvolume.

This patch adds support to fsck for per subvolume lost+found.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Add support for dirents that point to subvolumes
Kent Overstreet [Tue, 16 Mar 2021 04:46:26 +0000 (00:46 -0400)]
bcachefs: Add support for dirents that point to subvolumes

Dirents currently always point to inodes. Subvolumes add a new type of
dirent, with d_type DT_SUBVOL, that instead points to an entry in the
subvolumes btree, and the subvolume has a pointer to the root inode.

This patch adds bch2_dirent_read_target() to get the inode (and
potentially subvolume) a dirent points to, and changes existing code to
use that instead of reading from d_inum directly.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Subvolumes, snapshots
Kent Overstreet [Tue, 16 Mar 2021 04:42:25 +0000 (00:42 -0400)]
bcachefs: Subvolumes, snapshots

This patch adds subvolume.c - support for the subvolumes and snapshots
btrees and related data types and on disk data structures. The next
patches will start hooking up this new code to existing code.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Disable quota support
Kent Overstreet [Sun, 26 Sep 2021 17:54:14 +0000 (13:54 -0400)]
bcachefs: Disable quota support

Existing quota support breaks badly with snapshots. We're not deleting
the code because some of it will be needed when we reimplement quotas
along the lines of btrfs subvolume quotas.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agoRevert "bcachefs: Add more assertions for locking btree iterators out of order"
Kent Overstreet [Wed, 15 Sep 2021 15:15:18 +0000 (11:15 -0400)]
Revert "bcachefs: Add more assertions for locking btree iterators out of order"

Figured out the bug we were chasing, and it had nothing to do with
locking btree iterators/paths out of order.

This reverts commit ff08733dd298c969aec7c7828095458f73fd5374.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Improve btree_node_mem_ptr optimization
Kent Overstreet [Mon, 13 Sep 2021 20:04:49 +0000 (16:04 -0400)]
bcachefs: Improve btree_node_mem_ptr optimization

This patch checks b->hash_val before attempting to lock the node in the
btree, which makes it more equivalent to the "lookup in hash table"
path - and potentially avoids an unnecessary transaction restart if
btree_node_mem_ptr(k) no longer points to the node we want.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Add a missing bch2_trans_relock() call
Kent Overstreet [Mon, 13 Sep 2021 16:38:40 +0000 (12:38 -0400)]
bcachefs: Add a missing bch2_trans_relock() call

This was causing an assertion to pop in fsck, in one of the repair
paths.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Fix some compiler warnings
Kent Overstreet [Thu, 9 Sep 2021 23:05:34 +0000 (19:05 -0400)]
bcachefs: Fix some compiler warnings

gcc couldn't always deduce that written wasn't used uninitialized

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Add missing BTREE_ITER_INTENT
Kent Overstreet [Wed, 8 Sep 2021 03:04:04 +0000 (23:04 -0400)]
bcachefs: Add missing BTREE_ITER_INTENT

No reason not to be using it here...

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Better approach to write vs. read lock deadlocks
Kent Overstreet [Wed, 8 Sep 2021 01:25:32 +0000 (21:25 -0400)]
bcachefs: Better approach to write vs. read lock deadlocks

Instead of unconditionally upgrading read locks to intent locks in
do_bch2_trans_commit(), this patch changes the path that takes write
locks to first trylock, and then if trylock fails check if we have a
conflicting read lock, and restart the transaction if necessary.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: normalize_read_intent_locks
Kent Overstreet [Wed, 8 Sep 2021 01:24:05 +0000 (21:24 -0400)]
bcachefs: normalize_read_intent_locks

This is a new approach to avoiding the self deadlock we'd get if we
tried to take a write lock on a node while holding a read lock - we
simply upgrade the readers to intent.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Consolidate intent lock code in btree_path_up_until_good_node
Kent Overstreet [Wed, 8 Sep 2021 00:23:30 +0000 (20:23 -0400)]
bcachefs: Consolidate intent lock code in btree_path_up_until_good_node

We need to take all needed intent locks when relocking an iterator:
bch2_btree_path_traverse() had a special cased, faster version of this,
but it really should be in up_until_good_node() so that set_pos() can
use it too.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Optimize btree lookups in write path
Kent Overstreet [Tue, 7 Sep 2021 19:34:16 +0000 (15:34 -0400)]
bcachefs: Optimize btree lookups in write path

This patch significantly reduces the number of btree lookups required in
the extent update path.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Add a missing btree_path_make_mut() call
Kent Overstreet [Tue, 7 Sep 2021 17:55:33 +0000 (13:55 -0400)]
bcachefs: Add a missing btree_path_make_mut() call

Also add another small helper, btree_path_clone().

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Enabled shard_inode_numbers by default
Kent Overstreet [Tue, 7 Sep 2021 04:58:13 +0000 (00:58 -0400)]
bcachefs: Enabled shard_inode_numbers by default

We'd like performance increasing options to be on by default.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: No need to clone iterators for update
Kent Overstreet [Mon, 6 Sep 2021 19:38:12 +0000 (15:38 -0400)]
bcachefs: No need to clone iterators for update

Since btree_path is now internally refcounted, we don't need to clone an
iterator before calling bch2_trans_update() if we'll be mutating it.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Kill retry loop in btree merge path
Kent Overstreet [Sun, 5 Sep 2021 04:22:32 +0000 (00:22 -0400)]
bcachefs: Kill retry loop in btree merge path

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Drop some fast path tracepoints
Kent Overstreet [Sun, 5 Sep 2021 04:05:08 +0000 (00:05 -0400)]
bcachefs: Drop some fast path tracepoints

These haven't turned out to be useful

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Tighten up btree locking invariants
Kent Overstreet [Sun, 5 Sep 2021 01:23:11 +0000 (21:23 -0400)]
bcachefs: Tighten up btree locking invariants

New rule is: if a btree path holds any locks it should be holding
precisely the locks wanted (accoringing to path->level and
path->locks_want).

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Extent btree iterators are no longer special
Kent Overstreet [Sun, 5 Sep 2021 01:19:48 +0000 (21:19 -0400)]
bcachefs: Extent btree iterators are no longer special

Since iter->real_pos was introduced, we no longer have to deal with
extent btree iterators that have skipped past deleted keys - this is a
real performance improvement on btree updates.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Add more assertions for locking btree iterators out of order
Kent Overstreet [Fri, 3 Sep 2021 21:18:57 +0000 (17:18 -0400)]
bcachefs: Add more assertions for locking btree iterators out of order

btree_path_traverse_all() traverses btree iterators in sorted order, and
thus shouldn't see transaction restarts due to potential deadlocks - but
sometimes we do. This patch adds some more assertions and tracks some
more state to help track this down.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Kill bpos_diff() XXX check for perf regression
Kent Overstreet [Mon, 30 Aug 2021 19:18:31 +0000 (15:18 -0400)]
bcachefs: Kill bpos_diff() XXX check for perf regression

This improves the btree iterator lookup code by using
trans_for_each_iter_inorder().

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: btree_path
Kent Overstreet [Mon, 30 Aug 2021 19:18:31 +0000 (15:18 -0400)]
bcachefs: btree_path

This splits btree_iter into two components: btree_iter is now the
externally visible componont, and it points to a btree_path which is now
reference counted.

This means we no longer have to clone iterators up front if they might
be mutated - btree_path can be shared by multiple iterators, and cloned
if an iterator would mutate a shared btree_path. This will help us use
iterators more efficiently, as well as slimming down the main long lived
state in btree_trans, and significantly cleans up the logic for iterator
lifetimes.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
11 months agobcachefs: Fix initialization of bch_write_op.nonce
Kent Overstreet [Fri, 3 Sep 2021 21:32:42 +0000 (17:32 -0400)]
bcachefs: Fix initialization of bch_write_op.nonce

If an extent ends up with a replica that is encrypted an a replica that
isn't encrypted (due the user changing options), and then
copygc/rebalance moves one of the replicas by reading from the
unencrypted replica, we had a bug where we wouldn't correctly initialize
op->nonce - for each crc field in an extent, crc.offset + crc.nonce must
be equal.

This patch fixes that by moving op.nonce initialization to
bch2_migrate_write_init.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Improve an error message
Kent Overstreet [Wed, 1 Sep 2021 22:06:01 +0000 (18:06 -0400)]
bcachefs: Improve an error message

When we detect an invalid key being inserted, we should print what code
was doing the update.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Add an assertion for removing btree nodes from cache
Kent Overstreet [Wed, 1 Sep 2021 04:50:18 +0000 (00:50 -0400)]
bcachefs: Add an assertion for removing btree nodes from cache

Chasing a bug that has something to do with the btree node cache.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Kill BTREE_ITER_NODES
Kent Overstreet [Mon, 30 Aug 2021 19:54:41 +0000 (15:54 -0400)]
bcachefs: Kill BTREE_ITER_NODES

We really only need to distinguish between btree iterators and btree key
cache iterators - this is more prep work for btree_path.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Kill BTREE_ITER_NEED_PEEK
Kent Overstreet [Mon, 30 Aug 2021 21:31:09 +0000 (17:31 -0400)]
bcachefs: Kill BTREE_ITER_NEED_PEEK

This was used for an optimization that hasn't existing in quite awhile
- iter->uptodate will probably be going away as well.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Prefer using btree_insert_entry to btree_iter
Kent Overstreet [Mon, 30 Aug 2021 20:08:34 +0000 (16:08 -0400)]
bcachefs: Prefer using btree_insert_entry to btree_iter

This moves some data dependencies forward, to improve pipelining.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: More renaming
Kent Overstreet [Mon, 30 Aug 2021 18:45:11 +0000 (14:45 -0400)]
bcachefs: More renaming

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Clean up/rename bch2_trans_node_* fns
Kent Overstreet [Mon, 30 Aug 2021 18:36:03 +0000 (14:36 -0400)]
bcachefs: Clean up/rename bch2_trans_node_* fns

These utility functions are for managing btree node state within a
btree_trans - rename them for consistency, and drop some unneeded
arguments.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Further reduce iter->trans usage
Kent Overstreet [Mon, 30 Aug 2021 18:22:43 +0000 (14:22 -0400)]
bcachefs: Further reduce iter->trans usage

This is prep work for splitting btree_path out from btree_iter -
btree_path will not have a pointer to btree_trans.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Better algorithm for btree node merging in write path
Kent Overstreet [Sat, 28 Aug 2021 00:55:44 +0000 (20:55 -0400)]
bcachefs: Better algorithm for btree node merging in write path

The existing algorithm was O(n^2) in the number of updates in the
commit.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Kill BTREE_ITER_SET_POS_AFTER_COMMIT
Kent Overstreet [Sun, 29 Aug 2021 23:34:37 +0000 (19:34 -0400)]
bcachefs: Kill BTREE_ITER_SET_POS_AFTER_COMMIT

BTREE_ITER_SET_POS_AFTER_COMMIT is used internally to automagically
advance extent btree iterators on sucessful commit.

But with the upcomnig btree_path patch it's getting more awkward to
support, and it adds overhead to core data structures that's only used
in a few places, and can be easily done by the caller instead.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Refactor bch2_trans_update_extent()
Kent Overstreet [Wed, 25 Aug 2021 05:03:25 +0000 (01:03 -0400)]
bcachefs: Refactor bch2_trans_update_extent()

This consolidates the code for doing extent updates, and makes the btree
iterator usage a bit cleaner and more efficient.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Reduce iter->trans usage
Kent Overstreet [Wed, 25 Aug 2021 01:30:06 +0000 (21:30 -0400)]
bcachefs: Reduce iter->trans usage

Disfavoured, and should go away.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: bch2_dump_trans_iters_updates()
Kent Overstreet [Wed, 25 Aug 2021 01:26:43 +0000 (21:26 -0400)]
bcachefs: bch2_dump_trans_iters_updates()

This factors out bch2_dump_trans_iters_updates() from the iter alloc
overflow path, and makes some small improvements to what it prints.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Ensure iter->real_pos is consistent with key returned
Kent Overstreet [Tue, 24 Aug 2021 20:54:36 +0000 (16:54 -0400)]
bcachefs: Ensure iter->real_pos is consistent with key returned

iter->real_pos needs to match the key returned or bad things will happen
when we go to update the key at that position. When we returned a
pending update from btree_trans_peek_updates(), this wasn't necessarily
the case.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Add SPOS_MAX to bpos_to_text()
Kent Overstreet [Wed, 25 Aug 2021 00:31:44 +0000 (20:31 -0400)]
bcachefs: Add SPOS_MAX to bpos_to_text()

Better pretty printing ftw

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Free iterator if we have duplicate
Kent Overstreet [Mon, 23 Aug 2021 21:19:17 +0000 (17:19 -0400)]
bcachefs: Free iterator if we have duplicate

This helps - but does not fully fix - the outstanding "transaction
iterator overflow" bugs.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Fix unhandled transaction restart in bch2_gc_btree_gens()
Kent Overstreet [Sun, 22 Aug 2021 16:56:56 +0000 (12:56 -0400)]
bcachefs: Fix unhandled transaction restart in bch2_gc_btree_gens()

This fixes https://github.com/koverstreet/bcachefs/issues/305

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: add progress stats to sysfs
Brett Holman [Fri, 23 Jul 2021 19:57:19 +0000 (13:57 -0600)]
bcachefs: add progress stats to sysfs

This adds progress stats to sysfs for copygc, rebalance, recovery, and the
cmd_job ioctls.

Signed-off-by: Brett Holman <bholman.devel@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
11 months agobcachefs: Fix 32 bit build failures
Brett Holman [Tue, 17 Aug 2021 23:14:26 +0000 (17:14 -0600)]
bcachefs: Fix 32 bit build failures

This fix replaces multiple 64 bit divisions with do_div() equivalents.

Signed-off-by: Brett Holman <bholman.devel@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
11 months agobcachefs: Be sure to check ptr->dev in copygc pred function
Kent Overstreet [Wed, 18 Aug 2021 20:19:28 +0000 (16:19 -0400)]
bcachefs: Be sure to check ptr->dev in copygc pred function

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Disk space accounting fix
Kent Overstreet [Tue, 17 Aug 2021 19:29:21 +0000 (15:29 -0400)]
bcachefs: Disk space accounting fix

DIV_ROUND_UP() wasn't doing what we wanted when passing it negative
numbers - fix it by just not passing it negative numbers anymore.

Also, no need to do the scaling by compression ratio for incompressible
data.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Fix a valgrind conditional jump
Kent Overstreet [Tue, 17 Aug 2021 19:03:53 +0000 (15:03 -0400)]
bcachefs: Fix a valgrind conditional jump

Valgrind was complaining about a jump depending on uninitialized memory
- we weren't, but this change makes the code less confusing for valgrind
to follow.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Minor btree iter refactoring
Kent Overstreet [Sat, 7 Aug 2021 22:19:33 +0000 (18:19 -0400)]
bcachefs: Minor btree iter refactoring

This makes the flow control in bch2_btree_iter_peek() and
bch2_btree_iter_peek_prev() a bit cleaner.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Fix btree_trans_peek_updates()
Kent Overstreet [Sat, 7 Aug 2021 22:21:35 +0000 (18:21 -0400)]
bcachefs: Fix btree_trans_peek_updates()

Should have been using bpos_cmp(), not bkey_cmp().

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Fix an unhandled transaction restart
Kent Overstreet [Thu, 5 Aug 2021 17:02:39 +0000 (13:02 -0400)]
bcachefs: Fix an unhandled transaction restart

__bch2_read() -> __bch2_read_extent() -> bch2_bucket_io_time_reset() may
cause a transaction restart, which we don't return an error for because
it doesn't prevent us from making forward progress on the read we're
submitting.

Instead, change __bch2_read() and bchfs_read() to check for transaction
restarts.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Ensure that new inodes hit underlying btree
Kent Overstreet [Fri, 30 Jul 2021 22:01:33 +0000 (18:01 -0400)]
bcachefs: Ensure that new inodes hit underlying btree

Inode creation is done with non-cached btree iterators, but then in the
same transaction the inode may be updated again with a cached iterator -
it makes cache coherency easier if new inodes always land in the
underlying btree.

This patch adds a check to bch2_trans_update() - if the same key is
updated multiple times in the same transaction with both cached and non
cache iterators, use the non cached iterator.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Add flags field to bch2_inode_to_text()
Kent Overstreet [Fri, 30 Jul 2021 21:59:37 +0000 (17:59 -0400)]
bcachefs: Add flags field to bch2_inode_to_text()

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Keep a sorted list of btree iterators
Kent Overstreet [Sat, 12 Jun 2021 19:45:45 +0000 (15:45 -0400)]
bcachefs: Keep a sorted list of btree iterators

This will be used to make other operations on btree iterators within a
transaction more efficient, and enable some other improvements to how we
manage btree iterators.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
11 months agobcachefs: Zero out mem_ptr field in btree ptr keys from journal replay
Kent Overstreet [Fri, 30 Jul 2021 18:33:06 +0000 (14:33 -0400)]
bcachefs: Zero out mem_ptr field in btree ptr keys from journal replay

This fixes a bad ptr deref on recovery from unclean shutdown in
bch2_btree_node_get_noiter().

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Don't drop read locks at transaction commit time
Kent Overstreet [Wed, 28 Jul 2021 02:28:39 +0000 (22:28 -0400)]
bcachefs: Don't drop read locks at transaction commit time

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: traverse_all() shouldn't be restarting the transaction
Kent Overstreet [Wed, 28 Jul 2021 02:32:05 +0000 (22:32 -0400)]
bcachefs: traverse_all() shouldn't be restarting the transaction

We're only called by bch2_trans_begin() now.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Kill BTREE_INSERT_NOUNLOCK
Kent Overstreet [Wed, 28 Jul 2021 02:15:04 +0000 (22:15 -0400)]
bcachefs: Kill BTREE_INSERT_NOUNLOCK

With the recent transaction restart changes, it's no longer needed - all
transaction commits have BTREE_INSERT_NOUNLOCK semantics.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Btree splits no longer automatically cause a transaction restart
Kent Overstreet [Sat, 24 Jul 2021 18:25:01 +0000 (14:25 -0400)]
bcachefs: Btree splits no longer automatically cause a transaction restart

With the new and improved handling of transaction restarts, this should
finally be safe.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: __bch2_trans_commit() no longer calls bch2_trans_reset()
Kent Overstreet [Sun, 25 Jul 2021 03:57:28 +0000 (23:57 -0400)]
bcachefs: __bch2_trans_commit() no longer calls bch2_trans_reset()

It's now the caller's responsibility to call bch2_trans_begin.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Ensure btree_iter_traverse() obeys iter->should_be_locked
Kent Overstreet [Thu, 22 Jul 2021 16:39:11 +0000 (12:39 -0400)]
bcachefs: Ensure btree_iter_traverse() obeys iter->should_be_locked

iter->should_be_locked means that if bch2_btree_iter_relock() fails, we
need to restart the transaction.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: bch2_btree_iter_traverse() shouldn't normally call traverse_all()
Kent Overstreet [Tue, 27 Jul 2021 22:01:52 +0000 (18:01 -0400)]
bcachefs: bch2_btree_iter_traverse() shouldn't normally call traverse_all()

If there's more than one iterator in the btree_trans, it's requried to
call bch2_trans_begin() to handle transaction restarts.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: trans->restarted
Kent Overstreet [Sun, 25 Jul 2021 21:19:52 +0000 (17:19 -0400)]
bcachefs: trans->restarted

Start tracking when btree transactions have been restarted - and assert
that we're always calling bch2_trans_begin() immediately after
transaction restart.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Change lockrestart_do() to always call bch2_trans_begin()
Kent Overstreet [Wed, 28 Jul 2021 20:17:10 +0000 (16:17 -0400)]
bcachefs: Change lockrestart_do() to always call bch2_trans_begin()

More consistent behaviour means less likely to trip over ourselves in
silly ways.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Clean up interior update paths
Kent Overstreet [Sat, 24 Jul 2021 21:38:15 +0000 (17:38 -0400)]
bcachefs: Clean up interior update paths

Btree node merging now happens prior to transaction commit, not after,
so we don't need to pay attention to BTREE_INSERT_NOUNLOCK.

Also, foreground_maybe_merge shouldn't be calling
bch2_btree_iter_traverse_all() - this is becoming private to the btree
iterator code and should only be called by bch2_trans_begin().

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Use bch2_trans_begin() more consistently
Kent Overstreet [Sun, 25 Jul 2021 00:24:10 +0000 (20:24 -0400)]
bcachefs: Use bch2_trans_begin() more consistently

Upcoming patch will require that a transaction restart is always
immediately followed by bch2_trans_begin().

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Always check for transaction restarts
Kent Overstreet [Sat, 24 Jul 2021 23:50:40 +0000 (19:50 -0400)]
bcachefs: Always check for transaction restarts

On transaction restart iterators won't be locked anymore - make sure
we're always checking for errors.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: traverse_all() is responsible for clearing should_be_locked
Kent Overstreet [Sat, 24 Jul 2021 21:43:35 +0000 (17:43 -0400)]
bcachefs: traverse_all() is responsible for clearing should_be_locked

bch2_btree_iter_traverse_all() may loop, and it needs to clear
iter->should_be_locked on every iteration.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: bch2_trans_relock() only relocks iters that should be locked
Kent Overstreet [Tue, 27 Jul 2021 21:58:58 +0000 (17:58 -0400)]
bcachefs: bch2_trans_relock() only relocks iters that should be locked

This avoids unexpected lock restarts in bch2_btree_iter_traverse_all().

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Don't traverse iterators in __bch2_trans_commit()
Kent Overstreet [Sun, 25 Jul 2021 18:20:43 +0000 (14:20 -0400)]
bcachefs: Don't traverse iterators in __bch2_trans_commit()

They should already be traversed, and we're asserting that since the
introduction of iter->should_be_locked

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Add an option for btree node mem ptr optimization
Kent Overstreet [Mon, 26 Jul 2021 19:52:41 +0000 (15:52 -0400)]
bcachefs: Add an option for btree node mem ptr optimization

bch2_btree_node_ptr_v2 has a field for stashing a pointer to the in
memory btree node; this is safe because we clear this field when reading
in nodes from disk and we never free in memory btree nodes - but, we
have bug reports that indicate something might be faulty with this
optimization, so let's add an option for it.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Minor tracepoint improvements
Kent Overstreet [Sat, 24 Jul 2021 21:31:25 +0000 (17:31 -0400)]
bcachefs: Minor tracepoint improvements

Btree iterator tracepoints should print whether they're for the key
cache.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: bch2_btree_iter_relock_intent()
Kent Overstreet [Sat, 24 Jul 2021 21:12:51 +0000 (17:12 -0400)]
bcachefs: bch2_btree_iter_relock_intent()

This adds a new helper for btree_cache.c that does what we want where
the iterator is still being traverse - and also eliminates some
unnecessary transaction restarts.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Use bch2_trans_do() in bch2_btree_key_cache_journal_flush()
Kent Overstreet [Fri, 23 Jul 2021 22:26:38 +0000 (18:26 -0400)]
bcachefs: Use bch2_trans_do() in bch2_btree_key_cache_journal_flush()

We're working to standardize handling of transaction restarts.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Fix a btree iterator leak
Kent Overstreet [Sun, 25 Jul 2021 00:20:02 +0000 (20:20 -0400)]
bcachefs: Fix a btree iterator leak

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Pretty-ify bch2_bkey_val_to_text()
Kent Overstreet [Wed, 21 Jul 2021 17:55:51 +0000 (13:55 -0400)]
bcachefs: Pretty-ify bch2_bkey_val_to_text()

Don't print out the ": " when there isn't a value to print.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Don't squash return code in check_dirents()
Kent Overstreet [Wed, 21 Jul 2021 17:23:50 +0000 (13:23 -0400)]
bcachefs: Don't squash return code in check_dirents()

We were squashing BCH_FSCK_ERRORS_NOT_FIXED.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Use bch2_inode_find_by_inum() in truncate
Kent Overstreet [Wed, 21 Jul 2021 01:18:16 +0000 (21:18 -0400)]
bcachefs: Use bch2_inode_find_by_inum() in truncate

This is needed for snapshots because we need to start handling lock
restarts even when just calling bch2_inode_peek().

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Handle lock restarts in bch2_xattr_get()
Kent Overstreet [Wed, 21 Jul 2021 01:07:21 +0000 (21:07 -0400)]
bcachefs: Handle lock restarts in bch2_xattr_get()

Snapshots add another btree lookup, thus we need to handle lock
restarts.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Don't downgrade in traverse()
Kent Overstreet [Wed, 21 Jul 2021 00:14:44 +0000 (20:14 -0400)]
bcachefs: Don't downgrade in traverse()

Downgrading of btree iterators is something that should only happen
explicitly.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: BSET_OFFSET()
Kent Overstreet [Fri, 16 Jul 2021 16:57:27 +0000 (12:57 -0400)]
bcachefs: BSET_OFFSET()

Add a field to struct bset for the sector offset within the btree node
where it was written.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agoRevert "bcachefs: statfs bfree and bavail should be the same"
Kent Overstreet [Mon, 11 Sep 2023 03:35:02 +0000 (23:35 -0400)]
Revert "bcachefs: statfs bfree and bavail should be the same"

This reverts commit 664f9847bec525d396d62d2db094ca9020289ae0.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
11 months agobcachefs: Update btree ptrs after every write
Kent Overstreet [Sat, 10 Jul 2021 17:44:42 +0000 (13:44 -0400)]
bcachefs: Update btree ptrs after every write

This closes a significant hole (and last known hole) in our ability to
verify metadata. Previously, since btree nodes are log structured, we
couldn't detect lost btree writes that weren't the first write to a
given node. Additionally, this seems to have lead to some significant
metadata corruption on multi device filesystems with metadata
replication: since a write may have made it to one device and not
another, if we read that btree node back from the replica that did have
that write and started appending after that point, the other replica
would have a gap in the bset entries and reading from that replica
wouldn't find the rest of the bsets.

But, since updates to interior btree nodes are now journalled, we can
close this hole by updating pointers to btree nodes after every write
with the currently written number of sectors, without negatively
affecting performance. This means we will always detect lost or corrupt
metadata - it also means that our btree is now a curious hybrid of COW
and non COW btrees, with all the benefits of both (excluding
complexity).

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Improve btree_bad_header() error message
Kent Overstreet [Thu, 15 Jul 2021 17:42:43 +0000 (13:42 -0400)]
bcachefs: Improve btree_bad_header() error message

We should always print out the full btree node ptr.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Fixes for unit tests
Kent Overstreet [Thu, 15 Jul 2021 01:25:55 +0000 (21:25 -0400)]
bcachefs: Fixes for unit tests

The unit tests hadn't been updated for various recent btree changes -
this patch makes them work again.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Fix bch2_btree_iter_rewind()
Kent Overstreet [Thu, 15 Jul 2021 03:35:11 +0000 (23:35 -0400)]
bcachefs: Fix bch2_btree_iter_rewind()

We'd hit a BUG() when rewinding at the start of the btree on btrees with
snapshots.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Improvements to fsck check_dirents()
Kent Overstreet [Thu, 15 Jul 2021 00:28:27 +0000 (20:28 -0400)]
bcachefs: Improvements to fsck check_dirents()

The fsck code handles transaction restarts in a very ad hoc way, and not
always correctly. This patch makes some improvements to check_dirents(),
but more work needs to be done to figure out how this kind of code
should be structured.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Tighten up btree_iter locking assertions
Kent Overstreet [Wed, 14 Jul 2021 19:13:27 +0000 (15:13 -0400)]
bcachefs: Tighten up btree_iter locking assertions

We weren't correctly verifying that we had interior node intent locks -
this patch also fixes bugs uncovered by the new assertions.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Fix a memory leak in the dio write path
Kent Overstreet [Wed, 14 Jul 2021 04:14:45 +0000 (00:14 -0400)]
bcachefs: Fix a memory leak in the dio write path

There were some error paths where we were leaking page refs - oops.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
11 months agobcachefs: Add an option for whether inodes use the key cache
Kent Overstreet [Sun, 13 Jun 2021 21:07:18 +0000 (17:07 -0400)]
bcachefs: Add an option for whether inodes use the key cache

We probably don't ever want to flip this off in production, but it may
be useful for certain kinds of testing.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Fix an allocator shutdown deadlock
Kent Overstreet [Tue, 13 Jul 2021 20:12:00 +0000 (16:12 -0400)]
bcachefs: Fix an allocator shutdown deadlock

On fstest generic/388, we were seeing sporadic deadlocks in the
emergency shutdown, where we'd get stuck shutting down the allocator
because bch2_btree_update_start() -> bch2_btree_reserve_get() allocated
and then deallocated some btree nodes, putting them back on the
btree_reserve_cache, after the allocator shutdown code had already
cleared out that cache.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Add safe versions of varint encode/decode
Kent Overstreet [Tue, 13 Jul 2021 20:03:51 +0000 (16:03 -0400)]
bcachefs: Add safe versions of varint encode/decode

This adds safe versions of bch2_varint_(encode|decode) that don't read
or write past the end of the buffer, or varint being encoded.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Add open_buckets to sysfs
Kent Overstreet [Tue, 13 Jul 2021 03:52:49 +0000 (23:52 -0400)]
bcachefs: Add open_buckets to sysfs

This is to help debug a rare shutdown deadlock in the allocator code -
the btree code is leaking open_buckets.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Ensure bad d_type doesn't oops in bch2_dirent_to_text()
Kent Overstreet [Tue, 13 Jul 2021 03:17:15 +0000 (23:17 -0400)]
bcachefs: Ensure bad d_type doesn't oops in bch2_dirent_to_text()

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Kick off btree node writes from write completions
Kent Overstreet [Sun, 11 Jul 2021 20:41:14 +0000 (16:41 -0400)]
bcachefs: Kick off btree node writes from write completions

This is a performance improvement by removing the need to wait for the
in flight btree write to complete before kicking one off, which is going
to be needed to avoid a performance regression with the upcoming patch
to update btree ptrs after every btree write.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Mask out unknown compat features when going read-write
Kent Overstreet [Sun, 11 Jul 2021 17:54:07 +0000 (13:54 -0400)]
bcachefs: Mask out unknown compat features when going read-write

Compat features should be cleared if the filesystem was touched by a
version that doesn't support them.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: Really don't hold btree locks while btree IOs are in flight
Kent Overstreet [Sun, 11 Jul 2021 03:03:15 +0000 (23:03 -0400)]
bcachefs: Really don't hold btree locks while btree IOs are in flight

This is something we've attempted to stick to for quite some time, as it
helps guarantee filesystem latency - but there's a few remaining paths
that this patch fixes.

This is also necessary for an upcoming patch to update btree pointers
after every btree write - since the btree write completion path will now
be doing btree operations.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
11 months agobcachefs: Regularize argument passing of btree_trans
Kent Overstreet [Sun, 11 Jul 2021 03:22:06 +0000 (23:22 -0400)]
bcachefs: Regularize argument passing of btree_trans

btree_trans should always be passed when we have one - iter->trans is
disfavoured. This mainly updates old code in btree_update_interior.c,
some of which predates btree_trans.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
11 months agobcachefs: docs: add docs for bch2_trans_reset
Dan Robertson [Thu, 8 Jul 2021 02:31:36 +0000 (22:31 -0400)]
bcachefs: docs: add docs for bch2_trans_reset

Add basic kernel docs for bch2_trans_reset and bch2_trans_begin.

Signed-off-by: Dan Robertson <dan@dlrobertson.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
11 months agobcachefs: set disk state should check new_state
Dan Robertson [Thu, 8 Jul 2021 22:15:38 +0000 (18:15 -0400)]
bcachefs: set disk state should check new_state

A new device state that is not a valid state should return -EINVAL
in the disk set state ioctl.

Signed-off-by: Dan Robertson <dan@dlrobertson.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
11 months agobcachefs: BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE
Kent Overstreet [Tue, 6 Jul 2021 02:16:02 +0000 (22:16 -0400)]
bcachefs: BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE

Add a new flag to control assertions about updating to internal snapshot
nodes, that normally should not be written to - to be used in an
upcoming patch.

Also do some renaming - trigger_flags is now update_flags.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>