Loading fs/btrfs/async-thread.c +2 −1 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ struct btrfs_worker_thread { /* number of things on the pending list */ atomic_t num_pending; unsigned long sequence; /* protects the pending list. */ Loading Loading @@ -242,7 +243,7 @@ static struct btrfs_worker_thread *next_worker(struct btrfs_workers *workers) worker = list_entry(next, struct btrfs_worker_thread, worker_list); atomic_inc(&worker->num_pending); worker->sequence++; if (worker->sequence % 4 == 0) if (worker->sequence % workers->idle_thresh == 0) list_move_tail(next, &workers->worker_list); return worker; } Loading fs/btrfs/disk-io.c +8 −1 Original line number Diff line number Diff line Loading @@ -1386,7 +1386,14 @@ struct btrfs_root *open_ctree(struct super_block *sb, * devices */ fs_info->submit_workers.idle_thresh = 64; fs_info->workers.idle_thresh = 32; /* fs_info->workers is responsible for checksumming file data * blocks and metadata. Using a larger idle thresh allows each * worker thread to operate on things in roughly the order they * were sent by the writeback daemons, improving overall locality * of the IO going down the pipe. */ fs_info->workers.idle_thresh = 128; btrfs_init_workers(&fs_info->fixup_workers, "fixup", 1); btrfs_init_workers(&fs_info->endio_workers, "endio", Loading fs/btrfs/file-item.c +12 −4 Original line number Diff line number Diff line Loading @@ -321,6 +321,7 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans, file_key.offset = offset; btrfs_set_key_type(&file_key, BTRFS_CSUM_ITEM_KEY); mutex_lock(&BTRFS_I(inode)->csum_mutex); item = btrfs_lookup_csum(trans, root, path, objectid, offset, 1); if (!IS_ERR(item)) { leaf = path->nodes[0]; Loading Loading @@ -367,7 +368,7 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans, ret = btrfs_search_slot(trans, root, &file_key, path, BTRFS_CRC32_SIZE, 1); if (ret < 0) goto fail; goto fail_unlock; if (ret == 0) { BUG(); } Loading Loading @@ -411,10 +412,10 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans, ret = btrfs_insert_empty_item(trans, root, path, &file_key, ins_size); if (ret < 0) goto fail; goto fail_unlock; if (ret != 0) { WARN_ON(1); goto fail; goto fail_unlock; } csum: leaf = path->nodes[0]; Loading @@ -427,6 +428,8 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans, item_end = (struct btrfs_csum_item *)((unsigned char *)item_end + btrfs_item_size_nr(leaf, path->slots[0])); eb_token = NULL; mutex_unlock(&BTRFS_I(inode)->csum_mutex); cond_resched(); next_sector: if (!eb_token || Loading Loading @@ -467,13 +470,18 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans, eb_token = NULL; } btrfs_mark_buffer_dirty(path->nodes[0]); cond_resched(); if (total_bytes < sums->len) { btrfs_release_path(root, path); goto again; } fail: out: btrfs_free_path(path); return ret; fail_unlock: mutex_unlock(&BTRFS_I(inode)->csum_mutex); goto out; } int btrfs_csum_truncate(struct btrfs_trans_handle *trans, Loading fs/btrfs/inode.c +0 −2 Original line number Diff line number Diff line Loading @@ -415,10 +415,8 @@ static noinline int add_pending_csums(struct btrfs_trans_handle *trans, btrfs_set_trans_block_group(trans, inode); list_for_each(cur, list) { sum = list_entry(cur, struct btrfs_ordered_sum, list); mutex_lock(&BTRFS_I(inode)->csum_mutex); btrfs_csum_file_blocks(trans, BTRFS_I(inode)->root, inode, sum); mutex_unlock(&BTRFS_I(inode)->csum_mutex); } return 0; } Loading Loading
fs/btrfs/async-thread.c +2 −1 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ struct btrfs_worker_thread { /* number of things on the pending list */ atomic_t num_pending; unsigned long sequence; /* protects the pending list. */ Loading Loading @@ -242,7 +243,7 @@ static struct btrfs_worker_thread *next_worker(struct btrfs_workers *workers) worker = list_entry(next, struct btrfs_worker_thread, worker_list); atomic_inc(&worker->num_pending); worker->sequence++; if (worker->sequence % 4 == 0) if (worker->sequence % workers->idle_thresh == 0) list_move_tail(next, &workers->worker_list); return worker; } Loading
fs/btrfs/disk-io.c +8 −1 Original line number Diff line number Diff line Loading @@ -1386,7 +1386,14 @@ struct btrfs_root *open_ctree(struct super_block *sb, * devices */ fs_info->submit_workers.idle_thresh = 64; fs_info->workers.idle_thresh = 32; /* fs_info->workers is responsible for checksumming file data * blocks and metadata. Using a larger idle thresh allows each * worker thread to operate on things in roughly the order they * were sent by the writeback daemons, improving overall locality * of the IO going down the pipe. */ fs_info->workers.idle_thresh = 128; btrfs_init_workers(&fs_info->fixup_workers, "fixup", 1); btrfs_init_workers(&fs_info->endio_workers, "endio", Loading
fs/btrfs/file-item.c +12 −4 Original line number Diff line number Diff line Loading @@ -321,6 +321,7 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans, file_key.offset = offset; btrfs_set_key_type(&file_key, BTRFS_CSUM_ITEM_KEY); mutex_lock(&BTRFS_I(inode)->csum_mutex); item = btrfs_lookup_csum(trans, root, path, objectid, offset, 1); if (!IS_ERR(item)) { leaf = path->nodes[0]; Loading Loading @@ -367,7 +368,7 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans, ret = btrfs_search_slot(trans, root, &file_key, path, BTRFS_CRC32_SIZE, 1); if (ret < 0) goto fail; goto fail_unlock; if (ret == 0) { BUG(); } Loading Loading @@ -411,10 +412,10 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans, ret = btrfs_insert_empty_item(trans, root, path, &file_key, ins_size); if (ret < 0) goto fail; goto fail_unlock; if (ret != 0) { WARN_ON(1); goto fail; goto fail_unlock; } csum: leaf = path->nodes[0]; Loading @@ -427,6 +428,8 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans, item_end = (struct btrfs_csum_item *)((unsigned char *)item_end + btrfs_item_size_nr(leaf, path->slots[0])); eb_token = NULL; mutex_unlock(&BTRFS_I(inode)->csum_mutex); cond_resched(); next_sector: if (!eb_token || Loading Loading @@ -467,13 +470,18 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans, eb_token = NULL; } btrfs_mark_buffer_dirty(path->nodes[0]); cond_resched(); if (total_bytes < sums->len) { btrfs_release_path(root, path); goto again; } fail: out: btrfs_free_path(path); return ret; fail_unlock: mutex_unlock(&BTRFS_I(inode)->csum_mutex); goto out; } int btrfs_csum_truncate(struct btrfs_trans_handle *trans, Loading
fs/btrfs/inode.c +0 −2 Original line number Diff line number Diff line Loading @@ -415,10 +415,8 @@ static noinline int add_pending_csums(struct btrfs_trans_handle *trans, btrfs_set_trans_block_group(trans, inode); list_for_each(cur, list) { sum = list_entry(cur, struct btrfs_ordered_sum, list); mutex_lock(&BTRFS_I(inode)->csum_mutex); btrfs_csum_file_blocks(trans, BTRFS_I(inode)->root, inode, sum); mutex_unlock(&BTRFS_I(inode)->csum_mutex); } return 0; } Loading