mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-02-02 00:00:03 +03:00
Update bcachefs sources to 1a510b00b6 bcachefs: Increase BTREE_TRANS_MEM_MAX
This commit is contained in:
parent
55142cd0b5
commit
07ec713e05
@ -1 +1 @@
|
||||
ca3cfad39f915257eecda93599c8b434ce80e0b2
|
||||
1a510b00b6d1498190197cf804585959449380cb
|
||||
|
4
INSTALL
4
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 --
|
||||
|
||||
|
319
Kbuild.include
319
Kbuild.include
@ -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:
|
33
Makefile
33
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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
|
@ -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);"
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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))
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user