diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2009-05-20 09:02:28 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2009-05-20 09:02:28 +0200 | 
| commit | 521c180874dae86f675d23c4eade4dba8b1f2cc8 (patch) | |
| tree | 7509303da3a9a1b40a26f6811f321c89cd31737b /fs/btrfs/disk-io.c | |
| parent | f1a11e0576c7a73d759d05d776692b2b2d37172b (diff) | |
| parent | 64d1304a64477629cb16b75491a77bafe6f86963 (diff) | |
Merge branch 'core/urgent' into core/futexes
Merge reason: this branch was on an pre -rc1 base, merge it up to -rc6+
              to get the latest upstream fixes.
Conflicts:
	kernel/futex.c
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'fs/btrfs/disk-io.c')
| -rw-r--r-- | fs/btrfs/disk-io.c | 104 | 
1 files changed, 37 insertions, 67 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 92caa8035f3..4b0ea0b80c2 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,  			memcpy(&found, result, csum_size);  			read_extent_buffer(buf, &val, 0, csum_size); -			printk(KERN_INFO "btrfs: %s checksum verify failed " -			       "on %llu wanted %X found %X level %d\n", -			       root->fs_info->sb->s_id, -			       buf->start, val, found, btrfs_header_level(buf)); +			if (printk_ratelimit()) { +				printk(KERN_INFO "btrfs: %s checksum verify " +				       "failed on %llu wanted %X found %X " +				       "level %d\n", +				       root->fs_info->sb->s_id, +				       (unsigned long long)buf->start, val, found, +				       btrfs_header_level(buf)); +			}  			if (result != (char *)&inline_result)  				kfree(result);  			return 1; @@ -268,10 +272,13 @@ static int verify_parent_transid(struct extent_io_tree *io_tree,  		ret = 0;  		goto out;  	} -	printk("parent transid verify failed on %llu wanted %llu found %llu\n", -	       (unsigned long long)eb->start, -	       (unsigned long long)parent_transid, -	       (unsigned long long)btrfs_header_generation(eb)); +	if (printk_ratelimit()) { +		printk("parent transid verify failed on %llu wanted %llu " +		       "found %llu\n", +		       (unsigned long long)eb->start, +		       (unsigned long long)parent_transid, +		       (unsigned long long)btrfs_header_generation(eb)); +	}  	ret = 1;  	clear_extent_buffer_uptodate(io_tree, eb);  out: @@ -415,9 +422,12 @@ static int btree_readpage_end_io_hook(struct page *page, u64 start, u64 end,  	found_start = btrfs_header_bytenr(eb);  	if (found_start != start) { -		printk(KERN_INFO "btrfs bad tree block start %llu %llu\n", -		       (unsigned long long)found_start, -		       (unsigned long long)eb->start); +		if (printk_ratelimit()) { +			printk(KERN_INFO "btrfs bad tree block start " +			       "%llu %llu\n", +			       (unsigned long long)found_start, +			       (unsigned long long)eb->start); +		}  		ret = -EIO;  		goto err;  	} @@ -429,8 +439,10 @@ static int btree_readpage_end_io_hook(struct page *page, u64 start, u64 end,  		goto err;  	}  	if (check_tree_block_fsid(root, eb)) { -		printk(KERN_INFO "btrfs bad fsid on block %llu\n", -		       (unsigned long long)eb->start); +		if (printk_ratelimit()) { +			printk(KERN_INFO "btrfs bad fsid on block %llu\n", +			       (unsigned long long)eb->start); +		}  		ret = -EIO;  		goto err;  	} @@ -579,19 +591,12 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode,  	async->bio_flags = bio_flags;  	atomic_inc(&fs_info->nr_async_submits); + +	if (rw & (1 << BIO_RW_SYNCIO)) +		btrfs_set_work_high_prio(&async->work); +  	btrfs_queue_worker(&fs_info->workers, &async->work); -#if 0 -	int limit = btrfs_async_submit_limit(fs_info); -	if (atomic_read(&fs_info->nr_async_submits) > limit) { -		wait_event_timeout(fs_info->async_submit_wait, -			   (atomic_read(&fs_info->nr_async_submits) < limit), -			   HZ/10); -		wait_event_timeout(fs_info->async_submit_wait, -			   (atomic_read(&fs_info->nr_async_bios) < limit), -			   HZ/10); -	} -#endif  	while (atomic_read(&fs_info->async_submit_draining) &&  	      atomic_read(&fs_info->nr_async_submits)) {  		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,  		return btrfs_map_bio(BTRFS_I(inode)->root, rw, bio,  				     mirror_num, 0);  	} +  	/*  	 * kthread helpers are used to submit writes so that checksumming  	 * can happen in parallel across all CPUs @@ -765,27 +771,6 @@ static void btree_invalidatepage(struct page *page, unsigned long offset)  	}  } -#if 0 -static int btree_writepage(struct page *page, struct writeback_control *wbc) -{ -	struct buffer_head *bh; -	struct btrfs_root *root = BTRFS_I(page->mapping->host)->root; -	struct buffer_head *head; -	if (!page_has_buffers(page)) { -		create_empty_buffers(page, root->fs_info->sb->s_blocksize, -					(1 << BH_Dirty)|(1 << BH_Uptodate)); -	} -	head = page_buffers(page); -	bh = head; -	do { -		if (buffer_dirty(bh)) -			csum_tree_block(root, bh, 0); -		bh = bh->b_this_page; -	} while (bh != head); -	return block_write_full_page(page, btree_get_block, wbc); -} -#endif -  static struct address_space_operations btree_aops = {  	.readpage	= btree_readpage,  	.writepage	= btree_writepage, @@ -863,8 +848,6 @@ struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 bytenr,  	if (ret == 0)  		set_bit(EXTENT_BUFFER_UPTODATE, &buf->bflags); -	else -		WARN_ON(1);  	return buf;  } @@ -1273,11 +1256,7 @@ static int btrfs_congested_fn(void *congested_data, int bdi_bits)  	int ret = 0;  	struct btrfs_device *device;  	struct backing_dev_info *bdi; -#if 0 -	if ((bdi_bits & (1 << BDI_write_congested)) && -	    btrfs_congested_async(info, 0)) -		return 1; -#endif +  	list_for_each_entry(device, &info->fs_devices->devices, dev_list) {  		if (!device->bdev)  			continue; @@ -1599,6 +1578,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,  	fs_info->btree_inode = new_inode(sb);  	fs_info->btree_inode->i_ino = 1;  	fs_info->btree_inode->i_nlink = 1; +	fs_info->metadata_ratio = 8;  	fs_info->thread_pool_size = min_t(unsigned long,  					  num_online_cpus() + 2, 8); @@ -1689,7 +1669,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,  	if (features) {  		printk(KERN_ERR "BTRFS: couldn't mount because of "  		       "unsupported optional features (%Lx).\n", -		       features); +		       (unsigned long long)features);  		err = -EINVAL;  		goto fail_iput;  	} @@ -1699,7 +1679,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,  	if (!(sb->s_flags & MS_RDONLY) && features) {  		printk(KERN_ERR "BTRFS: couldn't mount RDWR because of "  		       "unsupported option features (%Lx).\n", -		       features); +		       (unsigned long long)features);  		err = -EINVAL;  		goto fail_iput;  	} @@ -2095,10 +2075,10 @@ static int write_dev_supers(struct btrfs_device *device,  				device->barriers = 0;  				get_bh(bh);  				lock_buffer(bh); -				ret = submit_bh(WRITE, bh); +				ret = submit_bh(WRITE_SYNC, bh);  			}  		} else { -			ret = submit_bh(WRITE, bh); +			ret = submit_bh(WRITE_SYNC, bh);  		}  		if (!ret && wait) { @@ -2291,7 +2271,7 @@ int close_ctree(struct btrfs_root *root)  	if (fs_info->delalloc_bytes) {  		printk(KERN_INFO "btrfs: at unmount delalloc count %llu\n", -		       fs_info->delalloc_bytes); +		       (unsigned long long)fs_info->delalloc_bytes);  	}  	if (fs_info->total_ref_cache_size) {  		printk(KERN_INFO "btrfs: at umount reference cache size %llu\n", @@ -2328,16 +2308,6 @@ int close_ctree(struct btrfs_root *root)  	btrfs_stop_workers(&fs_info->endio_write_workers);  	btrfs_stop_workers(&fs_info->submit_workers); -#if 0 -	while (!list_empty(&fs_info->hashers)) { -		struct btrfs_hasher *hasher; -		hasher = list_entry(fs_info->hashers.next, struct btrfs_hasher, -				    hashers); -		list_del(&hasher->hashers); -		crypto_free_hash(&fs_info->hash_tfm); -		kfree(hasher); -	} -#endif  	btrfs_close_devices(fs_info->fs_devices);  	btrfs_mapping_tree_free(&fs_info->mapping_tree);  | 
