From 07ec713e056a73337bc0f53f5910f5179537b2c2 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Sun, 4 Jul 2021 13:33:53 -0400 Subject: [PATCH] Update bcachefs sources to 1a510b00b6 bcachefs: Increase BTREE_TRANS_MEM_MAX --- .bcachefs_revision | 2 +- INSTALL | 4 - Kbuild.include | 319 -------------------------------------- Makefile | 33 ++-- cmd_format.c | 2 +- libbcachefs.c | 2 +- libbcachefs/acl.c | 5 +- libbcachefs/bkey.c | 20 +-- libbcachefs/bset.c | 2 +- libbcachefs/btree_gc.c | 3 + libbcachefs/btree_io.c | 10 +- libbcachefs/btree_iter.c | 4 +- libbcachefs/btree_types.h | 2 +- libbcachefs/fs-io.c | 19 +-- libbcachefs/fs.c | 4 +- libbcachefs/io.c | 11 +- libbcachefs/migrate.c | 3 +- tools-util.c | 2 - tools-util.h | 2 +- 19 files changed, 75 insertions(+), 374 deletions(-) delete mode 100644 Kbuild.include diff --git a/.bcachefs_revision b/.bcachefs_revision index 57211d2..a9a38b6 100644 --- a/.bcachefs_revision +++ b/.bcachefs_revision @@ -1 +1 @@ -ca3cfad39f915257eecda93599c8b434ce80e0b2 +1a510b00b6d1498190197cf804585959449380cb diff --git a/INSTALL b/INSTALL index f6c6041..85c09a2 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 509e085..0000000 --- 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 where a 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 6424433..23cb6c0 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 372ca8f..3f96f5d 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 d0c58da..34246dc 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 74cb188..5408a92 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 0053f32..946dd27 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 8a149e2..0eb85ac 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 5c03eb9..bfd0288 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 f2ccb5f..c354dd1 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 c356032..d2a8121 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 a923757..ec5195d 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 0fbfa62..b6eaaa0 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 d213305..0e5baa8 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 ab37eff..092ece2 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 6ebe49b..91a9f58 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 3cc0de4..361419a 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 de8010e..568707b 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); -- 2.39.2