The branch, master has been updated
       via  0ae9256 Align fileio's map_ptr() reads.  Fixes bug 8177.
       via  42f759a Reformat a few things for wider lines.
      from  e1ded58 Improve handling of existing files for alt-dest opts. Fixes 
bug #5644.

;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 0ae92567ed5381b3f92266562129aa7adc47025d
Author: Wayne Davison <way...@samba.org>
Date:   Fri Jan 18 15:07:03 2013 -0800

    Align fileio's map_ptr() reads.  Fixes bug 8177.

commit 42f759ad9ae0a7a1ea0c2dfcce01180fa17071af
Author: Wayne Davison <way...@samba.org>
Date:   Fri Jan 18 15:18:58 2013 -0800

    Reformat a few things for wider lines.

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

Summary of changes:
 fileio.c |   34 +++++++++++++++++++---------------
 1 files changed, 19 insertions(+), 15 deletions(-)


Changeset truncated at 500 lines:

diff --git a/fileio.c b/fileio.c
index d8ac097..c56b0d9 100644
--- a/fileio.c
+++ b/fileio.c
@@ -26,6 +26,13 @@
 #define ENODATA EAGAIN
 #endif
 
+/* We want all reads to be aligned on 1K boundries. */
+#define ALIGN_BOUNDRY 1024
+/* How far past the boundary is an offset? */
+#define ALIGNED_OVERSHOOT(oft) ((oft) & (ALIGN_BOUNDRY-1))
+/* Round up a length to the next boundary */
+#define ALIGNED_LENGTH(len) ((((len) - 1) | (ALIGN_BOUNDRY-1)) + 1)
+
 extern int sparse_files;
 
 static OFF_T sparse_seek = 0;
@@ -159,8 +166,7 @@ int write_file(int f, char *buf, int len)
  * It gives sliding window access to a file.  mmap() is not used because of
  * the possibility of another program (such as a mailer) truncating the
  * file thus giving us a SIGBUS. */
-struct map_struct *map_file(int fd, OFF_T len, int32 read_size,
-                           int32 blk_size)
+struct map_struct *map_file(int fd, OFF_T len, int32 read_size, int32 blk_size)
 {
        struct map_struct *map;
 
@@ -172,7 +178,7 @@ struct map_struct *map_file(int fd, OFF_T len, int32 
read_size,
 
        map->fd = fd;
        map->file_size = len;
-       map->def_window_size = read_size;
+       map->def_window_size = ALIGNED_LENGTH(read_size);
 
        return map;
 }
@@ -181,9 +187,8 @@ struct map_struct *map_file(int fd, OFF_T len, int32 
read_size,
 /* slide the read window in the file */
 char *map_ptr(struct map_struct *map, OFF_T offset, int32 len)
 {
-       int32 nread;
        OFF_T window_start, read_start;
-       int32 window_size, read_size, read_offset;
+       int32 window_size, read_size, read_offset, align_fudge;
 
        if (len == 0)
                return NULL;
@@ -198,12 +203,13 @@ char *map_ptr(struct map_struct *map, OFF_T offset, int32 
len)
                return map->p + (offset - map->p_offset);
 
        /* nope, we are going to have to do a read. Work out our desired window 
*/
-       window_start = offset;
+       align_fudge = (int32)ALIGNED_OVERSHOOT(offset);
+       window_start = offset - align_fudge;
        window_size = map->def_window_size;
        if (window_start + window_size > map->file_size)
                window_size = (int32)(map->file_size - window_start);
-       if (len > window_size)
-               window_size = len;
+       if (window_size < len + align_fudge)
+               window_size = ALIGNED_LENGTH(len + align_fudge);
 
        /* make sure we have allocated enough memory for the window */
        if (window_size > map->p_size) {
@@ -213,11 +219,9 @@ char *map_ptr(struct map_struct *map, OFF_T offset, int32 
len)
                map->p_size = window_size;
        }
 
-       /* Now try to avoid re-reading any bytes by reusing any bytes
-        * from the previous buffer. */
-       if (window_start >= map->p_offset &&
-           window_start < map->p_offset + map->p_len &&
-           window_start + window_size >= map->p_offset + map->p_len) {
+       /* Now try to avoid re-reading any bytes by reusing any bytes from the 
previous buffer. */
+       if (window_start >= map->p_offset && window_start < map->p_offset + 
map->p_len
+        && window_start + window_size >= map->p_offset + map->p_len) {
                read_start = map->p_offset + map->p_len;
                read_offset = (int32)(read_start - window_start);
                read_size = window_size - read_offset;
@@ -247,7 +251,7 @@ char *map_ptr(struct map_struct *map, OFF_T offset, int32 
len)
        map->p_len = window_size;
 
        while (read_size > 0) {
-               nread = read(map->fd, map->p + read_offset, read_size);
+               int32 nread = read(map->fd, map->p + read_offset, read_size);
                if (nread <= 0) {
                        if (!map->status)
                                map->status = nread ? errno : ENODATA;
@@ -261,7 +265,7 @@ char *map_ptr(struct map_struct *map, OFF_T offset, int32 
len)
                read_size -= nread;
        }
 
-       return map->p;
+       return map->p + align_fudge;
 }
 
 


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

Reply via email to