+ if (map->map) {
+ if (offset >= map->p_offset &&
+ offset+len <= map->p_offset+map->p_len) {
+ return (map->map + (offset - map->p_offset));
+ }
+ if (munmap(map->map, map->p_len) != 0) {
+ rprintf(FERROR,"munmap failed : %s\n", strerror(errno));
+ exit_cleanup(1);
+ }
+
+ /* align the mmap region on a nice boundary back a bit from
+ where it is asked for to allow for some seeking */
+ if (offset > 2*CHUNK_SIZE) {
+ map->p_offset = offset - 2*CHUNK_SIZE;
+ map->p_offset &= ~((OFF_T)(CHUNK_SIZE-1));
+ } else {
+ map->p_offset = 0;
+ }
+
+ /* map up to MAX_MAP_SIZE */
+ map->p_len = MAX(len, MAX_MAP_SIZE);
+ map->p_len = MIN(map->p_len, map->size - map->p_offset);
+
+ map->map = (char *)do_mmap(NULL,map->p_len,PROT_READ,
+ MAP_SHARED,map->fd,map->p_offset);
+
+ if (map->map == (char *)-1) {
+ map->map = NULL;
+ map->p_len = 0;
+ map->p_offset = 0;
+ } else {
+ return (map->map + (offset - map->p_offset));
+ }
+ }
+