1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)/**
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * f2fs_format_utils.c
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Copyright (c) 2014 Samsung Electronics Co., Ltd.
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *             http://www.samsung.com/
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Dual licensed under the GPL or LGPL version 2 licenses.
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define _LARGEFILE64_SOURCE
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <stdio.h>
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <unistd.h>
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <sys/ioctl.h>
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <sys/stat.h>
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "f2fs_fs.h"
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifdef HAVE_LINUX_FS_H
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <linux/fs.h>
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif
21
22int f2fs_trim_device()
23{
24	unsigned long long range[2];
25	struct stat stat_buf;
26
27	if (!config.trim)
28		return 0;
29
30	range[0] = 0;
31	range[1] = config.total_sectors * DEFAULT_SECTOR_SIZE;
32
33	if (fstat(config.fd, &stat_buf) < 0 ) {
34		MSG(1, "\tError: Failed to get the device stat!!!\n");
35		return -1;
36	}
37
38#if defined(WITH_BLKDISCARD) && defined(BLKDISCARD)
39	MSG(0, "Info: Discarding device\n");
40	if (S_ISREG(stat_buf.st_mode))
41		return 0;
42	else if (S_ISBLK(stat_buf.st_mode)) {
43		if (ioctl(config.fd, BLKDISCARD, &range) < 0) {
44			MSG(0, "Info: This device doesn't support TRIM\n");
45		} else {
46			MSG(0, "Info: Discarded %lu sectors\n",
47						config.total_sectors);
48		}
49	} else
50		return -1;
51#endif
52	return 0;
53}
54
55