1*cf5a6c84SAndroid Build Coastguard Worker /* blkdiscard - discard device sectors
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2020 Patrick Oppenlander <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker *
5*cf5a6c84SAndroid Build Coastguard Worker * See http://man7.org/linux/man-pages/man8/blkdiscard.8.html
6*cf5a6c84SAndroid Build Coastguard Worker *
7*cf5a6c84SAndroid Build Coastguard Worker * The -v and -p options are not supported.
8*cf5a6c84SAndroid Build Coastguard Worker * Size parsing does not match util-linux where MB, GB, TB are multiples of
9*cf5a6c84SAndroid Build Coastguard Worker * 1000 and MiB, TiB, GiB are multipes of 1024.
10*cf5a6c84SAndroid Build Coastguard Worker
11*cf5a6c84SAndroid Build Coastguard Worker USE_BLKDISCARD(NEWTOY(blkdiscard, "<1>1f(force)l(length)#<0o(offset)#<0s(secure)z(zeroout)[!sz]", TOYFLAG_BIN))
12*cf5a6c84SAndroid Build Coastguard Worker
13*cf5a6c84SAndroid Build Coastguard Worker config BLKDISCARD
14*cf5a6c84SAndroid Build Coastguard Worker bool "blkdiscard"
15*cf5a6c84SAndroid Build Coastguard Worker default y
16*cf5a6c84SAndroid Build Coastguard Worker help
17*cf5a6c84SAndroid Build Coastguard Worker usage: blkdiscard [-szf] [-o OFFSET] [-l LENGTH] DEVICE
18*cf5a6c84SAndroid Build Coastguard Worker
19*cf5a6c84SAndroid Build Coastguard Worker Discard device sectors (permanetly deleting data). Free space can improve
20*cf5a6c84SAndroid Build Coastguard Worker flash performance and lifetime by wear leveling and collating data.
21*cf5a6c84SAndroid Build Coastguard Worker (Some filesystem/driver combinations can do this automatically.)
22*cf5a6c84SAndroid Build Coastguard Worker
23*cf5a6c84SAndroid Build Coastguard Worker -o Start at OFFSET (--offset, default 0)
24*cf5a6c84SAndroid Build Coastguard Worker -l LENGTH to discard (--length, default all)
25*cf5a6c84SAndroid Build Coastguard Worker -s Overwrite discarded data (--secure)
26*cf5a6c84SAndroid Build Coastguard Worker -z Zero-fill rather than discard (--zeroout)
27*cf5a6c84SAndroid Build Coastguard Worker -f Disable check for mounted filesystem (--force)
28*cf5a6c84SAndroid Build Coastguard Worker
29*cf5a6c84SAndroid Build Coastguard Worker OFFSET and LENGTH must be aligned to the device sector size. Default
30*cf5a6c84SAndroid Build Coastguard Worker without -o/-l discards the entire device. (You have been warned.)
31*cf5a6c84SAndroid Build Coastguard Worker */
32*cf5a6c84SAndroid Build Coastguard Worker
33*cf5a6c84SAndroid Build Coastguard Worker #define FOR_blkdiscard
34*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
35*cf5a6c84SAndroid Build Coastguard Worker
36*cf5a6c84SAndroid Build Coastguard Worker #include <linux/fs.h>
37*cf5a6c84SAndroid Build Coastguard Worker
GLOBALS(long o,l;)38*cf5a6c84SAndroid Build Coastguard Worker GLOBALS(
39*cf5a6c84SAndroid Build Coastguard Worker long o, l;
40*cf5a6c84SAndroid Build Coastguard Worker )
41*cf5a6c84SAndroid Build Coastguard Worker
42*cf5a6c84SAndroid Build Coastguard Worker void blkdiscard_main(void)
43*cf5a6c84SAndroid Build Coastguard Worker {
44*cf5a6c84SAndroid Build Coastguard Worker int fd = xopen(*toys.optargs, O_WRONLY|O_EXCL*!FLAG(f));
45*cf5a6c84SAndroid Build Coastguard Worker unsigned long long ol[2] = {TT.o, TT.l};
46*cf5a6c84SAndroid Build Coastguard Worker
47*cf5a6c84SAndroid Build Coastguard Worker // TODO: argument size capped to 2 gigs on 32-bit, even with "-l 8g"
48*cf5a6c84SAndroid Build Coastguard Worker if (!FLAG(l)) {
49*cf5a6c84SAndroid Build Coastguard Worker xioctl(fd, BLKGETSIZE64, ol+1);
50*cf5a6c84SAndroid Build Coastguard Worker ol[1] -= ol[0];
51*cf5a6c84SAndroid Build Coastguard Worker }
52*cf5a6c84SAndroid Build Coastguard Worker xioctl(fd, FLAG(s) ? BLKSECDISCARD : FLAG(z) ? BLKZEROOUT : BLKDISCARD, ol);
53*cf5a6c84SAndroid Build Coastguard Worker close(fd);
54*cf5a6c84SAndroid Build Coastguard Worker }
55