diff mbox series

[v3] btrfs: Test proper interaction between skip_balance and paused balance

Message ID 20211108142901.1003352-1-nborisov@suse.com (mailing list archive)
State New, archived
Headers show
Series [v3] btrfs: Test proper interaction between skip_balance and paused balance | expand

Commit Message

Nikolay Borisov Nov. 8, 2021, 2:29 p.m. UTC
Ensure a device can be added to a filesystem that has a paused balance
operation and has been mounted with the 'skip_balance' mount option

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
---

V3:
 * Added swapon to the list of exclusive ops
 * Use _spare_dev_get
 * Test balance resume via progs while balance is paused. I hit an assertion failure
 outside of xfstest while doing this sequence of steps so let's add it to
 ensure that's not regressed.

 tests/btrfs/049     | 92 +++++++++++++++++++++++++++++++++++++++++++++
 tests/btrfs/049.out |  1 +
 2 files changed, 93 insertions(+)
 create mode 100755 tests/btrfs/049

--
2.17.1

Comments

Anand Jain Nov. 10, 2021, 10:03 a.m. UTC | #1
On 8/11/21 10:29 pm, Nikolay Borisov wrote:
> Ensure a device can be added to a filesystem that has a paused balance
> operation and has been mounted with the 'skip_balance' mount option
> 
> Signed-off-by: Nikolay Borisov <nborisov@suse.com>
> ---
> 
> V3:
>   * Added swapon to the list of exclusive ops
>   * Use _spare_dev_get
>   * Test balance resume via progs while balance is paused. I hit an assertion failure
>   outside of xfstest while doing this sequence of steps so let's add it to
>   ensure that's not regressed.
> 
>   tests/btrfs/049     | 92 +++++++++++++++++++++++++++++++++++++++++++++
>   tests/btrfs/049.out |  1 +
>   2 files changed, 93 insertions(+)
>   create mode 100755 tests/btrfs/049
> 
> diff --git a/tests/btrfs/049 b/tests/btrfs/049
> new file mode 100755
> index 000000000000..d01ef05e5ead
> --- /dev/null
> +++ b/tests/btrfs/049
> @@ -0,0 +1,92 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2021 SUSE Linux Products GmbH.  All Rights Reserved.
> +#
> +# FS QA Test 049
> +#
> +# Ensure that it's possible to add a device when we have a paused balance
> +# and the filesystem is mounted with skip_balance. The issue is fixed by a patch


> +# titled "btrfs: allow device add if balance is paused"

It is a new feature, not a bug fix? The kernel patch won't backport to
the stable kernels. Then on older kernels, this test has to exit with
_notrun().
Is there any way to achieve this? There isn't any sysfs interface that
will help and, so far we haven't used the kernel version to achieve
something like this.



> +#
> +. ./common/preamble
> +_begin_fstest quick balance auto
> +
> +# real QA test starts here
> +
> +_supported_fs btrfs
> +_require_scratch_swapfile
> +_require_scratch_dev_pool 3
> +
> +_scratch_dev_pool_get 2
> +_spare_dev_get
> +
> +swapfile="$SCRATCH_MNT/swap"
> +_scratch_pool_mkfs >/dev/null
> +_scratch_mount
> +_format_swapfile "$swapfile" $(($(get_page_size) * 10))
> +
> +check_exclusive_ops()
> +{
> +	$BTRFS_UTIL_PROG device remove 2 $SCRATCH_MNT &>/dev/null
> +	[ $? -ne 0 ] || _fail "Successfully removed device"
> +	$BTRFS_UTIL_PROG filesystem resize -5m $SCRATCH_MNT &> /dev/null
> +	[ $? -ne 0 ] || _fail "Successfully resized filesystem"
> +	$BTRFS_UTIL_PROG replace start -B 2 $SPARE_DEV $SCRATCH_MNT &> /dev/null
> +	[ $? -ne 0 ] || _fail "Successfully replaced device"
> +	swapon "$swapfile" &> /dev/null
> +	[ $? -ne 0 ] || _fail "Successfully enabled a swap file"
> +}
> +
> +uuid=$(findmnt -n -o UUID $SCRATCH_MNT)
> +
> +# Create some files on the so that balance doesn't complete instantly
> +args=`_scale_fsstress_args -z \
> +	-f write=10 -f creat=10 \
> +	-n 1000 -p 2 -d $SCRATCH_MNT/stress_dir`
> +echo "Run fsstress $args" >>$seqres.full
> +$FSSTRESS_PROG $args >/dev/null 2>&1
> +
> +# Start and pause balance to ensure it will be restored on remount
> +echo "Start balance" >>$seqres.full
> +_run_btrfs_balance_start --bg "$SCRATCH_MNT"
> +$BTRFS_UTIL_PROG balance pause "$SCRATCH_MNT"
> +$BTRFS_UTIL_PROG balance status "$SCRATCH_MNT" | grep -q paused
> +[ $? -eq 0 ] || _fail "Balance not paused"
> +
> +# Exclusive ops should be blocked on manual pause of balance
> +check_exclusive_ops
> +
> +# Balance is now placed in paused state during mount
> +_scratch_cycle_mount "skip_balance"
> +
> +# Exclusive ops should be blocked on balance pause due to 'skip_balance'
> +check_exclusive_ops
> +
> +# Device add is the only allowed operation
> +$BTRFS_UTIL_PROG device add -K -f $SPARE_DEV "$SCRATCH_MNT"
> +
> +# Exclusive ops should still be blocked on account that balance is still paused
> +check_exclusive_ops
> +
> +# Should be possible to resume balance after device add
> +$BTRFS_UTIL_PROG balance resume "$SCRATCH_MNT" &>/dev/null
> +[ $? -eq 0 ] || _fail "Couldn't resume balance after device add"
> +
> +# Add more files so that new balance won't fish immediately
> +$FSSTRESS_PROG $args >/dev/null 2>&1
> +
> +# Now pause->resume balance. This ensures balance paused is properly set in
> +# the kernel and won't trigger an assertion failure.
> +echo "Start balance" >>$seqres.full
> +_run_btrfs_balance_start --bg "$SCRATCH_MNT"
> +$BTRFS_UTIL_PROG balance pause "$SCRATCH_MNT"
> +$BTRFS_UTIL_PROG balance status "$SCRATCH_MNT" | grep -q paused
> +[ $? -eq 0 ] || _fail "Balance not paused"
> +$BTRFS_UTIL_PROG balance resume "$SCRATCH_MNT" &>/dev/null
> +[ $? -eq 0 ] || _fail "Balance can't be resumed via IOCTL"
> +
> +_spare_dev_put
> +_scratch_dev_pool_put
> +echo "Silence is golden"
> +status=0
> +exit
> diff --git a/tests/btrfs/049.out b/tests/btrfs/049.out
> index cb0061b33ff0..c69568ad9323 100644
> --- a/tests/btrfs/049.out
> +++ b/tests/btrfs/049.out
> @@ -1 +1,2 @@
>   QA output created by 049
> +Silence is golden
> --
> 2.17.1
>
Nikolay Borisov Nov. 10, 2021, 10:07 a.m. UTC | #2
<snip>


>> +# titled "btrfs: allow device add if balance is paused"
> 
> It is a new feature, not a bug fix? The kernel patch won't backport to
> the stable kernels. Then on older kernels, this test has to exit with
> _notrun().
> Is there any way to achieve this? There isn't any sysfs interface that
> will help and, so far we haven't used the kernel version to achieve
> something like this.
> 

No, and this is outside the remit of xfstest. Anyone who is running
xfstest should ensure incompatible tests are excluded.

<snip>
Eryu Guan Nov. 10, 2021, 10:53 a.m. UTC | #3
On Wed, Nov 10, 2021 at 12:07:37PM +0200, Nikolay Borisov wrote:
> <snip>
> 
> 
> >> +# titled "btrfs: allow device add if balance is paused"
> > 
> > It is a new feature, not a bug fix? The kernel patch won't backport to
> > the stable kernels. Then on older kernels, this test has to exit with
> > _notrun().
> > Is there any way to achieve this? There isn't any sysfs interface that
> > will help and, so far we haven't used the kernel version to achieve
> > something like this.
> > 
> 
> No, and this is outside the remit of xfstest. Anyone who is running
> xfstest should ensure incompatible tests are excluded.

I don't think that's the case, we perfer test case detect required env
to run the test and _notrun if any condition not met. For regression
test for bug fix, we want the test to fail on old/un-patched kernel, but
for new features we need a way to tell if the kernel in test has the
feature or not.

Thanks,
Eryu
Nikolay Borisov Nov. 10, 2021, 11:18 a.m. UTC | #4
On 10.11.21 г. 12:53, Eryu Guan wrote:
> On Wed, Nov 10, 2021 at 12:07:37PM +0200, Nikolay Borisov wrote:
>> <snip>
>>
>>
>>>> +# titled "btrfs: allow device add if balance is paused"
>>>
>>> It is a new feature, not a bug fix? The kernel patch won't backport to
>>> the stable kernels. Then on older kernels, this test has to exit with
>>> _notrun().
>>> Is there any way to achieve this? There isn't any sysfs interface that
>>> will help and, so far we haven't used the kernel version to achieve
>>> something like this.
>>>
>>
>> No, and this is outside the remit of xfstest. Anyone who is running
>> xfstest should ensure incompatible tests are excluded.
> 
> I don't think that's the case, we perfer test case detect required env
> to run the test and _notrun if any condition not met. For regression
> test for bug fix, we want the test to fail on old/un-patched kernel, but
> for new features we need a way to tell if the kernel in test has the
> feature or not.

There isn't really an easy way to test for the presence of this feature.
The closest I could think of is modify btrfs' exclusive_operation sysfs
to show "balance paused" and in the test simply run a dummy balance and
pause it and check whether "balance" or "balance paused" is the state of
the exclusive op. However this means for this test to also rely on the
presence of the exclusive_operation sysfs file. However, I don't like
this because adding a device to balance is independent of the
exclusive_operation sysfs i.e it only has an informative role.

> 
> Thanks,
> Eryu
>
Eryu Guan Nov. 14, 2021, 12:06 p.m. UTC | #5
On Mon, Nov 08, 2021 at 04:29:01PM +0200, Nikolay Borisov wrote:
> Ensure a device can be added to a filesystem that has a paused balance
> operation and has been mounted with the 'skip_balance' mount option
> 
> Signed-off-by: Nikolay Borisov <nborisov@suse.com>
> ---
> 
> V3:
>  * Added swapon to the list of exclusive ops
>  * Use _spare_dev_get
>  * Test balance resume via progs while balance is paused. I hit an assertion failure
>  outside of xfstest while doing this sequence of steps so let's add it to
>  ensure that's not regressed.
> 
>  tests/btrfs/049     | 92 +++++++++++++++++++++++++++++++++++++++++++++
>  tests/btrfs/049.out |  1 +
>  2 files changed, 93 insertions(+)
>  create mode 100755 tests/btrfs/049
> 
> diff --git a/tests/btrfs/049 b/tests/btrfs/049
> new file mode 100755
> index 000000000000..d01ef05e5ead
> --- /dev/null
> +++ b/tests/btrfs/049
> @@ -0,0 +1,92 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2021 SUSE Linux Products GmbH.  All Rights Reserved.
> +#
> +# FS QA Test 049
> +#
> +# Ensure that it's possible to add a device when we have a paused balance
> +# and the filesystem is mounted with skip_balance. The issue is fixed by a patch
> +# titled "btrfs: allow device add if balance is paused"

After looking at the kernel patch, it looks more like a bug fix not a
new feature, as adding device to a ENOSPC-but-paused balance seems to be
the only reasonable way to finish the balance. If that's the case,
there's no problem add this case that will fail on old kernels.

> +#
> +. ./common/preamble
> +_begin_fstest quick balance auto
> +
> +# real QA test starts here
> +
> +_supported_fs btrfs
> +_require_scratch_swapfile
> +_require_scratch_dev_pool 3
> +
> +_scratch_dev_pool_get 2
> +_spare_dev_get
> +
> +swapfile="$SCRATCH_MNT/swap"
> +_scratch_pool_mkfs >/dev/null
> +_scratch_mount
> +_format_swapfile "$swapfile" $(($(get_page_size) * 10))
> +
> +check_exclusive_ops()
> +{
> +	$BTRFS_UTIL_PROG device remove 2 $SCRATCH_MNT &>/dev/null
> +	[ $? -ne 0 ] || _fail "Successfully removed device"
> +	$BTRFS_UTIL_PROG filesystem resize -5m $SCRATCH_MNT &> /dev/null
> +	[ $? -ne 0 ] || _fail "Successfully resized filesystem"
> +	$BTRFS_UTIL_PROG replace start -B 2 $SPARE_DEV $SCRATCH_MNT &> /dev/null
> +	[ $? -ne 0 ] || _fail "Successfully replaced device"
> +	swapon "$swapfile" &> /dev/null
> +	[ $? -ne 0 ] || _fail "Successfully enabled a swap file"
> +}
> +
> +uuid=$(findmnt -n -o UUID $SCRATCH_MNT)

$uuid is not used anywhere, can be removed?

> +
> +# Create some files on the so that balance doesn't complete instantly

You mean "on the device"?

> +args=`_scale_fsstress_args -z \
> +	-f write=10 -f creat=10 \
> +	-n 1000 -p 2 -d $SCRATCH_MNT/stress_dir`
> +echo "Run fsstress $args" >>$seqres.full
> +$FSSTRESS_PROG $args >/dev/null 2>&1
> +
> +# Start and pause balance to ensure it will be restored on remount
> +echo "Start balance" >>$seqres.full
> +_run_btrfs_balance_start --bg "$SCRATCH_MNT"
> +$BTRFS_UTIL_PROG balance pause "$SCRATCH_MNT"
> +$BTRFS_UTIL_PROG balance status "$SCRATCH_MNT" | grep -q paused
> +[ $? -eq 0 ] || _fail "Balance not paused"
> +
> +# Exclusive ops should be blocked on manual pause of balance
> +check_exclusive_ops
> +
> +# Balance is now placed in paused state during mount
> +_scratch_cycle_mount "skip_balance"
> +
> +# Exclusive ops should be blocked on balance pause due to 'skip_balance'
> +check_exclusive_ops
> +
> +# Device add is the only allowed operation
> +$BTRFS_UTIL_PROG device add -K -f $SPARE_DEV "$SCRATCH_MNT"
> +
> +# Exclusive ops should still be blocked on account that balance is still paused
> +check_exclusive_ops
> +
> +# Should be possible to resume balance after device add
> +$BTRFS_UTIL_PROG balance resume "$SCRATCH_MNT" &>/dev/null
> +[ $? -eq 0 ] || _fail "Couldn't resume balance after device add"
> +
> +# Add more files so that new balance won't fish immediately
                                              ^^^^ finish ?
> +$FSSTRESS_PROG $args >/dev/null 2>&1
> +
> +# Now pause->resume balance. This ensures balance paused is properly set in
> +# the kernel and won't trigger an assertion failure.
> +echo "Start balance" >>$seqres.full
> +_run_btrfs_balance_start --bg "$SCRATCH_MNT"
> +$BTRFS_UTIL_PROG balance pause "$SCRATCH_MNT"
> +$BTRFS_UTIL_PROG balance status "$SCRATCH_MNT" | grep -q paused
> +[ $? -eq 0 ] || _fail "Balance not paused"
> +$BTRFS_UTIL_PROG balance resume "$SCRATCH_MNT" &>/dev/null
> +[ $? -eq 0 ] || _fail "Balance can't be resumed via IOCTL"
> +
> +_spare_dev_put
> +_scratch_dev_pool_put
> +echo "Silence is golden"
> +status=0
> +exit
> diff --git a/tests/btrfs/049.out b/tests/btrfs/049.out
> index cb0061b33ff0..c69568ad9323 100644
> --- a/tests/btrfs/049.out
> +++ b/tests/btrfs/049.out
> @@ -1 +1,2 @@
>  QA output created by 049
> +Silence is golden

Ah, 049.out was forgotten to be removed by commit 668c859d37f2
("btrfs/049: remove the test"), so it's reused here.

Thanks,
Eryu
Nikolay Borisov Nov. 15, 2021, 8:11 a.m. UTC | #6
On 14.11.21 г. 14:06, Eryu Guan wrote:
> On Mon, Nov 08, 2021 at 04:29:01PM +0200, Nikolay Borisov wrote:
>> Ensure a device can be added to a filesystem that has a paused balance
>> operation and has been mounted with the 'skip_balance' mount option
>>
>> Signed-off-by: Nikolay Borisov <nborisov@suse.com>
>> ---
>>
>> V3:
>>  * Added swapon to the list of exclusive ops
>>  * Use _spare_dev_get
>>  * Test balance resume via progs while balance is paused. I hit an assertion failure
>>  outside of xfstest while doing this sequence of steps so let's add it to
>>  ensure that's not regressed.
>>
>>  tests/btrfs/049     | 92 +++++++++++++++++++++++++++++++++++++++++++++
>>  tests/btrfs/049.out |  1 +
>>  2 files changed, 93 insertions(+)
>>  create mode 100755 tests/btrfs/049
>>
>> diff --git a/tests/btrfs/049 b/tests/btrfs/049
>> new file mode 100755
>> index 000000000000..d01ef05e5ead
>> --- /dev/null
>> +++ b/tests/btrfs/049
>> @@ -0,0 +1,92 @@
>> +#! /bin/bash
>> +# SPDX-License-Identifier: GPL-2.0
>> +# Copyright (c) 2021 SUSE Linux Products GmbH.  All Rights Reserved.
>> +#
>> +# FS QA Test 049
>> +#
>> +# Ensure that it's possible to add a device when we have a paused balance
>> +# and the filesystem is mounted with skip_balance. The issue is fixed by a patch
>> +# titled "btrfs: allow device add if balance is paused"
> 
> After looking at the kernel patch, it looks more like a bug fix not a
> new feature, as adding device to a ENOSPC-but-paused balance seems to be
> the only reasonable way to finish the balance. If that's the case,
> there's no problem add this case that will fail on old kernels.

*nod*

> 
>> +#
>> +. ./common/preamble
>> +_begin_fstest quick balance auto
>> +
>> +# real QA test starts here
>> +
>> +_supported_fs btrfs
>> +_require_scratch_swapfile
>> +_require_scratch_dev_pool 3
>> +
>> +_scratch_dev_pool_get 2
>> +_spare_dev_get
>> +
>> +swapfile="$SCRATCH_MNT/swap"
>> +_scratch_pool_mkfs >/dev/null
>> +_scratch_mount
>> +_format_swapfile "$swapfile" $(($(get_page_size) * 10))
>> +
>> +check_exclusive_ops()
>> +{
>> +	$BTRFS_UTIL_PROG device remove 2 $SCRATCH_MNT &>/dev/null
>> +	[ $? -ne 0 ] || _fail "Successfully removed device"
>> +	$BTRFS_UTIL_PROG filesystem resize -5m $SCRATCH_MNT &> /dev/null
>> +	[ $? -ne 0 ] || _fail "Successfully resized filesystem"
>> +	$BTRFS_UTIL_PROG replace start -B 2 $SPARE_DEV $SCRATCH_MNT &> /dev/null
>> +	[ $? -ne 0 ] || _fail "Successfully replaced device"
>> +	swapon "$swapfile" &> /dev/null
>> +	[ $? -ne 0 ] || _fail "Successfully enabled a swap file"
>> +}
>> +
>> +uuid=$(findmnt -n -o UUID $SCRATCH_MNT)
> 
> $uuid is not used anywhere, can be removed?

Sure, I'm sure I did but I guess fucked up during rebase.

> 
>> +
>> +# Create some files on the so that balance doesn't complete instantly
> 
> You mean "on the device"?

Yep.

> 
>> +args=`_scale_fsstress_args -z \
>> +	-f write=10 -f creat=10 \
>> +	-n 1000 -p 2 -d $SCRATCH_MNT/stress_dir`
>> +echo "Run fsstress $args" >>$seqres.full
>> +$FSSTRESS_PROG $args >/dev/null 2>&1
>> +
>> +# Start and pause balance to ensure it will be restored on remount
>> +echo "Start balance" >>$seqres.full
>> +_run_btrfs_balance_start --bg "$SCRATCH_MNT"
>> +$BTRFS_UTIL_PROG balance pause "$SCRATCH_MNT"
>> +$BTRFS_UTIL_PROG balance status "$SCRATCH_MNT" | grep -q paused
>> +[ $? -eq 0 ] || _fail "Balance not paused"
>> +
>> +# Exclusive ops should be blocked on manual pause of balance
>> +check_exclusive_ops
>> +
>> +# Balance is now placed in paused state during mount
>> +_scratch_cycle_mount "skip_balance"
>> +
>> +# Exclusive ops should be blocked on balance pause due to 'skip_balance'
>> +check_exclusive_ops
>> +
>> +# Device add is the only allowed operation
>> +$BTRFS_UTIL_PROG device add -K -f $SPARE_DEV "$SCRATCH_MNT"
>> +
>> +# Exclusive ops should still be blocked on account that balance is still paused
>> +check_exclusive_ops
>> +
>> +# Should be possible to resume balance after device add
>> +$BTRFS_UTIL_PROG balance resume "$SCRATCH_MNT" &>/dev/null
>> +[ $? -eq 0 ] || _fail "Couldn't resume balance after device add"
>> +
>> +# Add more files so that new balance won't fish immediately
>                                               ^^^^ finish ?

Yes,

>> +$FSSTRESS_PROG $args >/dev/null 2>&1
>> +
>> +# Now pause->resume balance. This ensures balance paused is properly set in
>> +# the kernel and won't trigger an assertion failure.
>> +echo "Start balance" >>$seqres.full
>> +_run_btrfs_balance_start --bg "$SCRATCH_MNT"
>> +$BTRFS_UTIL_PROG balance pause "$SCRATCH_MNT"
>> +$BTRFS_UTIL_PROG balance status "$SCRATCH_MNT" | grep -q paused
>> +[ $? -eq 0 ] || _fail "Balance not paused"
>> +$BTRFS_UTIL_PROG balance resume "$SCRATCH_MNT" &>/dev/null
>> +[ $? -eq 0 ] || _fail "Balance can't be resumed via IOCTL"
>> +
>> +_spare_dev_put
>> +_scratch_dev_pool_put
>> +echo "Silence is golden"
>> +status=0
>> +exit
>> diff --git a/tests/btrfs/049.out b/tests/btrfs/049.out
>> index cb0061b33ff0..c69568ad9323 100644
>> --- a/tests/btrfs/049.out
>> +++ b/tests/btrfs/049.out
>> @@ -1 +1,2 @@
>>  QA output created by 049
>> +Silence is golden
> 
> Ah, 049.out was forgotten to be removed by commit 668c859d37f2
> ("btrfs/049: remove the test"), so it's reused here.
> 
> Thanks,
> Eryu
>
diff mbox series

Patch

diff --git a/tests/btrfs/049 b/tests/btrfs/049
new file mode 100755
index 000000000000..d01ef05e5ead
--- /dev/null
+++ b/tests/btrfs/049
@@ -0,0 +1,92 @@ 
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2021 SUSE Linux Products GmbH.  All Rights Reserved.
+#
+# FS QA Test 049
+#
+# Ensure that it's possible to add a device when we have a paused balance
+# and the filesystem is mounted with skip_balance. The issue is fixed by a patch
+# titled "btrfs: allow device add if balance is paused"
+#
+. ./common/preamble
+_begin_fstest quick balance auto
+
+# real QA test starts here
+
+_supported_fs btrfs
+_require_scratch_swapfile
+_require_scratch_dev_pool 3
+
+_scratch_dev_pool_get 2
+_spare_dev_get
+
+swapfile="$SCRATCH_MNT/swap"
+_scratch_pool_mkfs >/dev/null
+_scratch_mount
+_format_swapfile "$swapfile" $(($(get_page_size) * 10))
+
+check_exclusive_ops()
+{
+	$BTRFS_UTIL_PROG device remove 2 $SCRATCH_MNT &>/dev/null
+	[ $? -ne 0 ] || _fail "Successfully removed device"
+	$BTRFS_UTIL_PROG filesystem resize -5m $SCRATCH_MNT &> /dev/null
+	[ $? -ne 0 ] || _fail "Successfully resized filesystem"
+	$BTRFS_UTIL_PROG replace start -B 2 $SPARE_DEV $SCRATCH_MNT &> /dev/null
+	[ $? -ne 0 ] || _fail "Successfully replaced device"
+	swapon "$swapfile" &> /dev/null
+	[ $? -ne 0 ] || _fail "Successfully enabled a swap file"
+}
+
+uuid=$(findmnt -n -o UUID $SCRATCH_MNT)
+
+# Create some files on the so that balance doesn't complete instantly
+args=`_scale_fsstress_args -z \
+	-f write=10 -f creat=10 \
+	-n 1000 -p 2 -d $SCRATCH_MNT/stress_dir`
+echo "Run fsstress $args" >>$seqres.full
+$FSSTRESS_PROG $args >/dev/null 2>&1
+
+# Start and pause balance to ensure it will be restored on remount
+echo "Start balance" >>$seqres.full
+_run_btrfs_balance_start --bg "$SCRATCH_MNT"
+$BTRFS_UTIL_PROG balance pause "$SCRATCH_MNT"
+$BTRFS_UTIL_PROG balance status "$SCRATCH_MNT" | grep -q paused
+[ $? -eq 0 ] || _fail "Balance not paused"
+
+# Exclusive ops should be blocked on manual pause of balance
+check_exclusive_ops
+
+# Balance is now placed in paused state during mount
+_scratch_cycle_mount "skip_balance"
+
+# Exclusive ops should be blocked on balance pause due to 'skip_balance'
+check_exclusive_ops
+
+# Device add is the only allowed operation
+$BTRFS_UTIL_PROG device add -K -f $SPARE_DEV "$SCRATCH_MNT"
+
+# Exclusive ops should still be blocked on account that balance is still paused
+check_exclusive_ops
+
+# Should be possible to resume balance after device add
+$BTRFS_UTIL_PROG balance resume "$SCRATCH_MNT" &>/dev/null
+[ $? -eq 0 ] || _fail "Couldn't resume balance after device add"
+
+# Add more files so that new balance won't fish immediately
+$FSSTRESS_PROG $args >/dev/null 2>&1
+
+# Now pause->resume balance. This ensures balance paused is properly set in
+# the kernel and won't trigger an assertion failure.
+echo "Start balance" >>$seqres.full
+_run_btrfs_balance_start --bg "$SCRATCH_MNT"
+$BTRFS_UTIL_PROG balance pause "$SCRATCH_MNT"
+$BTRFS_UTIL_PROG balance status "$SCRATCH_MNT" | grep -q paused
+[ $? -eq 0 ] || _fail "Balance not paused"
+$BTRFS_UTIL_PROG balance resume "$SCRATCH_MNT" &>/dev/null
+[ $? -eq 0 ] || _fail "Balance can't be resumed via IOCTL"
+
+_spare_dev_put
+_scratch_dev_pool_put
+echo "Silence is golden"
+status=0
+exit
diff --git a/tests/btrfs/049.out b/tests/btrfs/049.out
index cb0061b33ff0..c69568ad9323 100644
--- a/tests/btrfs/049.out
+++ b/tests/btrfs/049.out
@@ -1 +1,2 @@ 
 QA output created by 049
+Silence is golden