From 2b4a53c0516fcbddbdab9d82bb6519fd04fecbae Mon Sep 17 00:00:00 2001 From: Enrico Scholz Date: Fri, 18 Mar 2005 03:54:12 +0000 Subject: [PATCH] use a sparse-file friendly method for copying files git-svn-id: http://svn.linux-vserver.org/svn/util-vserver/trunk@1925 94cd875c-1c1d-0410-91d2-eb244daf1a30 --- util-vserver/lib_internal/unify-copy.c | 46 +++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/util-vserver/lib_internal/unify-copy.c b/util-vserver/lib_internal/unify-copy.c index 0264723..06c8aef 100644 --- a/util-vserver/lib_internal/unify-copy.c +++ b/util-vserver/lib_internal/unify-copy.c @@ -34,8 +34,7 @@ #define ENSC_WRAPPERS_IO 1 #include - //#define MMAP_BLOCKSIZE 0x10000000 -#define MMAP_BLOCKSIZE 0x4000 +#define MMAP_BLOCKSIZE (16 * 1024*1024) static inline bool verifySource(int fd, struct stat const *exp_stat) @@ -76,16 +75,45 @@ handlerSIGBUS(int UNUSED num) longjmp(bus_error_restore, 1); } +static void +copyMem(void *dst_v, void const *src_v, size_t len_v) +{ +#if 1 + int *dst = dst_v; + int const *src = src_v; + size_t len = len_v / sizeof(int); + size_t rest = len_v - sizeof(int)*len; + size_t i=0; + + for (; i0 && @@ -105,14 +133,14 @@ copyMMap(int in_fd, int out_fd) if (in_buf==0) goto out; out_size = in_size; - out_buf = mmap(0, out_size, PROT_WRITE, MAP_SHARED, out_fd, offset); + out_buf = mmap(0, out_size, PROT_WRITE, MAP_SHARED, out_fd, offset); if (out_buf==0) goto out; offset += in_size; madvise(const_cast(void *)(in_buf), in_size, MADV_SEQUENTIAL); madvise(out_buf, out_size, MADV_SEQUENTIAL); - memcpy(out_buf, in_buf, in_size); + copyMem(out_buf, in_buf, in_size); munmap(const_cast(void *)(in_buf), in_size); in_buf = 0; munmap(out_buf, out_size); out_buf = 0; -- 1.8.1.5