Skip to content

Commit

Permalink
btrfs: add a btrfs_has_fs_error helper
Browse files Browse the repository at this point in the history
We have a few flags that are inconsistently used to describe the fs in
different states of failure.  As of

	btrfs: always abort the transaction if we abort a trans handle

we will always set BTRFS_FS_STATE_ERROR if we abort, so we don't have to
check both ABORTED and ERROR to see if things have gone wrong.  Add a
helper to check BTRFS_FS_STATE_HELPER and then convert all checkers of
FS_STATE_ERROR to use the helper.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: David Sterba <dsterba@suse.com>
  • Loading branch information
josefbacik authored and kdave committed Sep 13, 2021
1 parent 3236dd1 commit 4faed39
Show file tree
Hide file tree
Showing 9 changed files with 21 additions and 19 deletions.
5 changes: 5 additions & 0 deletions fs/btrfs/ctree.h
Original file line number Diff line number Diff line change
Expand Up @@ -3574,6 +3574,11 @@ do { \
(errno), fmt, ##args); \
} while (0)

static inline bool btrfs_has_fs_error(struct btrfs_fs_info *fs_info)
{
return test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state);
}

__printf(5, 6)
__cold
void __btrfs_panic(struct btrfs_fs_info *fs_info, const char *function,
Expand Down
8 changes: 3 additions & 5 deletions fs/btrfs/disk-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1954,8 +1954,7 @@ static int transaction_kthread(void *arg)
wake_up_process(fs_info->cleaner_kthread);
mutex_unlock(&fs_info->transaction_kthread_mutex);

if (unlikely(test_bit(BTRFS_FS_STATE_ERROR,
&fs_info->fs_state)))
if (unlikely(btrfs_has_fs_error(fs_info)))
btrfs_cleanup_transaction(fs_info);
if (!kthread_should_stop() &&
(!btrfs_transaction_blocked(fs_info) ||
Expand Down Expand Up @@ -4232,7 +4231,7 @@ void btrfs_drop_and_free_fs_root(struct btrfs_fs_info *fs_info,
drop_ref = true;
spin_unlock(&fs_info->fs_roots_radix_lock);

if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state)) {
if (btrfs_has_fs_error(fs_info)) {
ASSERT(root->log_root == NULL);
if (root->reloc_root) {
btrfs_put_root(root->reloc_root);
Expand Down Expand Up @@ -4383,8 +4382,7 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info)
btrfs_err(fs_info, "commit super ret %d", ret);
}

if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state) ||
test_bit(BTRFS_FS_STATE_TRANS_ABORTED, &fs_info->fs_state))
if (btrfs_has_fs_error(fs_info))
btrfs_error_commit_super(fs_info);

kthread_stop(fs_info->transaction_kthread);
Expand Down
2 changes: 1 addition & 1 deletion fs/btrfs/extent_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -4885,7 +4885,7 @@ int btree_write_cache_pages(struct address_space *mapping,
* extent io tree. Thus we don't want to submit such wild eb
* if the fs already has error.
*/
if (!test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state)) {
if (!btrfs_has_fs_error(fs_info)) {
ret = flush_write_bio(&epd);
} else {
ret = -EROFS;
Expand Down
2 changes: 1 addition & 1 deletion fs/btrfs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -2013,7 +2013,7 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
* have opened a file as writable, we have to stop this write operation
* to ensure consistency.
*/
if (test_bit(BTRFS_FS_STATE_ERROR, &inode->root->fs_info->fs_state))
if (btrfs_has_fs_error(inode->root->fs_info))
return -EROFS;

if (!(iocb->ki_flags & IOCB_DIRECT) &&
Expand Down
6 changes: 3 additions & 3 deletions fs/btrfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -4377,7 +4377,7 @@ static void btrfs_prune_dentries(struct btrfs_root *root)
struct inode *inode;
u64 objectid = 0;

if (!test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state))
if (!btrfs_has_fs_error(fs_info))
WARN_ON(btrfs_root_refs(&root->root_item) != 0);

spin_lock(&root->inode_lock);
Expand Down Expand Up @@ -9988,7 +9988,7 @@ int btrfs_start_delalloc_snapshot(struct btrfs_root *root, bool in_reclaim_conte
};
struct btrfs_fs_info *fs_info = root->fs_info;

if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state))
if (btrfs_has_fs_error(fs_info))
return -EROFS;

return start_delalloc_inodes(root, &wbc, true, in_reclaim_context);
Expand All @@ -10007,7 +10007,7 @@ int btrfs_start_delalloc_roots(struct btrfs_fs_info *fs_info, long nr,
struct list_head splice;
int ret;

if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state))
if (btrfs_has_fs_error(fs_info))
return -EROFS;

INIT_LIST_HEAD(&splice);
Expand Down
2 changes: 1 addition & 1 deletion fs/btrfs/scrub.c
Original file line number Diff line number Diff line change
Expand Up @@ -3956,7 +3956,7 @@ static noinline_for_stack int scrub_supers(struct scrub_ctx *sctx,
int ret;
struct btrfs_fs_info *fs_info = sctx->fs_info;

if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state))
if (btrfs_has_fs_error(fs_info))
return -EROFS;

/* Seed devices of a new filesystem has their own generation. */
Expand Down
2 changes: 1 addition & 1 deletion fs/btrfs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -2006,7 +2006,7 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data)
if (ret)
goto restore;
} else {
if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state)) {
if (btrfs_has_fs_error(fs_info)) {
btrfs_err(fs_info,
"Remounting read-write after error is not allowed");
ret = -EINVAL;
Expand Down
11 changes: 5 additions & 6 deletions fs/btrfs/transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ static noinline int join_transaction(struct btrfs_fs_info *fs_info,
spin_lock(&fs_info->trans_lock);
loop:
/* The file system has been taken offline. No new transactions. */
if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state)) {
if (btrfs_has_fs_error(fs_info)) {
spin_unlock(&fs_info->trans_lock);
return -EROFS;
}
Expand Down Expand Up @@ -331,7 +331,7 @@ static noinline int join_transaction(struct btrfs_fs_info *fs_info,
*/
kfree(cur_trans);
goto loop;
} else if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state)) {
} else if (btrfs_has_fs_error(fs_info)) {
spin_unlock(&fs_info->trans_lock);
kfree(cur_trans);
return -EROFS;
Expand Down Expand Up @@ -579,7 +579,7 @@ start_transaction(struct btrfs_root *root, unsigned int num_items,
bool do_chunk_alloc = false;
int ret;

if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state))
if (btrfs_has_fs_error(fs_info))
return ERR_PTR(-EROFS);

if (current->journal_info) {
Expand Down Expand Up @@ -991,8 +991,7 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans,
if (throttle)
btrfs_run_delayed_iputs(info);

if (TRANS_ABORTED(trans) ||
test_bit(BTRFS_FS_STATE_ERROR, &info->fs_state)) {
if (TRANS_ABORTED(trans) || btrfs_has_fs_error(info)) {
wake_up_process(info->transaction_kthread);
if (TRANS_ABORTED(trans))
err = trans->aborted;
Expand Down Expand Up @@ -2155,7 +2154,7 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans)
* abort to prevent writing a new superblock that reflects a
* corrupt state (pointing to trees with unwritten nodes/leafs).
*/
if (test_bit(BTRFS_FS_STATE_TRANS_ABORTED, &fs_info->fs_state)) {
if (btrfs_has_fs_error(fs_info)) {
ret = -EROFS;
goto cleanup_transaction;
}
Expand Down
2 changes: 1 addition & 1 deletion fs/btrfs/tree-log.c
Original file line number Diff line number Diff line change
Expand Up @@ -3307,7 +3307,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
* writing the super here would result in transid mismatches. If there
* is an error here just bail.
*/
if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state)) {
if (btrfs_has_fs_error(fs_info)) {
ret = -EIO;
btrfs_set_log_full_commit(trans);
btrfs_abort_transaction(trans, ret);
Expand Down

0 comments on commit 4faed39

Please sign in to comment.