bug-tar
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bug-tar] tar fails to preserve hard links with --remove-files


From: Sergey Poznyakoff
Subject: Re: [Bug-tar] tar fails to preserve hard links with --remove-files
Date: Thu, 30 Jul 2009 23:52:58 +0300

Carl Worth <address@hidden> ha escrit:

> A user of Debian noticed that tar (1.22) does not always preserve hard
> links when creating an archive with the --remove-files option.

Thanks for reporting.

> On Sun, 13 Apr 2003 15:45:27 -0400, Theodore Ts'o <address@hidden> wrote:
> > I'm pretty sure, by the way, that the problem is that tar is keying
> > off of the st_nlink to decide whether or not to do hard link
> > processing as an optimization.

Yes, that's right.

> I've attached two patches to fix this bug. The first implements Ted's
> suggestion, (using the hard links hash table for all files when the
> --remove-files option is in effect, regardless of the value of
> st_nlink).

This one is mostly OK, except that I don't see any reason to test the
remove_files_option value in file_count_links. This will unnecessarily
inflate the link_table and slow down archive creation.

I have installed the attached patch.

Regards,
Sergey

>From 5944f452b0e615a172a9f058877671ff6272abb8 Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <address@hidden>
Date: Thu, 30 Jul 2009 23:48:04 +0300
Subject: [PATCH] Fix hard links recognition with -c --remove-files

* src/create.c (dump_hard_link): Always look up in the link table
if remove_files_option is set. Patch suggested by Theodore Ts'o
<address@hidden>.
(check_links): Remove extra newline from the warning message.
* tests/link02.at, tests/link03.at: New testcases.
* tests/Makefile.am (TESTSUITE_AT): Add link02.at and link03.at
* tests/testsuite.at: Include link02.at and link03.at
---
 src/create.c       |    4 +-
 tests/Makefile.am  |    2 +
 tests/link01.at    |    4 +-
 tests/link02.at    |   52 ++++++++++++++++++++++++++++++++++++++++++++++++
 tests/link03.at    |   56 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/testsuite.at |    2 +
 6 files changed, 116 insertions(+), 4 deletions(-)
 create mode 100644 tests/link02.at
 create mode 100644 tests/link03.at

diff --git a/src/create.c b/src/create.c
index 245b6c3..1031cc2 100644
--- a/src/create.c
+++ b/src/create.c
@@ -1377,7 +1377,7 @@ static Hash_table *link_table;
 static bool
 dump_hard_link (struct tar_stat_info *st)
 {
-  if (link_table && st->stat.st_nlink > 1)
+  if (link_table && (st->stat.st_nlink > 1 || remove_files_option))
     {
       struct link lp;
       struct link *duplicate;
@@ -1468,7 +1468,7 @@ check_links (void)
     {
       if (lp->nlink)
        {
-         WARN ((0, 0, _("Missing links to %s.\n"), quote (lp->name)));
+         WARN ((0, 0, _("Missing links to %s."), quote (lp->name)));
        }
     }
 }
diff --git a/tests/Makefile.am b/tests/Makefile.am
index da6cf0d..2001834 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -77,6 +77,8 @@ TESTSUITE_AT = \
  indexfile.at\
  ignfail.at\
  link01.at\
+ link02.at\
+ link03.at\
  listed01.at\
  listed02.at\
  long01.at\
diff --git a/tests/link01.at b/tests/link01.at
index 2bec558..5faf42e 100644
--- a/tests/link01.at
+++ b/tests/link01.at
@@ -1,7 +1,7 @@
 # Process this file with autom4te to create testsuite. -*- Autotest -*-
 
 # Test suite for GNU tar.
-# Copyright (C) 2004, 2007 Free Software Foundation, Inc.
+# Copyright (C) 2004, 2007, 2009 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -31,7 +31,7 @@
 # http://lists.gnu.org/archive/html/bug-tar/2004-07/msg00009.html
 
 AT_SETUP([link count gt 2])
-AT_KEYWORDS([link01])
+AT_KEYWORDS([hardlinks link01])
 
 AT_TAR_CHECK([
 mkdir directory
diff --git a/tests/link02.at b/tests/link02.at
new file mode 100644
index 0000000..756d48f
--- /dev/null
+++ b/tests/link02.at
@@ -0,0 +1,52 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2009 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+
+# 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., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Tar 1.22 failed to recognize last hard link when creating an archive with
+# the --remove-files option.
+#
+# Reported by: "Theodore Y. Ts'o" <address@hidden>,
+#              Carl Worth <address@hidden>
+# References:
+#   <address@hidden>
+#   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=188663
+#   <address@hidden>
+#   http://lists.gnu.org/archive/html/bug-tar/2009-07/msg00015.html
+
+AT_SETUP([preserve hard links with --remove-files])
+AT_KEYWORDS([hardlinks link02])
+
+AT_TAR_CHECK([
+genfile -l 64 -f file1
+link file1 file2
+link file2 file3
+link file3 file4
+tar -c -f archive --remove-files file1 file2 file3 file4
+tar tfv archive | sed -n 's/.*file[[2-4]] link to //p'
+],
+[0],
+[file1
+file1
+file1
+])
+
+AT_CLEANUP
+
+# End of link02.at
+
diff --git a/tests/link03.at b/tests/link03.at
new file mode 100644
index 0000000..af5b97c
--- /dev/null
+++ b/tests/link03.at
@@ -0,0 +1,56 @@
+# Process this file with autom4te to create testsuite. -*- Autotest -*-
+
+# Test suite for GNU tar.
+# Copyright (C) 2009 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+
+# 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., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# Make sure -l option works correctly in conjunction with --remove-files
+# See also link02.at
+
+AT_SETUP([working -l with --remove-files])
+AT_KEYWORDS([hardlinks link03])
+
+m4_define([create_files],[
+genfile -l 64 -f file1
+link file1 file2
+link file2 file3
+link file3 file4
+])
+
+AT_TAR_CHECK([
+create_files
+echo archive.1
+tar -c -f archive.1 -l --remove-files file1 file2 file3 file4
+create_files
+echo archive.2
+tar -c -f archive.2 -l --remove-files file1 file2 file3
+echo testing archive.2
+tar tfv archive.2 | sed -n 's/.*file[[2-3]] link to //p'
+],
+[0],
+[archive.1
+archive.2
+testing archive.2
+file1
+file1
+],
+[tar: Missing links to `file1'.
+])
+
+AT_CLEANUP
+
+
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 31ee16b..634133b 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -159,6 +159,8 @@ m4_include([chtype.at])
 m4_include([ignfail.at])
 
 m4_include([link01.at])
+m4_include([link02.at])
+m4_include([link03.at])
 
 m4_include([longv7.at])
 m4_include([long01.at])
-- 
1.6.0


reply via email to

[Prev in Thread] Current Thread [Next in Thread]