diff options
author | Ken Sumrall <ksumrall@android.com> | 2012-11-13 16:26:59 -0800 |
---|---|---|
committer | Ken Sumrall <ksumrall@android.com> | 2013-02-08 14:16:48 -0800 |
commit | 6002c64f41c3e169e68eeb4c5272c6ec63642514 (patch) | |
tree | e3819ea3f9a08dff0f9e2a735729e2be8df8925f | |
parent | 3e5822584d54b605c296a7fac78d4cc3f949e5ca (diff) | |
download | extras-6002c64f41c3e169e68eeb4c5272c6ec63642514.tar.gz |
A testing/debugging tool to wipe partitions
This is basically a command line tool version of the wipe_block_device()
function in libext4_utils. Useful for testing and/or debugging the
BLKSECDISCARD and BLKDISCARD ioctls.
Change-Id: I733f0f7daa673624ddbaac055d82b64d741acd70
-rw-r--r-- | tests/ext4/Android.mk | 3 | ||||
-rw-r--r-- | tests/storage/Android.mk | 6 | ||||
-rw-r--r-- | tests/storage/wipe_blkdev.c | 131 |
3 files changed, 137 insertions, 3 deletions
diff --git a/tests/ext4/Android.mk b/tests/ext4/Android.mk index 36f2e17d..0c0cdd08 100644 --- a/tests/ext4/Android.mk +++ b/tests/ext4/Android.mk @@ -4,7 +4,6 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= corrupt_gdt_free_blocks.c - LOCAL_MODULE:= corrupt_gdt_free_blocks LOCAL_MODULE_TAGS := debug LOCAL_C_INCLUDES += system/extras/ext4_utils @@ -15,7 +14,6 @@ include $(BUILD_EXECUTABLE) include $(CLEAR_VARS) LOCAL_SRC_FILES:= set_ext4_err_bit.c - LOCAL_MODULE:= set_ext4_err_bit LOCAL_MODULE_TAGS := debug @@ -25,7 +23,6 @@ include $(BUILD_EXECUTABLE) include $(CLEAR_VARS) LOCAL_SRC_FILES:= rand_emmc_perf.c - LOCAL_MODULE:= rand_emmc_perf LOCAL_MODULE_TAGS := optional LOCAL_FORCE_STATIC_EXECUTABLE := true diff --git a/tests/storage/Android.mk b/tests/storage/Android.mk index 48f0029f..462ebef6 100644 --- a/tests/storage/Android.mk +++ b/tests/storage/Android.mk @@ -9,3 +9,9 @@ LOCAL_MODULE := opentest LOCAL_MODULE_TAGS := optional include $(BUILD_EXECUTABLE) +include $(CLEAR_VARS) +LOCAL_SRC_FILES := wipe_blkdev.c +LOCAL_MODULE := wipe_blkdev +LOCAL_MODULE_TAGS := optional +include $(BUILD_EXECUTABLE) + diff --git a/tests/storage/wipe_blkdev.c b/tests/storage/wipe_blkdev.c new file mode 100644 index 00000000..43b630b9 --- /dev/null +++ b/tests/storage/wipe_blkdev.c @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2011, 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/ioctl.h> +#include <linux/fs.h> +#include <errno.h> + +typedef unsigned long long u64; + +#ifndef BLKDISCARD +#define BLKDISCARD _IO(0x12,119) +#endif + +#ifndef BLKSECDISCARD +#define BLKSECDISCARD _IO(0x12,125) +#endif + +static u64 get_block_device_size(int fd) +{ + u64 size = 0; + int ret; + + ret = ioctl(fd, BLKGETSIZE64, &size); + + if (ret) + return 0; + + return size; +} + +static int wipe_block_device(int fd, u64 len, int secure) +{ + u64 range[2]; + int ret; + int req; + + range[0] = 0; + range[1] = len; + if (secure) { + req = BLKSECDISCARD; + } else { + req = BLKDISCARD; + } + + ret = ioctl(fd, req, &range); + if (ret < 0) { + fprintf(stderr, "%s discard failed, errno = %d\n", + secure ? "Secure" : "Nonsecure", errno); + } + + return ret; +} + +static void usage(void) +{ + fprintf(stderr, "Usage: wipe_blkdev [-s] <partition>\n"); + exit(1); +} + +int main(int argc, char *argv[]) +{ + int secure = 0; + char *devname; + int fd; + u64 len; + struct stat statbuf; + int ret; + + if ((argc != 2) && (argc != 3)) { + usage(); + } + + if (argc == 3) { + if (!strcmp(argv[1], "-s")) { + secure = 1; + devname = argv[2]; + } else { + usage(); + } + } else { + devname = argv[1]; + } + + fd = open(devname, O_RDWR); + if (fd < 0) { + fprintf(stderr, "Cannot open device %s\n", devname); + exit(1); + } + + if (fstat(fd, &statbuf) < 0) { + fprintf(stderr, "Cannot stat %s\n", devname); + exit(1); + } + + if (!S_ISBLK(statbuf.st_mode)) { + fprintf(stderr, "%s is not a block device\n", devname); + exit(1); + } + + len = get_block_device_size(fd); + + if (! len) { + fprintf(stderr, "Cannot get size of block device %s\n", devname); + exit(1); + } + + ret = wipe_block_device(fd, len, secure); + + close(fd); + + return ret; +} |