]> source.dussan.org Git - rspamd.git/commitdiff
Detect and use fallocate/posix_fallocate.
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Wed, 14 Dec 2011 16:34:50 +0000 (19:34 +0300)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Wed, 14 Dec 2011 16:34:50 +0000 (19:34 +0300)
CMakeLists.txt
config.h.in
src/kvstorage_file.c
src/statfile.c
src/util.c
src/util.h

index 6bf8884a80c30915515f2deb982d366af50e6c66..3e6c4fd7987fd0fc55e91d2046b27084ad7e963b 100644 (file)
@@ -656,6 +656,7 @@ CHECK_INCLUDE_FILES(grp.h HAVE_GRP_H)
 CHECK_INCLUDE_FILES(glob.h HAVE_GLOB_H)
 CHECK_INCLUDE_FILES(poll.h HAVE_POLL_H)
 CHECK_INCLUDE_FILES(sys/sendfile.h HAVE_SYS_SENDFILE_H)
+CHECK_INCLUDE_FILES(linux/falloc.h HAVE_LINUX_FALLOC_H)
 
 # Some dependencies
 IF(HAVE_SYS_WAIT_H)
@@ -690,6 +691,8 @@ CHECK_SYMBOL_EXISTS(MAP_ANON sys/mman.h HAVE_MMAP_ANON)
 CHECK_SYMBOL_EXISTS(MAP_NOCORE sys/mman.h HAVE_MMAP_NOCORE)
 CHECK_SYMBOL_EXISTS(O_DIRECT fcntl.h HAVE_O_DIRECT)
 CHECK_SYMBOL_EXISTS(posix_fadvise fcntl.h HAVE_FADVISE)
+CHECK_SYMBOL_EXISTS(posix_fallocate fcntl.h HAVE_POSIX_FALLOCATE)
+CHECK_SYMBOL_EXISTS(fallocate fcntl.h HAVE_FALLOCATE)
 CHECK_SYMBOL_EXISTS(fdatasync unistd.h HAVE_FDATASYNC)
 CHECK_SYMBOL_EXISTS(_SC_NPROCESSORS_ONLN unistd.h HAVE_SC_NPROCESSORS_ONLN)
 IF(HAVE_SIGINFO_H)
index 999340f075c534c67ffd1710312fb7265a292c0a..aeefa9b0ab04099ac59e479dfecae39fc0c228f7 100644 (file)
@@ -85,7 +85,7 @@
  #endif /* HAVE_ENDIAN_H */
  
  #if !defined(BYTE_ORDER) || (BYTE_ORDER != BIG_ENDIAN && BYTE_ORDER != LITTLE_ENDIAN)
-         error "Undefined or unknown BYTE_ORDER";
+ # error "Undefined or unknown BYTE_ORDER"
  #endif
  
 
 #cmakedefine HAVE_O_DIRECT       1
 
 #cmakedefine HAVE_FADVISE        1
+
+#cmakedefine HAVE_FALLOCATE      1
+#cmakedefine HAVE_POSIX_FALLOCATE 1
+
 #cmakedefine HAVE_FDATASYNC      1
 #cmakedefine HAVE_COMPATIBLE_QUEUE_H    1
 
 #include <fcntl.h>
 #endif
 
+/* Linux specific falloc.h */
+#ifdef HAVE_LINUX_FALLOC_H
+#include <linux/falloc.h>
+#endif
+
 /* poll */
 #ifdef HAVE_POLL_H
 #include <poll.h>
index 154ccf27905cee7dda44ac54ccc2f169d8fa3f38..73e5a8a881ef9a3402ed57d1d2eb9ffa920280ca 100644 (file)
@@ -142,6 +142,7 @@ file_open_fd (const gchar *path, gsize *len, gint flags)
        if ((flags & O_CREAT) != 0) {
                /* Open file */
                if ((fd = open (path, flags, S_IRUSR|S_IWUSR|S_IRGRP)) != -1) {
+                       rspamd_fallocate (fd, 0, *len);
 #ifdef HAVE_FADVISE
                        posix_fadvise (fd, 0, *len, POSIX_FADV_SEQUENTIAL);
 #endif
index d9d42d98347c348c301a1d26ca4eb76c04a74f73..b5b06419e7e30556bac09aad04d98e886553e58b 100644 (file)
@@ -465,6 +465,8 @@ statfile_pool_create (statfile_pool_t * pool, gchar *filename, size_t size)
                return -1;
        }
 
+       rspamd_fallocate (fd, 0, sizeof (header) + sizeof (section) + sizeof (block) * nblocks);
+
        header.create_time = (guint64) time (NULL);
        if (write (fd, &header, sizeof (header)) == -1) {
                msg_info ("cannot write header to file %s, error %d, %s", filename, errno, strerror (errno));
index dea3976f1b637caaf49bd1001aedaec4e33cc9eb..c5ec0145eec7a939187c8fe553f3d2141ed22681 100644 (file)
@@ -1381,6 +1381,19 @@ rspamd_strtoul (const gchar *s, gsize len, gulong *value)
        return TRUE;
 }
 
+gint
+rspamd_fallocate (gint fd, off_t offset, off_t len)
+{
+#if defined(HAVE_FALLOCATE) && defined(FALLOC_FL_KEEP_SIZE)
+       return fallocate (fd, FALLOC_FL_KEEP_SIZE, offset, len);
+#elif defined(HAVE_POSIX_FALLOCATE)
+       return posix_fallocate (fd, offset, len);
+#else
+       /* Return 0 as nothing can be done on this system */
+       return 0;
+#endif
+}
+
 /*
  * vi:ts=4
  */
index 165b8433486c974239eaa2a9ed8148b439cbda7a..c4fcc80f403d76c57fa1b689d6970eac6d9ea48b 100644 (file)
@@ -241,4 +241,13 @@ gboolean rspamd_strtol (const gchar *s, gsize len, glong *value);
  */
 gboolean rspamd_strtoul (const gchar *s, gsize len, gulong *value);
 
+/**
+ * Try to allocate a file on filesystem (using fallocate or posix_fallocate)
+ * @param fd descriptor
+ * @param offset offset of file
+ * @param len length to allocate
+ * @return -1 in case of failure
+ */
+gint rspamd_fallocate (gint fd, off_t offset, off_t len);
+
 #endif