bug-tar
[Top][All Lists]
Advanced

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

Re: [Bug-tar] incremental of nfs directory do full every times.


From: Sergey Poznyakoff
Subject: Re: [Bug-tar] incremental of nfs directory do full every times.
Date: Thu, 27 Mar 2008 10:55:38 +0200

Hi Jean-Louis,

My apologies for being slow with replying.

> Attached patch fix a bug because DIR_IS_NFS return 2 if it is NFS.

Thank you, I have applied it.
 
> Instead of trying to detect if the device should be used, why not add
> an argument:
>   --no-check-device

That's a nice idea. I have implemented it in CVS (see the attached
patch). A complementary option --check-device is provided as well,
in case someone needs to override --no-check-device set in the
TAR_OPTIONS variable.

Thanks for your contributions.

Regards,
Sergey

        * src/common.h (check_device_option): New global.
        * src/incremen.c (procdir): Use boolean and instead of bitwise
        one. Patch by Jean-Louis Martineau.
        Compare device numbers only if check_device_option is set.
        * src/tar.c: New command line options --no-check-device and
        --check-device. Proposed by Jean-Louis Martineau.
        (parse_opt): Hanlde new options.
        (decode_options): Initialize check_device_option to true.

Index: src/common.h
===================================================================
RCS file: /cvsroot/tar/tar/src/common.h,v
retrieving revision 1.102
diff -p -u -r1.102 common.h
--- src/common.h        29 Oct 2007 16:55:58 -0000      1.102
+++ src/common.h        27 Mar 2008 08:44:19 -0000
@@ -188,6 +188,8 @@ GLOBAL enum old_files old_files_option;
 
 /* Specified file name for incremental list.  */
 GLOBAL const char *listed_incremental_option;
+/* Check device numbers when doing incremental dumps. */
+GLOBAL bool check_device_option;
 
 /* Specified mode change string.  */
 GLOBAL struct mode_change *mode_option;
Index: src/incremen.c
===================================================================
RCS file: /cvsroot/tar/tar/src/incremen.c,v
retrieving revision 1.61
diff -p -u -r1.61 incremen.c
--- src/incremen.c      13 Nov 2007 07:01:26 -0000      1.61
+++ src/incremen.c      27 Mar 2008 08:44:19 -0000
@@ -250,7 +250,8 @@ procdir (char *name_buffer, struct stat 
         directories, consider all NFS devices as equal,
         relying on the i-node to establish differences.  */
 
-      if (! (((DIR_IS_NFS (directory) & nfs)
+      if (! ((!check_device_option
+             || (DIR_IS_NFS (directory) && nfs)
              || directory->device_number == stat_data->st_dev)
             && directory->inode_number == stat_data->st_ino))
        {
Index: src/tar.c
===================================================================
RCS file: /cvsroot/tar/tar/src/tar.c,v
retrieving revision 1.173
diff -p -u -r1.173 tar.c
--- src/tar.c   29 Oct 2007 16:56:56 -0000      1.173
+++ src/tar.c   27 Mar 2008 08:44:19 -0000
@@ -249,6 +249,7 @@ enum
   ANCHORED_OPTION = CHAR_MAX + 1,
   ATIME_PRESERVE_OPTION,
   BACKUP_OPTION,
+  CHECK_DEVICE_OPTION,
   CHECKPOINT_OPTION,
   CHECKPOINT_ACTION_OPTION,
   DELAY_DIRECTORY_RESTORE_OPTION,
@@ -275,6 +276,7 @@ enum
   MTIME_OPTION,
   NEWER_MTIME_OPTION,
   NO_ANCHORED_OPTION,
+  NO_CHECK_DEVICE_OPTION,
   NO_DELAY_DIRECTORY_RESTORE_OPTION,
   NO_IGNORE_CASE_OPTION,
   NO_IGNORE_COMMAND_ERROR_OPTION,
@@ -411,6 +413,12 @@ static struct argp_option options[] = {
       " NUMBER defaults to 1"), GRID+1 },
   {"seek", 'n', NULL, 0,
    N_("archive is seekable"), GRID+1 },
+  {"no-check-device", NO_CHECK_DEVICE_OPTION, NULL, 0,
+   N_("do not check device numbers when creating incremental archives"),
+   GRID+1 },
+  {"check-device", CHECK_DEVICE_OPTION, NULL, 0,
+   N_("check device numbers when creating incremental archives (default)"),
+   GRID+1 },
 #undef GRID
 
 #define GRID 30
@@ -1545,6 +1553,14 @@ parse_opt (int key, char *arg, struct ar
                        " on this platform")));
       break;
 
+    case CHECK_DEVICE_OPTION:
+      check_device_option = true;
+      break;
+      
+    case NO_CHECK_DEVICE_OPTION:
+      check_device_option = false;
+      break;
+      
     case CHECKPOINT_OPTION:
       if (arg)
        {
@@ -2053,6 +2069,8 @@ decode_options (int argc, char **argv)
   owner_option = -1;
   group_option = -1;
 
+  check_device_option = true;
+  
   /* Convert old-style tar call by exploding option element and rearranging
      options accordingly.  */
 

reply via email to

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