The branch, master has been updated
       via  836e0c5 Create and use write_bigbuf() function for extra-large 
buffer sizes.
       via  2cd8708 Use chunked xattr reading in OS X sys_lgetxattr().
      from  eaa4e2d Fix itemize bug with --link-dest, -X, and -n.

;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 836e0c5df418a9fd0744e9101f05245322f8668a
Author: Wayne Davison <way...@samba.org>
Date:   Mon Nov 25 13:12:35 2013 -0800

    Create and use write_bigbuf() function for extra-large buffer sizes.

commit 2cd87086f05d0a6d943e8fa71f7f6b53b5375d56
Author: Wayne Davison <way...@samba.org>
Date:   Mon Nov 25 13:12:09 2013 -0800

    Use chunked xattr reading in OS X sys_lgetxattr().

-----------------------------------------------------------------------

Summary of changes:
 io.c            |   13 +++++++++++++
 lib/sysxattrs.c |   23 ++++++++++++++++++++++-
 xattrs.c        |    4 ++--
 3 files changed, 37 insertions(+), 3 deletions(-)


Changeset truncated at 500 lines:

diff --git a/io.c b/io.c
index c5b1ebc..264824e 100644
--- a/io.c
+++ b/io.c
@@ -2087,6 +2087,19 @@ void write_longint(int f, int64 x)
 #endif
 }
 
+void write_bigbuf(int f, const char *buf, size_t len)
+{
+       size_t half_max = (iobuf.out.size - iobuf.out_empty_len) / 2;
+
+       while (len > half_max + 1024) {
+               write_buf(f, buf, half_max);
+               buf += half_max;
+               len -= half_max;
+       }
+
+       write_buf(f, buf, len);
+}
+
 void write_buf(int f, const char *buf, size_t len)
 {
        size_t pos, siz;
diff --git a/lib/sysxattrs.c b/lib/sysxattrs.c
index d55ee0c..ba1a290 100644
--- a/lib/sysxattrs.c
+++ b/lib/sysxattrs.c
@@ -24,6 +24,10 @@
 
 #ifdef SUPPORT_XATTRS
 
+#ifdef HAVE_OSX_XATTRS
+#define GETXATTR_FETCH_LIMIT (64*1024*1024)
+#endif
+
 #if defined HAVE_LINUX_XATTRS
 
 ssize_t sys_lgetxattr(const char *path, const char *name, void *value, size_t 
size)
@@ -55,7 +59,24 @@ ssize_t sys_llistxattr(const char *path, char *list, size_t 
size)
 
 ssize_t sys_lgetxattr(const char *path, const char *name, void *value, size_t 
size)
 {
-       return getxattr(path, name, value, size, 0, XATTR_NOFOLLOW);
+       ssize_t len = getxattr(path, name, value, size, 0, XATTR_NOFOLLOW);
+
+       /* If we're retrieving data, handle resource forks > 64MB specially */
+       if (value != NULL && len == GETXATTR_FETCH_LIMIT && (size_t)len < size) 
{
+               /* getxattr will only return 64MB of data at a time, need to 
call again with a new offset */
+               u_int32_t offset = len;
+               size_t data_retrieved = len;
+               while (data_retrieved < size) {
+                       len = getxattr(path, name, value + offset, size - 
data_retrieved, offset, XATTR_NOFOLLOW);
+                       if (len <= 0)
+                               break;
+                       data_retrieved += len;
+                       offset += (u_int32_t)len;
+               }
+               len = data_retrieved;
+       }
+
+       return len;
 }
 
 ssize_t sys_fgetxattr(int filedes, const char *name, void *value, size_t size)
diff --git a/xattrs.c b/xattrs.c
index df2ea82..01d30e4 100644
--- a/xattrs.c
+++ b/xattrs.c
@@ -451,7 +451,7 @@ int send_xattr(int f, stat_x *sxp)
                        if (rxa->datum_len > MAX_FULL_DATUM)
                                write_buf(f, rxa->datum + 1, MAX_DIGEST_LEN);
                        else
-                               write_buf(f, rxa->datum, rxa->datum_len);
+                               write_bigbuf(f, rxa->datum, rxa->datum_len);
                }
                ndx = rsync_xal_l.count; /* pre-incremented count */
                rsync_xal_store(sxp->xattr); /* adds item to rsync_xal_l */
@@ -579,7 +579,7 @@ void send_xattr_request(const char *fname, struct 
file_struct *file, int f_out)
                        }
 
                        write_varint(f_out, len); /* length might have changed! 
*/
-                       write_buf(f_out, ptr, len);
+                       write_bigbuf(f_out, ptr, len);
                        free(ptr);
                }
        }


-- 
The rsync repository.
_______________________________________________
rsync-cvs mailing list
rsync-cvs@lists.samba.org
https://lists.samba.org/mailman/listinfo/rsync-cvs

Reply via email to