Btrfs: steal from global reserve if we are cleaning up orphans
Sometimes xfstest 83 will fail to remount the scratch device because we've gotten ourselves so full that we cannot cleanup the orphan items. In this case check to see if we're doing the orphan cleanup and if we are allow us to steal our reservation from the global block rsv. With this patch I've not been able to reproduce the failed mount problem. Thanks, Signed-off-by: Josef Bacik <jbacik@fusionio.com>
This commit is contained in:
parent
8696c53304
commit
5d80366e9b
|
@ -1237,6 +1237,11 @@ struct seq_list {
|
||||||
u64 seq;
|
u64 seq;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum btrfs_orphan_cleanup_state {
|
||||||
|
ORPHAN_CLEANUP_STARTED = 1,
|
||||||
|
ORPHAN_CLEANUP_DONE = 2,
|
||||||
|
};
|
||||||
|
|
||||||
/* fs_info */
|
/* fs_info */
|
||||||
struct reloc_control;
|
struct reloc_control;
|
||||||
struct btrfs_device;
|
struct btrfs_device;
|
||||||
|
|
|
@ -102,6 +102,8 @@ static void dump_space_info(struct btrfs_space_info *info, u64 bytes,
|
||||||
int dump_block_groups);
|
int dump_block_groups);
|
||||||
static int btrfs_update_reserved_bytes(struct btrfs_block_group_cache *cache,
|
static int btrfs_update_reserved_bytes(struct btrfs_block_group_cache *cache,
|
||||||
u64 num_bytes, int reserve);
|
u64 num_bytes, int reserve);
|
||||||
|
static int block_rsv_use_bytes(struct btrfs_block_rsv *block_rsv,
|
||||||
|
u64 num_bytes);
|
||||||
|
|
||||||
static noinline int
|
static noinline int
|
||||||
block_group_cache_done(struct btrfs_block_group_cache *cache)
|
block_group_cache_done(struct btrfs_block_group_cache *cache)
|
||||||
|
@ -4099,6 +4101,15 @@ again:
|
||||||
goto again;
|
goto again;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
if (ret == -ENOSPC &&
|
||||||
|
unlikely(root->orphan_cleanup_state == ORPHAN_CLEANUP_STARTED)) {
|
||||||
|
struct btrfs_block_rsv *global_rsv =
|
||||||
|
&root->fs_info->global_block_rsv;
|
||||||
|
|
||||||
|
if (block_rsv != global_rsv &&
|
||||||
|
!block_rsv_use_bytes(global_rsv, orig_bytes))
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
if (flushing) {
|
if (flushing) {
|
||||||
spin_lock(&space_info->lock);
|
spin_lock(&space_info->lock);
|
||||||
space_info->flush = 0;
|
space_info->flush = 0;
|
||||||
|
|
|
@ -2218,11 +2218,6 @@ void btrfs_run_delayed_iputs(struct btrfs_root *root)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum btrfs_orphan_cleanup_state {
|
|
||||||
ORPHAN_CLEANUP_STARTED = 1,
|
|
||||||
ORPHAN_CLEANUP_DONE = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is called in transaction commit time. If there are no orphan
|
* This is called in transaction commit time. If there are no orphan
|
||||||
* files in the subvolume, it removes orphan item and frees block_rsv
|
* files in the subvolume, it removes orphan item and frees block_rsv
|
||||||
|
|
Loading…
Reference in New Issue