https://github.com/torvalds/linux
Revision 758f2dfcf8a249b1f1510aa32e625c2ec20642a3 authored by Filipe Manana on 19 November 2015, 11:45:48 UTC, committed by Chris Mason on 25 November 2015, 13:22:08 UTC
Currently scrub can race with the cleaner kthread when the later attempts to delete an unused block group, and the result is preventing the cleaner kthread from ever deleting later the block group - unless the block group becomes used and unused again. The following diagram illustrates that race: CPU 1 CPU 2 cleaner kthread btrfs_delete_unused_bgs() gets block group X from fs_info->unused_bgs and removes it from that list scrub_enumerate_chunks() searches device tree using its commit root finds device extent for block group X gets block group X from the tree fs_info->block_group_cache_tree (via btrfs_lookup_block_group()) sets bg X to RO sees the block group is already RO and therefore doesn't delete it nor adds it back to unused list So fix this by making scrub add the block group again to the list of unused block groups if the block group is still unused when it finished scrubbing it and it hasn't been removed already. Signed-off-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: Chris Mason <clm@fb.com>
1 parent 020d5b7
Tip revision: 758f2dfcf8a249b1f1510aa32e625c2ec20642a3 authored by Filipe Manana on 19 November 2015, 11:45:48 UTC
Btrfs: fix scrub preventing unused block groups from being deleted
Btrfs: fix scrub preventing unused block groups from being deleted
Tip revision: 758f2df
File | Mode | Size |
---|---|---|
asymmetric_keys | ||
async_tx | ||
.gitignore | -rw-r--r-- | 12 bytes |
842.c | -rw-r--r-- | 2.6 KB |
Kconfig | -rw-r--r-- | 46.5 KB |
Makefile | -rw-r--r-- | 4.6 KB |
ablk_helper.c | -rw-r--r-- | 4.2 KB |
ablkcipher.c | -rw-r--r-- | 17.9 KB |
aead.c | -rw-r--r-- | 10.0 KB |
aes_generic.c | -rw-r--r-- | 62.0 KB |
af_alg.c | -rw-r--r-- | 9.8 KB |
ahash.c | -rw-r--r-- | 14.8 KB |
akcipher.c | -rw-r--r-- | 3.0 KB |
algapi.c | -rw-r--r-- | 20.6 KB |
algboss.c | -rw-r--r-- | 6.3 KB |
algif_aead.c | -rw-r--r-- | 13.6 KB |
algif_hash.c | -rw-r--r-- | 6.6 KB |
algif_rng.c | -rw-r--r-- | 5.2 KB |
algif_skcipher.c | -rw-r--r-- | 18.4 KB |
ansi_cprng.c | -rw-r--r-- | 10.9 KB |
anubis.c | -rw-r--r-- | 27.8 KB |
api.c | -rw-r--r-- | 13.8 KB |
arc4.c | -rw-r--r-- | 3.4 KB |
authenc.c | -rw-r--r-- | 13.7 KB |
authencesn.c | -rw-r--r-- | 14.9 KB |
blkcipher.c | -rw-r--r-- | 20.0 KB |
blowfish_common.c | -rw-r--r-- | 15.7 KB |
blowfish_generic.c | -rw-r--r-- | 3.4 KB |
camellia_generic.c | -rw-r--r-- | 34.9 KB |
cast5_generic.c | -rw-r--r-- | 20.9 KB |
cast6_generic.c | -rw-r--r-- | 9.5 KB |
cast_common.c | -rw-r--r-- | 13.1 KB |
cbc.c | -rw-r--r-- | 7.5 KB |
ccm.c | -rw-r--r-- | 22.5 KB |
chacha20_generic.c | -rw-r--r-- | 6.0 KB |
chacha20poly1305.c | -rw-r--r-- | 19.1 KB |
chainiv.c | -rw-r--r-- | 7.6 KB |
cipher.c | -rw-r--r-- | 3.3 KB |
cmac.c | -rw-r--r-- | 7.5 KB |
compress.c | -rw-r--r-- | 1.3 KB |
crc32.c | -rw-r--r-- | 3.7 KB |
crc32c_generic.c | -rw-r--r-- | 4.4 KB |
crct10dif_common.c | -rw-r--r-- | 3.6 KB |
crct10dif_generic.c | -rw-r--r-- | 3.2 KB |
cryptd.c | -rw-r--r-- | 26.1 KB |
crypto_null.c | -rw-r--r-- | 5.3 KB |
crypto_user.c | -rw-r--r-- | 12.8 KB |
crypto_wq.c | -rw-r--r-- | 972 bytes |
ctr.c | -rw-r--r-- | 12.3 KB |
cts.c | -rw-r--r-- | 9.8 KB |
deflate.c | -rw-r--r-- | 5.4 KB |
des_generic.c | -rw-r--r-- | 35.7 KB |
drbg.c | -rw-r--r-- | 56.0 KB |
ecb.c | -rw-r--r-- | 4.9 KB |
echainiv.c | -rw-r--r-- | 5.9 KB |
eseqiv.c | -rw-r--r-- | 5.9 KB |
fcrypt.c | -rw-r--r-- | 18.0 KB |
fips.c | -rw-r--r-- | 1.6 KB |
gcm.c | -rw-r--r-- | 32.9 KB |
gf128mul.c | -rw-r--r-- | 13.2 KB |
ghash-generic.c | -rw-r--r-- | 3.7 KB |
hash_info.c | -rw-r--r-- | 1.8 KB |
hmac.c | -rw-r--r-- | 6.8 KB |
internal.h | -rw-r--r-- | 4.1 KB |
jitterentropy-kcapi.c | -rw-r--r-- | 5.9 KB |
jitterentropy.c | -rw-r--r-- | 23.9 KB |
khazad.c | -rw-r--r-- | 51.8 KB |
lrw.c | -rw-r--r-- | 9.2 KB |
lz4.c | -rw-r--r-- | 2.5 KB |
lz4hc.c | -rw-r--r-- | 2.6 KB |
lzo.c | -rw-r--r-- | 2.6 KB |
mcryptd.c | -rw-r--r-- | 18.0 KB |
md4.c | -rw-r--r-- | 6.2 KB |
md5.c | -rw-r--r-- | 3.9 KB |
memneq.c | -rw-r--r-- | 6.1 KB |
michael_mic.c | -rw-r--r-- | 3.6 KB |
pcbc.c | -rw-r--r-- | 7.7 KB |
pcompress.c | -rw-r--r-- | 2.9 KB |
pcrypt.c | -rw-r--r-- | 13.2 KB |
poly1305_generic.c | -rw-r--r-- | 8.0 KB |
proc.c | -rw-r--r-- | 3.0 KB |
ripemd.h | -rw-r--r-- | 974 bytes |
rmd128.c | -rw-r--r-- | 10.2 KB |
rmd160.c | -rw-r--r-- | 12.6 KB |
rmd256.c | -rw-r--r-- | 10.6 KB |
rmd320.c | -rw-r--r-- | 13.1 KB |
rng.c | -rw-r--r-- | 5.0 KB |
rsa.c | -rw-r--r-- | 6.3 KB |
rsa_helper.c | -rw-r--r-- | 2.6 KB |
rsakey.asn1 | -rw-r--r-- | 107 bytes |
salsa20_generic.c | -rw-r--r-- | 6.7 KB |
scatterwalk.c | -rw-r--r-- | 3.9 KB |
seed.c | -rw-r--r-- | 17.4 KB |
seqiv.c | -rw-r--r-- | 8.9 KB |
serpent_generic.c | -rw-r--r-- | 21.2 KB |
sha1_generic.c | -rw-r--r-- | 2.4 KB |
sha256_generic.c | -rw-r--r-- | 10.4 KB |
sha512_generic.c | -rw-r--r-- | 7.1 KB |
shash.c | -rw-r--r-- | 17.5 KB |
skcipher.c | -rw-r--r-- | 7.3 KB |
tcrypt.c | -rw-r--r-- | 53.1 KB |
tcrypt.h | -rw-r--r-- | 4.3 KB |
tea.c | -rw-r--r-- | 6.6 KB |
testmgr.c | -rw-r--r-- | 85.1 KB |
testmgr.h | -rw-r--r-- | 1.2 MB |
tgr192.c | -rw-r--r-- | 30.5 KB |
twofish_common.c | -rw-r--r-- | 37.8 KB |
twofish_generic.c | -rw-r--r-- | 6.3 KB |
vmac.c | -rw-r--r-- | 18.9 KB |
wp512.c | -rw-r--r-- | 59.8 KB |
xcbc.c | -rw-r--r-- | 7.2 KB |
xor.c | -rw-r--r-- | 4.0 KB |
xts.c | -rw-r--r-- | 8.7 KB |
zlib.c | -rw-r--r-- | 9.6 KB |
Computing file changes ...