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