diff options
-rw-r--r-- | fs/btrfs/ctree.h | 4 | ||||
-rw-r--r-- | fs/btrfs/disk-io.c | 5 | ||||
-rw-r--r-- | fs/btrfs/file.c | 2 | ||||
-rw-r--r-- | fs/btrfs/scrub.c | 2 | ||||
-rw-r--r-- | fs/btrfs/super.c | 4 | ||||
-rw-r--r-- | fs/btrfs/transaction.c | 9 |
6 files changed, 14 insertions, 12 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 5f5c30aaef36..78fba44ad3d9 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -338,7 +338,9 @@ static inline unsigned long btrfs_chunk_item_size(int num_stripes) | |||
338 | /* | 338 | /* |
339 | * File system states | 339 | * File system states |
340 | */ | 340 | */ |
341 | #define BTRFS_FS_STATE_ERROR 0 | ||
341 | 342 | ||
343 | /* Super block flags */ | ||
342 | /* Errors detected */ | 344 | /* Errors detected */ |
343 | #define BTRFS_SUPER_FLAG_ERROR (1ULL << 2) | 345 | #define BTRFS_SUPER_FLAG_ERROR (1ULL << 2) |
344 | 346 | ||
@@ -1549,7 +1551,7 @@ struct btrfs_fs_info { | |||
1549 | u64 qgroup_seq; | 1551 | u64 qgroup_seq; |
1550 | 1552 | ||
1551 | /* filesystem state */ | 1553 | /* filesystem state */ |
1552 | u64 fs_state; | 1554 | unsigned long fs_state; |
1553 | 1555 | ||
1554 | struct btrfs_delayed_root *delayed_root; | 1556 | struct btrfs_delayed_root *delayed_root; |
1555 | 1557 | ||
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 00b6742fdde7..8e58a1f90546 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -2201,7 +2201,8 @@ int open_ctree(struct super_block *sb, | |||
2201 | goto fail_alloc; | 2201 | goto fail_alloc; |
2202 | 2202 | ||
2203 | /* check FS state, whether FS is broken. */ | 2203 | /* check FS state, whether FS is broken. */ |
2204 | fs_info->fs_state |= btrfs_super_flags(disk_super); | 2204 | if (btrfs_super_flags(disk_super) & BTRFS_SUPER_FLAG_ERROR) |
2205 | set_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state); | ||
2205 | 2206 | ||
2206 | ret = btrfs_check_super_valid(fs_info, sb->s_flags & MS_RDONLY); | 2207 | ret = btrfs_check_super_valid(fs_info, sb->s_flags & MS_RDONLY); |
2207 | if (ret) { | 2208 | if (ret) { |
@@ -3359,7 +3360,7 @@ int close_ctree(struct btrfs_root *root) | |||
3359 | printk(KERN_ERR "btrfs: commit super ret %d\n", ret); | 3360 | printk(KERN_ERR "btrfs: commit super ret %d\n", ret); |
3360 | } | 3361 | } |
3361 | 3362 | ||
3362 | if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) | 3363 | if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state)) |
3363 | btrfs_error_commit_super(root); | 3364 | btrfs_error_commit_super(root); |
3364 | 3365 | ||
3365 | btrfs_put_block_group_cache(fs_info); | 3366 | btrfs_put_block_group_cache(fs_info); |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 13c78ea3ebce..75d0fe134be3 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -1545,7 +1545,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
1545 | * although we have opened a file as writable, we have | 1545 | * although we have opened a file as writable, we have |
1546 | * to stop this write operation to ensure FS consistency. | 1546 | * to stop this write operation to ensure FS consistency. |
1547 | */ | 1547 | */ |
1548 | if (root->fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) { | 1548 | if (test_bit(BTRFS_FS_STATE_ERROR, &root->fs_info->fs_state)) { |
1549 | mutex_unlock(&inode->i_mutex); | 1549 | mutex_unlock(&inode->i_mutex); |
1550 | err = -EROFS; | 1550 | err = -EROFS; |
1551 | goto out; | 1551 | goto out; |
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 67783e03d121..c78b2a3fc335 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
@@ -2708,7 +2708,7 @@ static noinline_for_stack int scrub_supers(struct scrub_ctx *sctx, | |||
2708 | int ret; | 2708 | int ret; |
2709 | struct btrfs_root *root = sctx->dev_root; | 2709 | struct btrfs_root *root = sctx->dev_root; |
2710 | 2710 | ||
2711 | if (root->fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) | 2711 | if (test_bit(BTRFS_FS_STATE_ERROR, &root->fs_info->fs_state)) |
2712 | return -EIO; | 2712 | return -EIO; |
2713 | 2713 | ||
2714 | gen = root->fs_info->last_trans_committed; | 2714 | gen = root->fs_info->last_trans_committed; |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index eda330df45a4..4152f9ea34f5 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -98,7 +98,7 @@ static void __save_error_info(struct btrfs_fs_info *fs_info) | |||
98 | * today we only save the error info into ram. Long term we'll | 98 | * today we only save the error info into ram. Long term we'll |
99 | * also send it down to the disk | 99 | * also send it down to the disk |
100 | */ | 100 | */ |
101 | fs_info->fs_state = BTRFS_SUPER_FLAG_ERROR; | 101 | set_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state); |
102 | } | 102 | } |
103 | 103 | ||
104 | static void save_error_info(struct btrfs_fs_info *fs_info) | 104 | static void save_error_info(struct btrfs_fs_info *fs_info) |
@@ -114,7 +114,7 @@ static void btrfs_handle_error(struct btrfs_fs_info *fs_info) | |||
114 | if (sb->s_flags & MS_RDONLY) | 114 | if (sb->s_flags & MS_RDONLY) |
115 | return; | 115 | return; |
116 | 116 | ||
117 | if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) { | 117 | if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state)) { |
118 | sb->s_flags |= MS_RDONLY; | 118 | sb->s_flags |= MS_RDONLY; |
119 | printk(KERN_INFO "btrfs is forced readonly\n"); | 119 | printk(KERN_INFO "btrfs is forced readonly\n"); |
120 | /* | 120 | /* |
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 34610dc6d140..baf6d74fd0f2 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
@@ -61,7 +61,7 @@ static noinline int join_transaction(struct btrfs_root *root, int type) | |||
61 | spin_lock(&fs_info->trans_lock); | 61 | spin_lock(&fs_info->trans_lock); |
62 | loop: | 62 | loop: |
63 | /* The file system has been taken offline. No new transactions. */ | 63 | /* The file system has been taken offline. No new transactions. */ |
64 | if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) { | 64 | if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state)) { |
65 | spin_unlock(&fs_info->trans_lock); | 65 | spin_unlock(&fs_info->trans_lock); |
66 | return -EROFS; | 66 | return -EROFS; |
67 | } | 67 | } |
@@ -113,7 +113,7 @@ loop: | |||
113 | kmem_cache_free(btrfs_transaction_cachep, cur_trans); | 113 | kmem_cache_free(btrfs_transaction_cachep, cur_trans); |
114 | cur_trans = fs_info->running_transaction; | 114 | cur_trans = fs_info->running_transaction; |
115 | goto loop; | 115 | goto loop; |
116 | } else if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) { | 116 | } else if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state)) { |
117 | spin_unlock(&fs_info->trans_lock); | 117 | spin_unlock(&fs_info->trans_lock); |
118 | kmem_cache_free(btrfs_transaction_cachep, cur_trans); | 118 | kmem_cache_free(btrfs_transaction_cachep, cur_trans); |
119 | return -EROFS; | 119 | return -EROFS; |
@@ -301,7 +301,7 @@ start_transaction(struct btrfs_root *root, u64 num_items, int type, | |||
301 | int ret; | 301 | int ret; |
302 | u64 qgroup_reserved = 0; | 302 | u64 qgroup_reserved = 0; |
303 | 303 | ||
304 | if (root->fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) | 304 | if (test_bit(BTRFS_FS_STATE_ERROR, &root->fs_info->fs_state)) |
305 | return ERR_PTR(-EROFS); | 305 | return ERR_PTR(-EROFS); |
306 | 306 | ||
307 | if (current->journal_info) { | 307 | if (current->journal_info) { |
@@ -645,9 +645,8 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, | |||
645 | btrfs_run_delayed_iputs(root); | 645 | btrfs_run_delayed_iputs(root); |
646 | 646 | ||
647 | if (trans->aborted || | 647 | if (trans->aborted || |
648 | root->fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) { | 648 | test_bit(BTRFS_FS_STATE_ERROR, &root->fs_info->fs_state)) |
649 | err = -EIO; | 649 | err = -EIO; |
650 | } | ||
651 | assert_qgroups_uptodate(trans); | 650 | assert_qgroups_uptodate(trans); |
652 | 651 | ||
653 | kmem_cache_free(btrfs_trans_handle_cachep, trans); | 652 | kmem_cache_free(btrfs_trans_handle_cachep, trans); |