bug-cpio
[Top][All Lists]
Advanced

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

Re: [Bug-cpio] Consistently use ino_t to support filesystems with inode


From: Tim Kientzle
Subject: Re: [Bug-cpio] Consistently use ino_t to support filesystems with inodes wider than 32 bits.
Date: Mon, 5 Oct 2009 14:11:48 -0700

FYI, this won't work on Windows (in case you care ;-):
Microsoft's ino_t is only 16 bits, even though NTFS
uses a 64-bit index value.  int64_t may be a better choice.

Cheers,

Tim Kientzle

On Thu, Oct 1, 2009 at 11:35 AM, Stephen R. van den Berg <address@hidden> wrote:
---

Add support for filesystems with inode-fields wider than 32-bits (I witnessed
this bug on a large XFS filesystem).
This patch fixes the bug that hardlinked files are *not* included at
all (i.e. both files are listed, but the content is not transmitted with
either of them).

The patch is relative to the bleeding edge version of cpio on the git
repostory.

 src/copyin.c   |    8 ++++----
 src/copyout.c  |    4 ++--
 src/copypass.c |    2 +-
 src/extern.h   |    6 +++---
 src/util.c     |    6 +++---
 5 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/src/copyin.c b/src/copyin.c
index 5b7594b..8ba2bc9 100644
--- a/src/copyin.c
+++ b/src/copyin.c
@@ -258,7 +258,7 @@ create_defered_links (struct cpio_file_stat *file_hdr)
 {
  struct deferment *d;
  struct deferment *d_prev;
-  int  ino;
+  ino_t        ino;
  int  maj;
  int   min;
  int  link_res;
@@ -306,7 +306,7 @@ create_defered_links_to_skipped (struct cpio_file_stat *file_hdr,
 {
  struct deferment *d;
  struct deferment *d_prev;
-  int  ino;
+  ino_t        ino;
  int  maj;
  int   min;
  if (file_hdr->c_filesize == 0)
@@ -1460,8 +1460,8 @@ process_copy_in ()
         struct cpio_file_stat *h;
         h = &file_hdr;
         fprintf (stderr,
-               "magic = 0%o, ino = %d, mode = 0%o, uid = %d, gid = %d\n",
-               h->c_magic, h->c_ino, h->c_mode, h->c_uid, h->c_gid);
+               "magic = 0%o, ino = %ld, mode = 0%o, uid = %d, gid = %d\n",
+               h->c_magic, (long)h->c_ino, h->c_mode, h->c_uid, h->c_gid);
         fprintf (stderr,
               "nlink = %d, mtime = %d, filesize = %d, dev_maj = 0x%x\n",
               h->c_nlink, h->c_mtime, h->c_filesize, h->c_dev_maj);
diff --git a/src/copyout.c b/src/copyout.c
index dd9bac2..b3bb0ad 100644
--- a/src/copyout.c
+++ b/src/copyout.c
@@ -110,7 +110,7 @@ static int
 count_defered_links_to_dev_ino (struct cpio_file_stat *file_hdr)
 {
  struct deferment *d;
-  int  ino;
+  ino_t        ino;
  int  maj;
  int   min;
  int  count;
@@ -167,7 +167,7 @@ writeout_other_defers (struct cpio_file_stat *file_hdr, int out_des)
 {
  struct deferment *d;
  struct deferment *d_prev;
-  int  ino;
+  ino_t        ino;
  int  maj;
  int   min;
  ino = file_hdr->c_ino;
diff --git a/src/copypass.c b/src/copypass.c
index 8941b76..20929a6 100644
--- a/src/copypass.c
+++ b/src/copypass.c
@@ -387,7 +387,7 @@ process_copy_pass ()

 int
 link_to_maj_min_ino (char *file_name, int st_dev_maj, int st_dev_min,
-                    int st_ino)
+                    ino_t st_ino)
 {
  int  link_res;
  char *link_name;
diff --git a/src/extern.h b/src/extern.h
index a832897..6144be1 100644
--- a/src/extern.h
+++ b/src/extern.h
@@ -119,7 +119,7 @@ void process_copy_out (void);
 /* copypass.c */
 void process_copy_pass (void);
 int link_to_maj_min_ino (char *file_name, int st_dev_maj,
-                        int st_dev_min, int st_ino);
+                        int st_dev_min, ino_t st_ino);
 int link_to_name (char *link_name, char *link_target);

 /* dirname.c */
@@ -169,9 +169,9 @@ void warn_if_file_changed (char *file_name, off_t old_file_size,
                           time_t old_file_mtime);
 void create_all_directories (char *name);
 void prepare_append (int out_file_des);
-char *find_inode_file (unsigned long node_num,
+char *find_inode_file (ino_t node_num,
                      unsigned long major_num, unsigned long minor_num);
-void add_inode (unsigned long node_num, char *file_name,
+void add_inode (ino_t node_num, char *file_name,
               unsigned long major_num, unsigned long minor_num);
 int open_archive (char *file);
 void tape_offline (int tape_des);
diff --git a/src/util.c b/src/util.c
index 1eb92ae..16a4320 100644
--- a/src/util.c
+++ b/src/util.c
@@ -686,7 +686,7 @@ prepare_append (int out_file_des)

 struct inode_val
 {
-  unsigned long inode;
+  ino_t inode;
  unsigned long major_num;
  unsigned long minor_num;
  char *file_name;
@@ -713,7 +713,7 @@ inode_val_compare (const void *val1, const void *val2)
 }

 char *
-find_inode_file (unsigned long node_num, unsigned long major_num,
+find_inode_file (ino_t node_num, unsigned long major_num,
                unsigned long minor_num)
 {
  struct inode_val sample;
@@ -732,7 +732,7 @@ find_inode_file (unsigned long node_num, unsigned long major_num,
 /* Associate FILE_NAME with the inode NODE_NUM.  (Insert into hash table.)  */

 void
-add_inode (unsigned long node_num, char *file_name, unsigned long major_num,
+add_inode (ino_t node_num, char *file_name, unsigned long major_num,
          unsigned long minor_num)
 {
  struct inode_val *temp;
--
1.6.2.151.gdc0be

--
Sincerely,
          Stephen R. van den Berg.

"If he learns from his mistakes, pretty soon he'll know everything."




reply via email to

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