projects/linux·commit d5acbc60

Merge tag 'for-6.7-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux

d5acbc60 · Linus Torvalds <[email protected]> · 2023-10-30 10:42:06 -10:00

Pull btrfs updates from David Sterba:
 "New features:

   - raid-stripe-tree

     New tree for logical file extent mapping where the physical mapping
     may not match on multiple devices. This is now used in zoned mode
     to implement RAID0/RAID1* profiles, but can be used in non-zoned
     mode as well. The support for RAID56 is in development and will
     eventually fix the problems with the current implementation. This
     is a backward incompatible feature and has to be enabled at mkfs
     time.

   - simple quota accounting (squota)

     A simplified mode of qgroup that accounts all space on the initial
     extent owners (a subvolume), the snapshots are then cheap to create
     and delete. The deletion of snapshots in fully accounting qgroups
     is a known CPU/IO performance bottleneck.

     The squota is not suitable for the general use case but works well
     for containers where the original subvolume exists for the whole
     time. This is a backward incompatible feature as it needs extending
     some structures, but can be enabled on an existing filesystem.

   - temporary filesystem fsid (temp_fsid)

     The fsid identifies a filesystem and is hard coded in the
     structures, which disallows mounting the same fsid found on
     different devices.

     For a single device filesystem this is not strictly necessary, a
     new temporary fsid can be generated on mount e.g. after a device is
     cloned. This will be used by Steam Deck for root partition A/B
     testing, or can be used for VM root images.

  Other user visible changes:

   - filesystems with partially finished metadata_uuid conversion cannot
     be mounted anymore and the uuid fixup has to be done by btrfs-progs
     (btrfstune).

  Performance improvements:

   - reduce reservations for checksum deletions (with enabled free space
     tree by factor of 4), on a sample workload on file with many
     extents the deletion time decreased by 12%

   - make extent state merges more efficient during insertions, reduce
     rb-tree iterations (run time of critical functions reduced by 5%)

  Core changes:

   - the integrity check functionality has been removed, this was a
     debugging feature and removal does not affect other integrity
     checks like checksums or tree-checker

   - space reservation changes:

      - more efficient delayed ref reservations, this avoids building up
        too much work or overusing or exhausting the global block
        reserve in some situations

      - move delayed refs reservation to the transaction start time,
        this prevents some ENOSPC corner cases related to exhaustion of
        global reserve

      - improvements in reducing excessive reservations for block group
        items

      - adjust overcommit logic in near full situations, account for one
        more chunk to eventually allocate metadata chunk, this is mostly
        relevant for small filesystems (<10GiB)

   - single device filesystems are scanned but not registered (except
     seed devices), this allows temp_fsid to work

   - qgroup iterations do not need GFP_ATOMIC allocations anymore

   - cleanups, refactoring, reduced data structure size, function
     parameter simplifications, error handling fixes"

* tag 'for-6.7-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: (156 commits)
  btrfs: open code timespec64 in struct btrfs_inode
  btrfs: remove redundant log root tree index assignment during log sync
  btrfs: remove redundant initialization of variable dirty in btrfs_update_time()
  btrfs: sysfs: show temp_fsid feature
  btrfs: disable the device add feature for temp-fsid
  btrfs: disable the seed feature for temp-fsid
  btrfs: update comment for temp-fsid, fsid, and metadata_uuid
  btrfs: remove pointless empty log context list check when syncing log
  btrfs: update comment for struct btrfs_inode::lock
  btrfs: remove pointless barrier from btrfs_sync_file()
  btrfs: add and use helpers for reading and writing last_trans_committed
  btrfs: add and use helpers for reading and writing fs_info->generation
  btrfs: add and use helpers for reading and writing log_transid
  btrfs: add and use helpers for reading and writing last_log_commit
  btrfs: support cloned-device mount capability
  btrfs: add helper function find_fsid_by_disk
  btrfs: stop reserving excessive space for block group item insertions
  btrfs: stop reserving excessive space for block group item updates
  btrfs: reorder btrfs_inode to fill gaps
  btrfs: open code btrfs_ordered_inode_tree in btrfs_inode
  ...
Commit
d5acbc60fafbe0fc94c552ce916dd592cd4c6371
Parents
8829687a · c6e8f898

Merge commit. Changes below are compared with the first parent: 8829687a.

Changes

83 files changed · +4033 −5291

FileStatusAddDelContent
fs/btrfs/Kconfigmodified+0−21View file
fs/btrfs/Makefilemodified+1−2View file
fs/btrfs/accessors.hmodified+16−0View file
fs/btrfs/async-thread.cmodified+6−6View file
fs/btrfs/async-thread.hmodified+3−3View file
fs/btrfs/backref.cmodified+4−1View file
fs/btrfs/backref.hmodified+5−5View file
fs/btrfs/bio.cmodified+33−14View file
fs/btrfs/block-group.cmodified+80−94View file
fs/btrfs/block-rsv.cmodified+16−8View file
fs/btrfs/btrfs_inode.hmodified+44−36View file
fs/btrfs/check-integrity.cdeleted+0−2871View before deletion
fs/btrfs/check-integrity.hdeleted+0−20View before deletion
fs/btrfs/compression.cmodified+3−3View file
fs/btrfs/ctree.cmodified+106−234View file
fs/btrfs/ctree.hmodified+81−61View file
fs/btrfs/defrag.cmodified+148−4View file
fs/btrfs/defrag.hmodified+1−1View file
fs/btrfs/delalloc-space.cmodified+2−4View file
fs/btrfs/delayed-inode.cmodified+11−16View file
fs/btrfs/delayed-inode.hmodified+0−1View file
fs/btrfs/delayed-ref.cmodified+158−41View file
fs/btrfs/delayed-ref.hmodified+53−17View file
fs/btrfs/dev-replace.cmodified+1−2View file
fs/btrfs/dir-item.cmodified+4−4View file
fs/btrfs/dir-item.hmodified+9−0View file
fs/btrfs/disk-io.cmodified+55−87View file
fs/btrfs/disk-io.hmodified+2−1View file
fs/btrfs/extent-io-tree.cmodified+180−92View file
fs/btrfs/extent-io-tree.hmodified+3−4View file
fs/btrfs/extent-tree.cmodified+360−176View file
fs/btrfs/extent-tree.hmodified+10−5View file
fs/btrfs/extent_io.cmodified+23−16View file
fs/btrfs/extent_io.hmodified+2−2View file
fs/btrfs/file-item.cmodified+9−8View file
fs/btrfs/file.cmodified+32−29View file
fs/btrfs/free-space-cache.cmodified+16−12View file
fs/btrfs/free-space-tree.cmodified+9−8View file
fs/btrfs/fs.hmodified+52−17View file
fs/btrfs/inode-item.cmodified+11−10View file
fs/btrfs/inode-item.hmodified+8−0View file
fs/btrfs/inode.cmodified+101−90View file
fs/btrfs/ioctl.cmodified+15−8View file
fs/btrfs/locking.cmodified+16−4View file
fs/btrfs/messages.cmodified+16−16View file
fs/btrfs/messages.hmodified+7−7View file
fs/btrfs/ordered-data.cmodified+57−70View file
fs/btrfs/ordered-data.hmodified+2−15View file
fs/btrfs/print-tree.cmodified+35−0View file
fs/btrfs/props.cmodified+1−0View file
fs/btrfs/qgroup.cmodified+560−312View file
fs/btrfs/qgroup.hmodified+67−82View file
fs/btrfs/raid-stripe-tree.cadded+274−0View file
fs/btrfs/raid-stripe-tree.hadded+50−0View file
fs/btrfs/ref-verify.cmodified+6−3View file
fs/btrfs/reflink.cmodified+1−2View file
fs/btrfs/relocation.cmodified+127−81View file
fs/btrfs/relocation.hmodified+5−4View file
fs/btrfs/root-tree.cmodified+7−5View file
fs/btrfs/root-tree.hmodified+4−4View file
fs/btrfs/scrub.cmodified+74−4View file
fs/btrfs/send.cmodified+3−3View file
fs/btrfs/space-info.cmodified+41−23View file
fs/btrfs/space-info.hmodified+2−1View file
fs/btrfs/super.cmodified+23−64View file
fs/btrfs/sysfs.cmodified+52−1View file
fs/btrfs/tests/extent-buffer-tests.cmodified+5−1View file
fs/btrfs/tests/inode-tests.cmodified+10−2View file
fs/btrfs/transaction.cmodified+140−89View file
fs/btrfs/transaction.hmodified+11−9View file
fs/btrfs/tree-checker.cmodified+47−1View file
fs/btrfs/tree-log.cmodified+36−45View file
fs/btrfs/ulist.cmodified+2−1View file
fs/btrfs/uuid-tree.cmodified+3−3View file
fs/btrfs/verity.cmodified+2−2View file
fs/btrfs/volumes.cmodified+203−214View file
fs/btrfs/volumes.hmodified+29−10View file
fs/btrfs/xattr.cmodified+6−6View file
fs/btrfs/zoned.cmodified+289−163View file
fs/btrfs/zstd.cmodified+7−4View file
include/trace/events/btrfs.hmodified+78−5View file
include/uapi/linux/btrfs.hmodified+3−0View file
include/uapi/linux/btrfs_tree.hmodified+59−1View file

Only the first 600 diff lines are shown. Download the complete patch.

fs/btrfs/Kconfig

View file
diff --git a/fs/btrfs/Kconfig b/fs/btrfs/Kconfig
index a25c991..4fb925e 100644
--- a/fs/btrfs/Kconfig
+++ b/fs/btrfs/Kconfig
@@ -48,27 +48,6 @@ config BTRFS_FS_POSIX_ACL
If you don't know what Access Control Lists are, say N
-config BTRFS_FS_CHECK_INTEGRITY
- bool "Btrfs with integrity check tool compiled in (DEPRECATED)"
- depends on BTRFS_FS
- help
- This feature has been deprecated and will be removed in 6.7.
-
- Adds code that examines all block write requests (including
- writes of the super block). The goal is to verify that the
- state of the filesystem on disk is always consistent, i.e.,
- after a power-loss or kernel panic event the filesystem is
- in a consistent state.
-
- If the integrity check tool is included and activated in
- the mount options, plenty of kernel memory is used, and
- plenty of additional CPU cycles are spent. Enabling this
- functionality is not intended for normal use.
-
- In most cases, unless you are a btrfs developer who needs
- to verify the integrity of (super)-block write requests
- during the run of a regression test, say N
-
config BTRFS_FS_RUN_SANITY_TESTS
bool "Btrfs will run sanity tests upon loading"
depends on BTRFS_FS

fs/btrfs/Makefile

View file
diff --git a/fs/btrfs/Makefile b/fs/btrfs/Makefile
index 90d5320..525af97 100644
--- a/fs/btrfs/Makefile
+++ b/fs/btrfs/Makefile
@@ -33,10 +33,9 @@ btrfs-y += super.o ctree.o extent-tree.o print-tree.o root-tree.o dir-item.o \
uuid-tree.o props.o free-space-tree.o tree-checker.o space-info.o \
block-rsv.o delalloc-space.o block-group.o discard.o reflink.o \
subpage.o tree-mod-log.o extent-io-tree.o fs.o messages.o bio.o \
- lru_cache.o
+ lru_cache.o raid-stripe-tree.o
btrfs-$(CONFIG_BTRFS_FS_POSIX_ACL) += acl.o
-btrfs-$(CONFIG_BTRFS_FS_CHECK_INTEGRITY) += check-integrity.o
btrfs-$(CONFIG_BTRFS_FS_REF_VERIFY) += ref-verify.o
btrfs-$(CONFIG_BLK_DEV_ZONED) += zoned.o
btrfs-$(CONFIG_FS_VERITY) += verity.o

fs/btrfs/accessors.h

View file
diff --git a/fs/btrfs/accessors.h b/fs/btrfs/accessors.h
index 8cfc821..aa08445 100644
--- a/fs/btrfs/accessors.h
+++ b/fs/btrfs/accessors.h
@@ -4,6 +4,7 @@
#define BTRFS_ACCESSORS_H
#include <linux/stddef.h>
+#include <asm/unaligned.h>
struct btrfs_map_token {
struct extent_buffer *eb;
@@ -305,6 +306,14 @@ BTRFS_SETGET_FUNCS(timespec_nsec, struct btrfs_timespec, nsec, 32);
BTRFS_SETGET_STACK_FUNCS(stack_timespec_sec, struct btrfs_timespec, sec, 64);
BTRFS_SETGET_STACK_FUNCS(stack_timespec_nsec, struct btrfs_timespec, nsec, 32);
+BTRFS_SETGET_FUNCS(stripe_extent_encoding, struct btrfs_stripe_extent, encoding, 8);
+BTRFS_SETGET_FUNCS(raid_stride_devid, struct btrfs_raid_stride, devid, 64);
+BTRFS_SETGET_FUNCS(raid_stride_physical, struct btrfs_raid_stride, physical, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_stripe_extent_encoding,
+ struct btrfs_stripe_extent, encoding, 8);
+BTRFS_SETGET_STACK_FUNCS(stack_raid_stride_devid, struct btrfs_raid_stride, devid, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_raid_stride_physical, struct btrfs_raid_stride, physical, 64);
+
/* struct btrfs_dev_extent */
BTRFS_SETGET_FUNCS(dev_extent_chunk_tree, struct btrfs_dev_extent, chunk_tree, 64);
BTRFS_SETGET_FUNCS(dev_extent_chunk_objectid, struct btrfs_dev_extent,
@@ -349,6 +358,9 @@ BTRFS_SETGET_FUNCS(extent_data_ref_count, struct btrfs_extent_data_ref, count, 3
BTRFS_SETGET_FUNCS(shared_data_ref_count, struct btrfs_shared_data_ref, count, 32);
+BTRFS_SETGET_FUNCS(extent_owner_ref_root_id, struct btrfs_extent_owner_ref,
+ root_id, 64);
+
BTRFS_SETGET_FUNCS(extent_inline_ref_type, struct btrfs_extent_inline_ref,
type, 8);
BTRFS_SETGET_FUNCS(extent_inline_ref_offset, struct btrfs_extent_inline_ref,
@@ -365,6 +377,8 @@ static inline u32 btrfs_extent_inline_ref_size(int type)
if (type == BTRFS_EXTENT_DATA_REF_KEY)
return sizeof(struct btrfs_extent_data_ref) +
offsetof(struct btrfs_extent_inline_ref, offset);
+ if (type == BTRFS_EXTENT_OWNER_REF_KEY)
+ return sizeof(struct btrfs_extent_inline_ref);
return 0;
}
@@ -966,6 +980,8 @@ BTRFS_SETGET_FUNCS(qgroup_status_flags, struct btrfs_qgroup_status_item,
flags, 64);
BTRFS_SETGET_FUNCS(qgroup_status_rescan, struct btrfs_qgroup_status_item,
rescan, 64);
+BTRFS_SETGET_FUNCS(qgroup_status_enable_gen, struct btrfs_qgroup_status_item,
+ enable_gen, 64);
/* btrfs_qgroup_info_item */
BTRFS_SETGET_FUNCS(qgroup_info_generation, struct btrfs_qgroup_info_item,

fs/btrfs/async-thread.c

View file
diff --git a/fs/btrfs/async-thread.c b/fs/btrfs/async-thread.c
index ce083e9..9e261aa 100644
--- a/fs/btrfs/async-thread.c
+++ b/fs/btrfs/async-thread.c
@@ -9,6 +9,7 @@
#include <linux/list.h>
#include <linux/spinlock.h>
#include <linux/freezer.h>
+#include <trace/events/btrfs.h>
#include "async-thread.h"
#include "ctree.h"
@@ -242,7 +243,7 @@ static void run_ordered_work(struct btrfs_workqueue *wq,
break;
trace_btrfs_ordered_sched(work);
spin_unlock_irqrestore(lock, flags);
- work->ordered_func(work);
+ work->ordered_func(work, false);
/* now take the lock again and drop our item from the list */
spin_lock_irqsave(lock, flags);
@@ -277,7 +278,7 @@ static void run_ordered_work(struct btrfs_workqueue *wq,
* We don't want to call the ordered free functions with
* the lock held.
*/
- work->ordered_free(work);
+ work->ordered_func(work, true);
/* NB: work must not be dereferenced past this point. */
trace_btrfs_all_work_done(wq->fs_info, work);
}
@@ -285,7 +286,7 @@ static void run_ordered_work(struct btrfs_workqueue *wq,
spin_unlock_irqrestore(lock, flags);
if (free_self) {
- self->ordered_free(self);
+ self->ordered_func(self, true);
/* NB: self must not be dereferenced past this point. */
trace_btrfs_all_work_done(wq->fs_info, self);
}
@@ -300,7 +301,7 @@ static void btrfs_work_helper(struct work_struct *normal_work)
/*
* We should not touch things inside work in the following cases:
- * 1) after work->func() if it has no ordered_free
+ * 1) after work->func() if it has no ordered_func(..., true) to free
* Since the struct is freed in work->func().
* 2) after setting WORK_DONE_BIT
* The work may be freed in other threads almost instantly.
@@ -329,11 +330,10 @@ static void btrfs_work_helper(struct work_struct *normal_work)
}
void btrfs_init_work(struct btrfs_work *work, btrfs_func_t func,
- btrfs_func_t ordered_func, btrfs_func_t ordered_free)
+ btrfs_ordered_func_t ordered_func)
{
work->func = func;
work->ordered_func = ordered_func;
- work->ordered_free = ordered_free;
INIT_WORK(&work->normal_work, btrfs_work_helper);
INIT_LIST_HEAD(&work->ordered_list);
work->flags = 0;

fs/btrfs/async-thread.h

View file
diff --git a/fs/btrfs/async-thread.h b/fs/btrfs/async-thread.h
index 30f66c5..62b8a0d 100644
--- a/fs/btrfs/async-thread.h
+++ b/fs/btrfs/async-thread.h
@@ -13,11 +13,11 @@ struct btrfs_fs_info;
struct btrfs_workqueue;
struct btrfs_work;
typedef void (*btrfs_func_t)(struct btrfs_work *arg);
+typedef void (*btrfs_ordered_func_t)(struct btrfs_work *arg, bool);
struct btrfs_work {
btrfs_func_t func;
- btrfs_func_t ordered_func;
- btrfs_func_t ordered_free;
+ btrfs_ordered_func_t ordered_func;
/* Don't touch things below */
struct work_struct normal_work;
@@ -35,7 +35,7 @@ struct btrfs_workqueue *btrfs_alloc_ordered_workqueue(
struct btrfs_fs_info *fs_info, const char *name,
unsigned int flags);
void btrfs_init_work(struct btrfs_work *work, btrfs_func_t func,
- btrfs_func_t ordered_func, btrfs_func_t ordered_free);
+ btrfs_ordered_func_t ordered_func);
void btrfs_queue_work(struct btrfs_workqueue *wq,
struct btrfs_work *work);
void btrfs_destroy_workqueue(struct btrfs_workqueue *wq);

fs/btrfs/backref.c

View file
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c
index a4a809e..beed7e4 100644
--- a/fs/btrfs/backref.c
+++ b/fs/btrfs/backref.c
@@ -1129,6 +1129,9 @@ static int add_inline_refs(struct btrfs_backref_walk_ctx *ctx,
count, sc, GFP_NOFS);
break;
}
+ case BTRFS_EXTENT_OWNER_REF_KEY:
+ ASSERT(btrfs_fs_incompat(ctx->fs_info, SIMPLE_QUOTA));
+ break;
default:
WARN_ON(1);
}
@@ -2998,7 +3001,7 @@ int btrfs_backref_iter_next(struct btrfs_backref_iter *iter)
}
void btrfs_backref_init_cache(struct btrfs_fs_info *fs_info,
- struct btrfs_backref_cache *cache, int is_reloc)
+ struct btrfs_backref_cache *cache, bool is_reloc)
{
int i;

fs/btrfs/backref.h

View file
diff --git a/fs/btrfs/backref.h b/fs/btrfs/backref.h
index 71d535e..ab4ca0e 100644
--- a/fs/btrfs/backref.h
+++ b/fs/btrfs/backref.h
@@ -247,7 +247,7 @@ struct prelim_ref {
struct rb_node rbnode;
u64 root_id;
struct btrfs_key key_for_search;
- int level;
+ u8 level;
int count;
struct extent_inode_elem *inode_list;
u64 parent;
@@ -440,11 +440,11 @@ struct btrfs_backref_cache {
* Reloction backref cache require more info for reloc root compared
* to generic backref cache.
*/
- unsigned int is_reloc;
+ bool is_reloc;
};
void btrfs_backref_init_cache(struct btrfs_fs_info *fs_info,
- struct btrfs_backref_cache *cache, int is_reloc);
+ struct btrfs_backref_cache *cache, bool is_reloc);
struct btrfs_backref_node *btrfs_backref_alloc_node(
struct btrfs_backref_cache *cache, u64 bytenr, int level);
struct btrfs_backref_edge *btrfs_backref_alloc_edge(
@@ -533,9 +533,9 @@ void btrfs_backref_cleanup_node(struct btrfs_backref_cache *cache,
void btrfs_backref_release_cache(struct btrfs_backref_cache *cache);
static inline void btrfs_backref_panic(struct btrfs_fs_info *fs_info,
- u64 bytenr, int errno)
+ u64 bytenr, int error)
{
- btrfs_panic(fs_info, errno,
+ btrfs_panic(fs_info, error,
"Inconsistency in backref cache found at offset %llu",
bytenr);
}

fs/btrfs/bio.c

View file
diff --git a/fs/btrfs/bio.c b/fs/btrfs/bio.c
index 12b1244..4f3b693 100644
--- a/fs/btrfs/bio.c
+++ b/fs/btrfs/bio.c
@@ -10,11 +10,11 @@
#include "volumes.h"
#include "raid56.h"
#include "async-thread.h"
-#include "check-integrity.h"
#include "dev-replace.h"
#include "rcu-string.h"
#include "zoned.h"
#include "file-item.h"
+#include "raid-stripe-tree.h"
static struct bio_set btrfs_bioset;
static struct bio_set btrfs_clone_bioset;
@@ -416,6 +416,9 @@ static void btrfs_orig_write_end_io(struct bio *bio)
else
bio->bi_status = BLK_STS_OK;
+ if (bio_op(bio) == REQ_OP_ZONE_APPEND && !bio->bi_status)
+ stripe->physical = bio->bi_iter.bi_sector << SECTOR_SHIFT;
+
btrfs_orig_bbio_end_io(bbio);
btrfs_put_bioc(bioc);
}
@@ -427,6 +430,8 @@ static void btrfs_clone_write_end_io(struct bio *bio)
if (bio->bi_status) {
atomic_inc(&stripe->bioc->error);
btrfs_log_dev_io_error(bio, stripe->dev);
+ } else if (bio_op(bio) == REQ_OP_ZONE_APPEND) {
+ stripe->physical = bio->bi_iter.bi_sector << SECTOR_SHIFT;
}
/* Pass on control to the original bio this one was cloned from */
@@ -463,8 +468,6 @@ static void btrfs_submit_dev_bio(struct btrfs_device *dev, struct bio *bio)
(unsigned long)dev->bdev->bd_dev, btrfs_dev_name(dev),
dev->devid, bio->bi_iter.bi_size);
- btrfsic_check_bio(bio);
-
if (bio->bi_opf & REQ_BTRFS_CGROUP_PUNT)
blkcg_punt_bio_submit(bio);
else
@@ -490,6 +493,7 @@ static void btrfs_submit_mirrored_bio(struct btrfs_io_context *bioc, int dev_nr)
bio->bi_private = &bioc->stripes[dev_nr];
bio->bi_iter.bi_sector = bioc->stripes[dev_nr].physical >> SECTOR_SHIFT;
bioc->stripes[dev_nr].bioc = bioc;
+ bioc->size = bio->bi_iter.bi_size;
btrfs_submit_dev_bio(bioc->stripes[dev_nr].dev, bio);
}
@@ -499,6 +503,8 @@ static void __btrfs_submit_bio(struct bio *bio, struct btrfs_io_context *bioc,
if (!bioc) {
/* Single mirror read/write fast path. */
btrfs_bio(bio)->mirror_num = mirror_num;
+ if (bio_op(bio) != REQ_OP_READ)
+ btrfs_bio(bio)->orig_physical = smap->physical;
bio->bi_iter.bi_sector = smap->physical >> SECTOR_SHIFT;
if (bio_op(bio) != REQ_OP_READ)
btrfs_bio(bio)->orig_physical = smap->physical;
@@ -568,13 +574,20 @@ static void run_one_async_start(struct btrfs_work *work)
*
* At IO completion time the csums attached on the ordered extent record are
* inserted into the tree.
+ *
+ * If called with @do_free == true, then it will free the work struct.
*/
-static void run_one_async_done(struct btrfs_work *work)
+static void run_one_async_done(struct btrfs_work *work, bool do_free)
{
struct async_submit_bio *async =
container_of(work, struct async_submit_bio, work);
struct bio *bio = &async->bbio->bio;
+ if (do_free) {
+ kfree(container_of(work, struct async_submit_bio, work));
+ return;
+ }
+
/* If an error occurred we just want to clean up the bio and move on. */
if (bio->bi_status) {
btrfs_orig_bbio_end_io(async->bbio);
@@ -590,11 +603,6 @@ static void run_one_async_done(struct btrfs_work *work)
__btrfs_submit_bio(bio, async->bioc, &async->smap, async->mirror_num);
}
-static void run_one_async_free(struct btrfs_work *work)
-{
- kfree(container_of(work, struct async_submit_bio, work));
-}
-
static bool should_async_write(struct btrfs_bio *bbio)
{
/* Submit synchronously if the checksum implementation is fast. */
@@ -636,8 +644,7 @@ static bool btrfs_wq_submit_bio(struct btrfs_bio *bbio,
async->smap = *smap;
async->mirror_num = mirror_num;
- btrfs_init_work(&async->work, run_one_async_start, run_one_async_done,
- run_one_async_free);
+ btrfs_init_work(&async->work, run_one_async_start, run_one_async_done);
btrfs_queue_work(fs_info->workers, &async->work);
return true;
}
@@ -657,9 +664,11 @@ static bool btrfs_submit_chunk(struct btrfs_bio *bbio, int mirror_num)
blk_status_t ret;
int error;
+ smap.is_scrub = !bbio->inode;
+
btrfs_bio_counter_inc_blocked(fs_info);
error = btrfs_map_block(fs_info, btrfs_op(bio), logical, &map_length,
- &bioc, &smap, &mirror_num, 1);
+ &bioc, &smap, &mirror_num);
if (error) {
ret = errno_to_blk_status(error);
goto fail;
@@ -691,6 +700,18 @@ static bool btrfs_submit_chunk(struct btrfs_bio *bbio, int mirror_num)
bio->bi_opf |= REQ_OP_ZONE_APPEND;
}
+ if (is_data_bbio(bbio) && bioc &&
+ btrfs_need_stripe_tree_update(bioc->fs_info, bioc->map_type)) {
+ /*
+ * No locking for the list update, as we only add to
+ * the list in the I/O submission path, and list
+ * iteration only happens in the completion path, which
+ * can't happen until after the last submission.
+ */
+ btrfs_get_bioc(bioc);
+ list_add_tail(&bioc->rst_ordered_entry, &bbio->ordered->bioc_list);
+ }
+
/*
* Csum items for reloc roots have already been cloned at this
* point, so they are handled as part of the no-checksum case.
@@ -779,8 +800,6 @@ int btrfs_repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start,
bio_init(&bio, smap.dev->bdev, &bvec, 1, REQ_OP_WRITE | REQ_SYNC);
bio.bi_iter.bi_sector = smap.physical >> SECTOR_SHIFT;
__bio_add_page(&bio, page, length, pg_offset);
-
- btrfsic_check_bio(&bio);
ret = submit_bio_wait(&bio);
if (ret) {
/* try to remap that extent elsewhere? */

fs/btrfs/block-group.c

View file
diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
index b2e5107..6e5dc68 100644
--- a/fs/btrfs/block-group.c
+++ b/fs/btrfs/block-group.c
@@ -935,7 +935,7 @@ int btrfs_cache_block_group(struct btrfs_block_group *cache, bool wait)
caching_ctl->block_group = cache;
refcount_set(&caching_ctl->count, 2);
atomic_set(&caching_ctl->progress, 0);
- btrfs_init_work(&caching_ctl->work, caching_thread, NULL, NULL);
+ btrfs_init_work(&caching_ctl->work, caching_thread, NULL);
spin_lock(&cache->lock);
if (cache->cached != BTRFS_CACHE_NO) {
@@ -1286,7 +1286,7 @@ out:
/* Once for the lookup reference */
btrfs_put_block_group(block_group);
if (remove_rsv)
- btrfs_delayed_refs_rsv_release(fs_info, 1);
+ btrfs_dec_delayed_refs_rsv_bg_updates(fs_info);
btrfs_free_path(path);
return ret;
}
@@ -2601,7 +2601,7 @@ static int insert_dev_extent(struct btrfs_trans_handle *trans,
btrfs_set_dev_extent_chunk_offset(leaf, extent, chunk_offset);
btrfs_set_dev_extent_length(leaf, extent, num_bytes);
- btrfs_mark_buffer_dirty(leaf);
+ btrfs_mark_buffer_dirty(trans, leaf);
out:
btrfs_free_path(path);
return ret;
@@ -2709,7 +2709,7 @@ void btrfs_create_pending_block_groups(struct btrfs_trans_handle *trans)
/* Already aborted the transaction if it failed. */
next:
- btrfs_delayed_refs_rsv_release(fs_info, 1);
+ btrfs_dec_delayed_refs_rsv_bg_inserts(fs_info);
list_del_init(&block_group->bg_list);
clear_bit(BLOCK_GROUP_FLAG_NEW, &block_group->runtime_flags);
}
@@ -2819,8 +2819,7 @@ struct btrfs_block_group *btrfs_make_block_group(struct btrfs_trans_handle *tran
#endif
list_add_tail(&cache->bg_list, &trans->new_bgs);
- trans->delayed_ref_updates++;
- btrfs_update_delayed_refs_rsv(trans);
+ btrfs_inc_delayed_refs_rsv_bg_inserts(fs_info);
set_avail_alloc_bits(fs_info, type);
return cache;
@@ -3025,7 +3024,7 @@ static int update_block_group_item(struct btrfs_trans_handle *trans,
cache->global_root_id);
btrfs_set_stack_block_group_flags(&bgi, cache->flags);
write_extent_buffer(leaf, &bgi, bi, sizeof(bgi));
- btrfs_mark_buffer_dirty(leaf);
+ btrfs_mark_buffer_dirty(trans, leaf);
fail:
btrfs_release_path(path);
/*
@@ -3051,7 +3050,6 @@ static int cache_save_setup(struct btrfs_block_group *block_group,
struct btrfs_path *path)
{
struct btrfs_fs_info *fs_info = block_group->fs_info;
- struct btrfs_root *root = fs_info->tree_root;
struct inode *inode = NULL;
struct extent_changeset *data_reserved = NULL;
u64 alloc_hint = 0;
@@ -3103,7 +3101,7 @@ again:
* time.
*/
BTRFS_I(inode)->generation = 0;
- ret = btrfs_update_inode(trans, root, BTRFS_I(inode));
+ ret = btrfs_update_inode(trans, BTRFS_I(inode));
if (ret) {
/*
* So theoretically we could recover from this, simply set the
@@ -3370,7 +3368,7 @@ again:
if (should_put)
btrfs_put_block_group(cache);
if (drop_reserve)
- btrfs_delayed_refs_rsv_release(fs_info, 1);
+ btrfs_dec_delayed_refs_rsv_bg_updates(fs_info);
/*
* Avoid blocking other tasks for too long. It might even save
* us from writing caches for block groups that are going to be
@@ -3474,8 +3472,7 @@ int btrfs_write_dirty_block_groups(struct btrfs_trans_handle *trans)
cache_save_setup(cache, trans, path);
if (!ret)
- ret = btrfs_run_delayed_refs(trans,
- (unsigned long) -1);
+ ret = btrfs_run_delayed_refs(trans, U64_MAX);
if (!ret && cache->disk_cache_state == BTRFS_DC_SETUP) {
cache->io_ctl.inode = NULL;
@@ -3518,7 +3515,7 @@ int btrfs_write_dirty_block_groups(struct btrfs_trans_handle *trans)
/* If its not on the io list, we need to put the block group */
if (should_put)
btrfs_put_block_group(cache);
- btrfs_delayed_refs_rsv_release(fs_info, 1);
+ btrfs_dec_delayed_refs_rsv_bg_updates(fs_info);
spin_lock(&cur_trans->dirty_bgs_lock);
}
spin_unlock(&cur_trans->dirty_bgs_lock);
@@ -3543,12 +3540,12 @@ int btrfs_update_block_group(struct btrfs_trans_handle *trans,
u64 bytenr, u64 num_bytes, bool alloc)
{
struct btrfs_fs_info *info = trans->fs_info;
- struct btrfs_block_group *cache = NULL;
- u64 total = num_bytes;
+ struct btrfs_space_info *space_info;
+ struct btrfs_block_group *cache;
u64 old_val;
- u64 byte_in_group;
+ bool reclaim = false;
+ bool bg_already_dirty = true;
int factor;
- int ret = 0;
/* Block accounting for super block */
spin_lock(&info->delalloc_root_lock);
@@ -3560,97 +3557,86 @@ int btrfs_update_block_group(struct btrfs_trans_handle *trans,
btrfs_set_super_bytes_used(info->super_copy, old_val);
spin_unlock(&info->delalloc_root_lock);
- while (total) {
- struct btrfs_space_info *space_info;
- bool reclaim = false;
-
- cache = btrfs_lookup_block_group(info, bytenr);
- if (!cache) {
- ret = -ENOENT;
- break;
- }
- space_info = cache->space_info;
- factor = btrfs_bg_type_to_factor(cache->flags);
+ cache = btrfs_lookup_block_group(info, bytenr);
+ if (!cache)
+ return -ENOENT;
- /*
- * If this block group has free space cache written out, we
- * need to make sure to load it if we are removing space. This
- * is because we need the unpinning stage to actually add the
- * space back to the block group, otherwise we will leak space.
- */
- if (!alloc && !btrfs_block_group_done(cache))
- btrfs_cache_block_group(cache, true);
+ /* An extent can not span multiple block groups. */
+ ASSERT(bytenr + num_bytes <= cache->start + cache->length);
- byte_in_group = bytenr - cache->start;
- WARN_ON(byte_in_group > cache->length);
+ space_info = cache->space_info;
+ factor = btrfs_bg_type_to_factor(cache->flags);
- spin_lock(&space_info->lock);
- spin_lock(&cache->lock);
+ /*
+ * If this block group has free space cache written out, we need to make
+ * sure to load it if we are removing space. This is because we need
+ * the unpinning stage to actually add the space back to the block group,
+ * otherwise we will leak space.
+ */
+ if (!alloc && !btrfs_block_group_done(cache))
+ btrfs_cache_block_group(cache, true);
- if (btrfs_test_opt(info, SPACE_CACHE) &&
- cache->disk_cache_state < BTRFS_DC_CLEAR)
- cache->disk_cache_state = BTRFS_DC_CLEAR;
+ spin_lock(&space_info->lock);
+ spin_lock(&cache->lock);
- old_val = cache->used;
- num_bytes = min(total, cache->length - byte_in_group);
- if (alloc) {
- old_val += num_bytes;
- cache->used = old_val;
- cache->reserved -= num_bytes;
- space_info->bytes_reserved -= num_bytes;
- space_info->bytes_used += num_bytes;
- space_info->disk_used += num_bytes * factor;
- spin_unlock(&cache->lock);
- spin_unlock(&space_info->lock);
- } else {
- old_val -= num_bytes;
- cache->used = old_val;
- cache->pinned += num_bytes;
- btrfs_space_info_update_bytes_pinned(info, space_info,
- num_bytes);
- space_info->bytes_used -= num_bytes;
- space_info->disk_used -= num_bytes * factor;
+ if (btrfs_test_opt(info, SPACE_CACHE) &&
+ cache->disk_cache_state < BTRFS_DC_CLEAR)
+ cache->disk_cache_state = BTRFS_DC_CLEAR;
- reclaim = should_reclaim_block_group(cache, num_bytes);
+ old_val = cache->used;
+ if (alloc) {
+ old_val += num_bytes;

This diff is incomplete. Download the complete patch.

fs/btrfs/block-rsv.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/btrfs_inode.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/check-integrity.c

View before deletion

This diff is incomplete. Download the complete patch.

fs/btrfs/check-integrity.h

View before deletion

This diff is incomplete. Download the complete patch.

fs/btrfs/compression.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/ctree.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/ctree.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/defrag.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/defrag.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/delalloc-space.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/delayed-inode.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/delayed-inode.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/delayed-ref.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/delayed-ref.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/dev-replace.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/dir-item.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/dir-item.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/disk-io.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/disk-io.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/extent-io-tree.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/extent-io-tree.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/extent-tree.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/extent-tree.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/extent_io.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/extent_io.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/file-item.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/file.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/free-space-cache.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/free-space-tree.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/fs.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/inode-item.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/inode-item.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/inode.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/ioctl.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/locking.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/messages.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/messages.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/ordered-data.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/ordered-data.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/print-tree.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/props.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/qgroup.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/qgroup.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/raid-stripe-tree.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/raid-stripe-tree.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/ref-verify.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/reflink.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/relocation.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/relocation.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/root-tree.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/root-tree.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/scrub.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/send.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/space-info.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/space-info.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/super.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/sysfs.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/tests/extent-buffer-tests.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/tests/inode-tests.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/transaction.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/transaction.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/tree-checker.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/tree-log.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/ulist.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/uuid-tree.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/verity.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/volumes.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/volumes.h

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/xattr.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/zoned.c

View file

This diff is incomplete. Download the complete patch.

fs/btrfs/zstd.c

View file

This diff is incomplete. Download the complete patch.

include/trace/events/btrfs.h

View file

This diff is incomplete. Download the complete patch.

include/uapi/linux/btrfs.h

View file

This diff is incomplete. Download the complete patch.

include/uapi/linux/btrfs_tree.h

View file

This diff is incomplete. Download the complete patch.