summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-07-04 13:33:53 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2021-07-04 23:33:54 -0400
commit07ec713e056a73337bc0f53f5910f5179537b2c2 (patch)
treef43e435b6fb409f4dab4420be283690101904c7c
parent55142cd0b5ef2a2150d4708dad0c3fd54a3ffd39 (diff)
Update bcachefs sources to 1a510b00b6 bcachefs: Increase BTREE_TRANS_MEM_MAX
-rw-r--r--.bcachefs_revision2
-rw-r--r--INSTALL4
-rw-r--r--Kbuild.include319
-rw-r--r--Makefile33
-rw-r--r--cmd_format.c2
-rw-r--r--libbcachefs.c2
-rw-r--r--libbcachefs/acl.c5
-rw-r--r--libbcachefs/bkey.c20
-rw-r--r--libbcachefs/bset.c2
-rw-r--r--libbcachefs/btree_gc.c3
-rw-r--r--libbcachefs/btree_io.c10
-rw-r--r--libbcachefs/btree_iter.c4
-rw-r--r--libbcachefs/btree_types.h2
-rw-r--r--libbcachefs/fs-io.c19
-rw-r--r--libbcachefs/fs.c4
-rw-r--r--libbcachefs/io.c11
-rw-r--r--libbcachefs/migrate.c3
-rw-r--r--tools-util.c2
-rw-r--r--tools-util.h2
19 files changed, 75 insertions, 374 deletions
diff --git a/.bcachefs_revision b/.bcachefs_revision
index 57211d25..a9a38b64 100644
--- a/.bcachefs_revision
+++ b/.bcachefs_revision
@@ -1 +1 @@
-ca3cfad39f915257eecda93599c8b434ce80e0b2
+1a510b00b6d1498190197cf804585959449380cb
diff --git a/INSTALL b/INSTALL
index f6c6041e..85c09a21 100644
--- 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
index 509e0856..00000000
--- a/Kbuild.include
+++ /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:
diff --git a/Makefile b/Makefile
index 6424433b..23cb6c07 100644
--- 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
diff --git a/cmd_format.c b/cmd_format.c
index 372ca8f8..3f96f5de 100644
--- a/cmd_format.c
+++ b/cmd_format.c
@@ -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);
diff --git a/libbcachefs.c b/libbcachefs.c
index d0c58da7..34246dc9 100644
--- a/libbcachefs.c
+++ b/libbcachefs.c
@@ -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);
}
diff --git a/libbcachefs/acl.c b/libbcachefs/acl.c
index 74cb188f..5408a922 100644
--- a/libbcachefs/acl.c
+++ b/libbcachefs/acl.c
@@ -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;
}
diff --git a/libbcachefs/bkey.c b/libbcachefs/bkey.c
index 0053f32c..946dd27f 100644
--- a/libbcachefs/bkey.c
+++ b/libbcachefs/bkey.c
@@ -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];
}
diff --git a/libbcachefs/bset.c b/libbcachefs/bset.c
index 8a149e21..0eb85acd 100644
--- a/libbcachefs/bset.c
+++ b/libbcachefs/bset.c
@@ -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);"
diff --git a/libbcachefs/btree_gc.c b/libbcachefs/btree_gc.c
index 5c03eb93..bfd02886 100644
--- a/libbcachefs/btree_gc.c
+++ b/libbcachefs/btree_gc.c
@@ -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);
diff --git a/libbcachefs/btree_io.c b/libbcachefs/btree_io.c
index f2ccb5f3..c354dd1a 100644
--- a/libbcachefs/btree_io.c
+++ b/libbcachefs/btree_io.c
@@ -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,
diff --git a/libbcachefs/btree_iter.c b/libbcachefs/btree_iter.c
index c356032b..d2a8121c 100644
--- a/libbcachefs/btree_iter.c
+++ b/libbcachefs/btree_iter.c
@@ -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))
diff --git a/libbcachefs/btree_types.h b/libbcachefs/btree_types.h
index a923757c..ec5195da 100644
--- a/libbcachefs/btree_types.h
+++ b/libbcachefs/btree_types.h
@@ -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;
diff --git a/libbcachefs/fs-io.c b/libbcachefs/fs-io.c
index 0fbfa622..b6eaaa0d 100644
--- a/libbcachefs/fs-io.c
+++ b/libbcachefs/fs-io.c
@@ -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);
diff --git a/libbcachefs/fs.c b/libbcachefs/fs.c
index d2133053..0e5baa82 100644
--- a/libbcachefs/fs.c
+++ b/libbcachefs/fs.c
@@ -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;
diff --git a/libbcachefs/io.c b/libbcachefs/io.c
index ab37eff0..092ece2c 100644
--- a/libbcachefs/io.c
+++ b/libbcachefs/io.c
@@ -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)
diff --git a/libbcachefs/migrate.c b/libbcachefs/migrate.c
index 6ebe49ba..91a9f584 100644
--- a/libbcachefs/migrate.c
+++ b/libbcachefs/migrate.c
@@ -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);
diff --git a/tools-util.c b/tools-util.c
index 3cc0de44..361419ae 100644
--- a/tools-util.c
+++ b/tools-util.c
@@ -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);
diff --git a/tools-util.h b/tools-util.h
index de8010ee..568707bc 100644
--- a/tools-util.h
+++ b/tools-util.h
@@ -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);