Author: areq Date: Mon Jun 7 12:14:25 2010 GMT Module: packages Tag: HEAD ---- Log message: - add patches from fedora
---- Files affected: packages/btrfs-progs: btrfs-progs.spec (1.3 -> 1.4) , btrfs-progs-build-everything.patch (NONE -> 1.1) (NEW), btrfs-progs-build-fixes.patch (NONE -> 1.1) (NEW), btrfs-progs-fix-labels.patch (NONE -> 1.1) (NEW), btrfs-progs-fix-return-value.patch (NONE -> 1.1) (NEW), btrfs-progs-upstream.patch (NONE -> 1.1) (NEW), btrfs-progs-valgrind.patch (NONE -> 1.1) (NEW) ---- Diffs: ================================================================ Index: packages/btrfs-progs/btrfs-progs.spec diff -u packages/btrfs-progs/btrfs-progs.spec:1.3 packages/btrfs-progs/btrfs-progs.spec:1.4 --- packages/btrfs-progs/btrfs-progs.spec:1.3 Sun Nov 8 00:14:09 2009 +++ packages/btrfs-progs/btrfs-progs.spec Mon Jun 7 14:14:19 2010 @@ -2,11 +2,17 @@ Summary: Utilities belonging to the btrfs filesystem Name: btrfs-progs Version: 0.19 -Release: 1 +Release: 2 License: GPL v2 Group: Applications/System Source0: http://www.kernel.org/pub/linux/kernel/people/mason/btrfs/%{name}-%{version}.tar.bz2 # Source0-md5: 5854728d080cc76f21a83bdc99b6ddaa +Patch0: %{name}-fix-labels.patch +Patch1: %{name}-build-everything.patch +Patch2: %{name}-valgrind.patch +Patch3: %{name}-fix-return-value.patch +Patch4: %{name}-build-fixes.patch +Patch5: %{name}-upstream.patch URL: http://btrfs.wiki.kernel.org/ BuildRequires: autoconf >= 2.50 BuildRequires: automake @@ -22,6 +28,12 @@ %prep %setup -q +%patch0 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch1 -p1 sed -i -e 's#gcc#$(CC)#g' Makefile @@ -57,6 +69,9 @@ All persons listed below can be reached at <cvs_login>@pld-linux.org $Log$ +Revision 1.4 2010/06/07 12:14:19 areq +- add patches from fedora + Revision 1.3 2009/11/07 23:14:09 adamg - updated to 0.19 ================================================================ Index: packages/btrfs-progs/btrfs-progs-build-everything.patch diff -u /dev/null packages/btrfs-progs/btrfs-progs-build-everything.patch:1.1 --- /dev/null Mon Jun 7 14:14:25 2010 +++ packages/btrfs-progs/btrfs-progs-build-everything.patch Mon Jun 7 14:14:19 2010 @@ -0,0 +1,12 @@ +--- btrfs-progs-0.19/Makefile.orig 2010-03-24 14:45:18.001490900 -0400 ++++ btrfs-progs-0.19/Makefile 2010-03-24 14:45:35.745491310 -0400 +@@ -17,8 +17,7 @@ + LIBS=-luuid + + progs = btrfsctl mkfs.btrfs btrfs-debug-tree btrfs-show btrfs-vol btrfsck \ +- btrfs \ +- btrfs-map-logical ++ btrfs btrfs-map-logical btrfstune btrfs-image + + # make C=1 to enable sparse + ifdef C ================================================================ Index: packages/btrfs-progs/btrfs-progs-build-fixes.patch diff -u /dev/null packages/btrfs-progs/btrfs-progs-build-fixes.patch:1.1 --- /dev/null Mon Jun 7 14:14:25 2010 +++ packages/btrfs-progs/btrfs-progs-build-fixes.patch Mon Jun 7 14:14:19 2010 @@ -0,0 +1,32 @@ +--- btrfs-progs-0.19/btrfsck.c ++++ btrfs-progs-0.19/btrfsck.c +@@ -21,6 +21,9 @@ + #include <stdio.h> + #include <stdlib.h> + #include <fcntl.h> ++#include <sys/types.h> ++#include <sys/stat.h> ++#include <unistd.h> + #include "kerncompat.h" + #include "ctree.h" + #include "disk-io.h" +--- btrfs-progs-0.19/mkfs.c ++++ btrfs-progs-0.19/mkfs.c +@@ -341,7 +341,7 @@ int main(int ac, char **av) + u64 alloc_start = 0; + u64 metadata_profile = BTRFS_BLOCK_GROUP_RAID1 | BTRFS_BLOCK_GROUP_DUP; + u64 data_profile = BTRFS_BLOCK_GROUP_RAID0; +- u32 leafsize = getpagesize(); ++ u32 leafsize = sysconf(_SC_PAGESIZE); + u32 sectorsize = 4096; + u32 nodesize = leafsize; + u32 stripesize = 4096; +@@ -398,7 +398,7 @@ int main(int ac, char **av) + print_usage(); + } + } +- sectorsize = max(sectorsize, (u32)getpagesize()); ++ sectorsize = max(sectorsize, (u32)sysconf(_SC_PAGESIZE)); + if (leafsize < sectorsize || (leafsize & (sectorsize - 1))) { + fprintf(stderr, "Illegal leafsize %u\n", leafsize); + exit(1); ================================================================ Index: packages/btrfs-progs/btrfs-progs-fix-labels.patch diff -u /dev/null packages/btrfs-progs/btrfs-progs-fix-labels.patch:1.1 --- /dev/null Mon Jun 7 14:14:25 2010 +++ packages/btrfs-progs/btrfs-progs-fix-labels.patch Mon Jun 7 14:14:19 2010 @@ -0,0 +1,25 @@ +diff --git a/mkfs.c b/mkfs.c +index d664254..138bcc9 100644 +--- a/mkfs.c ++++ b/mkfs.c +@@ -294,7 +294,6 @@ static u64 parse_profile(char *s) + + static char *parse_label(char *input) + { +- int i; + int len = strlen(input); + + if (len > BTRFS_LABEL_SIZE) { +@@ -302,12 +301,6 @@ static char *parse_label(char *input) + BTRFS_LABEL_SIZE); + exit(1); + } +- for (i = 0; i < len; i++) { +- if (input[i] == '/' || input[i] == '\\') { +- fprintf(stderr, "invalid label %s\n", input); +- exit(1); +- } +- } + return strdup(input); + } + ================================================================ Index: packages/btrfs-progs/btrfs-progs-fix-return-value.patch diff -u /dev/null packages/btrfs-progs/btrfs-progs-fix-return-value.patch:1.1 --- /dev/null Mon Jun 7 14:14:25 2010 +++ packages/btrfs-progs/btrfs-progs-fix-return-value.patch Mon Jun 7 14:14:19 2010 @@ -0,0 +1,32 @@ +From 8b6be4c65eda396e0c42182f4ebf2794c62b442c Mon Sep 17 00:00:00 2001 +From: Josef Bacik <[email protected]> +Date: Tue, 2 Feb 2010 09:51:15 -0500 +Subject: [PATCH] Btrfs-progs: make btrfsctl return values like everybody else + +This patch makes btrfsctl return 0 for success and 1 for failure, which is the +behavior of all other userspace applications. Thanks, + +Signed-off-by: Josef Bacik <[email protected]> +--- + btrfsctl.c | 6 ++---- + 1 files changed, 2 insertions(+), 4 deletions(-) + +diff --git a/btrfsctl.c b/btrfsctl.c +index 66c4e89..73d9c30 100644 +--- a/btrfsctl.c ++++ b/btrfsctl.c +@@ -231,9 +231,7 @@ int main(int ac, char **av) + printf("ioctl failed with error %d\n", ret); + } + printf("%s\n", BTRFS_BUILD_VERSION); +- if (ret) +- exit(0); +- else +- exit(1); ++ ++ return ret ? 1 : 0; + } + +-- +1.6.6 + ================================================================ Index: packages/btrfs-progs/btrfs-progs-upstream.patch diff -u /dev/null packages/btrfs-progs/btrfs-progs-upstream.patch:1.1 --- /dev/null Mon Jun 7 14:14:25 2010 +++ packages/btrfs-progs/btrfs-progs-upstream.patch Mon Jun 7 14:14:19 2010 @@ -0,0 +1,3752 @@ +diff --git a/Makefile b/Makefile +index 8097b5a..525676e 100644 +--- a/Makefile ++++ b/Makefile +@@ -4,7 +4,7 @@ CFLAGS = -g -Werror -Os + objects = ctree.o disk-io.o radix-tree.o extent-tree.o print-tree.o \ + root-tree.o dir-item.o file-item.o inode-item.o \ + inode-map.o crc32c.o rbtree.o extent-cache.o extent_io.o \ +- volumes.o utils.o ++ volumes.o utils.o btrfs-list.o + + # + CHECKFLAGS=-D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise \ +@@ -16,7 +16,9 @@ prefix ?= /usr/local + bindir = $(prefix)/bin + LIBS=-luuid + +-progs = btrfsctl mkfs.btrfs btrfs-debug-tree btrfs-show btrfs-vol btrfsck ++progs = btrfsctl mkfs.btrfs btrfs-debug-tree btrfs-show btrfs-vol btrfsck \ ++ btrfs \ ++ btrfs-map-logical + + # make C=1 to enable sparse + ifdef C +@@ -35,6 +37,10 @@ all: version $(progs) manpages + version: + bash version.sh + ++btrfs: $(objects) btrfs.o btrfs_cmds.o ++ gcc $(CFLAGS) -o btrfs btrfs.o btrfs_cmds.o \ ++ $(objects) $(LDFLAGS) $(LIBS) ++ + btrfsctl: $(objects) btrfsctl.o + gcc $(CFLAGS) -o btrfsctl btrfsctl.o $(objects) $(LDFLAGS) $(LIBS) + +@@ -56,6 +62,9 @@ btrfs-debug-tree: $(objects) debug-tree.o + btrfstune: $(objects) btrfstune.o + gcc $(CFLAGS) -o btrfstune $(objects) btrfstune.o $(LDFLAGS) $(LIBS) + ++btrfs-map-logical: $(objects) btrfs-map-logical.o ++ gcc $(CFLAGS) -o btrfs-map-logical $(objects) btrfs-map-logical.o $(LDFLAGS) $(LIBS) ++ + btrfs-image: $(objects) btrfs-image.o + gcc $(CFLAGS) -o btrfs-image $(objects) btrfs-image.o -lpthread -lz $(LDFLAGS) $(LIBS) + +@@ -68,6 +77,9 @@ quick-test: $(objects) quick-test.o + convert: $(objects) convert.o + gcc $(CFLAGS) -o btrfs-convert $(objects) convert.o -lext2fs $(LDFLAGS) $(LIBS) + ++ioctl-test: $(objects) ioctl-test.o ++ gcc $(CFLAGS) -o ioctl-test $(objects) ioctl-test.o $(LDFLAGS) $(LIBS) ++ + manpages: + cd man; make + +diff --git a/btrfs-defrag.c b/btrfs-defrag.c +new file mode 100644 +index 0000000..8f1525a +--- /dev/null ++++ b/btrfs-defrag.c +@@ -0,0 +1,39 @@ ++/* ++ * Copyright (C) 2010 Oracle. All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public ++ * License v2 as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public ++ * License along with this program; if not, write to the ++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ * Boston, MA 021110-1307, USA. ++ */ ++ ++#ifndef __CHECKER__ ++#include <sys/ioctl.h> ++#include <sys/mount.h> ++#include "ioctl.h" ++#endif ++#include <stdio.h> ++#include <stdlib.h> ++#include <sys/types.h> ++#include <sys/stat.h> ++#include <fcntl.h> ++#include <ctype.h> ++#include <unistd.h> ++#include <dirent.h> ++#include <libgen.h> ++#include <getopt.h> ++#include "kerncompat.h" ++#include "ctree.h" ++#include "transaction.h" ++#include "utils.h" ++#include "version.h" ++ +diff --git a/btrfs-list.c b/btrfs-list.c +new file mode 100644 +index 0000000..7741705 +--- /dev/null ++++ b/btrfs-list.c +@@ -0,0 +1,825 @@ ++/* ++ * Copyright (C) 2010 Oracle. All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public ++ * License v2 as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public ++ * License along with this program; if not, write to the ++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ * Boston, MA 021110-1307, USA. ++ */ ++ ++#ifndef __CHECKER__ ++#include <sys/ioctl.h> ++#include <sys/mount.h> ++#include "ioctl.h" ++#endif ++#include <stdio.h> ++#include <stdlib.h> ++#include <sys/types.h> ++#include <sys/stat.h> ++#include <fcntl.h> ++#include <unistd.h> ++#include <dirent.h> ++#include <libgen.h> ++#include "kerncompat.h" ++#include "ctree.h" ++#include "transaction.h" ++#include "utils.h" ++#include "version.h" ++ ++/* we store all the roots we find in an rbtree so that we can ++ * search for them later. ++ */ ++struct root_lookup { ++ struct rb_root root; ++}; ++ ++/* ++ * one of these for each root we find. ++ */ ++struct root_info { ++ struct rb_node rb_node; ++ ++ /* this root's id */ ++ u64 root_id; ++ ++ /* the id of the root that references this one */ ++ u64 ref_tree; ++ ++ /* the dir id we're in from ref_tree */ ++ u64 dir_id; ++ ++ /* path from the subvol we live in to this root, including the ++ * root's name. This is null until we do the extra lookup ioctl. ++ */ ++ char *path; ++ ++ /* the name of this root in the directory it lives in */ ++ char name[]; ++}; ++ ++static void root_lookup_init(struct root_lookup *tree) ++{ ++ tree->root.rb_node = NULL; ++} ++ ++static int comp_entry(struct root_info *entry, u64 root_id, u64 ref_tree) ++{ ++ if (entry->root_id > root_id) ++ return 1; ++ if (entry->root_id < root_id) ++ return -1; ++ if (entry->ref_tree > ref_tree) ++ return 1; ++ if (entry->ref_tree < ref_tree) ++ return -1; ++ return 0; ++} ++ ++/* ++ * insert a new root into the tree. returns the existing root entry ++ * if one is already there. Both root_id and ref_tree are used ++ * as the key ++ */ ++static struct rb_node *tree_insert(struct rb_root *root, u64 root_id, ++ u64 ref_tree, struct rb_node *node) ++{ ++ struct rb_node ** p = &root->rb_node; ++ struct rb_node * parent = NULL; ++ struct root_info *entry; ++ int comp; ++ ++ while(*p) { ++ parent = *p; ++ entry = rb_entry(parent, struct root_info, rb_node); ++ ++ comp = comp_entry(entry, root_id, ref_tree); ++ ++ if (comp < 0) ++ p = &(*p)->rb_left; ++ else if (comp > 0) ++ p = &(*p)->rb_right; ++ else ++ return parent; ++ } ++ ++ entry = rb_entry(parent, struct root_info, rb_node); ++ rb_link_node(node, parent, p); ++ rb_insert_color(node, root); ++ return NULL; ++} ++ ++/* ++ * find a given root id in the tree. We return the smallest one, ++ * rb_next can be used to move forward looking for more if required ++ */ ++static struct root_info *tree_search(struct rb_root *root, u64 root_id) ++{ ++ struct rb_node * n = root->rb_node; ++ struct root_info *entry; ++ ++ while(n) { ++ entry = rb_entry(n, struct root_info, rb_node); ++ ++ if (entry->root_id < root_id) ++ n = n->rb_left; ++ else if (entry->root_id > root_id) ++ n = n->rb_right; ++ else { ++ struct root_info *prev; ++ struct rb_node *prev_n; ++ while (1) { ++ prev_n = rb_prev(n); ++ if (!prev_n) ++ break; ++ prev = rb_entry(prev_n, struct root_info, ++ rb_node); ++ if (prev->root_id != root_id) ++ break; ++ entry = prev; ++ n = prev_n; ++ } ++ return entry; ++ } ++ } ++ return NULL; ++} ++ ++/* ++ * this allocates a new root in the lookup tree. ++ * ++ * root_id should be the object id of the root ++ * ++ * ref_tree is the objectid of the referring root. ++ * ++ * dir_id is the directory in ref_tree where this root_id can be found. ++ * ++ * name is the name of root_id in that directory ++ * ++ * name_len is the length of name ++ */ ++static int add_root(struct root_lookup *root_lookup, ++ u64 root_id, u64 ref_tree, u64 dir_id, char *name, ++ int name_len) ++{ ++ struct root_info *ri; ++ struct rb_node *ret; ++ ri = malloc(sizeof(*ri) + name_len + 1); ++ if (!ri) { ++ printf("memory allocation failed\n"); ++ exit(1); ++ } ++ memset(ri, 0, sizeof(*ri) + name_len + 1); ++ ri->path = NULL; ++ ri->dir_id = dir_id; ++ ri->root_id = root_id; ++ ri->ref_tree = ref_tree; ++ strncpy(ri->name, name, name_len); ++ ++ ret = tree_insert(&root_lookup->root, root_id, ref_tree, &ri->rb_node); ++ if (ret) { ++ printf("failed to insert tree %llu\n", (unsigned long long)root_id); ++ exit(1); ++ } ++ return 0; ++} ++ ++/* ++ * for a given root_info, search through the root_lookup tree to construct ++ * the full path name to it. ++ * ++ * This can't be called until all the root_info->path fields are filled ++ * in by lookup_ino_path ++ */ ++static int resolve_root(struct root_lookup *rl, struct root_info *ri) ++{ ++ u64 top_id; ++ char *full_path = NULL; ++ int len = 0; ++ struct root_info *found; ++ ++ /* ++ * we go backwards from the root_info object and add pathnames ++ * from parent directories as we go. ++ */ ++ found = ri; ++ while (1) { ++ char *tmp; ++ u64 next; ++ int add_len = strlen(found->path); ++ ++ /* room for / and for null */ ++ tmp = malloc(add_len + 2 + len); ++ if (full_path) { ++ memcpy(tmp + add_len + 1, full_path, len); ++ tmp[add_len] = '/'; ++ memcpy(tmp, found->path, add_len); ++ tmp [add_len + len + 1] = '\0'; ++ free(full_path); ++ full_path = tmp; ++ len += add_len + 1; ++ } else { ++ full_path = strdup(found->path); ++ len = add_len; ++ } ++ ++ next = found->ref_tree; ++ /* if the ref_tree refers to ourselves, we're at the top */ ++ if (next == found->root_id) { ++ top_id = next; ++ break; ++ } ++ ++ /* ++ * if the ref_tree wasn't in our tree of roots, we're ++ * at the top ++ */ ++ found = tree_search(&rl->root, next); ++ if (!found) { ++ top_id = next; ++ break; ++ } ++ } ++ printf("ID %llu top level %llu path %s\n", ri->root_id, top_id, ++ full_path); ++ free(full_path); ++ return 0; ++} ++ ++/* ++ * for a single root_info, ask the kernel to give us a path name ++ * inside it's ref_root for the dir_id where it lives. ++ * ++ * This fills in root_info->path with the path to the directory and and ++ * appends this root's name. ++ */ ++static int lookup_ino_path(int fd, struct root_info *ri) ++{ ++ struct btrfs_ioctl_ino_lookup_args args; ++ int ret; ++ ++ if (ri->path) ++ return 0; ++ ++ memset(&args, 0, sizeof(args)); ++ args.treeid = ri->ref_tree; ++ args.objectid = ri->dir_id; ++ ++ ret = ioctl(fd, BTRFS_IOC_INO_LOOKUP, &args); ++ if (ret) { ++ fprintf(stderr, "ERROR: Failed to lookup path for root %llu\n", ++ (unsigned long long)ri->ref_tree); ++ return ret; ++ } ++ ++ if (args.name[0]) { ++ /* ++ * we're in a subdirectory of ref_tree, the kernel ioctl ++ * puts a / in there for us ++ */ ++ ri->path = malloc(strlen(ri->name) + strlen(args.name) + 1); ++ if (!ri->path) { ++ perror("malloc failed"); ++ exit(1); ++ } ++ strcpy(ri->path, args.name); ++ strcat(ri->path, ri->name); ++ } else { ++ /* we're at the root of ref_tree */ ++ ri->path = strdup(ri->name); ++ if (!ri->path) { ++ perror("strdup failed"); ++ exit(1); ++ } ++ } ++ return 0; ++} ++ ++/* finding the generation for a given path is a two step process. ++ * First we use the inode loookup routine to find out the root id ++ * ++ * Then we use the tree search ioctl to scan all the root items for a ++ * given root id and spit out the latest generation we can find ++ */ ++static u64 find_root_gen(int fd) ++{ <<Diff was trimmed, longer than 597 lines>> ---- CVS-web: http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/btrfs-progs/btrfs-progs.spec?r1=1.3&r2=1.4&f=u _______________________________________________ pld-cvs-commit mailing list [email protected] http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit
