From 0528b69c1507dbbde9038e7705fc15cc06e9f33b Mon Sep 17 00:00:00 2001 From: Chris Mason Date: Tue, 7 Aug 2007 16:15:59 -0400 Subject: add defrag ioctl --- btrfsctl.c | 11 ++++++++++- ioctl.h | 2 +- mkfs.c | 1 + print-tree.c | 10 ++++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/btrfsctl.c b/btrfsctl.c index ae2f27b3..4dfc42bd 100644 --- a/btrfsctl.c +++ b/btrfsctl.c @@ -77,6 +77,12 @@ int main(int ac, char **av) exit(1); } command = BTRFS_IOC_SNAP_CREATE; + } else if (strcmp(av[i], "-d") == 0) { + if (i >= ac - 1) { + fprintf(stderr, "-d requires an arg"); + print_usage(); + } + command = BTRFS_IOC_DEFRAG; } } if (command == 0) { @@ -102,7 +108,10 @@ int main(int ac, char **av) perror("open"); exit(1); } - strcpy(args.name, name); + if (name) + strcpy(args.name, name); + else + args.name[0] = '\0'; ret = ioctl(fd, command, &args); printf("ioctl returns %d\n", ret); return 0; diff --git a/ioctl.h b/ioctl.h index 23bed48c..8bc47dec 100644 --- a/ioctl.h +++ b/ioctl.h @@ -28,6 +28,6 @@ struct btrfs_ioctl_vol_args { #define BTRFS_IOC_SNAP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 1, \ struct btrfs_ioctl_vol_args) -#define BTRFS_IOC_ADD_DISK _IOW(BTRFS_IOCTL_MAGIC, 2, \ +#define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, \ struct btrfs_ioctl_vol_args) #endif diff --git a/mkfs.c b/mkfs.c index ac990495..bd664672 100644 --- a/mkfs.c +++ b/mkfs.c @@ -225,6 +225,7 @@ int mkfs(int fd, char *pathname, u64 num_blocks, u32 blocksize) btrfs_set_inode_nblocks(inode_item, 1); btrfs_set_inode_mode(inode_item, S_IFDIR | 0755); + // memset(&root_item, 0, sizeof(root_item)); btrfs_set_root_dirid(&root_item, 0); btrfs_set_root_refs(&root_item, 1); btrfs_set_disk_key_offset(&item.key, 0); diff --git a/print-tree.c b/print-tree.c index 9df4379a..60deda54 100644 --- a/print-tree.c +++ b/print-tree.c @@ -96,6 +96,16 @@ void btrfs_print_leaf(struct btrfs_root *root, struct btrfs_leaf *l) (unsigned long long)btrfs_root_blocknr(ri), (unsigned long long)btrfs_root_dirid(ri), btrfs_root_refs(ri)); + if (1 || btrfs_root_refs(ri) == 0) { + struct btrfs_key drop_key; + btrfs_disk_key_to_cpu(&drop_key, + &ri->drop_progress); + printf("\t\tdrop key %Lu %x %Lu level %d\n", + (unsigned long long)drop_key.objectid, + drop_key.flags, + (unsigned long long)drop_key.offset, + ri->drop_level); + } break; case BTRFS_EXTENT_ITEM_KEY: ei = btrfs_item_ptr(l, i, struct btrfs_extent_item); -- cgit v1.2.3