forked from Minki/linux
Btrfs: add a flags field to btrfs_fs_info
We have a lot of random ints in btrfs_fs_info that can be put into flags. This is mostly equivalent with the exception of how we deal with quota going on or off, now instead we set a flag when we are turning it on or off and deal with that appropriately, rather than just having a pending state that the current quota_enabled gets set to. Thanks, Signed-off-by: Josef Bacik <jbacik@fb.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
ba8b04c1d4
commit
afcdd129e0
@ -44,17 +44,6 @@
|
||||
#define BTRFS_INODE_IN_DELALLOC_LIST 9
|
||||
#define BTRFS_INODE_READDIO_NEED_LOCK 10
|
||||
#define BTRFS_INODE_HAS_PROPS 11
|
||||
/*
|
||||
* The following 3 bits are meant only for the btree inode.
|
||||
* When any of them is set, it means an error happened while writing an
|
||||
* extent buffer belonging to:
|
||||
* 1) a non-log btree
|
||||
* 2) a log btree and first log sub-transaction
|
||||
* 3) a log btree and second log sub-transaction
|
||||
*/
|
||||
#define BTRFS_INODE_BTREE_ERR 12
|
||||
#define BTRFS_INODE_BTREE_LOG1_ERR 13
|
||||
#define BTRFS_INODE_BTREE_LOG2_ERR 14
|
||||
|
||||
/* in memory btrfs inode */
|
||||
struct btrfs_inode {
|
||||
|
@ -677,9 +677,25 @@ struct btrfs_device;
|
||||
struct btrfs_fs_devices;
|
||||
struct btrfs_balance_control;
|
||||
struct btrfs_delayed_root;
|
||||
|
||||
#define BTRFS_FS_BARRIER 1
|
||||
#define BTRFS_FS_CLOSING_START 2
|
||||
#define BTRFS_FS_CLOSING_DONE 3
|
||||
#define BTRFS_FS_LOG_RECOVERING 4
|
||||
#define BTRFS_FS_OPEN 5
|
||||
#define BTRFS_FS_QUOTA_ENABLED 6
|
||||
#define BTRFS_FS_QUOTA_ENABLING 7
|
||||
#define BTRFS_FS_QUOTA_DISABLING 8
|
||||
#define BTRFS_FS_UPDATE_UUID_TREE_GEN 9
|
||||
#define BTRFS_FS_CREATING_FREE_SPACE_TREE 10
|
||||
#define BTRFS_FS_BTREE_ERR 11
|
||||
#define BTRFS_FS_LOG1_ERR 12
|
||||
#define BTRFS_FS_LOG2_ERR 13
|
||||
|
||||
struct btrfs_fs_info {
|
||||
u8 fsid[BTRFS_FSID_SIZE];
|
||||
u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
|
||||
unsigned long flags;
|
||||
struct btrfs_root *extent_root;
|
||||
struct btrfs_root *tree_root;
|
||||
struct btrfs_root *chunk_root;
|
||||
@ -908,10 +924,6 @@ struct btrfs_fs_info {
|
||||
int thread_pool_size;
|
||||
|
||||
struct kobject *space_info_kobj;
|
||||
int do_barriers;
|
||||
int closing;
|
||||
int log_root_recovering;
|
||||
int open;
|
||||
|
||||
u64 total_pinned;
|
||||
|
||||
@ -988,17 +1000,6 @@ struct btrfs_fs_info {
|
||||
#ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY
|
||||
u32 check_integrity_print_mask;
|
||||
#endif
|
||||
/*
|
||||
* quota information
|
||||
*/
|
||||
unsigned int quota_enabled:1;
|
||||
|
||||
/*
|
||||
* quota_enabled only changes state after a commit. This holds the
|
||||
* next state.
|
||||
*/
|
||||
unsigned int pending_quota_state:1;
|
||||
|
||||
/* is qgroup tracking in a consistent state? */
|
||||
u64 qgroup_flags;
|
||||
|
||||
@ -1062,7 +1063,6 @@ struct btrfs_fs_info {
|
||||
wait_queue_head_t replace_wait;
|
||||
|
||||
struct semaphore uuid_tree_rescan_sem;
|
||||
unsigned int update_uuid_tree_gen:1;
|
||||
|
||||
/* Used to reclaim the metadata space in the background. */
|
||||
struct work_struct async_reclaim_work;
|
||||
@ -1081,7 +1081,6 @@ struct btrfs_fs_info {
|
||||
*/
|
||||
struct list_head pinned_chunks;
|
||||
|
||||
int creating_free_space_tree;
|
||||
/* Used to record internally whether fs has been frozen */
|
||||
int fs_frozen;
|
||||
};
|
||||
@ -2868,10 +2867,14 @@ int btrfs_drop_subtree(struct btrfs_trans_handle *trans,
|
||||
static inline int btrfs_fs_closing(struct btrfs_fs_info *fs_info)
|
||||
{
|
||||
/*
|
||||
* Get synced with close_ctree()
|
||||
* Do it this way so we only ever do one test_bit in the normal case.
|
||||
*/
|
||||
smp_mb();
|
||||
return fs_info->closing;
|
||||
if (test_bit(BTRFS_FS_CLOSING_START, &fs_info->flags)) {
|
||||
if (test_bit(BTRFS_FS_CLOSING_DONE, &fs_info->flags))
|
||||
return 2;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1874,7 +1874,8 @@ int btrfs_delayed_delete_inode_ref(struct inode *inode)
|
||||
* leads to enospc problems. This means we also can't do
|
||||
* delayed inode refs
|
||||
*/
|
||||
if (BTRFS_I(inode)->root->fs_info->log_root_recovering)
|
||||
if (test_bit(BTRFS_FS_LOG_RECOVERING,
|
||||
&BTRFS_I(inode)->root->fs_info->flags))
|
||||
return -EAGAIN;
|
||||
|
||||
delayed_node = btrfs_get_or_create_delayed_node(inode);
|
||||
|
@ -770,7 +770,8 @@ int btrfs_add_delayed_tree_ref(struct btrfs_fs_info *fs_info,
|
||||
if (!head_ref)
|
||||
goto free_ref;
|
||||
|
||||
if (fs_info->quota_enabled && is_fstree(ref_root)) {
|
||||
if (test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) &&
|
||||
is_fstree(ref_root)) {
|
||||
record = kmalloc(sizeof(*record), GFP_NOFS);
|
||||
if (!record)
|
||||
goto free_head_ref;
|
||||
@ -828,7 +829,8 @@ int btrfs_add_delayed_data_ref(struct btrfs_fs_info *fs_info,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (fs_info->quota_enabled && is_fstree(ref_root)) {
|
||||
if (test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) &&
|
||||
is_fstree(ref_root)) {
|
||||
record = kmalloc(sizeof(*record), GFP_NOFS);
|
||||
if (!record) {
|
||||
kmem_cache_free(btrfs_delayed_data_ref_cachep, ref);
|
||||
|
@ -1839,7 +1839,7 @@ static int cleaner_kthread(void *arg)
|
||||
* Do not do anything if we might cause open_ctree() to block
|
||||
* before we have finished mounting the filesystem.
|
||||
*/
|
||||
if (!root->fs_info->open)
|
||||
if (!test_bit(BTRFS_FS_OPEN, &root->fs_info->flags))
|
||||
goto sleep;
|
||||
|
||||
if (!mutex_trylock(&root->fs_info->cleaner_mutex))
|
||||
@ -2332,8 +2332,6 @@ static void btrfs_init_qgroup(struct btrfs_fs_info *fs_info)
|
||||
fs_info->qgroup_op_tree = RB_ROOT;
|
||||
INIT_LIST_HEAD(&fs_info->dirty_qgroups);
|
||||
fs_info->qgroup_seq = 1;
|
||||
fs_info->quota_enabled = 0;
|
||||
fs_info->pending_quota_state = 0;
|
||||
fs_info->qgroup_ulist = NULL;
|
||||
fs_info->qgroup_rescan_running = false;
|
||||
mutex_init(&fs_info->qgroup_rescan_lock);
|
||||
@ -2518,8 +2516,7 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info,
|
||||
root = btrfs_read_tree_root(tree_root, &location);
|
||||
if (!IS_ERR(root)) {
|
||||
set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state);
|
||||
fs_info->quota_enabled = 1;
|
||||
fs_info->pending_quota_state = 1;
|
||||
set_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
|
||||
fs_info->quota_root = root;
|
||||
}
|
||||
|
||||
@ -2710,8 +2707,7 @@ int open_ctree(struct super_block *sb,
|
||||
extent_io_tree_init(&fs_info->freed_extents[1],
|
||||
fs_info->btree_inode->i_mapping);
|
||||
fs_info->pinned_extents = &fs_info->freed_extents[0];
|
||||
fs_info->do_barriers = 1;
|
||||
|
||||
set_bit(BTRFS_FS_BARRIER, &fs_info->flags);
|
||||
|
||||
mutex_init(&fs_info->ordered_operations_mutex);
|
||||
mutex_init(&fs_info->tree_log_mutex);
|
||||
@ -3199,10 +3195,9 @@ retry_root_backup:
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
fs_info->update_uuid_tree_gen = 1;
|
||||
set_bit(BTRFS_FS_UPDATE_UUID_TREE_GEN, &fs_info->flags);
|
||||
}
|
||||
|
||||
fs_info->open = 1;
|
||||
set_bit(BTRFS_FS_OPEN, &fs_info->flags);
|
||||
|
||||
/*
|
||||
* backuproot only affect mount behavior, and if open_ctree succeeded,
|
||||
@ -3893,8 +3888,7 @@ void close_ctree(struct btrfs_root *root)
|
||||
struct btrfs_fs_info *fs_info = root->fs_info;
|
||||
int ret;
|
||||
|
||||
fs_info->closing = 1;
|
||||
smp_mb();
|
||||
set_bit(BTRFS_FS_CLOSING_START, &fs_info->flags);
|
||||
|
||||
/* wait for the qgroup rescan worker to stop */
|
||||
btrfs_qgroup_wait_for_completion(fs_info, false);
|
||||
@ -3939,8 +3933,7 @@ void close_ctree(struct btrfs_root *root)
|
||||
kthread_stop(fs_info->transaction_kthread);
|
||||
kthread_stop(fs_info->cleaner_kthread);
|
||||
|
||||
fs_info->closing = 2;
|
||||
smp_mb();
|
||||
set_bit(BTRFS_FS_CLOSING_DONE, &fs_info->flags);
|
||||
|
||||
btrfs_free_qgroup_config(fs_info);
|
||||
|
||||
@ -3965,7 +3958,7 @@ void close_ctree(struct btrfs_root *root)
|
||||
invalidate_inode_pages2(fs_info->btree_inode->i_mapping);
|
||||
btrfs_stop_all_workers(fs_info);
|
||||
|
||||
fs_info->open = 0;
|
||||
clear_bit(BTRFS_FS_OPEN, &fs_info->flags);
|
||||
free_root_pointers(fs_info, 1);
|
||||
|
||||
iput(fs_info->btree_inode);
|
||||
|
@ -2940,7 +2940,7 @@ int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans,
|
||||
if (trans->aborted)
|
||||
return 0;
|
||||
|
||||
if (root->fs_info->creating_free_space_tree)
|
||||
if (test_bit(BTRFS_FS_CREATING_FREE_SPACE_TREE, &root->fs_info->flags))
|
||||
return 0;
|
||||
|
||||
if (root == root->fs_info->extent_root)
|
||||
@ -5188,7 +5188,7 @@ static int __reserve_metadata_bytes(struct btrfs_root *root,
|
||||
* which means we won't have fs_info->fs_root set, so don't do
|
||||
* the async reclaim as we will panic.
|
||||
*/
|
||||
if (!root->fs_info->log_root_recovering &&
|
||||
if (!test_bit(BTRFS_FS_LOG_RECOVERING, &root->fs_info->flags) &&
|
||||
need_do_async_reclaim(space_info, root, used) &&
|
||||
!work_busy(&root->fs_info->async_reclaim_work)) {
|
||||
trace_btrfs_trigger_flush(root->fs_info,
|
||||
@ -5794,7 +5794,7 @@ int btrfs_subvolume_reserve_metadata(struct btrfs_root *root,
|
||||
int ret;
|
||||
struct btrfs_block_rsv *global_rsv = &root->fs_info->global_block_rsv;
|
||||
|
||||
if (root->fs_info->quota_enabled) {
|
||||
if (test_bit(BTRFS_FS_QUOTA_ENABLED, &root->fs_info->flags)) {
|
||||
/* One for parent inode, two for dir entries */
|
||||
num_bytes = 3 * root->nodesize;
|
||||
ret = btrfs_qgroup_reserve_meta(root, num_bytes);
|
||||
@ -5972,7 +5972,7 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes)
|
||||
csum_bytes = BTRFS_I(inode)->csum_bytes;
|
||||
spin_unlock(&BTRFS_I(inode)->lock);
|
||||
|
||||
if (root->fs_info->quota_enabled) {
|
||||
if (test_bit(BTRFS_FS_QUOTA_ENABLED, &root->fs_info->flags)) {
|
||||
ret = btrfs_qgroup_reserve_meta(root,
|
||||
nr_extents * root->nodesize);
|
||||
if (ret)
|
||||
@ -8544,7 +8544,7 @@ static int account_leaf_items(struct btrfs_trans_handle *trans,
|
||||
u64 bytenr, num_bytes;
|
||||
|
||||
/* We can be called directly from walk_up_proc() */
|
||||
if (!root->fs_info->quota_enabled)
|
||||
if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &root->fs_info->flags))
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < nr; i++) {
|
||||
@ -8653,7 +8653,7 @@ static int account_shared_subtree(struct btrfs_trans_handle *trans,
|
||||
BUG_ON(root_level < 0 || root_level > BTRFS_MAX_LEVEL);
|
||||
BUG_ON(root_eb == NULL);
|
||||
|
||||
if (!root->fs_info->quota_enabled)
|
||||
if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &root->fs_info->flags))
|
||||
return 0;
|
||||
|
||||
if (!extent_buffer_uptodate(root_eb)) {
|
||||
@ -10803,7 +10803,7 @@ void btrfs_delete_unused_bgs(struct btrfs_fs_info *fs_info)
|
||||
struct btrfs_trans_handle *trans;
|
||||
int ret = 0;
|
||||
|
||||
if (!fs_info->open)
|
||||
if (!test_bit(BTRFS_FS_OPEN, &fs_info->flags))
|
||||
return;
|
||||
|
||||
spin_lock(&fs_info->unused_bgs_lock);
|
||||
|
@ -3625,7 +3625,6 @@ static void end_extent_buffer_writeback(struct extent_buffer *eb)
|
||||
static void set_btree_ioerr(struct page *page)
|
||||
{
|
||||
struct extent_buffer *eb = (struct extent_buffer *)page->private;
|
||||
struct btrfs_inode *btree_ino = BTRFS_I(eb->fs_info->btree_inode);
|
||||
|
||||
SetPageError(page);
|
||||
if (test_and_set_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags))
|
||||
@ -3671,13 +3670,13 @@ static void set_btree_ioerr(struct page *page)
|
||||
*/
|
||||
switch (eb->log_index) {
|
||||
case -1:
|
||||
set_bit(BTRFS_INODE_BTREE_ERR, &btree_ino->runtime_flags);
|
||||
set_bit(BTRFS_FS_BTREE_ERR, &eb->fs_info->flags);
|
||||
break;
|
||||
case 0:
|
||||
set_bit(BTRFS_INODE_BTREE_LOG1_ERR, &btree_ino->runtime_flags);
|
||||
set_bit(BTRFS_FS_LOG1_ERR, &eb->fs_info->flags);
|
||||
break;
|
||||
case 1:
|
||||
set_bit(BTRFS_INODE_BTREE_LOG2_ERR, &btree_ino->runtime_flags);
|
||||
set_bit(BTRFS_FS_LOG2_ERR, &eb->fs_info->flags);
|
||||
break;
|
||||
default:
|
||||
BUG(); /* unexpected, logic error */
|
||||
|
@ -1163,7 +1163,7 @@ int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info)
|
||||
if (IS_ERR(trans))
|
||||
return PTR_ERR(trans);
|
||||
|
||||
fs_info->creating_free_space_tree = 1;
|
||||
set_bit(BTRFS_FS_CREATING_FREE_SPACE_TREE, &fs_info->flags);
|
||||
free_space_root = btrfs_create_tree(trans, fs_info,
|
||||
BTRFS_FREE_SPACE_TREE_OBJECTID);
|
||||
if (IS_ERR(free_space_root)) {
|
||||
@ -1183,7 +1183,7 @@ int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info)
|
||||
}
|
||||
|
||||
btrfs_set_fs_compat_ro(fs_info, FREE_SPACE_TREE);
|
||||
fs_info->creating_free_space_tree = 0;
|
||||
clear_bit(BTRFS_FS_CREATING_FREE_SPACE_TREE, &fs_info->flags);
|
||||
|
||||
ret = btrfs_commit_transaction(trans, tree_root);
|
||||
if (ret)
|
||||
@ -1192,7 +1192,7 @@ int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info)
|
||||
return 0;
|
||||
|
||||
abort:
|
||||
fs_info->creating_free_space_tree = 0;
|
||||
clear_bit(BTRFS_FS_CREATING_FREE_SPACE_TREE, &fs_info->flags);
|
||||
btrfs_abort_transaction(trans, ret);
|
||||
btrfs_end_transaction(trans, tree_root);
|
||||
return ret;
|
||||
|
@ -3948,7 +3948,7 @@ noinline int btrfs_update_inode(struct btrfs_trans_handle *trans,
|
||||
*/
|
||||
if (!btrfs_is_free_space_inode(inode)
|
||||
&& root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID
|
||||
&& !root->fs_info->log_root_recovering) {
|
||||
&& !test_bit(BTRFS_FS_LOG_RECOVERING, &root->fs_info->flags)) {
|
||||
btrfs_update_root_times(trans, root);
|
||||
|
||||
ret = btrfs_delayed_update_inode(trans, root, inode);
|
||||
@ -5235,7 +5235,7 @@ void btrfs_evict_inode(struct inode *inode)
|
||||
|
||||
btrfs_free_io_failure_record(inode, 0, (u64)-1);
|
||||
|
||||
if (root->fs_info->log_root_recovering) {
|
||||
if (test_bit(BTRFS_FS_LOG_RECOVERING, &root->fs_info->flags)) {
|
||||
BUG_ON(test_bit(BTRFS_INODE_HAS_ORPHAN_ITEM,
|
||||
&BTRFS_I(inode)->runtime_flags));
|
||||
goto no_delete;
|
||||
|
@ -309,7 +309,7 @@ int btrfs_read_qgroup_config(struct btrfs_fs_info *fs_info)
|
||||
u64 flags = 0;
|
||||
u64 rescan_progress = 0;
|
||||
|
||||
if (!fs_info->quota_enabled)
|
||||
if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags))
|
||||
return 0;
|
||||
|
||||
fs_info->qgroup_ulist = ulist_alloc(GFP_NOFS);
|
||||
@ -463,13 +463,11 @@ next2:
|
||||
}
|
||||
out:
|
||||
fs_info->qgroup_flags |= flags;
|
||||
if (!(fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_ON)) {
|
||||
fs_info->quota_enabled = 0;
|
||||
fs_info->pending_quota_state = 0;
|
||||
} else if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN &&
|
||||
ret >= 0) {
|
||||
if (!(fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_ON))
|
||||
clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
|
||||
else if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN &&
|
||||
ret >= 0)
|
||||
ret = qgroup_rescan_init(fs_info, rescan_progress, 0);
|
||||
}
|
||||
btrfs_free_path(path);
|
||||
|
||||
if (ret < 0) {
|
||||
@ -847,7 +845,7 @@ static int btrfs_clean_quota_tree(struct btrfs_trans_handle *trans,
|
||||
}
|
||||
ret = 0;
|
||||
out:
|
||||
root->fs_info->pending_quota_state = 0;
|
||||
set_bit(BTRFS_FS_QUOTA_DISABLING, &root->fs_info->flags);
|
||||
btrfs_free_path(path);
|
||||
return ret;
|
||||
}
|
||||
@ -868,7 +866,7 @@ int btrfs_quota_enable(struct btrfs_trans_handle *trans,
|
||||
|
||||
mutex_lock(&fs_info->qgroup_ioctl_lock);
|
||||
if (fs_info->quota_root) {
|
||||
fs_info->pending_quota_state = 1;
|
||||
set_bit(BTRFS_FS_QUOTA_ENABLING, &fs_info->flags);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -964,7 +962,7 @@ out_add_root:
|
||||
}
|
||||
spin_lock(&fs_info->qgroup_lock);
|
||||
fs_info->quota_root = quota_root;
|
||||
fs_info->pending_quota_state = 1;
|
||||
set_bit(BTRFS_FS_QUOTA_ENABLING, &fs_info->flags);
|
||||
spin_unlock(&fs_info->qgroup_lock);
|
||||
out_free_path:
|
||||
btrfs_free_path(path);
|
||||
@ -993,8 +991,8 @@ int btrfs_quota_disable(struct btrfs_trans_handle *trans,
|
||||
mutex_lock(&fs_info->qgroup_ioctl_lock);
|
||||
if (!fs_info->quota_root)
|
||||
goto out;
|
||||
fs_info->quota_enabled = 0;
|
||||
fs_info->pending_quota_state = 0;
|
||||
clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
|
||||
set_bit(BTRFS_FS_QUOTA_DISABLING, &fs_info->flags);
|
||||
btrfs_qgroup_wait_for_completion(fs_info, false);
|
||||
spin_lock(&fs_info->qgroup_lock);
|
||||
quota_root = fs_info->quota_root;
|
||||
@ -1490,7 +1488,8 @@ int btrfs_qgroup_insert_dirty_extent(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_delayed_ref_root *delayed_refs;
|
||||
int ret;
|
||||
|
||||
if (!fs_info->quota_enabled || bytenr == 0 || num_bytes == 0)
|
||||
if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)
|
||||
|| bytenr == 0 || num_bytes == 0)
|
||||
return 0;
|
||||
if (WARN_ON(trans == NULL))
|
||||
return -EINVAL;
|
||||
@ -1713,7 +1712,7 @@ btrfs_qgroup_account_extent(struct btrfs_trans_handle *trans,
|
||||
if (old_roots)
|
||||
nr_old_roots = old_roots->nnodes;
|
||||
|
||||
if (!fs_info->quota_enabled)
|
||||
if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags))
|
||||
goto out_free;
|
||||
BUG_ON(!fs_info->quota_root);
|
||||
|
||||
@ -1833,10 +1832,14 @@ int btrfs_run_qgroups(struct btrfs_trans_handle *trans,
|
||||
if (!quota_root)
|
||||
goto out;
|
||||
|
||||
if (!fs_info->quota_enabled && fs_info->pending_quota_state)
|
||||
if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) &&
|
||||
test_bit(BTRFS_FS_QUOTA_ENABLING, &fs_info->flags))
|
||||
start_rescan_worker = 1;
|
||||
|
||||
fs_info->quota_enabled = fs_info->pending_quota_state;
|
||||
if (test_and_clear_bit(BTRFS_FS_QUOTA_ENABLING, &fs_info->flags))
|
||||
set_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
|
||||
if (test_and_clear_bit(BTRFS_FS_QUOTA_DISABLING, &fs_info->flags))
|
||||
clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
|
||||
|
||||
spin_lock(&fs_info->qgroup_lock);
|
||||
while (!list_empty(&fs_info->dirty_qgroups)) {
|
||||
@ -1855,7 +1858,7 @@ int btrfs_run_qgroups(struct btrfs_trans_handle *trans,
|
||||
BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT;
|
||||
spin_lock(&fs_info->qgroup_lock);
|
||||
}
|
||||
if (fs_info->quota_enabled)
|
||||
if (test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags))
|
||||
fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_ON;
|
||||
else
|
||||
fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_ON;
|
||||
@ -1900,7 +1903,7 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans,
|
||||
u64 nums;
|
||||
|
||||
mutex_lock(&fs_info->qgroup_ioctl_lock);
|
||||
if (!fs_info->quota_enabled)
|
||||
if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags))
|
||||
goto out;
|
||||
|
||||
if (!quota_root) {
|
||||
@ -2347,7 +2350,7 @@ static void btrfs_qgroup_rescan_worker(struct btrfs_work *work)
|
||||
err = PTR_ERR(trans);
|
||||
break;
|
||||
}
|
||||
if (!fs_info->quota_enabled) {
|
||||
if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) {
|
||||
err = -EINTR;
|
||||
} else {
|
||||
err = qgroup_rescan_leaf(fs_info, path, trans);
|
||||
@ -2578,8 +2581,8 @@ int btrfs_qgroup_reserve_data(struct inode *inode, u64 start, u64 len)
|
||||
struct ulist_iterator uiter;
|
||||
int ret;
|
||||
|
||||
if (!root->fs_info->quota_enabled || !is_fstree(root->objectid) ||
|
||||
len == 0)
|
||||
if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &root->fs_info->flags) ||
|
||||
!is_fstree(root->objectid) || len == 0)
|
||||
return 0;
|
||||
|
||||
changeset.bytes_changed = 0;
|
||||
@ -2676,8 +2679,8 @@ int btrfs_qgroup_reserve_meta(struct btrfs_root *root, int num_bytes)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!root->fs_info->quota_enabled || !is_fstree(root->objectid) ||
|
||||
num_bytes == 0)
|
||||
if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &root->fs_info->flags) ||
|
||||
!is_fstree(root->objectid) || num_bytes == 0)
|
||||
return 0;
|
||||
|
||||
BUG_ON(num_bytes != round_down(num_bytes, root->nodesize));
|
||||
@ -2692,7 +2695,8 @@ void btrfs_qgroup_free_meta_all(struct btrfs_root *root)
|
||||
{
|
||||
int reserved;
|
||||
|
||||
if (!root->fs_info->quota_enabled || !is_fstree(root->objectid))
|
||||
if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &root->fs_info->flags) ||
|
||||
!is_fstree(root->objectid))
|
||||
return;
|
||||
|
||||
reserved = atomic_xchg(&root->qgroup_meta_rsv, 0);
|
||||
@ -2703,7 +2707,8 @@ void btrfs_qgroup_free_meta_all(struct btrfs_root *root)
|
||||
|
||||
void btrfs_qgroup_free_meta(struct btrfs_root *root, int num_bytes)
|
||||
{
|
||||
if (!root->fs_info->quota_enabled || !is_fstree(root->objectid))
|
||||
if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &root->fs_info->flags) ||
|
||||
!is_fstree(root->objectid))
|
||||
return;
|
||||
|
||||
BUG_ON(num_bytes != round_down(num_bytes, root->nodesize));
|
||||
|
@ -3952,7 +3952,7 @@ static int qgroup_fix_relocated_data_extents(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_key key;
|
||||
int ret = 0;
|
||||
|
||||
if (!fs_info->quota_enabled)
|
||||
if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
|
@ -1836,7 +1836,7 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data)
|
||||
}
|
||||
sb->s_flags &= ~MS_RDONLY;
|
||||
|
||||
fs_info->open = 1;
|
||||
set_bit(BTRFS_FS_OPEN, &fs_info->flags);
|
||||
}
|
||||
out:
|
||||
wake_up_process(fs_info->transaction_kthread);
|
||||
|
@ -480,7 +480,7 @@ int btrfs_test_qgroups(u32 sectorsize, u32 nodesize)
|
||||
*/
|
||||
root->fs_info->tree_root = root;
|
||||
root->fs_info->quota_root = root;
|
||||
root->fs_info->quota_enabled = 1;
|
||||
set_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags);
|
||||
|
||||
/*
|
||||
* Can't use bytenr 0, some things freak out
|
||||
|
@ -441,7 +441,7 @@ static void wait_current_trans(struct btrfs_root *root)
|
||||
|
||||
static int may_wait_transaction(struct btrfs_root *root, int type)
|
||||
{
|
||||
if (root->fs_info->log_root_recovering)
|
||||
if (test_bit(BTRFS_FS_LOG_RECOVERING, &root->fs_info->flags))
|
||||
return 0;
|
||||
|
||||
if (type == TRANS_USERSPACE)
|
||||
@ -993,7 +993,6 @@ int btrfs_wait_marked_extents(struct btrfs_root *root,
|
||||
struct extent_state *cached_state = NULL;
|
||||
u64 start = 0;
|
||||
u64 end;
|
||||
struct btrfs_inode *btree_ino = BTRFS_I(root->fs_info->btree_inode);
|
||||
bool errors = false;
|
||||
|
||||
while (!find_first_extent_bit(dirty_pages, start, &start, &end,
|
||||
@ -1025,17 +1024,17 @@ int btrfs_wait_marked_extents(struct btrfs_root *root,
|
||||
|
||||
if (root->root_key.objectid == BTRFS_TREE_LOG_OBJECTID) {
|
||||
if ((mark & EXTENT_DIRTY) &&
|
||||
test_and_clear_bit(BTRFS_INODE_BTREE_LOG1_ERR,
|
||||
&btree_ino->runtime_flags))
|
||||
test_and_clear_bit(BTRFS_FS_LOG1_ERR,
|
||||
&root->fs_info->flags))
|
||||
errors = true;
|
||||
|
||||
if ((mark & EXTENT_NEW) &&
|
||||
test_and_clear_bit(BTRFS_INODE_BTREE_LOG2_ERR,
|
||||
&btree_ino->runtime_flags))
|
||||
test_and_clear_bit(BTRFS_FS_LOG2_ERR,
|
||||
&root->fs_info->flags))
|
||||
errors = true;
|
||||
} else {
|
||||
if (test_and_clear_bit(BTRFS_INODE_BTREE_ERR,
|
||||
&btree_ino->runtime_flags))
|
||||
if (test_and_clear_bit(BTRFS_FS_BTREE_ERR,
|
||||
&root->fs_info->flags))
|
||||
errors = true;
|
||||
}
|
||||
|
||||
@ -1335,7 +1334,7 @@ static int qgroup_account_snapshot(struct btrfs_trans_handle *trans,
|
||||
* kick in anyway.
|
||||
*/
|
||||
mutex_lock(&fs_info->qgroup_ioctl_lock);
|
||||
if (!fs_info->quota_enabled) {
|
||||
if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) {
|
||||
mutex_unlock(&fs_info->qgroup_ioctl_lock);
|
||||
return 0;
|
||||
}
|
||||
@ -1712,7 +1711,7 @@ static void update_super_roots(struct btrfs_root *root)
|
||||
super->root_level = root_item->level;
|
||||
if (btrfs_test_opt(root->fs_info, SPACE_CACHE))
|
||||
super->cache_generation = root_item->generation;
|
||||
if (root->fs_info->update_uuid_tree_gen)
|
||||
if (test_bit(BTRFS_FS_UPDATE_UUID_TREE_GEN, &root->fs_info->flags))
|
||||
super->uuid_tree_generation = root_item->generation;
|
||||
}
|
||||
|
||||
@ -1919,7 +1918,6 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
|
||||
{
|
||||
struct btrfs_transaction *cur_trans = trans->transaction;
|
||||
struct btrfs_transaction *prev_trans = NULL;
|
||||
struct btrfs_inode *btree_ino = BTRFS_I(root->fs_info->btree_inode);
|
||||
int ret;
|
||||
|
||||
/* Stop the commit early if ->aborted is set */
|
||||
@ -2213,8 +2211,8 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
|
||||
btrfs_update_commit_device_size(root->fs_info);
|
||||
btrfs_update_commit_device_bytes_used(root, cur_trans);
|
||||
|
||||
clear_bit(BTRFS_INODE_BTREE_LOG1_ERR, &btree_ino->runtime_flags);
|
||||
clear_bit(BTRFS_INODE_BTREE_LOG2_ERR, &btree_ino->runtime_flags);
|
||||
clear_bit(BTRFS_FS_LOG1_ERR, &root->fs_info->flags);
|
||||
clear_bit(BTRFS_FS_LOG2_ERR, &root->fs_info->flags);
|
||||
|
||||
btrfs_trans_release_chunk_metadata(trans);
|
||||
|
||||
|
@ -5579,7 +5579,7 @@ int btrfs_recover_log_trees(struct btrfs_root *log_root_tree)
|
||||
if (!path)
|
||||
return -ENOMEM;
|
||||
|
||||
fs_info->log_root_recovering = 1;
|
||||
set_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags);
|
||||
|
||||
trans = btrfs_start_transaction(fs_info->tree_root, 0);
|
||||
if (IS_ERR(trans)) {
|
||||
@ -5689,7 +5689,7 @@ again:
|
||||
|
||||
free_extent_buffer(log_root_tree->node);
|
||||
log_root_tree->log_root = NULL;
|
||||
fs_info->log_root_recovering = 0;
|
||||
clear_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags);
|
||||
kfree(log_root_tree);
|
||||
|
||||
return 0;
|
||||
|
@ -4217,7 +4217,7 @@ out:
|
||||
if (ret)
|
||||
btrfs_warn(fs_info, "btrfs_uuid_scan_kthread failed %d", ret);
|
||||
else
|
||||
fs_info->update_uuid_tree_gen = 1;
|
||||
set_bit(BTRFS_FS_UPDATE_UUID_TREE_GEN, &fs_info->flags);
|
||||
up(&fs_info->uuid_tree_rescan_sem);
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user