Index: src/rrd_resize.c
===================================================================
--- src/rrd_resize.c	(revision 1086)
+++ src/rrd_resize.c	(working copy)
@@ -55,7 +55,7 @@ int rrd_resize(
         modify = -modify;
 
 
-    rrd_file = rrd_open(infilename, &rrdold, RRD_READWRITE);
+    rrd_file = rrd_open(infilename, &rrdold, RRD_READWRITE | RRD_COPY);
     if (rrd_file == NULL) {
         rrd_set_error("could not open RRD");
         return (-1);
@@ -111,15 +111,14 @@ int rrd_resize(
     case 1:
         rrdold.stat_head->version[3] = '3';
         break;
-    default:{
+    default:
         rrd_set_error("Do not know how to handle RRD version %s",
                       rrdold.stat_head->version);
+        rrd_close(rrd_file);
         rrd_free(&rrdold);
-        close(rrd_file->fd);
         return (-1);
+        break;
     }
-    }
-
 
 /* XXX: Error checking? */
     rrd_write(rrd_out_file, rrdnew.stat_head, sizeof(stat_head_t) * 1);
@@ -231,8 +230,9 @@ int rrd_resize(
     rrd_write(rrd_out_file, rrdnew.rra_ptr,
               sizeof(rra_ptr_t) * rrdnew.stat_head->rra_cnt);
 
-    close(rrd_out_file->fd);
+    rrd_close(rrd_file);
     rrd_free(&rrdold);
-    close(rrd_file->fd);
+    rrd_close(rrd_out_file);
+    rrd_free(&rrdnew);
     return (0);
 }
Index: src/rrd_open.c
===================================================================
--- src/rrd_open.c	(revision 1086)
+++ src/rrd_open.c	(working copy)
@@ -118,9 +118,8 @@ rrd_file_t *rrd_open(
 #ifdef HAVE_MMAP
         mm_flags = MAP_PRIVATE;
 # ifdef MAP_NORESERVE
-        mm_flags |= MAP_NORESERVE;
+        mm_flags |= MAP_NORESERVE;  /* readonly, so no swap backing needed */
 # endif
-        mm_flags |= MAP_PRIVATE;
 #endif
     } else {
         if (rdwr & RRD_READWRITE) {
@@ -137,19 +136,19 @@ rrd_file_t *rrd_open(
     }
     if (rdwr & RRD_READAHEAD) {
 #ifdef MAP_POPULATE
-        mm_flags |= MAP_POPULATE;
+        mm_flags |= MAP_POPULATE;   /* populate ptes and data */
 #endif
-#if defined MAP_NONBLOCK && !defined USE_DIRECT_IO
-        mm_flags |= MAP_NONBLOCK;   /* just populage ptes */
+#if defined MAP_NONBLOCK
+        mm_flags |= MAP_NONBLOCK;   /* just populate ptes */
 #endif
-    } else {
 #ifdef USE_DIRECT_IO
+    } else {
         flags |= O_DIRECT;
 #endif
-#if 0                   //def O_NONBLOCK
-        flags |= O_NONBLOCK;
-#endif
     }
+#ifdef O_NONBLOCK
+    flags |= O_NONBLOCK;
+#endif
 
     if ((rrd_file->fd = open(file_name, flags, mode)) < 0) {
         rrd_set_error("opening '%s': %s", file_name, rrd_strerror(errno));
@@ -195,11 +194,9 @@ rrd_file_t *rrd_open(
                       rrd_strerror(errno));
         goto out_close;
     }
-    rrd_file->file_start = data;
-#else
 #endif
 #ifdef USE_MADVISE
-    if (rdwr & RRD_COPY) {  /*XXX: currently not used! */
+    if (rdwr & RRD_COPY) {
         /* We will read everything in a moment (copying) */
         madvise(data, rrd_file->file_len, MADV_WILLNEED | MADV_SEQUENTIAL);
         goto out_done;
@@ -287,6 +284,7 @@ rrd_file_t *rrd_open(
 #ifdef USE_MADVISE
   out_done:
 #endif
+    rrd_file->file_start = data;
     rrd_file->header_len = offset;
     rrd_file->pos = offset;
 /* we could close(rrd_file->fd); here, the mapping is still valid anyway */
@@ -357,9 +355,8 @@ ssize_t rrd_read(
     size_t count)
 {
 #ifdef HAVE_MMAP
-    char     *pos = rrd_file->file_start + rrd_file->pos;
-
-    buf = memmove(buf, pos, count);
+    buf = memmove(buf, rrd_file->file_start + rrd_file->pos, count);
+    rrd_file->pos += count; /* mimmic read() semantics */
     rrd_file->pos += count; /* mimmic read() semantics */
     return count;
 #else
@@ -424,8 +421,8 @@ void rrd_free(
     free(rrd->pdp_prep);
     free(rrd->cdp_prep);
     free(rrd->rrd_value);
-//XXX: ? rrd_init(rrd);
 #endif
+//XXX: ? rrd_init(rrd);
 }
 
 /* routine used by external libraries to free memory allocated by
Index: configure.ac
===================================================================
--- configure.ac	(revision 1086)
+++ configure.ac	(working copy)
@@ -299,10 +299,12 @@ AC_ARG_ENABLE([mmap],
 [  --disable-mmap          disable mmap in rrd_update, use seek+write instead],
 [],
 [enable_mmap=yes])
+
+dnl will most likely not work on compressed filesystems, i think.. *shrug*
 AC_ARG_ENABLE([direct-io],
-[  --enable-direct-io      enable O_DIRECT],
-[],
-[enable_direct_io=yes])
+[  --enable-direct-io      enable O_DIRECT if available],
+[enable_direct_io=yes],
+[])
 
  AC_ARG_ENABLE(pthread,[  --disable-pthread       disable multithread support],
 [],[enable_pthread=yes])
@@ -342,6 +344,27 @@ AC_HEADER_STDC
 AC_HEADER_DIRENT
 AC_CHECK_HEADERS(features.h sys/stat.h sys/types.h fcntl.h locale.h fp_class.h malloc.h unistd.h ieeefp.h math.h sys/times.h sys/param.h sys/resource.h signal.h float.h stdio.h stdlib.h errno.h string.h ctype.h)
 
+if test "x$enable_direct_io" = "xyes"; then
+CFLAGS="$CFLAGS -D_GNU_SOURCE"
+AC_CACHE_CHECK([for O_DIRECT flag to open(2)],rrd_cv_HAVE_OPEN_O_DIRECT,[
+AC_TRY_COMPILE([
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif],
+[int fd = open("/dev/null", O_DIRECT);],
+rrd_cv_HAVE_OPEN_O_DIRECT=yes,rrd_cv_HAVE_OPEN_O_DIRECT=no)])
+  if test "x$rrd_cv_HAVE_OPEN_O_DIRECT" = "xyes"; then
+    AC_DEFINE(USE_DIRECT_IO,1,[Whether the open(2) accepts O_DIRECT])
+  else
+    enable_direct_io="no"
+  fi 
+else
+  enable_direct_io="no"
+fi
+
 dnl Checks for typedefs, structures, and compiler characteristics.
 AC_C_CONST
 AC_HEADER_TIME
@@ -403,15 +426,11 @@ if test "x$enable_mmap" = "xyes"; then
   if test "x$ac_cv_func_mmap" != "xyes";
   then
     AC_MSG_ERROR([--enable-mmap requested but mmap() was not detected])
+dnl enable_mmap="no"
   fi
 fi
 
 
-dnl if test "x$enable_direct_io" = "xyes"; then
-dnl check for working O_DIRECT
-dnl fi
-AC_SUBST([USE_DIRECT_IO])
-
 CONFIGURE_PART(IEEE Math Checks)
  
 
@@ -826,7 +845,8 @@ echo
 echo "----------------------------------------------------------------"
 echo "Config is DONE!"
 echo
-echo "          With MMAP IO: $ac_cv_func_mmap_fixed_mapped"
+echo "          With MMAP IO: $enable_mmap"
+echo "          Use O_DIRECT: $enable_direct_io"
 echo "          Perl Modules: $COMP_PERL"
 echo "           Perl Binary: $PERL"
 echo "          Perl Version: $PERL_VERSION"
