mkfs.f2fs: reclaim free space in case of regular file
authorChangman Lee <cm224.lee@samsung.com>
Tue, 4 Nov 2014 09:10:54 +0000 (18:10 +0900)
committerJaegeuk Kim <jaegeuk@kernel.org>
Sat, 8 Nov 2014 02:17:43 +0000 (18:17 -0800)
If we use regular file instead block device, let's reclaim its free
space.

Signed-off-by: Changman Lee <cm224.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
configure.ac
mkfs/f2fs_format_utils.c

index 0111e72..d66cb73 100644 (file)
@@ -57,7 +57,7 @@ PKG_CHECK_MODULES([libuuid], [uuid])
 
 # Checks for header files.
 AC_CHECK_HEADERS([linux/fs.h fcntl.h mntent.h stdlib.h string.h \
-               sys/ioctl.h sys/mount.h unistd.h])
+               sys/ioctl.h sys/mount.h unistd.h linux/falloc.h])
 
 # Checks for typedefs, structures, and compiler characteristics.
 AC_C_INLINE
index 9892a8f..88b9953 100644 (file)
@@ -6,18 +6,26 @@
  *
  * Dual licensed under the GPL or LGPL version 2 licenses.
  */
+#define _LARGEFILE_SOURCE
 #define _LARGEFILE64_SOURCE
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
 
 #include <stdio.h>
 #include <unistd.h>
 #include <sys/ioctl.h>
 #include <sys/stat.h>
+#include <fcntl.h>
 
 #include "f2fs_fs.h"
 
 #ifdef HAVE_LINUX_FS_H
 #include <linux/fs.h>
 #endif
+#ifdef HAVE_LINUX_FALLOC_H
+#include <linux/falloc.h>
+#endif
 
 int f2fs_trim_device()
 {
@@ -37,9 +45,15 @@ int f2fs_trim_device()
 
 #if defined(WITH_BLKDISCARD) && defined(BLKDISCARD)
        MSG(0, "Info: Discarding device\n");
-       if (S_ISREG(stat_buf.st_mode))
+       if (S_ISREG(stat_buf.st_mode)) {
+#ifdef FALLOC_FL_PUNCH_HOLE
+               if (fallocate(config.fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
+                               range[0], range[1]) < 0) {
+                       MSG(0, "Info: fallocate(PUNCH_HOLE|KEEP_SIZE) is failed\n");
+               }
+#endif
                return 0;
-       else if (S_ISBLK(stat_buf.st_mode)) {
+       else if (S_ISBLK(stat_buf.st_mode)) {
                if (ioctl(config.fd, BLKDISCARD, &range) < 0) {
                        MSG(0, "Info: This device doesn't support TRIM\n");
                } else {