]> git.hungrycats.org Git - linux/commitdiff
btrfs: relocation: Introduce error injection points for cancelling balance
authorQu Wenruo <wqu@suse.com>
Tue, 3 Dec 2019 06:42:51 +0000 (14:42 +0800)
committerZygo Blaxell <ce3g8jdj@umail.furryterror.org>
Sat, 14 Dec 2019 04:53:08 +0000 (23:53 -0500)
Introduce a new error injection point, should_cancel_balance().

It's just a wrapper of atomic_read(&fs_info->balance_cancel_req), but
allows us to override the return value.

Currently there are only one locations using this function:
- btrfs_balance()
  It checks cancel before each block group.

There are other locations checking fs_info->balance_cancel_req, but they
are not used as an indicator to exit, so there is no need to use the
wrapper.

But there will be more locations coming, and some locations can cause
kernel panic if not handled properly.

So introduce this error injection to provide better test interface.

Signed-off-by: Qu Wenruo <wqu@suse.com>
(cherry picked from commit 6d2751364569f885ca795e37882690a78ac9f149)

fs/btrfs/ctree.h
fs/btrfs/relocation.c
fs/btrfs/volumes.c

index 54efb21c27272685c11dc70185ef0a48c5146dd1..b693d3dd6d0aa28b00bcb373588c65e5708e2038 100644 (file)
@@ -3352,6 +3352,7 @@ void btrfs_reloc_pre_snapshot(struct btrfs_pending_snapshot *pending,
                              u64 *bytes_to_reserve);
 int btrfs_reloc_post_snapshot(struct btrfs_trans_handle *trans,
                              struct btrfs_pending_snapshot *pending);
+int should_cancel_balance(struct btrfs_fs_info *fs_info);
 
 /* scrub.c */
 int btrfs_scrub_dev(struct btrfs_fs_info *fs_info, u64 devid, u64 start,
index b72001d395ad5f345d28b6f9170301eef63e267c..3c0e8d630b824ca16ab02da9821c9d21a53e6950 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/blkdev.h>
 #include <linux/rbtree.h>
 #include <linux/slab.h>
+#include <linux/error-injection.h>
 #include "ctree.h"
 #include "disk-io.h"
 #include "transaction.h"
@@ -3231,6 +3232,16 @@ int setup_extent_mapping(struct inode *inode, u64 start, u64 end,
        return ret;
 }
 
+/*
+ * This wrapper is to allow error injection to fully test all cancel
+ * call sites.
+ */
+int should_cancel_balance(struct btrfs_fs_info *fs_info)
+{
+       return atomic_read(&fs_info->balance_cancel_req);
+}
+ALLOW_ERROR_INJECTION(should_cancel_balance, TRUE);
+
 static int relocate_file_extent_cluster(struct inode *inode,
                                        struct file_extent_cluster *cluster)
 {
index ae09ad3a137af363f5b393911a09aff32263385b..e27a3bc8f1e73fc29b50148001b90aed3a44fe12 100644 (file)
@@ -3856,7 +3856,7 @@ int btrfs_balance(struct btrfs_fs_info *fs_info,
 
        if (btrfs_fs_closing(fs_info) ||
            atomic_read(&fs_info->balance_pause_req) ||
-           atomic_read(&fs_info->balance_cancel_req)) {
+           should_cancel_balance(fs_info)) {
                ret = -EINVAL;
                goto out;
        }