On Wed, Nov 09, 2011 at 12:19:58PM -0200, Gustavo Sverzut Barbieri wrote: > On Tue, Nov 8, 2011 at 3:20 PM, Chris Mason <chris.ma...@oracle.com> wrote: > > On Tue, Nov 08, 2011 at 03:08:41PM -0200, Gustavo Sverzut Barbieri wrote: > >> On Tue, Nov 1, 2011 at 9:20 PM, Gustavo Sverzut Barbieri > >> <barbi...@gmail.com> wrote: > >> > On Tue, Nov 1, 2011 at 7:57 PM, Alexandre Oliva > >> > <ol...@lsd.ic.unicamp.br> wrote: > >> >> Hi, Gustavo, > >> >> > >> >> On Nov 1, 2011, Gustavo Sverzut Barbieri <barbi...@gmail.com> wrote: > >> >> > >> >>> btrfs csum failed ino 2957021 extent 85041815552 csum 667310679 > >> >>> wanted 0 mirror 0 > >> >> > >> >>> Is there any way to recover it? :-S > >> >> > >> >> Did you try mounting without data checksums? > >> > > >> > Just tried to mount with -o nodatasum, no luck. Is that enough? > >> > >> Ideas? Should I give up and consider data lost? :-( > > > > We actually check the crcs even when mounted with nodatasum. Can you > > give the restore tool a shot from my current btrfs-progs git repo? If > > it can read it we can find a way to get the files off. > > Hi Chris, > > Fortunately it worked and I've restored, it misses symbolic links and > executable permissions (or I did a mistake somewhere, like mounting) > but overall it's all fine.
Great to hear you've pulled the files. Do you need the kernel patch for symlinks etc? > > The attached patch was helpful to let me ignore stuff like development > files and caches. Speeds up the recovery :-) Very nice, thanks. -chris > > Thanks! > > -- > Gustavo Sverzut Barbieri > -------------------------------------- > Mobile: +55 (19) 9225-2202 > Contact: http://www.gustavobarbieri.com.br/contact > From dc57b73b08fefb21099cc6b171683daaffa04501 Mon Sep 17 00:00:00 2001 > From: Gustavo Sverzut Barbieri <barbi...@profusion.mobi> > Date: Mon, 8 Jan 2001 00:37:39 -0200 > Subject: [PATCH] restore: allow ignoring file name patterns and paths. > > Introduce two new command line switches that can be specified multiple > times: > > -e path-pattern > -E file-name-pattern > > They are processed with fnmatch(), the first (-e) using FNM_PATHNAME > flag on the whole path string, the second uses no flag and is applied > only over the file or directory name. > > Example: > > restore -v \ > -e '*/.cache' -e '*/.thumbnails' \ > -e '*/Desktop/Pictures' \ > -E '*~' \ > /dev/sdb1 /tmp/home-restore > > will restore everything but files under ~/.cache, ~/.thumbnails and > ~/Desktop/Pictures for every user (assume it's the mountpoint of > /home), also ignoring every backup file (*~). > --- > restore.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- > 1 files changed, 53 insertions(+), 2 deletions(-) > > diff --git a/restore.c b/restore.c > index 250c9d3..bdb0c7f 100644 > --- a/restore.c > +++ b/restore.c > @@ -25,6 +25,7 @@ > #include <fcntl.h> > #include <sys/stat.h> > #include <zlib.h> > +#include <fnmatch.h> > #include "kerncompat.h" > #include "ctree.h" > #include "disk-io.h" > @@ -40,6 +41,9 @@ static int get_snaps = 0; > static int verbose = 0; > static int ignore_errors = 0; > static int overwrite = 0; > +static char **exclude_paths = NULL; > +static char **exclude_patterns = NULL; > +static int dir_name_len = 0; > > static int decompress(char *inbuf, char *outbuf, u64 compress_len, > u64 decompress_len) > @@ -436,6 +440,27 @@ set_size: > return 0; > } > > +static int is_excluded(const char *path, const char *name) > +{ > + char **itr; > + if (exclude_paths) { > + path += dir_name_len; > + for (itr = exclude_paths; *itr != NULL; itr++) { > + if (fnmatch(*itr, path, FNM_PATHNAME) == 0) { > + return 1; > + } > + } > + } > + if (exclude_patterns) { > + for (itr = exclude_patterns; *itr != NULL; itr++) { > + if (fnmatch(*itr, path, 0) == 0) { > + return 1; > + } > + } > + } > + return 0; > +} > + > static int search_dir(struct btrfs_root *root, struct btrfs_key *key, > const char *dir) > { > @@ -568,6 +593,11 @@ static int search_dir(struct btrfs_root *root, struct > btrfs_key *key, > } > ret = 0; > } > + if (is_excluded(path_name, filename)) { > + if (verbose) > + printf("Ignored %s\n", path_name); > + goto next; > + } > if (verbose) > printf("Restoring %s\n", path_name); > fd = open(path_name, O_CREAT|O_WRONLY, 0644); > @@ -636,6 +666,11 @@ static int search_dir(struct btrfs_root *root, struct > btrfs_key *key, > location.objectid = BTRFS_FIRST_FREE_OBJECTID; > } > > + if (is_excluded(path_name, filename)) { > + if (verbose) > + printf("Ignored %s\n", path_name); > + goto next; > + } > if (verbose) > printf("Restoring %s\n", path_name); > > @@ -672,7 +707,7 @@ next: > > static void usage() > { > - fprintf(stderr, "Usage: restore [-svio] [-t disk offset] <device> " > + fprintf(stderr, "Usage: restore [-svio] [-e exclude-paths] [-E > exclude-name-patterns] [-t disk offset] <device> " > "<directory>\n"); > } > > @@ -765,8 +800,15 @@ int main(int argc, char **argv) > int opt; > int super_mirror = 0; > int find_dir = 0; > + int exclude_paths_idx = 0; > + int exclude_patterns_idx = 0; > > - while ((opt = getopt(argc, argv, "sviot:u:df:")) != -1) { > + if (argc > 1) { > + exclude_paths = calloc(argc - 1, sizeof(char *)); > + exclude_patterns = calloc(argc - 1, sizeof(char *)); > + } > + > + while ((opt = getopt(argc, argv, "sviot:u:df:e:E:")) != -1) { > switch (opt) { > case 's': > get_snaps = 1; > @@ -806,6 +848,14 @@ int main(int argc, char **argv) > exit(1); > } > break; > + case 'e': > + exclude_paths[exclude_paths_idx] = > strdup(optarg); > + exclude_paths_idx++; > + break; > + case 'E': > + exclude_patterns[exclude_patterns_idx] = > strdup(optarg); > + exclude_patterns_idx++; > + break; > case 'd': > find_dir = 1; > break; > @@ -855,6 +905,7 @@ int main(int argc, char **argv) > break; > dir_name[len - 1] = '\0'; > } > + dir_name_len = strlen(dir_name); > > if (find_dir) { > ret = find_first_dir(root, &key.objectid); > -- > 1.7.7.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html