diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r-- | fs/btrfs/disk-io.c | 102 |
1 files changed, 37 insertions, 65 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 92caa8035f36..0ff16d3331da 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -232,10 +232,14 @@ static int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf, | |||
232 | memcpy(&found, result, csum_size); | 232 | memcpy(&found, result, csum_size); |
233 | 233 | ||
234 | read_extent_buffer(buf, &val, 0, csum_size); | 234 | read_extent_buffer(buf, &val, 0, csum_size); |
235 | printk(KERN_INFO "btrfs: %s checksum verify failed " | 235 | if (printk_ratelimit()) { |
236 | "on %llu wanted %X found %X level %d\n", | 236 | printk(KERN_INFO "btrfs: %s checksum verify " |
237 | root->fs_info->sb->s_id, | 237 | "failed on %llu wanted %X found %X " |
238 | buf->start, val, found, btrfs_header_level(buf)); | 238 | "level %d\n", |
239 | root->fs_info->sb->s_id, | ||
240 | (unsigned long long)buf->start, val, found, | ||
241 | btrfs_header_level(buf)); | ||
242 | } | ||
239 | if (result != (char *)&inline_result) | 243 | if (result != (char *)&inline_result) |
240 | kfree(result); | 244 | kfree(result); |
241 | return 1; | 245 | return 1; |
@@ -268,10 +272,13 @@ static int verify_parent_transid(struct extent_io_tree *io_tree, | |||
268 | ret = 0; | 272 | ret = 0; |
269 | goto out; | 273 | goto out; |
270 | } | 274 | } |
271 | printk("parent transid verify failed on %llu wanted %llu found %llu\n", | 275 | if (printk_ratelimit()) { |
272 | (unsigned long long)eb->start, | 276 | printk("parent transid verify failed on %llu wanted %llu " |
273 | (unsigned long long)parent_transid, | 277 | "found %llu\n", |
274 | (unsigned long long)btrfs_header_generation(eb)); | 278 | (unsigned long long)eb->start, |
279 | (unsigned long long)parent_transid, | ||
280 | (unsigned long long)btrfs_header_generation(eb)); | ||
281 | } | ||
275 | ret = 1; | 282 | ret = 1; |
276 | clear_extent_buffer_uptodate(io_tree, eb); | 283 | clear_extent_buffer_uptodate(io_tree, eb); |
277 | out: | 284 | out: |
@@ -415,9 +422,12 @@ static int btree_readpage_end_io_hook(struct page *page, u64 start, u64 end, | |||
415 | 422 | ||
416 | found_start = btrfs_header_bytenr(eb); | 423 | found_start = btrfs_header_bytenr(eb); |
417 | if (found_start != start) { | 424 | if (found_start != start) { |
418 | printk(KERN_INFO "btrfs bad tree block start %llu %llu\n", | 425 | if (printk_ratelimit()) { |
419 | (unsigned long long)found_start, | 426 | printk(KERN_INFO "btrfs bad tree block start " |
420 | (unsigned long long)eb->start); | 427 | "%llu %llu\n", |
428 | (unsigned long long)found_start, | ||
429 | (unsigned long long)eb->start); | ||
430 | } | ||
421 | ret = -EIO; | 431 | ret = -EIO; |
422 | goto err; | 432 | goto err; |
423 | } | 433 | } |
@@ -429,8 +439,10 @@ static int btree_readpage_end_io_hook(struct page *page, u64 start, u64 end, | |||
429 | goto err; | 439 | goto err; |
430 | } | 440 | } |
431 | if (check_tree_block_fsid(root, eb)) { | 441 | if (check_tree_block_fsid(root, eb)) { |
432 | printk(KERN_INFO "btrfs bad fsid on block %llu\n", | 442 | if (printk_ratelimit()) { |
433 | (unsigned long long)eb->start); | 443 | printk(KERN_INFO "btrfs bad fsid on block %llu\n", |
444 | (unsigned long long)eb->start); | ||
445 | } | ||
434 | ret = -EIO; | 446 | ret = -EIO; |
435 | goto err; | 447 | goto err; |
436 | } | 448 | } |
@@ -579,19 +591,12 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, | |||
579 | async->bio_flags = bio_flags; | 591 | async->bio_flags = bio_flags; |
580 | 592 | ||
581 | atomic_inc(&fs_info->nr_async_submits); | 593 | atomic_inc(&fs_info->nr_async_submits); |
594 | |||
595 | if (rw & (1 << BIO_RW_SYNCIO)) | ||
596 | btrfs_set_work_high_prio(&async->work); | ||
597 | |||
582 | btrfs_queue_worker(&fs_info->workers, &async->work); | 598 | btrfs_queue_worker(&fs_info->workers, &async->work); |
583 | #if 0 | ||
584 | int limit = btrfs_async_submit_limit(fs_info); | ||
585 | if (atomic_read(&fs_info->nr_async_submits) > limit) { | ||
586 | wait_event_timeout(fs_info->async_submit_wait, | ||
587 | (atomic_read(&fs_info->nr_async_submits) < limit), | ||
588 | HZ/10); | ||
589 | 599 | ||
590 | wait_event_timeout(fs_info->async_submit_wait, | ||
591 | (atomic_read(&fs_info->nr_async_bios) < limit), | ||
592 | HZ/10); | ||
593 | } | ||
594 | #endif | ||
595 | while (atomic_read(&fs_info->async_submit_draining) && | 600 | while (atomic_read(&fs_info->async_submit_draining) && |
596 | atomic_read(&fs_info->nr_async_submits)) { | 601 | atomic_read(&fs_info->nr_async_submits)) { |
597 | wait_event(fs_info->async_submit_wait, | 602 | wait_event(fs_info->async_submit_wait, |
@@ -656,6 +661,7 @@ static int btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, | |||
656 | return btrfs_map_bio(BTRFS_I(inode)->root, rw, bio, | 661 | return btrfs_map_bio(BTRFS_I(inode)->root, rw, bio, |
657 | mirror_num, 0); | 662 | mirror_num, 0); |
658 | } | 663 | } |
664 | |||
659 | /* | 665 | /* |
660 | * kthread helpers are used to submit writes so that checksumming | 666 | * kthread helpers are used to submit writes so that checksumming |
661 | * can happen in parallel across all CPUs | 667 | * can happen in parallel across all CPUs |
@@ -765,27 +771,6 @@ static void btree_invalidatepage(struct page *page, unsigned long offset) | |||
765 | } | 771 | } |
766 | } | 772 | } |
767 | 773 | ||
768 | #if 0 | ||
769 | static int btree_writepage(struct page *page, struct writeback_control *wbc) | ||
770 | { | ||
771 | struct buffer_head *bh; | ||
772 | struct btrfs_root *root = BTRFS_I(page->mapping->host)->root; | ||
773 | struct buffer_head *head; | ||
774 | if (!page_has_buffers(page)) { | ||
775 | create_empty_buffers(page, root->fs_info->sb->s_blocksize, | ||
776 | (1 << BH_Dirty)|(1 << BH_Uptodate)); | ||
777 | } | ||
778 | head = page_buffers(page); | ||
779 | bh = head; | ||
780 | do { | ||
781 | if (buffer_dirty(bh)) | ||
782 | csum_tree_block(root, bh, 0); | ||
783 | bh = bh->b_this_page; | ||
784 | } while (bh != head); | ||
785 | return block_write_full_page(page, btree_get_block, wbc); | ||
786 | } | ||
787 | #endif | ||
788 | |||
789 | static struct address_space_operations btree_aops = { | 774 | static struct address_space_operations btree_aops = { |
790 | .readpage = btree_readpage, | 775 | .readpage = btree_readpage, |
791 | .writepage = btree_writepage, | 776 | .writepage = btree_writepage, |
@@ -1273,11 +1258,7 @@ static int btrfs_congested_fn(void *congested_data, int bdi_bits) | |||
1273 | int ret = 0; | 1258 | int ret = 0; |
1274 | struct btrfs_device *device; | 1259 | struct btrfs_device *device; |
1275 | struct backing_dev_info *bdi; | 1260 | struct backing_dev_info *bdi; |
1276 | #if 0 | 1261 | |
1277 | if ((bdi_bits & (1 << BDI_write_congested)) && | ||
1278 | btrfs_congested_async(info, 0)) | ||
1279 | return 1; | ||
1280 | #endif | ||
1281 | list_for_each_entry(device, &info->fs_devices->devices, dev_list) { | 1262 | list_for_each_entry(device, &info->fs_devices->devices, dev_list) { |
1282 | if (!device->bdev) | 1263 | if (!device->bdev) |
1283 | continue; | 1264 | continue; |
@@ -1599,6 +1580,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1599 | fs_info->btree_inode = new_inode(sb); | 1580 | fs_info->btree_inode = new_inode(sb); |
1600 | fs_info->btree_inode->i_ino = 1; | 1581 | fs_info->btree_inode->i_ino = 1; |
1601 | fs_info->btree_inode->i_nlink = 1; | 1582 | fs_info->btree_inode->i_nlink = 1; |
1583 | fs_info->metadata_ratio = 8; | ||
1602 | 1584 | ||
1603 | fs_info->thread_pool_size = min_t(unsigned long, | 1585 | fs_info->thread_pool_size = min_t(unsigned long, |
1604 | num_online_cpus() + 2, 8); | 1586 | num_online_cpus() + 2, 8); |
@@ -1689,7 +1671,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1689 | if (features) { | 1671 | if (features) { |
1690 | printk(KERN_ERR "BTRFS: couldn't mount because of " | 1672 | printk(KERN_ERR "BTRFS: couldn't mount because of " |
1691 | "unsupported optional features (%Lx).\n", | 1673 | "unsupported optional features (%Lx).\n", |
1692 | features); | 1674 | (unsigned long long)features); |
1693 | err = -EINVAL; | 1675 | err = -EINVAL; |
1694 | goto fail_iput; | 1676 | goto fail_iput; |
1695 | } | 1677 | } |
@@ -1699,7 +1681,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1699 | if (!(sb->s_flags & MS_RDONLY) && features) { | 1681 | if (!(sb->s_flags & MS_RDONLY) && features) { |
1700 | printk(KERN_ERR "BTRFS: couldn't mount RDWR because of " | 1682 | printk(KERN_ERR "BTRFS: couldn't mount RDWR because of " |
1701 | "unsupported option features (%Lx).\n", | 1683 | "unsupported option features (%Lx).\n", |
1702 | features); | 1684 | (unsigned long long)features); |
1703 | err = -EINVAL; | 1685 | err = -EINVAL; |
1704 | goto fail_iput; | 1686 | goto fail_iput; |
1705 | } | 1687 | } |
@@ -2095,10 +2077,10 @@ static int write_dev_supers(struct btrfs_device *device, | |||
2095 | device->barriers = 0; | 2077 | device->barriers = 0; |
2096 | get_bh(bh); | 2078 | get_bh(bh); |
2097 | lock_buffer(bh); | 2079 | lock_buffer(bh); |
2098 | ret = submit_bh(WRITE, bh); | 2080 | ret = submit_bh(WRITE_SYNC, bh); |
2099 | } | 2081 | } |
2100 | } else { | 2082 | } else { |
2101 | ret = submit_bh(WRITE, bh); | 2083 | ret = submit_bh(WRITE_SYNC, bh); |
2102 | } | 2084 | } |
2103 | 2085 | ||
2104 | if (!ret && wait) { | 2086 | if (!ret && wait) { |
@@ -2291,7 +2273,7 @@ int close_ctree(struct btrfs_root *root) | |||
2291 | 2273 | ||
2292 | if (fs_info->delalloc_bytes) { | 2274 | if (fs_info->delalloc_bytes) { |
2293 | printk(KERN_INFO "btrfs: at unmount delalloc count %llu\n", | 2275 | printk(KERN_INFO "btrfs: at unmount delalloc count %llu\n", |
2294 | fs_info->delalloc_bytes); | 2276 | (unsigned long long)fs_info->delalloc_bytes); |
2295 | } | 2277 | } |
2296 | if (fs_info->total_ref_cache_size) { | 2278 | if (fs_info->total_ref_cache_size) { |
2297 | printk(KERN_INFO "btrfs: at umount reference cache size %llu\n", | 2279 | printk(KERN_INFO "btrfs: at umount reference cache size %llu\n", |
@@ -2328,16 +2310,6 @@ int close_ctree(struct btrfs_root *root) | |||
2328 | btrfs_stop_workers(&fs_info->endio_write_workers); | 2310 | btrfs_stop_workers(&fs_info->endio_write_workers); |
2329 | btrfs_stop_workers(&fs_info->submit_workers); | 2311 | btrfs_stop_workers(&fs_info->submit_workers); |
2330 | 2312 | ||
2331 | #if 0 | ||
2332 | while (!list_empty(&fs_info->hashers)) { | ||
2333 | struct btrfs_hasher *hasher; | ||
2334 | hasher = list_entry(fs_info->hashers.next, struct btrfs_hasher, | ||
2335 | hashers); | ||
2336 | list_del(&hasher->hashers); | ||
2337 | crypto_free_hash(&fs_info->hash_tfm); | ||
2338 | kfree(hasher); | ||
2339 | } | ||
2340 | #endif | ||
2341 | btrfs_close_devices(fs_info->fs_devices); | 2313 | btrfs_close_devices(fs_info->fs_devices); |
2342 | btrfs_mapping_tree_free(&fs_info->mapping_tree); | 2314 | btrfs_mapping_tree_free(&fs_info->mapping_tree); |
2343 | 2315 | ||