linux.git
18 months agobcachefs: Better inlining in bch2_subvolume_get_snapshot()
Kent Overstreet [Wed, 23 Nov 2022 23:22:59 +0000 (18:22 -0500)]
bcachefs: Better inlining in bch2_subvolume_get_snapshot()

This provides an inlined version of bch2_subvolume_get() and uses it in
bch2_subvolume_get_snapshot(), since this is the version that's used all
over the place and in fast paths (e.g. IO paths).

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Inline bch2_bkey_format_add_key()
Kent Overstreet [Thu, 24 Nov 2022 08:38:31 +0000 (03:38 -0500)]
bcachefs: Inline bch2_bkey_format_add_key()

This is only called in two places, and when it's used we use it in a
tight loop - it's definitely worth inlining.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Tiny bch2_trans_update_by_path_trace() optimization
Kent Overstreet [Wed, 23 Nov 2022 04:47:22 +0000 (23:47 -0500)]
bcachefs: Tiny bch2_trans_update_by_path_trace() optimization

This just removes a redundant comparison - there's more work we could do
here to remove some redundant copying.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Move some asserts behind CONFIG_BCACHEFS_DEBUG
Kent Overstreet [Wed, 23 Nov 2022 03:06:04 +0000 (22:06 -0500)]
bcachefs: Move some asserts behind CONFIG_BCACHEFS_DEBUG

Convert some non-critical asserts in long-stable code to debug asserts.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Split out __bch2_btree_node_get()
Kent Overstreet [Wed, 23 Nov 2022 03:05:45 +0000 (22:05 -0500)]
bcachefs: Split out __bch2_btree_node_get()

Standard splitting out of the slow path from the fast path of a
function. We may follow this up in another patch with inlining the fast
path into btree_iter.c.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Handle last journal write being torn
Kent Overstreet [Sun, 20 Nov 2022 02:40:35 +0000 (21:40 -0500)]
bcachefs: Handle last journal write being torn

If the last journal write didn't complete sucessfully due to a torn
write, we'll detect it as a checksum error. In that case, we should just
pretend that journal entry was never written.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Improve journal_read() logging
Kent Overstreet [Sun, 20 Nov 2022 02:20:58 +0000 (21:20 -0500)]
bcachefs: Improve journal_read() logging

Print out the journal entries we read and will replay as soon as
possible - if we get an error walidating keys it's helpful to know where
it was in the journal.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix a transaction path overflow
Kent Overstreet [Fri, 18 Nov 2022 00:07:40 +0000 (19:07 -0500)]
bcachefs: Fix a transaction path overflow

It turns out we need bch2_extent_trim_atomi() even when we're deleting
extents one at a time because it's possible for one reflink_p to
reference arbitrarily many reflink_v extents. This doesn't normally
happen, but the data move path can fragment existing extents in the
background.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix a race with b->write_type
Kent Overstreet [Thu, 17 Nov 2022 21:03:15 +0000 (16:03 -0500)]
bcachefs: Fix a race with b->write_type

b->write_type needs to be set atomically with setting the
btree_node_need_write flag, so move it into b->flags.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Error message improvement
Kent Overstreet [Wed, 16 Nov 2022 01:25:08 +0000 (20:25 -0500)]
bcachefs: Error message improvement

 - Centralize format strings in bcachefs.h
 - Add bch2_fmt_inum_offset() and related helpers
 - Switch error messages for inodes to also print out the offset, in
   bytes

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Improve a few warnings
Kent Overstreet [Tue, 15 Nov 2022 20:57:07 +0000 (15:57 -0500)]
bcachefs: Improve a few warnings

Warnings ought to always have a format string/log message - makes them
considerably more useful.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix for_each_btree_key2()
Kent Overstreet [Wed, 16 Nov 2022 04:17:55 +0000 (23:17 -0500)]
bcachefs: Fix for_each_btree_key2()

Previously, when we exited from the loop body with a break statement
_ret wouldn't have been assigned to yet, and we could spuriously return
a transaction restart error.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Btree split improvement
Kent Overstreet [Wed, 16 Nov 2022 02:52:12 +0000 (21:52 -0500)]
bcachefs: Btree split improvement

This improves the bkey_format calculation when splitting btree nodes.
Previously, we'd use a format calculated for the original node for the
lower of the two new nodes.

This was particularly bad on sequential insertions, where we iteratively
split the last btree node, whos format has to include KEY_MAX.

Now, we calculate formats precisely for the keys the two new nodes will
contain. This also should make splitting a bit more efficient, since
we're only copying keys once (from the original node to the new node,
instead of new node, replacement node, then upper split).

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix return code from btree_path_traverse_one()
Kent Overstreet [Wed, 16 Nov 2022 03:48:03 +0000 (22:48 -0500)]
bcachefs: Fix return code from btree_path_traverse_one()

trans->restarted is a positive error code, not the usual negative

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Minor dio write path improvements
Kent Overstreet [Mon, 14 Nov 2022 03:43:37 +0000 (22:43 -0500)]
bcachefs: Minor dio write path improvements

This switches where we take quota reservations to be per bch_wirte_op
instead of per dio_write, so we can drop the quota reservation in the
same place as we call i_sectors_acct(), and only take/release
ei_quota_lock once.

In the future we'd like ei_quota_lock to not be a mutex, so that we can
avoid punting to process context before deliving write completions in
nocow mode.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Quota: Don't allocate memory under lock
Kent Overstreet [Mon, 14 Nov 2022 03:35:55 +0000 (22:35 -0500)]
bcachefs: Quota: Don't allocate memory under lock

The genradix code can handle multiple threads trying to allocate at the
same time - we don't need the genradix_ptr_alloc() call to happen under
a lock.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix a use after free
Kent Overstreet [Mon, 14 Nov 2022 07:22:30 +0000 (02:22 -0500)]
bcachefs: Fix a use after free

This fixes a regression from percpu freedlists in the btree key cache
code: in a rare error path, we were immediately freeing a bkey_cached
that had been used before and should've waited for an SRCU barrier.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Delete atomic_inc_bug()
Kent Overstreet [Mon, 14 Nov 2022 01:53:24 +0000 (20:53 -0500)]
bcachefs: Delete atomic_inc_bug()

These were wrappers around atomic operations that verified that the
counter wasn't negative, but they're dead code - delete.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fixes for building in userspace
Kent Overstreet [Mon, 14 Nov 2022 01:01:42 +0000 (20:01 -0500)]
bcachefs: Fixes for building in userspace

 - Marking a non-static function as inline doesn't actually work and is
   now causing problems - drop that

 - Introduce BCACHEFS_LOG_PREFIX for when we want to prefix log messages
   with bcachefs (filesystem name)

 - Userspace doesn't have real percpu variables (maybe we can get this
   fixed someday), put an #ifdef around bch2_disk_reservation_add()
   fastpath

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Factor out two_state_shared_lock
Kent Overstreet [Fri, 4 Nov 2022 17:25:57 +0000 (13:25 -0400)]
bcachefs: Factor out two_state_shared_lock

We have a unique lock used for controlling adding to the pagecache: the
lock has two states, where both states are shared - the lock may be held
multiple times for either state - but not both states at the same time.

This is exactly what we need for nocow mode locking, so this patch pulls
it out of fs.c into its own file.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Kill BCH_WRITE_FLUSH
Kent Overstreet [Thu, 3 Nov 2022 04:29:43 +0000 (00:29 -0400)]
bcachefs: Kill BCH_WRITE_FLUSH

BCH_WRITE_FLUSH is a write flag that causes a journal flush.  It's only
used in the direct IO path, and this will allow for some consolidation
with the regular fsync path, which will help with the upcoming nocow
mode.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: bch2_trans_commit_bkey_invalid()
Kent Overstreet [Thu, 3 Nov 2022 15:14:04 +0000 (11:14 -0400)]
bcachefs: bch2_trans_commit_bkey_invalid()

 - factor out more slowpath code into non-inline function
 - use bch2_print_string_as_lines(), so our error message doesn't get
   truncated

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Kill bch2_alloc_sectors_start()
Kent Overstreet [Wed, 2 Nov 2022 19:41:32 +0000 (15:41 -0400)]
bcachefs: Kill bch2_alloc_sectors_start()

Only used in one place, just inline it there.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Improve __bch2_btree_path_make_mut()
Kent Overstreet [Tue, 1 Nov 2022 08:23:24 +0000 (04:23 -0400)]
bcachefs: Improve __bch2_btree_path_make_mut()

btree_path_copy() doesn't need to call
bch2_btree_path_check_sort_fast() - the newly allocated path will always
be in the correct position, post copy; also delete some redundant
branches from __bch2_btree_path_make_mut().

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Inlining improvements
Kent Overstreet [Tue, 1 Nov 2022 07:37:53 +0000 (03:37 -0400)]
bcachefs: Inlining improvements

 - Don't call into bch2_encrypt_bio() when we're not encrypting
 - Pull slowpath out of trans_lock_write()
 - Make sure bc2h_trans_journal_res_get() gets inlined.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: DIO write path optimization
Kent Overstreet [Tue, 1 Nov 2022 00:30:27 +0000 (20:30 -0400)]
bcachefs: DIO write path optimization

 - With BCH_WRITE_SYNC, we no longer need the completion in struct
   dio_write
 - Pull out bch2_dio_write_copy_iov() into a separate non-inline
   function, it's code that doesn't run in the common case
 - Copy mapping and inode pointers into dio_write, avoiding pointer
   chasing at the start of bch2_dio_write_loop()
 - kthread_use_mm() is not needed in the common case; move it into
   bch2_dio_write_loop_async()
 - factor out various helpers from bch2_dio_write_loop() and rework
   control flow for better icache utilization

Other small optimizations:

 - bch2_keylist_free() is only used in one place, at the end of the
   bch2_write() path - drop the reinit
 - in bch2_disk_reservation_put(), check if res->sectors is nonzero
   before touching c->online_reserved, since that will likely be a cache
   miss

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
bcachefs: More DIO write path optimization

Better code prefetching (?)

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: BCH_WRITE_SYNC
Kent Overstreet [Sat, 29 Oct 2022 19:54:17 +0000 (15:54 -0400)]
bcachefs: BCH_WRITE_SYNC

This adds a new flag for the write path, BCH_WRITE_SYNC, and switches
the O_DIRECT write path to use it when we're not running asynchronously.

It runs the btree update after the write in the original thread's
context instead of a kworker, cutting context switches in half.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: More style fixes
Kent Overstreet [Sat, 22 Oct 2022 19:59:53 +0000 (15:59 -0400)]
bcachefs: More style fixes

Fixes for various checkpatch errors.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Kill BCH_WRITE_JOURNAL_SEQ_PTR
Kent Overstreet [Mon, 31 Oct 2022 02:21:11 +0000 (22:21 -0400)]
bcachefs: Kill BCH_WRITE_JOURNAL_SEQ_PTR

Dead code, delete.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: should_compact_all()
Kent Overstreet [Fri, 28 Oct 2022 22:56:31 +0000 (18:56 -0400)]
bcachefs: should_compact_all()

This factors out a properly-documented helper for deciding when we want
to sort a btree node with MAX_BSETS bsets down to a single bset.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Improved btree write statistics
Kent Overstreet [Fri, 28 Oct 2022 21:08:41 +0000 (17:08 -0400)]
bcachefs: Improved btree write statistics

This replaces sysfs btree_avg_write_size with btree_write_stats, which
now breaks out statistics by the source of the btree write.

Btree writes that are too small are a source of inefficiency, and
excessive btree resort overhead - this will let us see what's causing
them.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Improve fs_usage_apply_warn() message
Kent Overstreet [Mon, 24 Oct 2022 17:34:17 +0000 (13:34 -0400)]
bcachefs: Improve fs_usage_apply_warn() message

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix a spurious warning
Kent Overstreet [Mon, 24 Oct 2022 19:10:14 +0000 (15:10 -0400)]
bcachefs: Fix a spurious warning

Fixes fstests generic/648

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix buffered write path for generic/275
Kent Overstreet [Mon, 24 Oct 2022 02:01:50 +0000 (22:01 -0400)]
bcachefs: Fix buffered write path for generic/275

Per fstests generic/275, on -ENOSPC we're supposed write until the
filesystem is full - i.e. do a partial write instead of failing the full
write.

This is a partial fix for the buffered write path: we'll still fail on a
page boundary.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Journal keys overlay fixes
Kent Overstreet [Sun, 23 Oct 2022 21:37:23 +0000 (17:37 -0400)]
bcachefs: Journal keys overlay fixes

 - In the btree iterator code that overlays keys from the journal, we
   were incorrectly specifying level=0 instead of the btree_path's
   current level in a few places
 - When we didn't do journal replay, we shouldn't free the journal keys:
   this fixes cmd_list and cmd_dump, which run in norecovery mode

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix an out-of-bounds shift
Kent Overstreet [Sat, 22 Oct 2022 20:19:27 +0000 (16:19 -0400)]
bcachefs: Fix an out-of-bounds shift

roundup_pow_of_two() is undefined for 0 - oops.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Make error messages more uniform
Kent Overstreet [Sat, 22 Oct 2022 19:10:28 +0000 (15:10 -0400)]
bcachefs: Make error messages more uniform

Use __func__ in error messages that refer to function name, and do so
more uniformly - suggested by checkpatch.pl

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Convert to __packed and __aligned
Kent Overstreet [Sat, 22 Oct 2022 19:00:16 +0000 (15:00 -0400)]
bcachefs: Convert to __packed and __aligned

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: bch2_bkey_cmp_packed_inlined()
Kent Overstreet [Fri, 21 Oct 2022 23:20:09 +0000 (19:20 -0400)]
bcachefs: bch2_bkey_cmp_packed_inlined()

This adds an inlined version of bch2_bkey_cmp_packed(), and uses it in
bch2_sort_keys(), where it's part of the inner loop.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Move bkey bkey_unpack_key() to bkey.h
Kent Overstreet [Fri, 21 Oct 2022 23:15:07 +0000 (19:15 -0400)]
bcachefs: Move bkey bkey_unpack_key() to bkey.h

Long ago, bkey_unpack_key() was added to bset.h instead of bkey.h
because bkey.h didn't include btree_types.h, which it needs for the
compiled unpack function.

This patch finally moves it to the proper location.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Optimize __bch2_btree_node_iter_advance()
Kent Overstreet [Fri, 21 Oct 2022 21:37:42 +0000 (17:37 -0400)]
bcachefs: Optimize __bch2_btree_node_iter_advance()

This replaces an expensive memmove() call with an open-coded version.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Don't touch c->flags in bch2_trans_iter_init()
Kent Overstreet [Fri, 21 Oct 2022 21:26:49 +0000 (17:26 -0400)]
bcachefs: Don't touch c->flags in bch2_trans_iter_init()

This moves the JOURNAL_REPLAY_DONE flag check from
bch2_trans_iter_init() to bch2_trans_init(), where we stash a copy in
btree_trans - gaining us a small performance improvement.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Assorted checkpatch fixes
Kent Overstreet [Wed, 19 Oct 2022 22:31:33 +0000 (18:31 -0400)]
bcachefs: Assorted checkpatch fixes

checkpatch.pl gives lots of warnings that we don't want - suggested
ignore list:

 ASSIGN_IN_IF
 UNSPECIFIED_INT - bcachefs coding style prefers single token type names
 NEW_TYPEDEFS - typedefs are occasionally good
 FUNCTION_ARGUMENTS - we prefer to look at functions in .c files
  (hopefully with docbook documentation), not .h
  file prototypes
 MULTISTATEMENT_MACRO_USE_DO_WHILE
- we have _many_ x-macros and other macros where
  we can't do this

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Optimize bch2_dev_usage_read()
Kent Overstreet [Fri, 21 Oct 2022 18:01:19 +0000 (14:01 -0400)]
bcachefs: Optimize bch2_dev_usage_read()

 - add bch2_dev_usage_read_fast(), which doesn't return by value -
   bch_dev_usage is big enough that we don't want the silent memcpy
 - tweak the allocation path to only call bch2_dev_usage_read() once per
   bucket allocated

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: fix bch2_write_extent() crc corruption.
Daniel Hill [Tue, 11 Oct 2022 08:33:56 +0000 (21:33 +1300)]
bcachefs: fix bch2_write_extent() crc corruption.

crc.compression_type & nouce gets reset to inside bch2_rechecksum_bio(),
we set it back to the previous values calculated. This fixes
incompressible extents being marked as uncompressed.

Signed-off-by: Daniel Hill <daniel@gluo.nz>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: fix security warning in pr_name_and_units
Daniel B. Hill [Mon, 17 Oct 2022 20:54:32 +0000 (09:54 +1300)]
bcachefs: fix security warning in pr_name_and_units

Signed-off-by: Daniel Hill <daniel@gluo.nz>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Don't issue transaction restart on key cache realloc
Kent Overstreet [Mon, 17 Oct 2022 11:32:57 +0000 (07:32 -0400)]
bcachefs: Don't issue transaction restart on key cache realloc

This shouldn't be needed anymore, since we don't rely on the pointer
validity that this was guarding against anymore - we get a new good
reference and save it right after this function.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Separate out flush_new_cached_update()
Kent Overstreet [Mon, 17 Oct 2022 11:31:37 +0000 (07:31 -0400)]
bcachefs: Separate out flush_new_cached_update()

This separates out the slowpath of bch2_trans_update_by_path_trace()
into a new non-inlined helper.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Optimize __bkey_unpack_key_format_checked()
Kent Overstreet [Mon, 17 Oct 2022 11:19:34 +0000 (07:19 -0400)]
bcachefs: Optimize __bkey_unpack_key_format_checked()

Delete some code when CONFIG_BCACHEFS_DEBUG=n

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Inline bch2_inode_pack()
Kent Overstreet [Mon, 17 Oct 2022 11:09:02 +0000 (07:09 -0400)]
bcachefs: Inline bch2_inode_pack()

It's mainly used from bch2_inode_write(), so inline it there.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: bucket_alloc_fail tracepoint should only fire when we have to block
Kent Overstreet [Mon, 17 Oct 2022 11:07:28 +0000 (07:07 -0400)]
bcachefs: bucket_alloc_fail tracepoint should only fire when we have to block

We don't want to fire the bucket_alloc_fail tracepoint on transaction
restart, when we can retry immediately - only when we the allocation
actually has to block.

Also, switch from sched_clock() to local_clock(), as we've been doing
elsewhere.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Optimize bch2_trans_init()
Kent Overstreet [Mon, 17 Oct 2022 11:03:11 +0000 (07:03 -0400)]
bcachefs: Optimize bch2_trans_init()

Now we store the transaction's fn idx in a local variable, instead of
redoing the lookup every time we call bch2_trans_init().

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Split out __btree_path_up_until_good_node()
Kent Overstreet [Mon, 17 Oct 2022 06:04:31 +0000 (02:04 -0400)]
bcachefs: Split out __btree_path_up_until_good_node()

This breaks up btree_path_up_until_good_node() so that only the fastpath
gets inlined.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Btree key cache shrinker fix
Kent Overstreet [Mon, 17 Oct 2022 06:08:07 +0000 (02:08 -0400)]
bcachefs: Btree key cache shrinker fix

The shrinker assumes freed key cache items are ordered by age, so that
it doesn't have to scan the full list to find items that are old enough
(according to the srcu code) to be freed.

But percpu freelists broke this ordering; this patch fixes this by
ensuring we insert items into the proper position.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: __bio_compress() fix up.
Daniel Hill [Sat, 15 Oct 2022 13:25:54 +0000 (02:25 +1300)]
bcachefs: __bio_compress() fix up.

A single block can't be compressed, so it's incompressible.
This stops rebalance repeatably marking extents as uncompressed.

Signed-off-by: Daniel Hill <daniel@gluo.nz>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: make durability a read-write sysfs option
Daniel Hill [Wed, 25 May 2022 04:11:56 +0000 (16:11 +1200)]
bcachefs: make durability a read-write sysfs option

Sometimes the user may need to change durability after formatting to
match current hardware setup, this option provides a quick and flexible
alternative to removing then adding the device.
It is HIGHLY ADVISED TO RUN REREPLICATE after changing this value so the
system doesn't remain degraded.

Signed-off-by: Daniel Hill <daniel@gluo.nz>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: improve behaviour of btree_cache_scan()
Daniel Hill [Thu, 6 Oct 2022 02:53:36 +0000 (15:53 +1300)]
bcachefs: improve behaviour of btree_cache_scan()

Appending new nodes to the end of the list means we're more likely to
evict old entries when btree_cache_scan() is started.

Signed-off-by: Daniel Hill <daniel@gluo.nz>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Quota fixes
Kent Overstreet [Sat, 15 Oct 2022 07:52:28 +0000 (03:52 -0400)]
bcachefs: Quota fixes

 - We now correctly allow soft limits to be exceeded, instead of always
   returning -EDQUOT
 - Disk quota grate times/warnings can now be set, not just the
   systemwide defaults

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Switch to local_clock() for fastpath time source
Kent Overstreet [Sat, 15 Oct 2022 05:03:14 +0000 (01:03 -0400)]
bcachefs: Switch to local_clock() for fastpath time source

local_clock() isn't always completely accurate - e.g. on machines with
TSC drift - but ktime_get_ns() overhead is too high, unfortunately.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Btree key cache improvements
Kent Overstreet [Sat, 15 Oct 2022 04:47:21 +0000 (00:47 -0400)]
bcachefs: Btree key cache improvements

 - In userspace, we don't have real percpu variables; this patch
   disables the percpu freelists in userspace
 - add some error messages for the asserts in
   bch2_fs_btree_key_cache_exit(); we've been hitting this (only in
   userspace, oddly), perhaps this will help us track down the error.
 - bkey_cached_reuse() should likely be taking the key cache lock, and
   it's a slowpath so it doesn't hurt to

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix btree node prefetchig
Kent Overstreet [Fri, 14 Oct 2022 11:20:05 +0000 (07:20 -0400)]
bcachefs: Fix btree node prefetchig

We were forgetting to count down the number of nodes to prefetch, firing
off _way_ more than intended - whoops.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: bch2_btree_key_cache_scan() doesn't need trylock
Kent Overstreet [Fri, 14 Oct 2022 10:48:23 +0000 (06:48 -0400)]
bcachefs: bch2_btree_key_cache_scan() doesn't need trylock

We don't actually allocate memory under the btree key cache lock - so
there's no recursion concerns, and the shrinker can just use
mutex_lock().

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Defer full journal entry validation
Kent Overstreet [Fri, 14 Oct 2022 02:52:40 +0000 (22:52 -0400)]
bcachefs: Defer full journal entry validation

On journal read, previously we would do full journal entry validation
immediately after reading a journal entry.

However, this would lead to errors for journal entries we weren't
actually going to use, either because they were too old or too new
(newer than the most recent flush).

We've observed write tearing on journal entries newer than the newest
flush - which makes sense, prior to a flush there's no guarantees about
write persistence.

This patch defers full journal entry validation until the end of the
journal read path, when we know which journal entries we'll want to use.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Improve journal_entry_add()
Kent Overstreet [Fri, 14 Oct 2022 05:14:15 +0000 (01:14 -0400)]
bcachefs: Improve journal_entry_add()

Prep work for the next patch, to defer journal entry validation: we now
track for each replica whether we had a good checksum.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: time stats now uses the mean_and_variance module.
Daniel Hill [Thu, 11 Aug 2022 21:03:28 +0000 (09:03 +1200)]
bcachefs: time stats now uses the mean_and_variance module.

Signed-off-by: Daniel Hill <daniel@gluo.nz>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Mean and variance
Daniel Hill [Sat, 6 Aug 2022 02:48:49 +0000 (14:48 +1200)]
bcachefs: Mean and variance

This module provides a fast 64bit implementation of basic statistics
functions, including mean, variance and standard deviation in both
weighted and unweighted variants, the unweighted variant has a 32bit
limitation per sample to prevent overflow when squaring.

Signed-off-by: Daniel Hill <daniel@gluo.nz>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix for not dropping privs in fallocate
Kent Overstreet [Thu, 13 Oct 2022 04:44:34 +0000 (00:44 -0400)]
bcachefs: Fix for not dropping privs in fallocate

When modifying a file, we may be required to drop the suid/sgid bits -
we were missing a file_modified() call to do this.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix bch2_write_begin()
Kent Overstreet [Thu, 13 Oct 2022 04:24:17 +0000 (00:24 -0400)]
bcachefs: Fix bch2_write_begin()

An error case was jumping to the wrong label, creating an infinite loop
- oops.

This fixes fstests generic/648.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agofixup bcachefs: Deadlock cycle detector
Kent Overstreet [Fri, 20 Jan 2023 20:35:07 +0000 (15:35 -0500)]
fixup bcachefs: Deadlock cycle detector

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agofixup bcachefs: Deadlock cycle detector
Kent Overstreet [Fri, 20 Jan 2023 20:35:07 +0000 (15:35 -0500)]
fixup bcachefs: Deadlock cycle detector

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix lock_graph_remove_non_waiters()
Kent Overstreet [Wed, 12 Oct 2022 22:17:49 +0000 (18:17 -0400)]
bcachefs: Fix lock_graph_remove_non_waiters()

We were removing 1 more entry than we were supposed to - oops.

Also some other simplifications and cleanups, and bring back the abort
preference code in a better fashion.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Support FS_XFLAG_PROJINHERIT
Kent Overstreet [Wed, 12 Oct 2022 20:21:08 +0000 (16:21 -0400)]
bcachefs: Support FS_XFLAG_PROJINHERIT

We already have support for the flag's semantics: inode options are
inherited by children if they were explicitly set on the parent. This
patch just maps the FS_XFLAG_PROJINHERIT flag to the "this option was
epxlicitly set" bit.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Don't allow hardlinks when inherited attrs would change
Kent Overstreet [Wed, 12 Oct 2022 20:12:27 +0000 (16:12 -0400)]
bcachefs: Don't allow hardlinks when inherited attrs would change

This is the right thing to do, and conforms with our own behaviour on
rename and xfs's behaviour on hardlink.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Initialize sb_quota with default 1 week timer
Kent Overstreet [Wed, 12 Oct 2022 18:47:58 +0000 (14:47 -0400)]
bcachefs: Initialize sb_quota with default 1 week timer

For compliance with other quota implementations, we should be
initializing quota information with a default 1 week timelimit: this
fixes fstests generic/235.

Also, this adds to_text() functions for some quota structs - useful
debugging aids.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Call bch2_btree_update_add_new_node() before dropping write lock
Kent Overstreet [Wed, 12 Oct 2022 15:04:28 +0000 (11:04 -0400)]
bcachefs: Call bch2_btree_update_add_new_node() before dropping write lock

btree nodes can be written by other threads (shrinker, journal reclaim)
with only a read lock, but brand new nodes should only be written by the
thread doing the split/interior update. bch2_btree_update_add_new_node()
sets btree node flags to indicate that this is a new node and should not
be written out by other threads, thus we need to call it before dropping
our write lock.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Reflink now respects quotas
Kent Overstreet [Tue, 11 Oct 2022 08:32:14 +0000 (04:32 -0400)]
bcachefs: Reflink now respects quotas

This adds a new helper, quota_reserve_range(), which takes a quota
reservation for unallocated blocks in a given file range, and uses it in
bch2_remap_file_range().

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix a rare path in bch2_btree_path_peek_slot()
Kent Overstreet [Wed, 12 Oct 2022 11:58:50 +0000 (07:58 -0400)]
bcachefs: Fix a rare path in bch2_btree_path_peek_slot()

In the drop_alloc tests, we may end up calling
bch2_btree_iter_peek_slot() on an interior level that doesn't exist.
Previously, this would hit the path->uptodate assertion in
bch2_btree_path_peek_slot(); this path first checks a NULL btree node,
which is how we know we're at the end of the btree.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: bch2_path_put_nokeep()
Kent Overstreet [Tue, 11 Oct 2022 10:37:56 +0000 (06:37 -0400)]
bcachefs: bch2_path_put_nokeep()

The btree iterator code may allocate extra btree paths, temporarily,
that do not refer to keys being returned: we don't need to wait until
transaction restart to drop these, when they're not referenced they
should be deleted right away.

This fixes a transaction path overflow bug.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix cached data accounting
Kent Overstreet [Tue, 11 Oct 2022 08:49:23 +0000 (04:49 -0400)]
bcachefs: Fix cached data accounting

Negating without casting to a signed integer means the value wasn't
getting sign extended properly - oops.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Btree splits now only take the locks they need
Kent Overstreet [Tue, 27 Sep 2022 22:57:34 +0000 (18:57 -0400)]
bcachefs: Btree splits now only take the locks they need

Previously, bch2_btree_update_start() would always take all intent
locks, all the way up to the root.

We've finally got data from users where this became a scalability issue
- so, this patch fixes bch2_btree_update_start() to only take the locks
we need.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: bch2_btree_iter_peek() now works with interior nodes
Kent Overstreet [Mon, 10 Oct 2022 02:25:19 +0000 (22:25 -0400)]
bcachefs: bch2_btree_iter_peek() now works with interior nodes

Needed by the next patch, which will be iterating over keys in nodes at
level 1.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: bch2_btree_insert_node() no longer uses lock_write_nofail
Kent Overstreet [Sun, 9 Oct 2022 09:04:38 +0000 (05:04 -0400)]
bcachefs: bch2_btree_insert_node() no longer uses lock_write_nofail

Now that we have an error path plumbed through, there's no need to be
using bch2_btree_node_lock_write_nofail().

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Add error path to btree_split()
Kent Overstreet [Sun, 2 Oct 2022 02:15:30 +0000 (22:15 -0400)]
bcachefs: Add error path to btree_split()

The next patch in the series is (finally!) going to change btree splits
(and interior updates in general) to not take intent locks all the way
up to the root - instead only locking the nodes they'll need to modify.

However, this will be introducing a race since if we're not holding a
write lock on a btree node it can be written out by another thread, and
then we might not have enough space for a new bset entry.

We can handle this by retrying - we just need to introduce a new error
path.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Write new btree nodes after parent update
Kent Overstreet [Sat, 1 Oct 2022 04:34:02 +0000 (00:34 -0400)]
bcachefs: Write new btree nodes after parent update

In order to avoid locking all btree nodes up to the root for btree node
splits, we're going to have to introduce a new error path into
bch2_btree_insert_node(); this mean we can't have done any writes or
modified global state before that point.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Simplify break_cycle()
Kent Overstreet [Sun, 9 Oct 2022 08:55:02 +0000 (04:55 -0400)]
bcachefs: Simplify break_cycle()

We'd like to prioritize aborting transactions that have done less work -
however, it appears breaking cycles by telling other threads to abort
may still be buggy, so disable that for now.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Print cycle on unrecoverable deadlock
Kent Overstreet [Sun, 9 Oct 2022 08:29:04 +0000 (04:29 -0400)]
bcachefs: Print cycle on unrecoverable deadlock

Some lock operations can't fail; a cycle of nofail locks is impossible
to recover from. So we want to get rid of these nofail locking
operations, but as this is tricky it'll be done incrementally.

If such a cycle happens, this patch prints out which codepaths are
involved so we know what to work on next.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Handle dropping pointers in data_update path
Kent Overstreet [Sun, 9 Oct 2022 07:32:17 +0000 (03:32 -0400)]
bcachefs: Handle dropping pointers in data_update path

Cached pointers are generally dropped, not moved: this led to an
assertion firing in the data update path when there were no new replicas
being written.

This path adds a data_options field for pointers to be dropped, and
tweaks move_extent() to check if we're only dropping pointers, not
writing new ones, before kicking off a data update operation.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Ratelimit ec error message
Kent Overstreet [Sun, 9 Oct 2022 06:30:50 +0000 (02:30 -0400)]
bcachefs: Ratelimit ec error message

We should fix this, but for now this makes this more usable.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Use btree_type_has_ptrs() more consistently
Kent Overstreet [Sun, 9 Oct 2022 06:25:53 +0000 (02:25 -0400)]
bcachefs: Use btree_type_has_ptrs() more consistently

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix "multiple types of data in same bucket" with ec
Kent Overstreet [Sun, 9 Oct 2022 05:08:51 +0000 (01:08 -0400)]
bcachefs: Fix "multiple types of data in same bucket" with ec

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Ensure fsck error is printed before panic
Kent Overstreet [Sun, 9 Oct 2022 04:54:36 +0000 (00:54 -0400)]
bcachefs: Ensure fsck error is printed before panic

When errors=panic, we want to make sure we print the error before
calling bch2_inconsistent_error().

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix a deadlock in btree_update_nodes_written()
Kent Overstreet [Mon, 3 Oct 2022 20:41:17 +0000 (16:41 -0400)]
bcachefs: Fix a deadlock in btree_update_nodes_written()

btree_node_lock_nopath() is something we'd like to get rid of, it's
always prone to deadlocks if we accidentally are holding other locks,
because it doesn't mark the lock it's taking in a path: we'll want to
get rid of it in the future, but for now this patch works it by calling
bch2_trans_unlock().

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: bch2_trans_locked()
Kent Overstreet [Mon, 3 Oct 2022 20:39:49 +0000 (16:39 -0400)]
bcachefs: bch2_trans_locked()

Useful debugging function.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Improve btree_deadlock debugfs output
Kent Overstreet [Sun, 2 Oct 2022 05:41:08 +0000 (01:41 -0400)]
bcachefs: Improve btree_deadlock debugfs output

This changes bch2_check_for_deadlock() to print the longest chains it
finds - when we have a deadlock because the cycle detector isn't finding
something, this will let us see what it's missing.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Don't quash error in bch2_bucket_alloc_set_trans()
Kent Overstreet [Sun, 2 Oct 2022 03:54:46 +0000 (23:54 -0400)]
bcachefs: Don't quash error in bch2_bucket_alloc_set_trans()

We were incorrectly returning -BCH_ERR_insufficient_devices when we'd
received a different error from bch2_bucket_alloc_trans(), which
(erronously) turns into -EROFS further up the call chain.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix a trans path overflow in bch2_btree_delete_range_trans()
Kent Overstreet [Wed, 28 Sep 2022 14:16:57 +0000 (10:16 -0400)]
bcachefs: Fix a trans path overflow in bch2_btree_delete_range_trans()

bch2_btree_delete_range_trans() was using btree_trans_too_many_iters()
to avoid path overflow, but this was buggy here (and also
btree_trans_too_many_iters() is suspect in general).

btree_trans_too_many_iters() only returns true when we're close to the
maximum number of paths - within 8 - but extent insert/delete assumes
that it can use more paths than that.

Instead, we need to call bch2_trans_begin() on every loop iteration.
Since we don't want to call bch2_trans_begin() (restarting the outer
transaction) if the call was a no-op - if we had no work to do - we have
to structure things a bit oddly.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: bucket_alloc_state
Kent Overstreet [Fri, 4 Nov 2022 20:06:55 +0000 (16:06 -0400)]
bcachefs: bucket_alloc_state

This refactoring puts our various allocation path counters into a
dedicated struct - the upcoming nocow patch is going to add another
counter.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Fix bch2_btree_path_up_until_good_node()
Kent Overstreet [Tue, 27 Sep 2022 22:56:57 +0000 (18:56 -0400)]
bcachefs: Fix bch2_btree_path_up_until_good_node()

There was a rare bug when path->locks_want was nonzero, but not
BTREE_MAX_DEPTH, where we'd return on a valid node that wasn't locked -
oops.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Factor out bch2_write_drop_io_error_ptrs()
Kent Overstreet [Tue, 27 Sep 2022 21:17:23 +0000 (17:17 -0400)]
bcachefs: Factor out bch2_write_drop_io_error_ptrs()

Move slowpath code to a separate, non-inline function.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
18 months agobcachefs: Break out bch2_btree_path_traverse_cached_slowpath()
Kent Overstreet [Tue, 27 Sep 2022 02:34:49 +0000 (22:34 -0400)]
bcachefs: Break out bch2_btree_path_traverse_cached_slowpath()

Prep work for further refactoring.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>