We actually don't need to issue trim on entire disk by checking first blocks having zeros.
Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org> --- mkfs/f2fs_format_utils.c | 47 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/mkfs/f2fs_format_utils.c b/mkfs/f2fs_format_utils.c index 8bf128c..52fedc7 100644 --- a/mkfs/f2fs_format_utils.c +++ b/mkfs/f2fs_format_utils.c @@ -110,13 +110,56 @@ static int trim_device(int i) return 0; } +static int f2fs_zero_blocks(int i) +{ +#ifdef WITH_ANDROID + struct device_info *dev = c.devices + i; + int fd = dev->fd; + char buf[F2FS_BLKSIZE]; + char *zero_buf; + int j, ret; + int ret2 = 0; + + zero_buf = calloc(1, F2FS_BLKSIZE); + if (zero_buf == NULL) { + MSG(1, "\tError: Malloc Failed for zero buf!!!\n"); + return -1; + } + + /* check first 16MB blocks */ + for (j = 0; j < 4096; j++) { + ret = lseek(fd, j * F2FS_BLKSIZE, SEEK_SET); + if (ret < 0) { + ret2 = -1; + break; + } + ret = read(fd, buf, F2FS_BLKSIZE); + if (ret != F2FS_BLKSIZE) { + ret2 = -1; + break; + } + if (memcmp(buf, zero_buf, F2FS_BLKSIZE)) { + ret2 = -1; + break; + } + } + free(zero_buf); + if (!ret2) + MSG(0, "Info: Skip discarding blocks (found all zeros\n"); + return ret2; +#else + return -1; +#endif +} + int f2fs_trim_devices(void) { int i; - for (i = 0; i < c.ndevs; i++) - if (trim_device(i)) + for (i = 0; i < c.ndevs; i++) { + if (f2fs_zero_blocks(i) && trim_device(i)) return -1; + } c.trimmed = 1; return 0; } -- 2.19.0.605.g01d371f741-goog _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel