#include <fcntl.h>
#include <unistd.h>
#include <getopt.h>
+#include <limits.h>
#include "kerncompat.h"
#include "ctree.h"
#define FIELD_BUF_LEN 80
-struct extent_buffer *debug_corrupt_block(struct btrfs_root *root, u64 bytenr,
- u32 blocksize, u64 copy)
+static struct extent_buffer *debug_corrupt_block(struct btrfs_root *root,
+ u64 bytenr, u32 blocksize, u64 copy)
{
int ret;
struct extent_buffer *eb;
int num_copies;
int mirror_num = 1;
- eb = btrfs_find_create_tree_block(root, bytenr, blocksize);
+ eb = btrfs_find_create_tree_block(root->fs_info, bytenr, blocksize);
if (!eb)
return NULL;
{
struct extent_buffer *eb;
- eb = read_tree_block(root, bytenr, root->leafsize, 0);
+ eb = read_tree_block(root, bytenr, root->nodesize, 0);
if (!extent_buffer_uptodate(eb))
return -EIO;;
struct extent_buffer *next;
next = read_tree_block(root, btrfs_node_blockptr(eb, i),
- root->leafsize,
+ root->nodesize,
btrfs_node_ptr_generation(eb, i));
if (!extent_buffer_uptodate(next))
continue;
struct btrfs_trans_handle *trans;
struct btrfs_dir_item *di;
struct btrfs_path *path;
- char *name;
+ char name[PATH_MAX];
struct btrfs_key location;
struct btrfs_disk_key disk_key;
unsigned long name_ptr;
switch (corrupt_field) {
case BTRFS_DIR_ITEM_NAME:
name_len = btrfs_dir_name_len(path->nodes[0], di);
- name = malloc(name_len);
- if (!name) {
- ret = -ENOMEM;
- goto out;
- }
name_ptr = (unsigned long)(di + 1);
read_extent_buffer(path->nodes[0], name, name_ptr, name_len);
name[0]++;
write_extent_buffer(path->nodes[0], name, name_ptr, name_len);
btrfs_mark_buffer_dirty(path->nodes[0]);
- free(name);
goto out;
case BTRFS_DIR_ITEM_LOCATION_OBJECTID:
btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location);
return -EINVAL;
}
- eb = read_tree_block(root, block, root->leafsize, 0);
+ eb = read_tree_block(root, block, root->nodesize, 0);
if (!extent_buffer_uptodate(eb)) {
fprintf(stderr, "Couldn't read in tree block %s\n", field);
return -EINVAL;
* If using COW, chunk recover will use the old item to recover,
* which is still OK but we want to check the ability to rebuild chunk
* not only restore the old ones */
-int corrupt_item_nocow(struct btrfs_trans_handle *trans,
+static int corrupt_item_nocow(struct btrfs_trans_handle *trans,
struct btrfs_root *root, struct btrfs_path *path,
int del)
{
}
return ret;
}
-int corrupt_chunk_tree(struct btrfs_trans_handle *trans,
+static int corrupt_chunk_tree(struct btrfs_trans_handle *trans,
struct btrfs_root *root)
{
int ret;
btrfs_free_path(path);
return ret;
}
-int find_chunk_offset(struct btrfs_root *root,
+static int find_chunk_offset(struct btrfs_root *root,
struct btrfs_path *path, u64 offset)
{
struct btrfs_key key;
goto out;
}
if (ret < 0) {
- fprintf(stderr, "Error searching chunk");
+ fprintf(stderr, "Error searching chunk\n");
goto out;
}
out:
return ret;
}
-int main(int ac, char **av)
+int main(int argc, char **argv)
{
struct cache_tree root_cache;
struct btrfs_key key;
{ NULL, 0, NULL, 0 }
};
- c = getopt_long(ac, av, "l:c:b:eEkuUi:f:x:m:K:IDdr:C:",
+ c = getopt_long(argc, argv, "l:c:b:eEkuUi:f:x:m:K:IDdr:C:",
long_options, NULL);
if (c < 0)
break;
print_usage(c != GETOPT_VAL_HELP);
}
}
- set_argv0(av);
- ac = ac - optind;
- if (check_argc_min(ac, 1))
+ set_argv0(argv);
+ if (check_argc_min(argc - optind, 1))
print_usage(1);
- dev = av[optind];
+ dev = argv[optind];
radix_tree_init();
cache_tree_init(&root_cache);
if (inode) {
struct btrfs_trans_handle *trans;
- if (!strlen(field))
+ if (*field == 0)
print_usage(1);
trans = btrfs_start_transaction(root, 1);
goto out_close;
}
if (metadata_block) {
- if (!strlen(field))
+ if (*field == 0)
print_usage(1);
ret = corrupt_metadata_block(root, metadata_block, field);
goto out_close;
}
if (corrupt_di) {
- if (!key.objectid || !strlen(field))
+ if (!key.objectid || *field == 0)
print_usage(1);
ret = corrupt_dir_item(root, &key, field);
goto out_close;
goto out_close;
}
if (key.objectid || key.offset || key.type) {
- if (!strlen(field))
+ if (*field == 0)
print_usage(1);
ret = corrupt_key(root, &key, field);
goto out_close;