]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
Update bcachefs sources to 1a510b00b6 bcachefs: Increase BTREE_TRANS_MEM_MAX
authorKent Overstreet <kent.overstreet@gmail.com>
Sun, 4 Jul 2021 17:33:53 +0000 (13:33 -0400)
committerKent Overstreet <kent.overstreet@gmail.com>
Mon, 5 Jul 2021 03:33:54 +0000 (23:33 -0400)
19 files changed:
.bcachefs_revision
INSTALL
Kbuild.include [deleted file]
Makefile
cmd_format.c
libbcachefs.c
libbcachefs/acl.c
libbcachefs/bkey.c
libbcachefs/bset.c
libbcachefs/btree_gc.c
libbcachefs/btree_io.c
libbcachefs/btree_iter.c
libbcachefs/btree_types.h
libbcachefs/fs-io.c
libbcachefs/fs.c
libbcachefs/io.c
libbcachefs/migrate.c
tools-util.c
tools-util.h

index 57211d2511b03d1bb139ec1a59946134300bb326..a9a38b645f6e1f807685ad05c5c4a3808134a786 100644 (file)
@@ -1 +1 @@
-ca3cfad39f915257eecda93599c8b434ce80e0b2
+1a510b00b6d1498190197cf804585959449380cb
diff --git a/INSTALL b/INSTALL
index f6c6041ed2fc6d90990c34e098451d4cfcaabe9e..85c09a2157119ad86dde0f4712893ed4cdb59db0 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -32,10 +32,6 @@ Or to build from source, install libscrypt from the AUR along with,
 
 Then, just make && make install
 
--- Debug build --
-
-In order to perform extra checks on bcachefs tools, abort on any unforeseen warning and include support for valgrind, use 'make debug'.
-This target will decrease performance and is specifically meant for developers
 
 -- Experimental features --
 
diff --git a/Kbuild.include b/Kbuild.include
deleted file mode 100644 (file)
index 509e085..0000000
+++ /dev/null
@@ -1,319 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-####
-# kbuild: Generic definitions
-
-# Convenient variables
-comma   := ,
-quote   := "
-squote  := '
-empty   :=
-space   := $(empty) $(empty)
-space_escape := _-_SPACE_-_
-pound := \#
-
-###
-# Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o
-dot-target = $(dir $@).$(notdir $@)
-
-###
-# The temporary file to save gcc -MMD generated dependencies must not
-# contain a comma
-depfile = $(subst $(comma),_,$(dot-target).d)
-
-###
-# filename of target with directory and extension stripped
-basetarget = $(basename $(notdir $@))
-
-###
-# real prerequisites without phony targets
-real-prereqs = $(filter-out $(PHONY), $^)
-
-###
-# Escape single quote for use in echo statements
-escsq = $(subst $(squote),'\$(squote)',$1)
-
-###
-# Quote a string to pass it to C files. foo => '"foo"'
-stringify = $(squote)$(quote)$1$(quote)$(squote)
-
-###
-# Easy method for doing a status message
-       kecho := :
- quiet_kecho := echo
-silent_kecho := :
-kecho := $($(quiet)kecho)
-
-###
-# filechk is used to check if the content of a generated file is updated.
-# Sample usage:
-#
-# filechk_sample = echo $(KERNELRELEASE)
-# version.h: FORCE
-#      $(call filechk,sample)
-#
-# The rule defined shall write to stdout the content of the new file.
-# The existing file will be compared with the new one.
-# - If no file exist it is created
-# - If the content differ the new file is used
-# - If they are equal no change, and no timestamp update
-define filechk
-       $(Q)set -e;                                             \
-       mkdir -p $(dir $@);                                     \
-       trap "rm -f $(dot-target).tmp" EXIT;                    \
-       { $(filechk_$(1)); } > $(dot-target).tmp;               \
-       if [ ! -r $@ ] || ! cmp -s $@ $(dot-target).tmp; then   \
-               $(kecho) '  UPD     $@';                        \
-               mv -f $(dot-target).tmp $@;                     \
-       fi
-endef
-
-######
-# gcc support functions
-# See documentation in Documentation/kbuild/makefiles.rst
-
-# cc-cross-prefix
-# Usage: CROSS_COMPILE := $(call cc-cross-prefix, m68k-linux-gnu- m68k-linux-)
-# Return first <prefix> where a <prefix>gcc is found in PATH.
-# If no gcc found in PATH with listed prefixes return nothing
-#
-# Note: '2>/dev/null' is here to force Make to invoke a shell. Otherwise, it
-# would try to directly execute the shell builtin 'command'. This workaround
-# should be kept for a long time since this issue was fixed only after the
-# GNU Make 4.2.1 release.
-cc-cross-prefix = $(firstword $(foreach c, $(1), \
-                       $(if $(shell command -v -- $(c)gcc 2>/dev/null), $(c))))
-
-# output directory for tests below
-TMPOUT = $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_$$$$
-
-# try-run
-# Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise)
-# Exit code chooses option. "$$TMP" serves as a temporary file and is
-# automatically cleaned up.
-try-run = $(shell set -e;              \
-       TMP=$(TMPOUT)/tmp;              \
-       TMPO=$(TMPOUT)/tmp.o;           \
-       mkdir -p $(TMPOUT);             \
-       trap "rm -rf $(TMPOUT)" EXIT;   \
-       if ($(1)) >/dev/null 2>&1;      \
-       then echo "$(2)";               \
-       else echo "$(3)";               \
-       fi)
-
-# as-option
-# Usage: cflags-y += $(call as-option,-Wa$(comma)-isa=foo,)
-
-as-option = $(call try-run,\
-       $(CC) $(KBUILD_CFLAGS) $(1) -c -x assembler /dev/null -o "$$TMP",$(1),$(2))
-
-# as-instr
-# Usage: cflags-y += $(call as-instr,instr,option1,option2)
-
-as-instr = $(call try-run,\
-       printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3))
-
-# __cc-option
-# Usage: MY_CFLAGS += $(call __cc-option,$(CC),$(MY_CFLAGS),-march=winchip-c6,-march=i586)
-__cc-option = $(call try-run,\
-       $(1) -Werror $(2) $(3) -c -x c /dev/null -o "$$TMP",$(3),$(4))
-
-# cc-option
-# Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)
-
-cc-option = $(call __cc-option, $(CC),\
-       $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS),$(1),$(2))
-
-# cc-option-yn
-# Usage: flag := $(call cc-option-yn,-march=winchip-c6)
-cc-option-yn = $(call try-run,\
-       $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n)
-
-# cc-disable-warning
-# Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable)
-cc-disable-warning = $(call try-run,\
-       $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
-
-# cc-ifversion
-# Usage:  EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1)
-cc-ifversion = $(shell [ $(CONFIG_GCC_VERSION)0 $(1) $(2)000 ] && echo $(3) || echo $(4))
-
-# ld-option
-# Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y)
-ld-option = $(call try-run, $(LD) $(KBUILD_LDFLAGS) $(1) -v,$(1),$(2),$(3))
-
-# ld-ifversion
-# Usage:  $(call ld-ifversion, -ge, 22252, y)
-ld-ifversion = $(shell [ $(CONFIG_LD_VERSION)0 $(1) $(2)0 ] && echo $(3) || echo $(4))
-
-######
-
-###
-# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
-# Usage:
-# $(Q)$(MAKE) $(build)=dir
-build := -f $(srctree)/scripts/Makefile.build obj
-
-###
-# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.dtbinst obj=
-# Usage:
-# $(Q)$(MAKE) $(dtbinst)=dir
-dtbinst := -f $(srctree)/scripts/Makefile.dtbinst obj
-
-###
-# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=
-# Usage:
-# $(Q)$(MAKE) $(clean)=dir
-clean := -f $(srctree)/scripts/Makefile.clean obj
-
-# echo command.
-# Short version is used, if $(quiet) equals `quiet_', otherwise full one.
-echo-cmd = $(if $($(quiet)cmd_$(1)),\
-       echo '  $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';)
-
-# printing commands
-cmd = @set -e; $(echo-cmd) $(cmd_$(1))
-
-###
-# if_changed      - execute command if any prerequisite is newer than
-#                   target, or command line has changed
-# if_changed_dep  - as if_changed, but uses fixdep to reveal dependencies
-#                   including used config symbols
-# if_changed_rule - as if_changed but execute rule instead
-# See Documentation/kbuild/makefiles.rst for more info
-
-ifneq ($(KBUILD_NOCMDDEP),1)
-# Check if both commands are the same including their order. Result is empty
-# string if equal. User may override this check using make KBUILD_NOCMDDEP=1
-cmd-check = $(filter-out $(subst $(space),$(space_escape),$(strip $(cmd_$@))), \
-                         $(subst $(space),$(space_escape),$(strip $(cmd_$1))))
-else
-cmd-check = $(if $(strip $(cmd_$@)),,1)
-endif
-
-# Replace >$< with >$$< to preserve $ when reloading the .cmd file
-# (needed for make)
-# Replace >#< with >$(pound)< to avoid starting a comment in the .cmd file
-# (needed for make)
-# Replace >'< with >'\''< to be able to enclose the whole string in '...'
-# (needed for the shell)
-make-cmd = $(call escsq,$(subst $(pound),$$(pound),$(subst $$,$$$$,$(cmd_$(1)))))
-
-# Find any prerequisites that are newer than target or that do not exist.
-# (This is not true for now; $? should contain any non-existent prerequisites,
-# but it does not work as expected when .SECONDARY is present. This seems a bug
-# of GNU Make.)
-# PHONY targets skipped in both cases.
-newer-prereqs = $(filter-out $(PHONY),$?)
-
-# Execute command if command has changed or prerequisite(s) are updated.
-if_changed = $(if $(newer-prereqs)$(cmd-check),                              \
-       $(cmd);                                                              \
-       printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
-
-# Execute the command and also postprocess generated .d dependencies file.
-if_changed_dep = $(if $(newer-prereqs)$(cmd-check),$(cmd_and_fixdep),@:)
-
-cmd_and_fixdep =                                                             \
-       $(cmd);                                                              \
-       scripts/basic/fixdep $(depfile) $@ '$(make-cmd)' > $(dot-target).cmd;\
-       rm -f $(depfile)
-
-# Usage: $(call if_changed_rule,foo)
-# Will check if $(cmd_foo) or any of the prerequisites changed,
-# and if so will execute $(rule_foo).
-if_changed_rule = $(if $(newer-prereqs)$(cmd-check),$(rule_$(1)),@:)
-
-###
-# why - tell why a target got built
-#       enabled by make V=2
-#       Output (listed in the order they are checked):
-#          (1) - due to target is PHONY
-#          (2) - due to target missing
-#          (3) - due to: file1.h file2.h
-#          (4) - due to command line change
-#          (5) - due to missing .cmd file
-#          (6) - due to target not in $(targets)
-# (1) PHONY targets are always build
-# (2) No target, so we better build it
-# (3) Prerequisite is newer than target
-# (4) The command line stored in the file named dir/.target.cmd
-#     differed from actual command line. This happens when compiler
-#     options changes
-# (5) No dir/.target.cmd file (used to store command line)
-# (6) No dir/.target.cmd file and target not listed in $(targets)
-#     This is a good hint that there is a bug in the kbuild file
-ifeq ($(KBUILD_VERBOSE),2)
-why =                                                                        \
-    $(if $(filter $@, $(PHONY)),- due to target is PHONY,                    \
-        $(if $(wildcard $@),                                                 \
-            $(if $(newer-prereqs),- due to: $(newer-prereqs),                \
-                $(if $(cmd-check),                                           \
-                    $(if $(cmd_$@),- due to command line change,             \
-                        $(if $(filter $@, $(targets)),                       \
-                            - due to missing .cmd file,                      \
-                            - due to $(notdir $@) not in $$(targets)         \
-                         )                                                   \
-                     )                                                       \
-                 )                                                           \
-             ),                                                              \
-             - due to target missing                                         \
-         )                                                                   \
-     )
-
-echo-why = $(call escsq, $(strip $(why)))
-endif
-
-###############################################################################
-#
-# When a Kconfig string contains a filename, it is suitable for
-# passing to shell commands. It is surrounded by double-quotes, and
-# any double-quotes or backslashes within it are escaped by
-# backslashes.
-#
-# This is no use for dependencies or $(wildcard). We need to strip the
-# surrounding quotes and the escaping from quotes and backslashes, and
-# we *do* need to escape any spaces in the string. So, for example:
-#
-# Usage: $(eval $(call config_filename,FOO))
-#
-# Defines FOO_FILENAME based on the contents of the CONFIG_FOO option,
-# transformed as described above to be suitable for use within the
-# makefile.
-#
-# Also, if the filename is a relative filename and exists in the source
-# tree but not the build tree, define FOO_SRCPREFIX as $(srctree)/ to
-# be prefixed to *both* command invocation and dependencies.
-#
-# Note: We also print the filenames in the quiet_cmd_foo text, and
-# perhaps ought to have a version specially escaped for that purpose.
-# But it's only cosmetic, and $(patsubst "%",%,$(CONFIG_FOO)) is good
-# enough.  It'll strip the quotes in the common case where there's no
-# space and it's a simple filename, and it'll retain the quotes when
-# there's a space. There are some esoteric cases in which it'll print
-# the wrong thing, but we don't really care. The actual dependencies
-# and commands *do* get it right, with various combinations of single
-# and double quotes, backslashes and spaces in the filenames.
-#
-###############################################################################
-#
-define config_filename
-ifneq ($$(CONFIG_$(1)),"")
-$(1)_FILENAME := $$(subst \\,\,$$(subst \$$(quote),$$(quote),$$(subst $$(space_escape),\$$(space),$$(patsubst "%",%,$$(subst $$(space),$$(space_escape),$$(CONFIG_$(1)))))))
-ifneq ($$(patsubst /%,%,$$(firstword $$($(1)_FILENAME))),$$(firstword $$($(1)_FILENAME)))
-else
-ifeq ($$(wildcard $$($(1)_FILENAME)),)
-ifneq ($$(wildcard $$(srctree)/$$($(1)_FILENAME)),)
-$(1)_SRCPREFIX := $(srctree)/
-endif
-endif
-endif
-endif
-endef
-#
-###############################################################################
-
-# delete partially updated (i.e. corrupted) files on error
-.DELETE_ON_ERROR:
-
-# do not delete intermediate files automatically
-.SECONDARY:
index 6424433b9acdb91ac84e2ea158ae23b2557a2c6e..23cb6c0712095e97367f2280949c7db0ef75c40f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -22,15 +22,26 @@ LDFLAGS+=$(CFLAGS) $(EXTRA_LDFLAGS)
 
 VERSION?=$(shell git describe --dirty=+ 2>/dev/null || echo v0.1-nogit)
 
-include Kbuild.include
+CC_VERSION=$(shell $(CC) -v 2>&1|grep -E '(gcc|clang) version')
 
-CFLAGS+=$(call cc-disable-warning, unused-but-set-variable)
-CFLAGS+=$(call cc-disable-warning, stringop-overflow)
-CFLAGS+=$(call cc-disable-warning, zero-length-bounds)
-CFLAGS+=$(call cc-disable-warning, missing-braces)
-CFLAGS+=$(call cc-disable-warning, zero-length-array)
-CFLAGS+=$(call cc-disable-warning, shift-overflow)
-CFLAGS+=$(call cc-disable-warning, enum-conversion)
+ifneq (,$(findstring gcc,$(CC_VERSION)))
+       CFLAGS+=-Wno-unused-but-set-variable                    \
+               -Wno-zero-length-bounds                         \
+               -Wno-stringop-overflow
+endif
+
+ifneq (,$(findstring clang,$(CC_VERSION)))
+       CFLAGS+=-Wno-missing-braces                             \
+               -Wno-zero-length-array                          \
+               -Wno-shift-overflow                             \
+               -Wno-enum-conversion
+endif
+
+ifdef BCACHEFS_DEBUG
+       CFLAGS+=-Werror
+       CFLAGS+=-DCONFIG_BCACHEFS_DEBUG=y
+endif
+       CFLAGS+=-DCONFIG_VALGRIND=y
 
 PKGCONFIG_LIBS="blkid uuid liburcu libsodium zlib liblz4 libzstd libudev"
 ifdef BCACHEFS_FUSE
@@ -87,10 +98,6 @@ bcachefs: $(filter-out ./tests/%.o, $(OBJS))
 
 MOUNT_SRCS=$(shell find mount/src -type f -iname '*.rs') \
     mount/Cargo.toml mount/Cargo.lock mount/build.rs
-
-debug: CFLAGS+=-Werror -DCONFIG_BCACHEFS_DEBUG=y -DCONFIG_VALGRIND=y
-debug: bcachefs
-
 libbcachefs_mount.a: $(MOUNT_SRCS)
        LIBBCACHEFS_INCLUDE=$(CURDIR) cargo build --manifest-path mount/Cargo.toml --release
        cp mount/target/release/libbcachefs_mount.a $@
@@ -155,8 +162,6 @@ update-bcachefs-sources:
        git add include/linux/list_nulls.h
        cp $(LINUX_DIR)/include/linux/poison.h include/linux/
        git add include/linux/poison.h
-       cp $(LINUX_DIR)/scripts/Kbuild.include ./
-       git add Kbuild.include
        $(RM) libbcachefs/*.mod.c
        git -C $(LINUX_DIR) rev-parse HEAD | tee .bcachefs_revision
        git add .bcachefs_revision
index 372ca8f830d69537752c1740d9e28741de09225d..3f96f5de3c221acb8cfafca33bd12acb0003aef8 100644 (file)
@@ -258,7 +258,7 @@ int cmd_format(int argc, char *argv[])
                                                darray_size(device_paths),
                                                bch2_opts_empty());
                if (IS_ERR(c))
-                       die("error opening %s: %s", device_paths.item[0],
+                       die("error opening %s: %s", device_paths.item,
                            strerror(-PTR_ERR(c)));
 
                bch2_fs_stop(c);
index d0c58da7f5fd1088d34a368c2a4f109c6cffc240..34246dc9106d5ffd83712f4b6571b4e91e042abe 100644 (file)
@@ -257,7 +257,7 @@ struct bch_sb *bch2_format(struct bch_opt_strs      fs_opt_strs,
 
                idx = bch2_disk_path_find_or_create(&sb, i->group);
                if (idx < 0)
-                       die("error creating disk path: %s", i->group);
+                       die("error creating disk path: %s", idx);
 
                SET_BCH_MEMBER_GROUP(m, idx + 1);
        }
index 74cb188f74c603e59ce6a565e9f11bf3fd713b11..5408a9225fe50025af1badea356541c6422d10cb 100644 (file)
@@ -370,7 +370,7 @@ int bch2_acl_chmod(struct btree_trans *trans,
        acl = bch2_acl_from_disk(xattr_val(xattr.v),
                        le16_to_cpu(xattr.v->x_val_len));
        ret = PTR_ERR_OR_ZERO(acl);
-       if (ret || !acl)
+       if (IS_ERR_OR_NULL(acl))
                goto err;
 
        ret = __posix_acl_chmod(&acl, GFP_KERNEL, mode);
@@ -389,7 +389,8 @@ int bch2_acl_chmod(struct btree_trans *trans,
        acl = NULL;
 err:
        bch2_trans_iter_put(trans, iter);
-       kfree(acl);
+       if (!IS_ERR_OR_NULL(acl))
+               kfree(acl);
        return ret;
 }
 
index 0053f32c0076b9d268c145190853e493f030b42a..946dd27f09fca86502a94c377020e234b2caa54b 100644 (file)
@@ -620,22 +620,22 @@ const char *bch2_bkey_format_validate(struct bkey_format *f)
        if (f->nr_fields != BKEY_NR_FIELDS)
                return "incorrect number of fields";
 
+       /*
+        * Verify that the packed format can't represent fields larger than the
+        * unpacked format:
+        */
        for (i = 0; i < f->nr_fields; i++) {
                unsigned unpacked_bits = bch2_bkey_format_current.bits_per_field[i];
-               u64 unpacked_mask = ~((~0ULL << 1) << (unpacked_bits - 1));
+               u64 unpacked_max = ~((~0ULL << 1) << (unpacked_bits - 1));
+               u64 packed_max = f->bits_per_field[i]
+                       ? ~((~0ULL << 1) << (f->bits_per_field[i] - 1))
+                       : 0;
                u64 field_offset = le64_to_cpu(f->field_offset[i]);
 
-               if (f->bits_per_field[i] > unpacked_bits)
+               if (packed_max + field_offset < packed_max ||
+                   packed_max + field_offset > unpacked_max)
                        return "field too large";
 
-               if ((f->bits_per_field[i] == unpacked_bits) && field_offset)
-                       return "offset + bits overflow";
-
-               if (((field_offset + ((1ULL << f->bits_per_field[i]) - 1)) &
-                    unpacked_mask) <
-                   field_offset)
-                       return "offset + bits overflow";
-
                bits += f->bits_per_field[i];
        }
 
index 8a149e21d0b47beaf8903a8f123ba24057ce6670..0eb85acdbf8bcaec42dfa6f5e33ee69df83fa9d4 100644 (file)
@@ -1193,7 +1193,7 @@ static struct bkey_packed *bset_search_write_set(const struct btree *b,
 
 static inline void prefetch_four_cachelines(void *p)
 {
-#if CONFIG_X86_64
+#ifdef CONFIG_X86_64
        asm("prefetcht0 (-127 + 64 * 0)(%0);"
            "prefetcht0 (-127 + 64 * 1)(%0);"
            "prefetcht0 (-127 + 64 * 2)(%0);"
index 5c03eb937ab4fedcfe9b28e4cfea992d73d86d56..bfd02886016270520e2872cd82f524476be067bc 100644 (file)
@@ -303,6 +303,9 @@ again:
        bch2_btree_and_journal_iter_init_node_iter(&iter, c, b);
 
        while ((k = bch2_btree_and_journal_iter_peek(&iter)).k) {
+               BUG_ON(bpos_cmp(k.k->p, b->data->min_key) < 0);
+               BUG_ON(bpos_cmp(k.k->p, b->data->max_key) > 0);
+
                bch2_btree_and_journal_iter_advance(&iter);
                bch2_bkey_buf_reassemble(&cur_k, c, k);
 
index f2ccb5f39a6d6a5782ab70aa7309248075c5d58b..c354dd1aefb9e365f5772ca2fae5c8cb4a72111a 100644 (file)
@@ -565,13 +565,16 @@ out:                                                                      \
 void bch2_btree_node_drop_keys_outside_node(struct btree *b)
 {
        struct bset_tree *t;
+       struct bkey_s_c k;
+       struct bkey unpacked;
+       struct btree_node_iter iter;
 
        for_each_bset(b, t) {
                struct bset *i = bset(b, t);
                struct bkey_packed *k;
 
                for (k = i->start; k != vstruct_last(i); k = bkey_next(k))
-                       if (bkey_cmp_left_packed(b, k, &b->data->min_key) < 0)
+                       if (bkey_cmp_left_packed(b, k, &b->data->min_key) >= 0)
                                break;
 
                if (k != i->start) {
@@ -596,6 +599,11 @@ void bch2_btree_node_drop_keys_outside_node(struct btree *b)
        }
 
        bch2_btree_build_aux_trees(b);
+
+       for_each_btree_node_key_unpack(b, k, &iter, &unpacked) {
+               BUG_ON(bpos_cmp(k.k->p, b->data->min_key) < 0);
+               BUG_ON(bpos_cmp(k.k->p, b->data->max_key) > 0);
+       }
 }
 
 static int validate_bset(struct bch_fs *c, struct bch_dev *ca,
index c356032be3ec43938eed81339740abde9d247e13..d2a8121c52c9989bcfb554acb0c3e72adf4cc92b 100644 (file)
@@ -1542,7 +1542,9 @@ struct btree *bch2_btree_iter_next_node(struct btree_iter *iter)
 
 static void btree_iter_set_search_pos(struct btree_iter *iter, struct bpos new_pos)
 {
+#ifdef CONFIG_BCACHEFS_DEBUG
        struct bpos old_pos = iter->real_pos;
+#endif
        int cmp = bpos_cmp(new_pos, iter->real_pos);
        unsigned l = iter->level;
 
@@ -1761,7 +1763,7 @@ struct bkey_s_c bch2_btree_iter_peek_prev(struct btree_iter *iter)
                if (!k.k ||
                    ((iter->flags & BTREE_ITER_IS_EXTENTS)
                     ? bkey_cmp(bkey_start_pos(k.k), iter->pos) >= 0
-                    : bkey_cmp(bkey_start_pos(k.k), iter->pos) > 0))
+                    : bkey_cmp(k.k->p, iter->pos) > 0))
                        k = btree_iter_level_prev(iter, l);
 
                if (likely(k.k))
index a923757c07da580f772171ef34c72df27f9d4296..ec5195daead4998bad4f16d511d48ee7bf6c3ea4 100644 (file)
@@ -363,7 +363,7 @@ struct btree_trans_commit_hook {
        struct btree_trans_commit_hook  *next;
 };
 
-#define BTREE_TRANS_MEM_MAX    4096
+#define BTREE_TRANS_MEM_MAX    (1U << 14)
 
 struct btree_trans {
        struct bch_fs           *c;
index 0fbfa622586ecf14f36cfe559032ad28b4e1b892..b6eaaa0dd67c71d95daef56bf619d2c543ba781d 100644 (file)
@@ -2307,16 +2307,17 @@ int bch2_truncate(struct user_namespace *mnt_userns,
        int ret = 0;
 
        /*
-        * Don't update timestamps if we're not doing anything:
+        * If the truncate call with change the size of the file, the
+        * cmtimes should be updated. If the size will not change, we
+        * do not need to update the cmtimes.
         */
-       if (iattr->ia_size == inode->v.i_size)
-               return 0;
-
-       if (!(iattr->ia_valid & ATTR_MTIME))
-               ktime_get_coarse_real_ts64(&iattr->ia_mtime);
-       if (!(iattr->ia_valid & ATTR_CTIME))
-               ktime_get_coarse_real_ts64(&iattr->ia_ctime);
-       iattr->ia_valid |= ATTR_MTIME|ATTR_CTIME;
+       if (iattr->ia_size != inode->v.i_size) {
+               if (!(iattr->ia_valid & ATTR_MTIME))
+                       ktime_get_coarse_real_ts64(&iattr->ia_mtime);
+               if (!(iattr->ia_valid & ATTR_CTIME))
+                       ktime_get_coarse_real_ts64(&iattr->ia_ctime);
+               iattr->ia_valid |= ATTR_MTIME|ATTR_CTIME;
+       }
 
        inode_dio_wait(&inode->v);
        bch2_pagecache_block_get(&inode->ei_pagecache_lock);
index d2133053fbd3cf694a3530e25ebc8578cd02259c..0e5baa8214a41a1efcc78d869e7840b07ed9543f 100644 (file)
@@ -1274,8 +1274,8 @@ static int bch2_statfs(struct dentry *dentry, struct kstatfs *buf)
        buf->f_type     = BCACHEFS_STATFS_MAGIC;
        buf->f_bsize    = sb->s_blocksize;
        buf->f_blocks   = usage.capacity >> shift;
-       buf->f_bfree    = usage.free >> shift;
-       buf->f_bavail   = avail_factor(usage.free) >> shift;
+       buf->f_bfree    = avail_factor(usage.free) >> shift;
+       buf->f_bavail   = buf->f_bfree;
 
        buf->f_files    = usage.nr_inodes + avail_inodes;
        buf->f_ffree    = avail_inodes;
index ab37eff0c778f2bc96193546123f23cdf4b6b34f..092ece2c8bdee20594ad57fc34148acf4b7a87f7 100644 (file)
@@ -1811,8 +1811,11 @@ static void __bch2_read_endio(struct work_struct *work)
        struct bvec_iter dst_iter = rbio->bvec_iter;
        struct bch_extent_crc_unpacked crc = rbio->pick.crc;
        struct nonce nonce = extent_nonce(rbio->version, crc);
+       unsigned nofs_flags;
        struct bch_csum csum;
 
+       nofs_flags = memalloc_nofs_save();
+
        /* Reset iterator for checksumming and copying bounced data: */
        if (rbio->bounce) {
                src->bi_iter.bi_size            = crc.compressed_size << 9;
@@ -1877,6 +1880,8 @@ nodecode:
                rbio = bch2_rbio_free(rbio);
                bch2_rbio_done(rbio);
        }
+out:
+       memalloc_nofs_restore(nofs_flags);
        return;
 csum_err:
        /*
@@ -1887,7 +1892,7 @@ csum_err:
        if (!rbio->bounce && (rbio->flags & BCH_READ_USER_MAPPED)) {
                rbio->flags |= BCH_READ_MUST_BOUNCE;
                bch2_rbio_error(rbio, READ_RETRY, BLK_STS_IOERR);
-               return;
+               goto out;
        }
 
        bch2_dev_inum_io_error(ca, rbio->read_pos.inode, (u64) rbio->bvec_iter.bi_sector,
@@ -1895,12 +1900,12 @@ csum_err:
                rbio->pick.crc.csum.hi, rbio->pick.crc.csum.lo,
                csum.hi, csum.lo, crc.csum_type);
        bch2_rbio_error(rbio, READ_RETRY_AVOID, BLK_STS_IOERR);
-       return;
+       goto out;
 decompression_err:
        bch_err_inum_ratelimited(c, rbio->read_pos.inode,
                                 "decompression error");
        bch2_rbio_error(rbio, READ_ERR, BLK_STS_IOERR);
-       return;
+       goto out;
 }
 
 static void bch2_read_endio(struct bio *bio)
index 6ebe49ba224803b1731f2381f573182fb7ff546c..91a9f584dd6d59a16e9edd3bc93d169aced16707 100644 (file)
@@ -73,7 +73,8 @@ static int __bch2_dev_usrdata_drop(struct bch_fs *c, unsigned dev_idx, int flags
 
                bch2_btree_iter_set_pos(iter, bkey_start_pos(&sk.k->k));
 
-               ret   = bch2_trans_update(&trans, iter, sk.k, 0) ?:
+               ret   = bch2_btree_iter_traverse(iter) ?:
+                       bch2_trans_update(&trans, iter, sk.k, 0) ?:
                        bch2_trans_commit(&trans, NULL, NULL,
                                        BTREE_INSERT_NOFAIL);
 
index 3cc0de444cf95b32d2def2e16c476c6bd726bcb6..361419aec5fc09a09611ef9e84f9d8e393076d1b 100644 (file)
@@ -289,8 +289,6 @@ int open_for_format(const char *dev, bool force)
                fputs("Proceed anyway?", stdout);
                if (!ask_yn())
                        exit(EXIT_FAILURE);
-               while (blkid_do_probe(pr) == 0)
-                       blkid_do_wipe(pr, 0);
        }
 
        blkid_free_probe(pr);
index de8010eead780e103d0c37a654ca558f52b84676..568707bc2f54b9fe6ba4e82a07fab8a8f23eab11 100644 (file)
@@ -22,7 +22,7 @@
 
 #define noreturn __attribute__((noreturn))
 
-void die(const char *, ...) __attribute__((format(printf, 1, 2))) noreturn;
+void die(const char *, ...) noreturn;
 char *mprintf(const char *, ...)
        __attribute__ ((format (printf, 1, 2)));
 void *xcalloc(size_t, size_t);