From 54b9e5b88785f7d430b2ae278f5ce83920422e5a Mon Sep 17 00:00:00 2001 From: Toshaan Bharvani Date: Wed, 20 Dec 2023 13:58:41 +0100 Subject: [PATCH] initial package creation Signed-off-by: Toshaan Bharvani --- ...ootdir-due-to-xfsdump-bulkstat-misus.patch | 302 ++++++++++++++++++ ...st-x-rather-than-assert-for-false-ro.patch | 57 ++++ SPECS/xfsdump.spec | 265 +++++++++++++++ 3 files changed, 624 insertions(+) create mode 100644 SOURCES/0001-for-next-xfsrestore-fix-rootdir-due-to-xfsdump-bulkstat-misus.patch create mode 100644 SOURCES/0002-v3.1.13-xfsrestore-suggest-x-rather-than-assert-for-false-ro.patch create mode 100644 SPECS/xfsdump.spec diff --git a/SOURCES/0001-for-next-xfsrestore-fix-rootdir-due-to-xfsdump-bulkstat-misus.patch b/SOURCES/0001-for-next-xfsrestore-fix-rootdir-due-to-xfsdump-bulkstat-misus.patch new file mode 100644 index 0000000..8fc2f0d --- /dev/null +++ b/SOURCES/0001-for-next-xfsrestore-fix-rootdir-due-to-xfsdump-bulkstat-misus.patch @@ -0,0 +1,302 @@ +From d7cba7410710cd3ec2c2d9fafd4d93437097f473 Mon Sep 17 00:00:00 2001 +From: Gao Xiang +Date: Wed, 28 Sep 2022 15:10:52 -0400 +Subject: [PATCH] xfsrestore: fix rootdir due to xfsdump bulkstat misuse + +If rootino is wrong and misspecified to a subdir inode #, +the following assertion could be triggered: + assert(ino != persp->p_rootino || hardh == persp->p_rooth); + +This patch adds a '-x' option (another awkward thing is that +the codebase doesn't support long options) to address +problamatic images by searching for the real dir, the reason +that I don't enable it by default is that I'm not very confident +with the xfsrestore codebase and xfsdump bulkstat issue will +also be fixed immediately as well, so this function might be +optional and only useful for pre-exist corrupted dumps. + +In details, my understanding of the original logic is + 1) xfsrestore will create a rootdir node_t (p_rooth); + 2) it will build the tree hierarchy from inomap and adopt + the parent if needed (so inodes whose parent ino hasn't + detected will be in the orphan dir, p_orphh); + 3) during this period, if ino == rootino and + hardh != persp->p_rooth (IOWs, another node_t with + the same ino # is created), that'd be definitely wrong. + +So the proposal fix is that + - considering the xfsdump root ino # is a subdir inode, it'll + trigger ino == rootino && hardh != persp->p_rooth condition; + - so we log this node_t as persp->p_rooth rather than the + initial rootdir node_t created in 1); + - we also know that this node is actually a subdir, and after + the whole inomap is scanned (IOWs, the tree is built), + the real root dir will have the orphan dir parent p_orphh; + - therefore, we walk up by the parent until some node_t has + the p_orphh, so that's it. + +Cc: Donald Douwsma +Signed-off-by: Gao Xiang +Signed-off-by: Hironori Shiina +Reviwed-by: Eric Sandeen +Signed-off-by: Carlos Maiolino +Signed-off-by: Pavel Reichl +--- + common/main.c | 1 + + man/man8/xfsrestore.8 | 14 +++++++++ + restore/content.c | 7 +++++ + restore/getopt.h | 4 +-- + restore/tree.c | 72 ++++++++++++++++++++++++++++++++++++++++--- + restore/tree.h | 2 ++ + 6 files changed, 94 insertions(+), 6 deletions(-) + +diff --git a/common/main.c b/common/main.c +index 1db07d4..6141ffb 100644 +--- a/common/main.c ++++ b/common/main.c +@@ -988,6 +988,7 @@ usage(void) + ULO(_("(contents only)"), GETOPT_TOC); + ULO(_(""), GETOPT_VERBOSITY); + ULO(_("(use small tree window)"), GETOPT_SMALLWINDOW); ++ ULO(_("(try to fix rootdir due to xfsdump issue)"),GETOPT_FIXROOTDIR); + ULO(_("(don't restore extended file attributes)"), GETOPT_NOEXTATTR); + ULO(_("(restore root dir owner/permissions)"), GETOPT_ROOTPERM); + ULO(_("(restore DMAPI event settings)"), GETOPT_SETDM); +diff --git a/man/man8/xfsrestore.8 b/man/man8/xfsrestore.8 +index 60e4309..df7dde0 100644 +--- a/man/man8/xfsrestore.8 ++++ b/man/man8/xfsrestore.8 +@@ -240,6 +240,20 @@ but does not create or modify any files or directories. + It may be desirable to set the verbosity level to \f3silent\f1 + when using this option. + .TP 5 ++.B \-x ++This option may be useful to fix an issue which the files are restored ++to orphanage directory because of xfsdump (v3.1.7 - v3.1.9) problem. ++A normal dump cannot be restored with this option. This option works ++only for a corrupted dump. ++If a dump is created by problematic xfsdump (v3.1.7 - v3.1.9), you ++should see the contents of the dump with \f3\-t\f1 option before ++restoring. Then, if a file is placed to the orphanage directory, you need to ++use this \f3\-x\f1 option to restore the dump. Otherwise, you can restore ++the dump without this option. ++ ++In the cumulative mode, this option is required only for a base (level 0) ++dump. You no longer need this option for level 1+ dumps. ++.TP 5 + \f3\-v\f1 \f2verbosity\f1 + .\" set inter-paragraph distance to 0 + .PD 0 +diff --git a/restore/content.c b/restore/content.c +index 8bb5fa4..488ae20 100644 +--- a/restore/content.c ++++ b/restore/content.c +@@ -861,6 +861,7 @@ static int quotafilecheck(char *type, char *dstdir, char *quotafile); + + bool_t content_media_change_needed; + bool_t restore_rootdir_permissions; ++bool_t need_fixrootdir; + char *media_change_alert_program = NULL; + size_t perssz; + +@@ -958,6 +959,7 @@ content_init(int argc, char *argv[], size64_t vmsz) + stsz = 0; + interpr = BOOL_FALSE; + restore_rootdir_permissions = BOOL_FALSE; ++ need_fixrootdir = BOOL_FALSE; + optind = 1; + opterr = 0; + while ((c = getopt(argc, argv, GETOPT_CMDSTRING)) != EOF) { +@@ -1186,6 +1188,9 @@ content_init(int argc, char *argv[], size64_t vmsz) + case GETOPT_FMT2COMPAT: + tranp->t_truncategenpr = BOOL_TRUE; + break; ++ case GETOPT_FIXROOTDIR: ++ need_fixrootdir = BOOL_TRUE; ++ break; + } + } + +@@ -3129,6 +3134,8 @@ applydirdump(drive_t *drivep, + return rv; + } + ++ if (need_fixrootdir) ++ tree_fixroot(); + persp->s.dirdonepr = BOOL_TRUE; + } + +diff --git a/restore/getopt.h b/restore/getopt.h +index b5bc004..b0c0c7d 100644 +--- a/restore/getopt.h ++++ b/restore/getopt.h +@@ -26,7 +26,7 @@ + * purpose is to contain that command string. + */ + +-#define GETOPT_CMDSTRING "a:b:c:def:himn:op:qrs:tv:wABCDEFG:H:I:JKL:M:NO:PQRS:TUVWX:Y:" ++#define GETOPT_CMDSTRING "a:b:c:def:himn:op:qrs:tv:wxABCDEFG:H:I:JKL:M:NO:PQRS:TUVWX:Y:" + + #define GETOPT_WORKSPACE 'a' /* workspace dir (content.c) */ + #define GETOPT_BLOCKSIZE 'b' /* blocksize for rmt */ +@@ -51,7 +51,7 @@ + /* 'u' */ + #define GETOPT_VERBOSITY 'v' /* verbosity level (0 to 4) */ + #define GETOPT_SMALLWINDOW 'w' /* use a small window for dir entries */ +-/* 'x' */ ++#define GETOPT_FIXROOTDIR 'x' /* try to fix rootdir due to bulkstat misuse */ + /* 'y' */ + /* 'z' */ + #define GETOPT_NOEXTATTR 'A' /* do not restore ext. file attr. */ +diff --git a/restore/tree.c b/restore/tree.c +index 5429b74..bfa07fe 100644 +--- a/restore/tree.c ++++ b/restore/tree.c +@@ -15,7 +15,6 @@ + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +- + #include + #include + #include +@@ -262,6 +261,7 @@ extern void usage(void); + extern size_t pgsz; + extern size_t pgmask; + extern bool_t restore_rootdir_permissions; ++extern bool_t need_fixrootdir; + + /* forward declarations of locally defined static functions ******************/ + +@@ -328,10 +328,47 @@ static tran_t *tranp = 0; + static char *persname = PERS_NAME; + static char *orphname = ORPH_NAME; + static xfs_ino_t orphino = ORPH_INO; ++static nh_t orig_rooth = NH_NULL; + + + /* definition of locally defined global functions ****************************/ + ++void ++tree_fixroot(void) ++{ ++ nh_t rooth = persp->p_rooth; ++ xfs_ino_t rootino; ++ ++ while (1) { ++ nh_t parh; ++ node_t *rootp = Node_map(rooth); ++ ++ rootino = rootp->n_ino; ++ parh = rootp->n_parh; ++ Node_unmap(rooth, &rootp); ++ ++ if (parh == rooth || ++ /* ++ * since all new node (including non-parent) ++ * would be adopted into orphh ++ */ ++ parh == persp->p_orphh || ++ parh == NH_NULL) ++ break; ++ rooth = parh; ++ } ++ ++ if (rooth != persp->p_rooth) { ++ persp->p_rooth = rooth; ++ persp->p_rootino = rootino; ++ disown(rooth); ++ adopt(persp->p_rooth, persp->p_orphh, NH_NULL); ++ ++ mlog(MLOG_NORMAL, _("fix root # to %llu (bind mount?)\n"), ++ rootino); ++ } ++} ++ + /* ARGSUSED */ + bool_t + tree_init(char *hkdir, +@@ -746,7 +783,8 @@ tree_begindir(filehdr_t *fhdrp, dah_t *dahp) + /* lookup head of hardlink list + */ + hardh = link_hardh(ino, gen); +- assert(ino != persp->p_rootino || hardh == persp->p_rooth); ++ if (need_fixrootdir == BOOL_FALSE) ++ assert(ino != persp->p_rootino || hardh == persp->p_rooth); + + /* already present + */ +@@ -815,7 +853,6 @@ tree_begindir(filehdr_t *fhdrp, dah_t *dahp) + adopt(persp->p_orphh, hardh, NRH_NULL); + *dahp = dah; + } +- + return hardh; + } + +@@ -960,6 +997,7 @@ tree_addent(nh_t parh, xfs_ino_t ino, gen_t gen, char *name, size_t namelen) + } + } else { + assert(hardp->n_nrh != NRH_NULL); ++ + namebuflen + = + namreg_get(hardp->n_nrh, +@@ -1110,6 +1148,13 @@ tree_addent(nh_t parh, xfs_ino_t ino, gen_t gen, char *name, size_t namelen) + ino, + gen); + } ++ /* found the fake rootino from subdir, need fix p_rooth. */ ++ if (need_fixrootdir == BOOL_TRUE && ++ persp->p_rootino == ino && hardh != persp->p_rooth) { ++ mlog(MLOG_NORMAL, ++ _("found fake rootino #%llu, will fix.\n"), ino); ++ persp->p_rooth = hardh; ++ } + return RV_OK; + } + +@@ -3808,7 +3853,26 @@ selsubtree_recurse_down(nh_t nh, bool_t sensepr) + static nh_t + link_hardh(xfs_ino_t ino, gen_t gen) + { +- return hash_find(ino, gen); ++ nh_t tmp = hash_find(ino, gen); ++ ++ /* ++ * XXX (another workaround): the simply way is that don't reuse node_t ++ * with gen = 0 created in tree_init(). Otherwise, it could cause ++ * xfsrestore: tree.c:1003: tree_addent: Assertion ++ * `hardp->n_nrh != NRH_NULL' failed. ++ * and that node_t is a dir node but the fake rootino could be a non-dir ++ * plus reusing it could cause potential loop in tree hierarchy. ++ */ ++ if (need_fixrootdir == BOOL_TRUE && ++ ino == persp->p_rootino && gen == 0 && ++ orig_rooth == NH_NULL) { ++ mlog(MLOG_NORMAL, ++_("link out fake rootino %llu with gen=0 created in tree_init()\n"), ino); ++ link_out(tmp); ++ orig_rooth = tmp; ++ return NH_NULL; ++ } ++ return tmp; + } + + /* returns following node in hard link list +diff --git a/restore/tree.h b/restore/tree.h +index bf66e3d..f5bd4ff 100644 +--- a/restore/tree.h ++++ b/restore/tree.h +@@ -18,6 +18,8 @@ + #ifndef TREE_H + #define TREE_H + ++void tree_fixroot(void); ++ + /* tree_init - creates a new tree abstraction. + */ + extern bool_t tree_init(char *hkdir, +-- +2.41.0 + diff --git a/SOURCES/0002-v3.1.13-xfsrestore-suggest-x-rather-than-assert-for-false-ro.patch b/SOURCES/0002-v3.1.13-xfsrestore-suggest-x-rather-than-assert-for-false-ro.patch new file mode 100644 index 0000000..6551b08 --- /dev/null +++ b/SOURCES/0002-v3.1.13-xfsrestore-suggest-x-rather-than-assert-for-false-ro.patch @@ -0,0 +1,57 @@ +From 8e97f9c2b3c362fa6dd872d72594713c713479bc Mon Sep 17 00:00:00 2001 +From: Donald Douwsma +Date: Thu, 24 Aug 2023 12:07:04 +1000 +Subject: [PATCH] xfsrestore: suggest -x rather than assert for false roots + +If we're going to have a fix for false root problems its a good idea to +let people know that there's a way to recover, error out with a useful +message that mentions the `-x` option rather than just assert. + +Before + + xfsrestore: searching media for directory dump + xfsrestore: reading directories + xfsrestore: tree.c:757: tree_begindir: Assertion `ino != persp->p_rootino || hardh == persp->p_rooth' failed. + Aborted + +After + + xfsrestore: ERROR: tree.c:791: tree_begindir: Assertion `ino != persp->p_rootino || hardh == persp->p_rooth` failed. + xfsrestore: ERROR: False root detected. Recovery may be possible using the `-x` option + Aborted + +Fixes: d7cba7410710 ("xfsrestore: fix rootdir due to xfsdump bulkstat misuse") +Signed-off-by: Donald Douwsma +Reviewed-by: Darrick J. Wong +Reviewed-by: Carlos Maiolino +Signed-off-by: Carlos Maiolino +Signed-off-by: Pavel Reichl +--- + restore/tree.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/restore/tree.c b/restore/tree.c +index bfa07fe..6f3180f 100644 +--- a/restore/tree.c ++++ b/restore/tree.c +@@ -783,8 +783,15 @@ tree_begindir(filehdr_t *fhdrp, dah_t *dahp) + /* lookup head of hardlink list + */ + hardh = link_hardh(ino, gen); +- if (need_fixrootdir == BOOL_FALSE) +- assert(ino != persp->p_rootino || hardh == persp->p_rooth); ++ if (need_fixrootdir == BOOL_FALSE && ++ !(ino != persp->p_rootino || hardh == persp->p_rooth)) { ++ mlog(MLOG_ERROR | MLOG_TREE, ++"%s:%d: %s: Assertion `ino != persp->p_rootino || hardh == persp->p_rooth` failed.\n", ++ __FILE__, __LINE__, __func__); ++ mlog(MLOG_ERROR | MLOG_TREE, _( ++"False root detected. Recovery may be possible using the `-x` option\n")); ++ return NH_NULL; ++ } + + /* already present + */ +-- +2.41.0 + diff --git a/SPECS/xfsdump.spec b/SPECS/xfsdump.spec new file mode 100644 index 0000000..b77902b --- /dev/null +++ b/SPECS/xfsdump.spec @@ -0,0 +1,265 @@ +Summary: Backup and restore utilities for the XFS filesystem +Name: xfsdump +Version: 3.1.12 +Release: 4%{?dist} +# Licensing based on generic "GNU GENERAL PUBLIC LICENSE" +# in source, with no mention of version. +License: GPL+ +Source0: http://kernel.org/pub/linux/utils/fs/xfs/%{name}/%{name}-%{version}.tar.xz +Source1: http://kernel.org/pub/linux/utils/fs/xfs/%{name}/%{name}-%{version}.tar.sign +Source2: https://git.kernel.org/pub/scm/docs/kernel/pgpkeys.git/plain/keys/13F703E6C11CF6F0.asc +BuildRequires: make +BuildRequires: gcc +BuildRequires: libtool, gettext, gawk +BuildRequires: xfsprogs-devel, libuuid-devel, libattr-devel ncurses-devel +BuildRequires: gnupg2, xz +Requires: xfsprogs >= 2.6.30, attr >= 2.0.0 + +Patch0: 0001-for-next-xfsrestore-fix-rootdir-due-to-xfsdump-bulkstat-misus.patch +Patch1: 0002-v3.1.13-xfsrestore-suggest-x-rather-than-assert-for-false-ro.patch + +%description +The xfsdump package contains xfsdump, xfsrestore and a number of +other utilities for administering XFS filesystems. + +xfsdump examines files in a filesystem, determines which need to be +backed up, and copies those files to a specified disk, tape or other +storage medium. It uses XFS-specific directives for optimizing the +dump of an XFS filesystem, and also knows how to backup XFS extended +attributes. Backups created with xfsdump are "endian safe" and can +thus be transfered between Linux machines of different architectures +and also between IRIX machines. + +xfsrestore performs the inverse function of xfsdump; it can restore a +full backup of a filesystem. Subsequent incremental backups can then +be layered on top of the full backup. Single files and directory +subtrees may be restored from full or partial backups. + +%prep +xzcat '%{SOURCE0}' | %{gpgverify} --keyring='%{SOURCE2}' --signature='%{SOURCE1}' --data=- +%autosetup -p1 + +%build +%configure + +make V=1 %{?_smp_mflags} + +%install +rm -rf $RPM_BUILD_ROOT +make DIST_ROOT=$RPM_BUILD_ROOT install +# remove non-versioned docs location +rm -rf $RPM_BUILD_ROOT/%{_datadir}/doc/xfsdump/ + +# Bit of a hack to move files from /sbin to /usr/sbin +(cd $RPM_BUILD_ROOT/%{_sbindir}; mv ../../sbin/xfsdump .) +(cd $RPM_BUILD_ROOT/%{_sbindir}; mv ../../sbin/xfsrestore .) + +# Create inventory dir (otherwise created @ runtime) +mkdir -p $RPM_BUILD_ROOT/%{_sharedstatedir}/xfsdump/inventory + +%find_lang %{name} + +%files -f %{name}.lang +%doc README doc/COPYING doc/CHANGES doc/README.xfsdump doc/xfsdump_ts.txt +%{_mandir}/man8/* +%{_sbindir}/* +%{_sharedstatedir}/xfsdump/inventory + +%changelog +* Fri Oct 26 2023 Pavel Reichl - 3.1.12-4 +- xfsdump/xfsrestore: suggest recovery for false roots may be possible using -x +- Related: RHEL-14038 + +* Mon Jun 26 2023 Pavel Reichl - 3.1.12-3 +- xfsdump: restoring inventory prevents non-directory files being restored from tape, +- actually fixed by rebase to 3.1.12 +- related: bz#2166557 +- xfsrestore: Files from the backup go to orphanage dir because of xfsdump issue +- related: bz#2034327 + +* Tue Apr 18 2023 Pavel Reichl - 3.1.12-2 +- rebuilt, Fix wrongly associated bugzilla + Related: rhbz#2181660 + +* Mon Apr 17 2023 Pavel Reichl - 3.1.12-1 +- New upstream release +- Use Cem's pgp key instead of Eric's + Related: rhbz#2181660 + +* Fri Feb 11 2022 Eric Sandeen 3.1.10-1 +- New upstream release +- Resolve issue with bind mounts / root inode mismatch (#2034324) + +* Tue Aug 10 2021 Mohan Boddu - 3.1.9-6 +- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags + Related: rhbz#1991688 + +* Fri Apr 16 2021 Mohan Boddu - 3.1.9-5 +- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937 + +* Thu Jan 28 2021 Fedora Release Engineering - 3.1.9-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Sat Aug 01 2020 Fedora Release Engineering - 3.1.9-3 +- Second attempt - Rebuilt for + https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Wed Jul 29 2020 Fedora Release Engineering - 3.1.9-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Fri Jan 31 2020 Eric Sandeen 3.1.9-1 +- New upstream release + +* Fri Jan 31 2020 Fedora Release Engineering - 3.1.8-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Sat Jul 27 2019 Fedora Release Engineering - 3.1.8-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Sun Feb 03 2019 Fedora Release Engineering - 3.1.8-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Sat Jul 14 2018 Fedora Release Engineering - 3.1.8-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Mon Feb 26 2018 Eric Sandeen 3.1.8-3 +- BuildRequires: gcc + +* Fri Feb 09 2018 Fedora Release Engineering - 3.1.8-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Thu Sep 21 2017 Eric Sandeen 3.1.8-1 +- New upstream release + +* Thu Aug 03 2017 Fedora Release Engineering - 3.1.6-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Thu Jul 27 2017 Fedora Release Engineering - 3.1.6-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Thu Jun 08 2017 Eric Sandeen 3.1.6-4 +- Build with largefile support on 32-bit platforms + +* Sat Feb 11 2017 Fedora Release Engineering - 3.1.6-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Fri Feb 05 2016 Fedora Release Engineering - 3.1.6-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Tue Nov 10 2015 Eric Sandeen 3.1.6-1 +- New upstream release + +* Fri Jun 19 2015 Fedora Release Engineering - 3.1.4-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Mon Aug 18 2014 Fedora Release Engineering - 3.1.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Thu Jul 17 2014 Eric Sandeen 3.1.4-1 +- New upstream release + +* Mon Jun 16 2014 Eric Sandeen 3.1.3-5 +- Fix aarch64 build (#926800) + +* Sun Jun 08 2014 Fedora Release Engineering - 3.1.3-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Mon Jan 20 2014 Eric Sandeen 3.1.3-3 +- Add /var/lib/xfsdump/inventory to file list (was created runtime) + +* Sun Aug 04 2013 Fedora Release Engineering - 3.1.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Wed May 08 2013 Eric Sandeen 3.1.3-1 +- New upstream release + +* Fri Feb 15 2013 Fedora Release Engineering - 3.1.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Thu Dec 13 2012 Eric Sandeen 3.1.2-1 +- New upstream release, with non-broken tarball + +* Thu Dec 13 2012 Eric Sandeen 3.1.1-1 +- New upstream release + +* Sun Jul 22 2012 Fedora Release Engineering - 3.1.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Wed Mar 28 2012 Eric Sandeen 3.1.0-2 +- Move files out of /sbin to /usr/sbin + +* Fri Mar 23 2012 Eric Sandeen 3.1.0-1 +- New upstream release + +* Sat Jan 14 2012 Fedora Release Engineering - 3.0.6-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Mon Oct 17 2011 Eric Sandeen 3.0.6-1 +- New upstream release + +* Thu Mar 31 2011 Eric Sandeen 3.0.5-1 +- New upstream release + +* Mon Feb 07 2011 Fedora Release Engineering - 3.0.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Wed Jan 13 2010 Eric Sandeen 3.0.4-1 +- New upstream release + +* Mon Nov 30 2009 Dennis Gregorovic - 3.0.1-3.1 +- Rebuilt for RHEL 6 + +* Mon Jul 27 2009 Fedora Release Engineering - 3.0.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Tue Jun 30 2009 Eric Sandeen 3.0.1-2 +- Fix up build-requires after e2fsprogs splitup + +* Tue May 05 2009 Eric Sandeen 3.0.1-1 +- New upstream release + +* Thu Feb 26 2009 Fedora Release Engineering - 3.0.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Wed Feb 04 2009 Eric Sandeen 3.0.0-1 +- New upstream release + +* Wed Nov 12 2008 Eric Sandeen 2.2.48-2 +- Enable parallel builds + +* Sun Feb 10 2008 Eric Sandeen - 2.2.48-1 +- Update to xfsdump version 2.2.48 +- First build with gcc-4.3 + +* Mon Sep 10 2007 Eric Sandeen - 2.2.46-1 +- Update to xfsdump version 2.2.46 +- Dropped O_CREAT patch, now upstream + +* Fri Aug 24 2007 Eric Sandeen - 2.2.45-3 +- Update license tag +- Fix up O_CREAT opens with no mode +- Add gawk to buildrequires + +* Tue Jun 19 2007 Eric Sandeen - 2.2.45-2 +- Remove readline-devel & libtermcap-devel BuildRequires + +* Thu May 31 2007 Eric Sandeen - 2.2.45-1 +- Update to xfsdump 2.2.45 + +* Thu Aug 31 2006 Russell Cattelan - 2.2.42-2 +- Remove Distribution: tag + +* Wed Aug 23 2006 Russell Cattelan - 2.2.42-1 +- update to version 2.2.42 + +* Tue Aug 22 2006 Russell Cattelan - 2.2.38-3 +- Fix the /usr/sbin sym links to relative links +- Add the Distribution tag +- Add ncurses-devel to buildrequires + +* Wed Aug 16 2006 Russell Cattelan - 2.2.38-2 +- install removes the makefile installed version of the docs + package the docs based in the version specfic directory + +* Wed Aug 9 2006 Russell Cattelan - 2.2.38-1 +- Add xfsdump to Fedora