diff options
| -rw-r--r-- | Documentation/filesystems/btrfs.txt | 34 | ||||
| -rw-r--r-- | fs/btrfs/Kconfig | 15 | ||||
| -rw-r--r-- | fs/btrfs/async-thread.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/check-integrity.c | 25 | ||||
| -rw-r--r-- | fs/btrfs/ctree.h | 6 | ||||
| -rw-r--r-- | fs/btrfs/dev-replace.c | 2 | ||||
| -rw-r--r-- | fs/btrfs/disk-io.c | 21 | ||||
| -rw-r--r-- | fs/btrfs/extent_io.c | 11 | ||||
| -rw-r--r-- | fs/btrfs/inode.c | 6 | ||||
| -rw-r--r-- | fs/btrfs/ordered-data.c | 3 | ||||
| -rw-r--r-- | fs/btrfs/scrub.c | 6 | ||||
| -rw-r--r-- | fs/btrfs/transaction.c | 4 | ||||
| -rw-r--r-- | fs/btrfs/tree-log.c | 5 | ||||
| -rw-r--r-- | fs/btrfs/volumes.c | 2 | ||||
| -rw-r--r-- | include/trace/events/btrfs.h | 4 |
15 files changed, 73 insertions, 72 deletions
diff --git a/Documentation/filesystems/btrfs.txt b/Documentation/filesystems/btrfs.txt index 9dae59407437..5dd282dda55c 100644 --- a/Documentation/filesystems/btrfs.txt +++ b/Documentation/filesystems/btrfs.txt | |||
| @@ -70,6 +70,12 @@ Unless otherwise specified, all options default to off. | |||
| 70 | 70 | ||
| 71 | See comments at the top of fs/btrfs/check-integrity.c for more info. | 71 | See comments at the top of fs/btrfs/check-integrity.c for more info. |
| 72 | 72 | ||
| 73 | commit=<seconds> | ||
| 74 | Set the interval of periodic commit, 30 seconds by default. Higher | ||
| 75 | values defer data being synced to permanent storage with obvious | ||
| 76 | consequences when the system crashes. The upper bound is not forced, | ||
| 77 | but a warning is printed if it's more than 300 seconds (5 minutes). | ||
| 78 | |||
| 73 | compress | 79 | compress |
| 74 | compress=<type> | 80 | compress=<type> |
| 75 | compress-force | 81 | compress-force |
| @@ -154,7 +160,11 @@ Unless otherwise specified, all options default to off. | |||
| 154 | Currently this scans a list of several previous tree roots and tries to | 160 | Currently this scans a list of several previous tree roots and tries to |
| 155 | use the first readable. | 161 | use the first readable. |
| 156 | 162 | ||
| 157 | skip_balance | 163 | rescan_uuid_tree |
| 164 | Force check and rebuild procedure of the UUID tree. This should not | ||
| 165 | normally be needed. | ||
| 166 | |||
| 167 | skip_balance | ||
| 158 | Skip automatic resume of interrupted balance operation after mount. | 168 | Skip automatic resume of interrupted balance operation after mount. |
| 159 | May be resumed with "btrfs balance resume." | 169 | May be resumed with "btrfs balance resume." |
| 160 | 170 | ||
| @@ -234,24 +244,14 @@ available from the git repository at the following location: | |||
| 234 | 244 | ||
| 235 | These include the following tools: | 245 | These include the following tools: |
| 236 | 246 | ||
| 237 | mkfs.btrfs: create a filesystem | 247 | * mkfs.btrfs: create a filesystem |
| 238 | |||
| 239 | btrfsctl: control program to create snapshots and subvolumes: | ||
| 240 | 248 | ||
| 241 | mount /dev/sda2 /mnt | 249 | * btrfs: a single tool to manage the filesystems, refer to the manpage for more details |
| 242 | btrfsctl -s new_subvol_name /mnt | ||
| 243 | btrfsctl -s snapshot_of_default /mnt/default | ||
| 244 | btrfsctl -s snapshot_of_new_subvol /mnt/new_subvol_name | ||
| 245 | btrfsctl -s snapshot_of_a_snapshot /mnt/snapshot_of_new_subvol | ||
| 246 | ls /mnt | ||
| 247 | default snapshot_of_a_snapshot snapshot_of_new_subvol | ||
| 248 | new_subvol_name snapshot_of_default | ||
| 249 | 250 | ||
| 250 | Snapshots and subvolumes cannot be deleted right now, but you can | 251 | * 'btrfsck' or 'btrfs check': do a consistency check of the filesystem |
| 251 | rm -rf all the files and directories inside them. | ||
| 252 | 252 | ||
| 253 | btrfsck: do a limited check of the FS extent trees. | 253 | Other tools for specific tasks: |
| 254 | 254 | ||
| 255 | btrfs-debug-tree: print all of the FS metadata in text form. Example: | 255 | * btrfs-convert: in-place conversion from ext2/3/4 filesystems |
| 256 | 256 | ||
| 257 | btrfs-debug-tree /dev/sda2 >& big_output_file | 257 | * btrfs-image: dump filesystem metadata for debugging |
diff --git a/fs/btrfs/Kconfig b/fs/btrfs/Kconfig index f9d5094e1029..aa976eced2d2 100644 --- a/fs/btrfs/Kconfig +++ b/fs/btrfs/Kconfig | |||
| @@ -9,12 +9,17 @@ config BTRFS_FS | |||
| 9 | select XOR_BLOCKS | 9 | select XOR_BLOCKS |
| 10 | 10 | ||
| 11 | help | 11 | help |
| 12 | Btrfs is a new filesystem with extents, writable snapshotting, | 12 | Btrfs is a general purpose copy-on-write filesystem with extents, |
| 13 | support for multiple devices and many more features. | 13 | writable snapshotting, support for multiple devices and many more |
| 14 | features focused on fault tolerance, repair and easy administration. | ||
| 14 | 15 | ||
| 15 | Btrfs is highly experimental, and THE DISK FORMAT IS NOT YET | 16 | The filesystem disk format is no longer unstable, and it's not |
| 16 | FINALIZED. You should say N here unless you are interested in | 17 | expected to change unless there are strong reasons to do so. If there |
| 17 | testing Btrfs with non-critical data. | 18 | is a format change, file systems with a unchanged format will |
| 19 | continue to be mountable and usable by newer kernels. | ||
| 20 | |||
| 21 | For more information, please see the web pages at | ||
| 22 | http://btrfs.wiki.kernel.org. | ||
| 18 | 23 | ||
| 19 | To compile this file system support as a module, choose M here. The | 24 | To compile this file system support as a module, choose M here. The |
| 20 | module will be called btrfs. | 25 | module will be called btrfs. |
diff --git a/fs/btrfs/async-thread.c b/fs/btrfs/async-thread.c index 8aec751fa464..c1e0b0caf9cc 100644 --- a/fs/btrfs/async-thread.c +++ b/fs/btrfs/async-thread.c | |||
| @@ -495,6 +495,7 @@ static int __btrfs_start_workers(struct btrfs_workers *workers) | |||
| 495 | spin_lock_irq(&workers->lock); | 495 | spin_lock_irq(&workers->lock); |
| 496 | if (workers->stopping) { | 496 | if (workers->stopping) { |
| 497 | spin_unlock_irq(&workers->lock); | 497 | spin_unlock_irq(&workers->lock); |
| 498 | ret = -EINVAL; | ||
| 498 | goto fail_kthread; | 499 | goto fail_kthread; |
| 499 | } | 500 | } |
| 500 | list_add_tail(&worker->worker_list, &workers->idle_list); | 501 | list_add_tail(&worker->worker_list, &workers->idle_list); |
diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index e0aab4456974..b50764bef141 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c | |||
| @@ -77,6 +77,15 @@ | |||
| 77 | * the integrity of (super)-block write requests, do not | 77 | * the integrity of (super)-block write requests, do not |
| 78 | * enable the config option BTRFS_FS_CHECK_INTEGRITY to | 78 | * enable the config option BTRFS_FS_CHECK_INTEGRITY to |
| 79 | * include and compile the integrity check tool. | 79 | * include and compile the integrity check tool. |
| 80 | * | ||
| 81 | * Expect millions of lines of information in the kernel log with an | ||
| 82 | * enabled check_int_print_mask. Therefore set LOG_BUF_SHIFT in the | ||
| 83 | * kernel config to at least 26 (which is 64MB). Usually the value is | ||
| 84 | * limited to 21 (which is 2MB) in init/Kconfig. The file needs to be | ||
| 85 | * changed like this before LOG_BUF_SHIFT can be set to a high value: | ||
| 86 | * config LOG_BUF_SHIFT | ||
| 87 | * int "Kernel log buffer size (16 => 64KB, 17 => 128KB)" | ||
| 88 | * range 12 30 | ||
| 80 | */ | 89 | */ |
| 81 | 90 | ||
| 82 | #include <linux/sched.h> | 91 | #include <linux/sched.h> |
| @@ -124,6 +133,7 @@ | |||
| 124 | #define BTRFSIC_PRINT_MASK_INITIAL_DATABASE 0x00000400 | 133 | #define BTRFSIC_PRINT_MASK_INITIAL_DATABASE 0x00000400 |
| 125 | #define BTRFSIC_PRINT_MASK_NUM_COPIES 0x00000800 | 134 | #define BTRFSIC_PRINT_MASK_NUM_COPIES 0x00000800 |
| 126 | #define BTRFSIC_PRINT_MASK_TREE_WITH_ALL_MIRRORS 0x00001000 | 135 | #define BTRFSIC_PRINT_MASK_TREE_WITH_ALL_MIRRORS 0x00001000 |
| 136 | #define BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH_VERBOSE 0x00002000 | ||
| 127 | 137 | ||
| 128 | struct btrfsic_dev_state; | 138 | struct btrfsic_dev_state; |
| 129 | struct btrfsic_state; | 139 | struct btrfsic_state; |
| @@ -3015,6 +3025,7 @@ void btrfsic_submit_bio(int rw, struct bio *bio) | |||
| 3015 | (rw & WRITE) && NULL != bio->bi_io_vec) { | 3025 | (rw & WRITE) && NULL != bio->bi_io_vec) { |
| 3016 | unsigned int i; | 3026 | unsigned int i; |
| 3017 | u64 dev_bytenr; | 3027 | u64 dev_bytenr; |
| 3028 | u64 cur_bytenr; | ||
| 3018 | int bio_is_patched; | 3029 | int bio_is_patched; |
| 3019 | char **mapped_datav; | 3030 | char **mapped_datav; |
| 3020 | 3031 | ||
| @@ -3033,6 +3044,7 @@ void btrfsic_submit_bio(int rw, struct bio *bio) | |||
| 3033 | GFP_NOFS); | 3044 | GFP_NOFS); |
| 3034 | if (!mapped_datav) | 3045 | if (!mapped_datav) |
| 3035 | goto leave; | 3046 | goto leave; |
| 3047 | cur_bytenr = dev_bytenr; | ||
| 3036 | for (i = 0; i < bio->bi_vcnt; i++) { | 3048 | for (i = 0; i < bio->bi_vcnt; i++) { |
| 3037 | BUG_ON(bio->bi_io_vec[i].bv_len != PAGE_CACHE_SIZE); | 3049 | BUG_ON(bio->bi_io_vec[i].bv_len != PAGE_CACHE_SIZE); |
| 3038 | mapped_datav[i] = kmap(bio->bi_io_vec[i].bv_page); | 3050 | mapped_datav[i] = kmap(bio->bi_io_vec[i].bv_page); |
| @@ -3044,16 +3056,13 @@ void btrfsic_submit_bio(int rw, struct bio *bio) | |||
| 3044 | kfree(mapped_datav); | 3056 | kfree(mapped_datav); |
| 3045 | goto leave; | 3057 | goto leave; |
| 3046 | } | 3058 | } |
| 3047 | if ((BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH | | 3059 | if (dev_state->state->print_mask & |
| 3048 | BTRFSIC_PRINT_MASK_VERBOSE) == | 3060 | BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH_VERBOSE) |
| 3049 | (dev_state->state->print_mask & | ||
| 3050 | (BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH | | ||
| 3051 | BTRFSIC_PRINT_MASK_VERBOSE))) | ||
| 3052 | printk(KERN_INFO | 3061 | printk(KERN_INFO |
| 3053 | "#%u: page=%p, len=%u, offset=%u\n", | 3062 | "#%u: bytenr=%llu, len=%u, offset=%u\n", |
| 3054 | i, bio->bi_io_vec[i].bv_page, | 3063 | i, cur_bytenr, bio->bi_io_vec[i].bv_len, |
| 3055 | bio->bi_io_vec[i].bv_len, | ||
| 3056 | bio->bi_io_vec[i].bv_offset); | 3064 | bio->bi_io_vec[i].bv_offset); |
| 3065 | cur_bytenr += bio->bi_io_vec[i].bv_len; | ||
| 3057 | } | 3066 | } |
| 3058 | btrfsic_process_written_block(dev_state, dev_bytenr, | 3067 | btrfsic_process_written_block(dev_state, dev_bytenr, |
| 3059 | mapped_datav, bio->bi_vcnt, | 3068 | mapped_datav, bio->bi_vcnt, |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index f9aeb2759a64..54ab86127f7a 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
| @@ -3613,9 +3613,6 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans, | |||
| 3613 | struct btrfs_ordered_sum *sums); | 3613 | struct btrfs_ordered_sum *sums); |
| 3614 | int btrfs_csum_one_bio(struct btrfs_root *root, struct inode *inode, | 3614 | int btrfs_csum_one_bio(struct btrfs_root *root, struct inode *inode, |
| 3615 | struct bio *bio, u64 file_start, int contig); | 3615 | struct bio *bio, u64 file_start, int contig); |
| 3616 | int btrfs_csum_truncate(struct btrfs_trans_handle *trans, | ||
| 3617 | struct btrfs_root *root, struct btrfs_path *path, | ||
| 3618 | u64 isize); | ||
| 3619 | int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end, | 3616 | int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end, |
| 3620 | struct list_head *list, int search_commit); | 3617 | struct list_head *list, int search_commit); |
| 3621 | /* inode.c */ | 3618 | /* inode.c */ |
| @@ -3744,9 +3741,6 @@ void btrfs_cleanup_defrag_inodes(struct btrfs_fs_info *fs_info); | |||
| 3744 | int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync); | 3741 | int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync); |
| 3745 | void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | 3742 | void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, |
| 3746 | int skip_pinned); | 3743 | int skip_pinned); |
| 3747 | int btrfs_replace_extent_cache(struct inode *inode, struct extent_map *replace, | ||
| 3748 | u64 start, u64 end, int skip_pinned, | ||
| 3749 | int modified); | ||
| 3750 | extern const struct file_operations btrfs_file_operations; | 3744 | extern const struct file_operations btrfs_file_operations; |
| 3751 | int __btrfs_drop_extents(struct btrfs_trans_handle *trans, | 3745 | int __btrfs_drop_extents(struct btrfs_trans_handle *trans, |
| 3752 | struct btrfs_root *root, struct inode *inode, | 3746 | struct btrfs_root *root, struct inode *inode, |
diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c index 342f9fd411e3..2cfc3dfff64f 100644 --- a/fs/btrfs/dev-replace.c +++ b/fs/btrfs/dev-replace.c | |||
| @@ -366,7 +366,7 @@ int btrfs_dev_replace_start(struct btrfs_root *root, | |||
| 366 | dev_replace->tgtdev = tgt_device; | 366 | dev_replace->tgtdev = tgt_device; |
| 367 | 367 | ||
| 368 | printk_in_rcu(KERN_INFO | 368 | printk_in_rcu(KERN_INFO |
| 369 | "btrfs: dev_replace from %s (devid %llu) to %s) started\n", | 369 | "btrfs: dev_replace from %s (devid %llu) to %s started\n", |
| 370 | src_device->missing ? "<missing disk>" : | 370 | src_device->missing ? "<missing disk>" : |
| 371 | rcu_str_deref(src_device->name), | 371 | rcu_str_deref(src_device->name), |
| 372 | src_device->devid, | 372 | src_device->devid, |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 4c4ed0bb3da1..8072cfa8a3b1 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -3517,7 +3517,6 @@ int btrfs_cleanup_fs_roots(struct btrfs_fs_info *fs_info) | |||
| 3517 | int btrfs_commit_super(struct btrfs_root *root) | 3517 | int btrfs_commit_super(struct btrfs_root *root) |
| 3518 | { | 3518 | { |
| 3519 | struct btrfs_trans_handle *trans; | 3519 | struct btrfs_trans_handle *trans; |
| 3520 | int ret; | ||
| 3521 | 3520 | ||
| 3522 | mutex_lock(&root->fs_info->cleaner_mutex); | 3521 | mutex_lock(&root->fs_info->cleaner_mutex); |
| 3523 | btrfs_run_delayed_iputs(root); | 3522 | btrfs_run_delayed_iputs(root); |
| @@ -3531,25 +3530,7 @@ int btrfs_commit_super(struct btrfs_root *root) | |||
| 3531 | trans = btrfs_join_transaction(root); | 3530 | trans = btrfs_join_transaction(root); |
| 3532 | if (IS_ERR(trans)) | 3531 | if (IS_ERR(trans)) |
| 3533 | return PTR_ERR(trans); | 3532 | return PTR_ERR(trans); |
| 3534 | ret = btrfs_commit_transaction(trans, root); | 3533 | return btrfs_commit_transaction(trans, root); |
| 3535 | if (ret) | ||
| 3536 | return ret; | ||
| 3537 | /* run commit again to drop the original snapshot */ | ||
| 3538 | trans = btrfs_join_transaction(root); | ||
| 3539 | if (IS_ERR(trans)) | ||
| 3540 | return PTR_ERR(trans); | ||
| 3541 | ret = btrfs_commit_transaction(trans, root); | ||
| 3542 | if (ret) | ||
| 3543 | return ret; | ||
| 3544 | ret = btrfs_write_and_wait_transaction(NULL, root); | ||
| 3545 | if (ret) { | ||
| 3546 | btrfs_error(root->fs_info, ret, | ||
| 3547 | "Failed to sync btree inode to disk."); | ||
| 3548 | return ret; | ||
| 3549 | } | ||
| 3550 | |||
| 3551 | ret = write_ctree_super(NULL, root, 0); | ||
| 3552 | return ret; | ||
| 3553 | } | 3534 | } |
| 3554 | 3535 | ||
| 3555 | int close_ctree(struct btrfs_root *root) | 3536 | int close_ctree(struct btrfs_root *root) |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 856bc2b2192c..8e457fca0a0b 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
| @@ -1980,6 +1980,7 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start, | |||
| 1980 | struct btrfs_mapping_tree *map_tree = &fs_info->mapping_tree; | 1980 | struct btrfs_mapping_tree *map_tree = &fs_info->mapping_tree; |
| 1981 | int ret; | 1981 | int ret; |
| 1982 | 1982 | ||
| 1983 | ASSERT(!(fs_info->sb->s_flags & MS_RDONLY)); | ||
| 1983 | BUG_ON(!mirror_num); | 1984 | BUG_ON(!mirror_num); |
| 1984 | 1985 | ||
| 1985 | /* we can't repair anything in raid56 yet */ | 1986 | /* we can't repair anything in raid56 yet */ |
| @@ -2036,6 +2037,9 @@ int repair_eb_io_failure(struct btrfs_root *root, struct extent_buffer *eb, | |||
| 2036 | unsigned long i, num_pages = num_extent_pages(eb->start, eb->len); | 2037 | unsigned long i, num_pages = num_extent_pages(eb->start, eb->len); |
| 2037 | int ret = 0; | 2038 | int ret = 0; |
| 2038 | 2039 | ||
| 2040 | if (root->fs_info->sb->s_flags & MS_RDONLY) | ||
| 2041 | return -EROFS; | ||
| 2042 | |||
| 2039 | for (i = 0; i < num_pages; i++) { | 2043 | for (i = 0; i < num_pages; i++) { |
| 2040 | struct page *p = extent_buffer_page(eb, i); | 2044 | struct page *p = extent_buffer_page(eb, i); |
| 2041 | ret = repair_io_failure(root->fs_info, start, PAGE_CACHE_SIZE, | 2045 | ret = repair_io_failure(root->fs_info, start, PAGE_CACHE_SIZE, |
| @@ -2057,12 +2061,12 @@ static int clean_io_failure(u64 start, struct page *page) | |||
| 2057 | u64 private; | 2061 | u64 private; |
| 2058 | u64 private_failure; | 2062 | u64 private_failure; |
| 2059 | struct io_failure_record *failrec; | 2063 | struct io_failure_record *failrec; |
| 2060 | struct btrfs_fs_info *fs_info; | 2064 | struct inode *inode = page->mapping->host; |
| 2065 | struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info; | ||
| 2061 | struct extent_state *state; | 2066 | struct extent_state *state; |
| 2062 | int num_copies; | 2067 | int num_copies; |
| 2063 | int did_repair = 0; | 2068 | int did_repair = 0; |
| 2064 | int ret; | 2069 | int ret; |
| 2065 | struct inode *inode = page->mapping->host; | ||
| 2066 | 2070 | ||
| 2067 | private = 0; | 2071 | private = 0; |
| 2068 | ret = count_range_bits(&BTRFS_I(inode)->io_failure_tree, &private, | 2072 | ret = count_range_bits(&BTRFS_I(inode)->io_failure_tree, &private, |
| @@ -2085,6 +2089,8 @@ static int clean_io_failure(u64 start, struct page *page) | |||
| 2085 | did_repair = 1; | 2089 | did_repair = 1; |
| 2086 | goto out; | 2090 | goto out; |
| 2087 | } | 2091 | } |
| 2092 | if (fs_info->sb->s_flags & MS_RDONLY) | ||
| 2093 | goto out; | ||
| 2088 | 2094 | ||
| 2089 | spin_lock(&BTRFS_I(inode)->io_tree.lock); | 2095 | spin_lock(&BTRFS_I(inode)->io_tree.lock); |
| 2090 | state = find_first_extent_bit_state(&BTRFS_I(inode)->io_tree, | 2096 | state = find_first_extent_bit_state(&BTRFS_I(inode)->io_tree, |
| @@ -2094,7 +2100,6 @@ static int clean_io_failure(u64 start, struct page *page) | |||
| 2094 | 2100 | ||
| 2095 | if (state && state->start <= failrec->start && | 2101 | if (state && state->start <= failrec->start && |
| 2096 | state->end >= failrec->start + failrec->len - 1) { | 2102 | state->end >= failrec->start + failrec->len - 1) { |
| 2097 | fs_info = BTRFS_I(inode)->root->fs_info; | ||
| 2098 | num_copies = btrfs_num_copies(fs_info, failrec->logical, | 2103 | num_copies = btrfs_num_copies(fs_info, failrec->logical, |
| 2099 | failrec->len); | 2104 | failrec->len); |
| 2100 | if (num_copies > 1) { | 2105 | if (num_copies > 1) { |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index da8d2f696ac5..f1a77449d032 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -2129,7 +2129,8 @@ static noinline bool record_extent_backrefs(struct btrfs_path *path, | |||
| 2129 | old->extent_offset, fs_info, | 2129 | old->extent_offset, fs_info, |
| 2130 | path, record_one_backref, | 2130 | path, record_one_backref, |
| 2131 | old); | 2131 | old); |
| 2132 | BUG_ON(ret < 0 && ret != -ENOENT); | 2132 | if (ret < 0 && ret != -ENOENT) |
| 2133 | return false; | ||
| 2133 | 2134 | ||
| 2134 | /* no backref to be processed for this extent */ | 2135 | /* no backref to be processed for this extent */ |
| 2135 | if (!old->count) { | 2136 | if (!old->count) { |
| @@ -6186,8 +6187,7 @@ insert: | |||
| 6186 | write_unlock(&em_tree->lock); | 6187 | write_unlock(&em_tree->lock); |
| 6187 | out: | 6188 | out: |
| 6188 | 6189 | ||
| 6189 | if (em) | 6190 | trace_btrfs_get_extent(root, em); |
| 6190 | trace_btrfs_get_extent(root, em); | ||
| 6191 | 6191 | ||
| 6192 | if (path) | 6192 | if (path) |
| 6193 | btrfs_free_path(path); | 6193 | btrfs_free_path(path); |
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index 25a8f3812f14..69582d5b69d1 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c | |||
| @@ -638,6 +638,7 @@ void btrfs_wait_ordered_roots(struct btrfs_fs_info *fs_info, int nr) | |||
| 638 | WARN_ON(nr < 0); | 638 | WARN_ON(nr < 0); |
| 639 | } | 639 | } |
| 640 | } | 640 | } |
| 641 | list_splice_tail(&splice, &fs_info->ordered_roots); | ||
| 641 | spin_unlock(&fs_info->ordered_root_lock); | 642 | spin_unlock(&fs_info->ordered_root_lock); |
| 642 | } | 643 | } |
| 643 | 644 | ||
| @@ -803,7 +804,7 @@ int btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len) | |||
| 803 | btrfs_put_ordered_extent(ordered); | 804 | btrfs_put_ordered_extent(ordered); |
| 804 | break; | 805 | break; |
| 805 | } | 806 | } |
| 806 | if (ordered->file_offset + ordered->len < start) { | 807 | if (ordered->file_offset + ordered->len <= start) { |
| 807 | btrfs_put_ordered_extent(ordered); | 808 | btrfs_put_ordered_extent(ordered); |
| 808 | break; | 809 | break; |
| 809 | } | 810 | } |
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 2544805544f0..561e2f16ba3e 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
| @@ -938,8 +938,10 @@ static int scrub_handle_errored_block(struct scrub_block *sblock_to_check) | |||
| 938 | BTRFS_DEV_STAT_CORRUPTION_ERRS); | 938 | BTRFS_DEV_STAT_CORRUPTION_ERRS); |
| 939 | } | 939 | } |
| 940 | 940 | ||
| 941 | if (sctx->readonly && !sctx->is_dev_replace) | 941 | if (sctx->readonly) { |
| 942 | goto did_not_correct_error; | 942 | ASSERT(!sctx->is_dev_replace); |
| 943 | goto out; | ||
| 944 | } | ||
| 943 | 945 | ||
| 944 | if (!is_metadata && !have_csum) { | 946 | if (!is_metadata && !have_csum) { |
| 945 | struct scrub_fixup_nodatasum *fixup_nodatasum; | 947 | struct scrub_fixup_nodatasum *fixup_nodatasum; |
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 57c16b46afbd..c6a872a8a468 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
| @@ -1480,7 +1480,7 @@ static void do_async_commit(struct work_struct *work) | |||
| 1480 | * We've got freeze protection passed with the transaction. | 1480 | * We've got freeze protection passed with the transaction. |
| 1481 | * Tell lockdep about it. | 1481 | * Tell lockdep about it. |
| 1482 | */ | 1482 | */ |
| 1483 | if (ac->newtrans->type < TRANS_JOIN_NOLOCK) | 1483 | if (ac->newtrans->type & __TRANS_FREEZABLE) |
| 1484 | rwsem_acquire_read( | 1484 | rwsem_acquire_read( |
| 1485 | &ac->root->fs_info->sb->s_writers.lock_map[SB_FREEZE_FS-1], | 1485 | &ac->root->fs_info->sb->s_writers.lock_map[SB_FREEZE_FS-1], |
| 1486 | 0, 1, _THIS_IP_); | 1486 | 0, 1, _THIS_IP_); |
| @@ -1521,7 +1521,7 @@ int btrfs_commit_transaction_async(struct btrfs_trans_handle *trans, | |||
| 1521 | * Tell lockdep we've released the freeze rwsem, since the | 1521 | * Tell lockdep we've released the freeze rwsem, since the |
| 1522 | * async commit thread will be the one to unlock it. | 1522 | * async commit thread will be the one to unlock it. |
| 1523 | */ | 1523 | */ |
| 1524 | if (trans->type < TRANS_JOIN_NOLOCK) | 1524 | if (ac->newtrans->type & __TRANS_FREEZABLE) |
| 1525 | rwsem_release( | 1525 | rwsem_release( |
| 1526 | &root->fs_info->sb->s_writers.lock_map[SB_FREEZE_FS-1], | 1526 | &root->fs_info->sb->s_writers.lock_map[SB_FREEZE_FS-1], |
| 1527 | 1, _THIS_IP_); | 1527 | 1, _THIS_IP_); |
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 744553c83fe2..9f7fc51ca334 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
| @@ -3697,7 +3697,8 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans, | |||
| 3697 | ret = btrfs_truncate_inode_items(trans, log, | 3697 | ret = btrfs_truncate_inode_items(trans, log, |
| 3698 | inode, 0, 0); | 3698 | inode, 0, 0); |
| 3699 | } else if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING, | 3699 | } else if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING, |
| 3700 | &BTRFS_I(inode)->runtime_flags)) { | 3700 | &BTRFS_I(inode)->runtime_flags) || |
| 3701 | inode_only == LOG_INODE_EXISTS) { | ||
| 3701 | if (inode_only == LOG_INODE_ALL) | 3702 | if (inode_only == LOG_INODE_ALL) |
| 3702 | fast_search = true; | 3703 | fast_search = true; |
| 3703 | max_key.type = BTRFS_XATTR_ITEM_KEY; | 3704 | max_key.type = BTRFS_XATTR_ITEM_KEY; |
| @@ -3801,7 +3802,7 @@ log_extents: | |||
| 3801 | err = ret; | 3802 | err = ret; |
| 3802 | goto out_unlock; | 3803 | goto out_unlock; |
| 3803 | } | 3804 | } |
| 3804 | } else { | 3805 | } else if (inode_only == LOG_INODE_ALL) { |
| 3805 | struct extent_map_tree *tree = &BTRFS_I(inode)->extent_tree; | 3806 | struct extent_map_tree *tree = &BTRFS_I(inode)->extent_tree; |
| 3806 | struct extent_map *em, *n; | 3807 | struct extent_map *em, *n; |
| 3807 | 3808 | ||
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 0db637097862..92303f42baaa 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
| @@ -5394,7 +5394,7 @@ static int bio_size_ok(struct block_device *bdev, struct bio *bio, | |||
| 5394 | { | 5394 | { |
| 5395 | struct bio_vec *prev; | 5395 | struct bio_vec *prev; |
| 5396 | struct request_queue *q = bdev_get_queue(bdev); | 5396 | struct request_queue *q = bdev_get_queue(bdev); |
| 5397 | unsigned short max_sectors = queue_max_sectors(q); | 5397 | unsigned int max_sectors = queue_max_sectors(q); |
| 5398 | struct bvec_merge_data bvm = { | 5398 | struct bvec_merge_data bvm = { |
| 5399 | .bi_bdev = bdev, | 5399 | .bi_bdev = bdev, |
| 5400 | .bi_sector = sector, | 5400 | .bi_sector = sector, |
diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h index f18b3b76e01e..4832d75dcbae 100644 --- a/include/trace/events/btrfs.h +++ b/include/trace/events/btrfs.h | |||
| @@ -162,12 +162,14 @@ DEFINE_EVENT(btrfs__inode, btrfs_inode_evict, | |||
| 162 | { EXTENT_FLAG_LOGGING, "LOGGING" }, \ | 162 | { EXTENT_FLAG_LOGGING, "LOGGING" }, \ |
| 163 | { EXTENT_FLAG_FILLING, "FILLING" }) | 163 | { EXTENT_FLAG_FILLING, "FILLING" }) |
| 164 | 164 | ||
| 165 | TRACE_EVENT(btrfs_get_extent, | 165 | TRACE_EVENT_CONDITION(btrfs_get_extent, |
| 166 | 166 | ||
| 167 | TP_PROTO(struct btrfs_root *root, struct extent_map *map), | 167 | TP_PROTO(struct btrfs_root *root, struct extent_map *map), |
| 168 | 168 | ||
| 169 | TP_ARGS(root, map), | 169 | TP_ARGS(root, map), |
| 170 | 170 | ||
| 171 | TP_CONDITION(map), | ||
| 172 | |||
| 171 | TP_STRUCT__entry( | 173 | TP_STRUCT__entry( |
| 172 | __field( u64, root_objectid ) | 174 | __field( u64, root_objectid ) |
| 173 | __field( u64, start ) | 175 | __field( u64, start ) |
